From a3d9123edd7081eac21f173df07995488372b06c Mon Sep 17 00:00:00 2001 From: "baloh.matevz" Date: Tue, 31 Jul 2012 05:24:37 +0000 Subject: [PATCH] - Added a sprite "7" to the sd lighting file as it was used, even if it didn't exist. - Piped 3.0.0 a bit. - Standardized code/modules/power. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4242 316c924e-a436-60f5-8080-3fe189b3f50e --- .../power/antimatter/containment_jar.dm | 40 +- code/modules/power/antimatter/control.dm | 576 +++++------ code/modules/power/antimatter/shielding.dm | 316 +++--- code/modules/power/generator.dm | 218 ++-- code/modules/power/generator_type2.dm | 170 +-- code/modules/power/port_gen.dm | 322 +++--- code/modules/power/sd_DynamicAreaLighting.dm | 629 ++++++----- code/modules/power/singularity/collector.dm | 232 ++--- .../power/singularity/containment_field.dm | 158 +-- code/modules/power/singularity/emitter.dm | 334 +++--- .../power/singularity/field_generator.dm | 592 +++++------ .../particle_accelerator/particle.dm | 100 +- .../particle_accelerator.dm | 593 +++++------ .../particle_accelerator/particle_chamber.dm | 6 +- .../particle_accelerator/particle_control.dm | 384 ++++--- .../particle_accelerator/particle_emitter.dm | 67 +- .../particle_accelerator/particle_power.dm | 6 +- code/modules/power/singularity/singularity.dm | 975 +++++++++--------- code/modules/power/smes.dm | 524 +++++----- code/modules/power/solar.dm | 205 ++-- code/modules/power/switch.dm | 106 +- code/modules/power/terminal.dm | 24 +- code/modules/power/tracker.dm | 52 +- icons/effects/ss13_dark_alpha7.dmi | Bin 519 -> 466 bytes maps/tgstation 3.0.0.dmm | 685 ++++++------ 25 files changed, 3655 insertions(+), 3659 deletions(-) diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm index 88b4969e8e..8cb372b0c1 100644 --- a/code/modules/power/antimatter/containment_jar.dm +++ b/code/modules/power/antimatter/containment_jar.dm @@ -15,27 +15,27 @@ var/stability = 100//TODO: add all the stability things to this so its not very safe if you keep hitting in on things - ex_act(severity) - switch(severity) - if(1.0) - explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess +/obj/item/weapon/am_containment/ex_act(severity) + switch(severity) + if(1.0) + explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess + if(src) + del(src) + return + if(2.0) + if(prob((fuel/10)-stability)) + explosion(get_turf(src), 1, 2, 3, 5) if(src) del(src) return - if(2.0) - if(prob((fuel/10)-stability)) - explosion(get_turf(src), 1, 2, 3, 5) - if(src) - del(src) - return - stability -= 40 - if(3.0) - stability -= 20 - //check_stability() - return + stability -= 40 + if(3.0) + stability -= 20 + //check_stability() + return - proc/usefuel(var/wanted) - if(fuel < wanted) - wanted = fuel - fuel -= wanted - return wanted \ No newline at end of file +/obj/item/weapon/am_containment/proc/usefuel(var/wanted) + if(fuel < wanted) + wanted = fuel + fuel -= wanted + return wanted \ No newline at end of file diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 39e2320a50..b50c405f4e 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -29,311 +29,311 @@ var/stored_power = 0//Power to deploy per tick - New() - ..() - linked_shielding = list() - linked_cores = list() +/obj/machinery/power/am_control_unit/New() + ..() + linked_shielding = list() + linked_cores = list() - Del()//Perhaps damage and run stability checks rather than just del on the others +/obj/machinery/power/am_control_unit/Del()//Perhaps damage and run stability checks rather than just del on the others + for(var/obj/machinery/am_shielding/AMS in linked_shielding) + del(AMS) + ..() + + +/obj/machinery/power/am_control_unit/process() + if(exploding) + explosion(get_turf(src),8,12,18,12) + if(src) del(src) + + if(update_shield_icons && !shield_icon_delay) + check_shield_icons() + update_shield_icons = 0 + + if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power + return + + if(!fueljar)//No fuel but we are on, shutdown + toggle_power() + //Angry buzz or such here + return + + add_avail(stored_power) + + power_cycle++ + if(power_cycle >= power_cycle_delay) + produce_power() + power_cycle = 0 + + return + + +/obj/machinery/power/am_control_unit/proc/produce_power() + playsound(src.loc, 'bang.ogg', 25, 1) + var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with + if(core_power <= 0) return 0//Something is wrong + var/core_damage = 0 + var/fuel = fueljar.usefuel(fuel_injection) + + stored_power = (fuel/core_power)*fuel*200000 + //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea + if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with + if(prob(50))core_damage = 1//Small chance of damage + if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores + if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this + if(core_damage == 0) return + for(var/obj/machinery/am_shielding/AMS in linked_cores) + AMS.stability -= core_damage + AMS.check_stability(1) + playsound(src.loc, 'bang.ogg', 50, 1) + return + + +/obj/machinery/power/am_control_unit/emp_act(severity) + switch(severity) + if(1) + if(active) toggle_power() + stability -= rand(15,30) + if(2) + if(active) toggle_power() + stability -= rand(10,20) + ..() + return 0 + + +/obj/machinery/power/am_control_unit/blob_act() + stability -= 20 + if(prob(100-stability))//Might infect the rest of the machine for(var/obj/machinery/am_shielding/AMS in linked_shielding) - del(AMS) - ..() - - - process() - if(exploding) - explosion(get_turf(src),8,12,18,12) - if(src) del(src) - - if(update_shield_icons && !shield_icon_delay) - check_shield_icons() - update_shield_icons = 0 - - if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power - return - - if(!fueljar)//No fuel but we are on, shutdown - toggle_power() - //Angry buzz or such here - return - - add_avail(stored_power) - - power_cycle++ - if(power_cycle >= power_cycle_delay) - produce_power() - power_cycle = 0 - - return - - - proc/produce_power() - playsound(src.loc, 'bang.ogg', 25, 1) - var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with - if(core_power <= 0) return 0//Something is wrong - var/core_damage = 0 - var/fuel = fueljar.usefuel(fuel_injection) - - stored_power = (fuel/core_power)*fuel*200000 - //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea - if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with - if(prob(50))core_damage = 1//Small chance of damage - if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores - if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this - if(core_damage == 0) return - for(var/obj/machinery/am_shielding/AMS in linked_cores) - AMS.stability -= core_damage - AMS.check_stability(1) - playsound(src.loc, 'bang.ogg', 50, 1) - return - - - emp_act(severity) - switch(severity) - if(1) - if(active) toggle_power() - stability -= rand(15,30) - if(2) - if(active) toggle_power() - stability -= rand(10,20) - ..() - return 0 - - - blob_act() - stability -= 20 - if(prob(100-stability))//Might infect the rest of the machine - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - AMS.blob_act() - spawn(0) - //Likely explode - del(src) - return - check_stability() - return - - - ex_act(severity) - switch(severity) - if(1.0) - stability -= 60 - if(2.0) - stability -= 40 - if(3.0) - stability -= 20 - check_stability() - return - - - bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - stability -= Proj.force - return 0 - - - power_change() - ..() - if(stat & NOPOWER && active) - toggle_power() - return - - - update_icon() - if(active) icon_state = "control_on" - else icon_state = "control" - //No other icons for it atm - - - attackby(obj/item/W, mob/user) - if(!istype(W) || !user) return - if(istype(W, /obj/item/weapon/wrench)) - if(!anchored) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the anchor bolts to the floor.", \ - "You hear a ratchet") - src.anchored = 1 - connect_to_network() - else if(!linked_shielding.len > 0) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecures the [src.name].", \ - "You remove the anchor bolts.", \ - "You hear a ratchet") - src.anchored = 0 - disconnect_from_network() - else - user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" - return - - if(istype(W, /obj/item/weapon/am_containment)) - if(fueljar) - user << "\red There is already a [fueljar] inside!" - return - fueljar = W - W.loc = src - if(user.client) - user.client.screen -= W - user.u_equip(W) - user.update_icons() - user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ - "You load an [W.name].", \ - "You hear a thunk.") - return - - if(W.force >= 20) - stability -= W.force/2 - check_stability() - ..() - return - - - attack_hand(mob/user as mob) - if(anchored) - interact(user) - return - - - proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0) - if(!istype(AMS)) return 0 - if(!anchored) return 0 - if(!AMS_linking && !AMS.link_control(src)) return 0 - linked_shielding.Add(AMS) - update_shield_icons = 1 - return 1 - - - proc/remove_shielding(var/obj/machinery/am_shielding/AMS) - if(!istype(AMS)) return 0 - linked_shielding.Remove(AMS) - update_shield_icons = 2 - if(active) toggle_power() - return 1 - - - proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced - if(stability <= 0) + AMS.blob_act() + spawn(0) + //Likely explode del(src) return + check_stability() + return - proc/toggle_power() - active = !active - if(active) - use_power = 2 - visible_message("The [src.name] starts up.") +/obj/machinery/power/am_control_unit/ex_act(severity) + switch(severity) + if(1.0) + stability -= 60 + if(2.0) + stability -= 40 + if(3.0) + stability -= 20 + check_stability() + return + + +/obj/machinery/power/am_control_unit/bullet_act(var/obj/item/projectile/Proj) + if(Proj.flag != "bullet") + stability -= Proj.force + return 0 + + +/obj/machinery/power/am_control_unit/power_change() + ..() + if(stat & NOPOWER && active) + toggle_power() + return + + +/obj/machinery/power/am_control_unit/update_icon() + if(active) icon_state = "control_on" + else icon_state = "control" + //No other icons for it atm + + +/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user) + if(!istype(W) || !user) return + if(istype(W, /obj/item/weapon/wrench)) + if(!anchored) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] secures the [src.name] to the floor.", \ + "You secure the anchor bolts to the floor.", \ + "You hear a ratchet") + src.anchored = 1 + connect_to_network() + else if(!linked_shielding.len > 0) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] unsecures the [src.name].", \ + "You remove the anchor bolts.", \ + "You hear a ratchet") + src.anchored = 0 + disconnect_from_network() else - use_power = 1 - visible_message("The [src.name] shuts down.") - update_icon() + user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" return - - proc/check_shield_icons()//Forces icon_update for all shields - if(shield_icon_delay) return - shield_icon_delay = 1 - if(update_shield_icons == 2)//2 means to clear everything and rebuild - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - if(AMS.processing) AMS.shutdown_core() - AMS.control_unit = null - spawn(10) - AMS.controllerscan() - linked_shielding = list() - - else - for(var/obj/machinery/am_shielding/AMS in linked_shielding) - AMS.update_icon() - spawn(20) - shield_icon_delay = 0 - return - - - proc/check_core_stability() - if(stored_core_stability_delay || linked_cores.len <= 0) return - stored_core_stability_delay = 1 - stored_core_stability = 0 - for(var/obj/machinery/am_shielding/AMS in linked_cores) - stored_core_stability += AMS.stability - stored_core_stability/=linked_cores.len - spawn(40) - stored_core_stability_delay = 0 - return - - - proc/interact(mob/user) - if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) - if(!istype(user, /mob/living/silicon/ai)) - user.machine = null - user << browse(null, "window=AMcontrol") - return - user.machine = src - - var/dat = "" - dat += "AntiMatter Control Panel
" - dat += "Close
" - dat += "Refresh
" - dat += "Force Shielding Update

" - dat += "Status: [(active?"Injecting":"Standby")]
" - dat += "Toggle Status
" - - dat += "Stability: [stability]%
" - dat += "Reactor parts: [linked_shielding.len]
"//TODO: perhaps add some sort of stability check - dat += "Cores: [linked_cores.len]

" - dat += "-Current Efficiency: [reported_core_efficiency]
" - dat += "-Average Stability: [stored_core_stability] (update)
" - dat += "Last Produced: [stored_power]
" - - dat += "Fuel: " - if(!fueljar) - dat += "
No fuel receptacle detected." - else - dat += "Eject
" - dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
" - - dat += "- Injecting: [fuel_injection] units
" - dat += "- --|++

" - - - user << browse(dat, "window=AMcontrol;size=420x500") - onclose(user, "AMcontrol") - return - - - Topic(href, href_list) - ..() - //Ignore input if we are broken or guy is not touching us, AI can control from a ways away - if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai))) - usr.machine = null - usr << browse(null, "window=AMcontrol") + if(istype(W, /obj/item/weapon/am_containment)) + if(fueljar) + user << "\red There is already a [fueljar] inside!" return + fueljar = W + W.loc = src + if(user.client) + user.client.screen -= W + user.u_equip(W) + user.update_icons() + user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ + "You load an [W.name].", \ + "You hear a thunk.") + return - if(href_list["close"]) - usr << browse(null, "window=AMcontrol") - usr.machine = null + if(W.force >= 20) + stability -= W.force/2 + check_stability() + ..() + return + + +/obj/machinery/power/am_control_unit/attack_hand(mob/user as mob) + if(anchored) + interact(user) + return + + +/obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0) + if(!istype(AMS)) return 0 + if(!anchored) return 0 + if(!AMS_linking && !AMS.link_control(src)) return 0 + linked_shielding.Add(AMS) + update_shield_icons = 1 + return 1 + + +/obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS) + if(!istype(AMS)) return 0 + linked_shielding.Remove(AMS) + update_shield_icons = 2 + if(active) toggle_power() + return 1 + + +/obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced + if(stability <= 0) + del(src) + return + + +/obj/machinery/power/am_control_unit/proc/toggle_power() + active = !active + if(active) + use_power = 2 + visible_message("The [src.name] starts up.") + else + use_power = 1 + visible_message("The [src.name] shuts down.") + update_icon() + return + + +/obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields + if(shield_icon_delay) return + shield_icon_delay = 1 + if(update_shield_icons == 2)//2 means to clear everything and rebuild + for(var/obj/machinery/am_shielding/AMS in linked_shielding) + if(AMS.processing) AMS.shutdown_core() + AMS.control_unit = null + spawn(10) + AMS.controllerscan() + linked_shielding = list() + + else + for(var/obj/machinery/am_shielding/AMS in linked_shielding) + AMS.update_icon() + spawn(20) + shield_icon_delay = 0 + return + + +/obj/machinery/power/am_control_unit/proc/check_core_stability() + if(stored_core_stability_delay || linked_cores.len <= 0) return + stored_core_stability_delay = 1 + stored_core_stability = 0 + for(var/obj/machinery/am_shielding/AMS in linked_cores) + stored_core_stability += AMS.stability + stored_core_stability/=linked_cores.len + spawn(40) + stored_core_stability_delay = 0 + return + + +/obj/machinery/power/am_control_unit/proc/interact(mob/user) + if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) + if(!istype(user, /mob/living/silicon/ai)) + user.machine = null + user << browse(null, "window=AMcontrol") return + user.machine = src - if(href_list["togglestatus"]) - toggle_power() + var/dat = "" + dat += "AntiMatter Control Panel
" + dat += "Close
" + dat += "Refresh
" + dat += "Force Shielding Update

" + dat += "Status: [(active?"Injecting":"Standby")]
" + dat += "Toggle Status
" - if(href_list["refreshicons"]) - update_shield_icons = 1 + dat += "Stability: [stability]%
" + dat += "Reactor parts: [linked_shielding.len]
"//TODO: perhaps add some sort of stability check + dat += "Cores: [linked_cores.len]

" + dat += "-Current Efficiency: [reported_core_efficiency]
" + dat += "-Average Stability: [stored_core_stability] (update)
" + dat += "Last Produced: [stored_power]
" - if(href_list["ejectjar"]) - if(fueljar) - fueljar.loc = src.loc - fueljar = null - //fueljar.control_unit = null currently it does not care where it is - //update_icon() when we have the icon for it + dat += "Fuel: " + if(!fueljar) + dat += "
No fuel receptacle detected." + else + dat += "Eject
" + dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
" - if(href_list["strengthup"]) - fuel_injection++ + dat += "- Injecting: [fuel_injection] units
" + dat += "- --|++

" - if(href_list["strengthdown"]) - fuel_injection-- - if(fuel_injection < 0) fuel_injection = 0 - if(href_list["refreshstability"]) - check_core_stability() + user << browse(dat, "window=AMcontrol;size=420x500") + onclose(user, "AMcontrol") + return - updateDialog() - return \ No newline at end of file + +/obj/machinery/power/am_control_unit/Topic(href, href_list) + ..() + //Ignore input if we are broken or guy is not touching us, AI can control from a ways away + if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai))) + usr.machine = null + usr << browse(null, "window=AMcontrol") + return + + if(href_list["close"]) + usr << browse(null, "window=AMcontrol") + usr.machine = null + return + + if(href_list["togglestatus"]) + toggle_power() + + if(href_list["refreshicons"]) + update_shield_icons = 1 + + if(href_list["ejectjar"]) + if(fueljar) + fueljar.loc = src.loc + fueljar = null + //fueljar.control_unit = null currently it does not care where it is + //update_icon() when we have the icon for it + + if(href_list["strengthup"]) + fuel_injection++ + + if(href_list["strengthdown"]) + fuel_injection-- + if(fuel_injection < 0) fuel_injection = 0 + + if(href_list["refreshstability"]) + check_core_stability() + + updateDialog() + return \ No newline at end of file diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index fd98a140b7..ffc0cd5130 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -26,177 +26,177 @@ proc/cardinalrange(var/center) var/efficiency = 1//How many cores this core counts for when doing power processing, plasma in the air and stability could affect this - New(loc) - ..(loc) - spawn(10) - controllerscan() +/obj/machinery/am_shielding/New(loc) + ..(loc) + spawn(10) + controllerscan() + return + + +/obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0) + //Make sure we are the only one here + if(!istype(src.loc, /turf)) + del(src) + return + for(var/obj/machinery/am_shielding/AMS in loc.contents) + if(AMS == src) continue + spawn(0) + del(src) return + //Search for shielding first + for(var/obj/machinery/am_shielding/AMS in cardinalrange(src)) + if(AMS && AMS.control_unit && link_control(AMS.control_unit)) + break - proc/controllerscan(var/priorscan = 0) - //Make sure we are the only one here - if(!istype(src.loc, /turf)) - del(src) - return - for(var/obj/machinery/am_shielding/AMS in loc.contents) - if(AMS == src) continue - spawn(0) - del(src) - return - - //Search for shielding first - for(var/obj/machinery/am_shielding/AMS in cardinalrange(src)) - if(AMS && AMS.control_unit && link_control(AMS.control_unit)) + if(!control_unit)//No other guys nearby look for a control unit + for(var/direction in cardinal) + for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src)) + if(AMC.add_shielding(src)) break - if(!control_unit)//No other guys nearby look for a control unit - for(var/direction in cardinal) - for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src)) - if(AMC.add_shielding(src)) - break - - if(!control_unit) - if(!priorscan) - spawn(20) - controllerscan(1)//Last chance - return - spawn(0) - del(src) - return - - - Del() - if(control_unit) control_unit.remove_shielding(src) - if(processing) shutdown_core() - visible_message("\red The [src.name] melts!") - //Might want to have it leave a mess on the floor but no sprites for now - ..() - return - - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - return 0 - - - process() - if(!processing) ..() - //TODO: core functions and stability - //TODO: think about checking the airmix for plasma and increasing power output - return - - - emp_act()//Immune due to not really much in the way of electronics. - return 0 - - - blob_act() - stability -= 20 - if(prob(100-stability)) - if(prob(10))//Might create a node - new /obj/effect/blob/node(src.loc,150) - else - new /obj/effect/blob(src.loc,60) - spawn(0) - del(src) + if(!control_unit) + if(!priorscan) + spawn(20) + controllerscan(1)//Last chance return - check_stability() - return + spawn(0) + del(src) + return - ex_act(severity) - switch(severity) - if(1.0) - stability -= 80 - if(2.0) - stability -= 40 - if(3.0) - stability -= 20 - check_stability() - return +/obj/machinery/am_shielding/Del() + if(control_unit) control_unit.remove_shielding(src) + if(processing) shutdown_core() + visible_message("\red The [src.name] melts!") + //Might want to have it leave a mess on the floor but no sprites for now + ..() + return - bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - stability -= Proj.force/2 - return 0 +/obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + return 0 - update_icon() - overlays = null - for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit)) - overlays += "shield_[direction]" - - if(core_check()) - overlays += "core" - if(!processing) setup_core() - else if(processing) shutdown_core() +/obj/machinery/am_shielding/process() + if(!processing) ..() + //TODO: core functions and stability + //TODO: think about checking the airmix for plasma and increasing power output + return - attackby(obj/item/W, mob/user) - if(!istype(W) || !user) return - if(W.force > 10) - stability -= W.force/2 - check_stability() - ..() - return +/obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics. + return 0 - - //Call this to link a detected shilding unit to the controller - proc/link_control(var/obj/machinery/power/am_control_unit/AMC) - if(!istype(AMC)) return 0 - if(control_unit && control_unit != AMC) return 0//Already have one - control_unit = AMC - control_unit.add_shielding(src,1) - return 1 - - - //Scans cards for shields or the control unit and if all there it - proc/core_check() - for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if(!machine) return 0//Need all for a core - if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0 - return 1 - - - proc/setup_core() - processing = 1 - machines.Add(src) - if(!control_unit) return - control_unit.linked_cores.Add(src) - control_unit.reported_core_efficiency += efficiency - return - - - proc/shutdown_core() - processing = 0 - machines.Remove(src) - if(!control_unit) return - control_unit.linked_cores.Remove(src) - control_unit.reported_core_efficiency -= efficiency - return - - - proc/check_stability(var/injecting_fuel = 0) - if(stability > 0) return - if(injecting_fuel && control_unit) - control_unit.exploding = 1 - if(src) +/obj/machinery/am_shielding/blob_act() + stability -= 20 + if(prob(100-stability)) + if(prob(10))//Might create a node + new /obj/effect/blob/node(src.loc,150) + else + new /obj/effect/blob(src.loc,60) + spawn(0) del(src) return + check_stability() + return - proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp - if(!control_unit || !processing) return - if(stability < 50) - new_efficiency /= 2 - control_unit.reported_core_efficiency += (new_efficiency - efficiency) - efficiency = new_efficiency - return +/obj/machinery/am_shielding/ex_act(severity) + switch(severity) + if(1.0) + stability -= 80 + if(2.0) + stability -= 40 + if(3.0) + stability -= 20 + check_stability() + return + + +/obj/machinery/am_shielding/bullet_act(var/obj/item/projectile/Proj) + if(Proj.flag != "bullet") + stability -= Proj.force/2 + return 0 + + +/obj/machinery/am_shielding/update_icon() + overlays = null + for(var/direction in alldirs) + var/machine = locate(/obj/machinery, get_step(loc, direction)) + if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit)) + overlays += "shield_[direction]" + + if(core_check()) + overlays += "core" + if(!processing) setup_core() + else if(processing) shutdown_core() + + +/obj/machinery/am_shielding/attackby(obj/item/W, mob/user) + if(!istype(W) || !user) return + if(W.force > 10) + stability -= W.force/2 + check_stability() + ..() + return + + + +//Call this to link a detected shilding unit to the controller +/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC) + if(!istype(AMC)) return 0 + if(control_unit && control_unit != AMC) return 0//Already have one + control_unit = AMC + control_unit.add_shielding(src,1) + return 1 + + +//Scans cards for shields or the control unit and if all there it +/obj/machinery/am_shielding/proc/core_check() + for(var/direction in alldirs) + var/machine = locate(/obj/machinery, get_step(loc, direction)) + if(!machine) return 0//Need all for a core + if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0 + return 1 + + +/obj/machinery/am_shielding/proc/setup_core() + processing = 1 + machines.Add(src) + if(!control_unit) return + control_unit.linked_cores.Add(src) + control_unit.reported_core_efficiency += efficiency + return + + +/obj/machinery/am_shielding/proc/shutdown_core() + processing = 0 + machines.Remove(src) + if(!control_unit) return + control_unit.linked_cores.Remove(src) + control_unit.reported_core_efficiency -= efficiency + return + + +/obj/machinery/am_shielding/proc/check_stability(var/injecting_fuel = 0) + if(stability > 0) return + if(injecting_fuel && control_unit) + control_unit.exploding = 1 + if(src) + del(src) + return + + +/obj/machinery/am_shielding/proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp + if(!control_unit || !processing) return + if(stability < 50) + new_efficiency /= 2 + control_unit.reported_core_efficiency += (new_efficiency - efficiency) + efficiency = new_efficiency + return @@ -214,10 +214,10 @@ proc/cardinalrange(var/center) m_amt = 100 w_amt = 2000 - attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) - new/obj/machinery/am_shielding(src.loc) - del(src) - return - ..() - return \ No newline at end of file +/obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) + new/obj/machinery/am_shielding(src.loc) + del(src) + return + ..() + return \ No newline at end of file diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 6344ffac0a..13b892f20f 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -20,145 +20,145 @@ var/lastgenlev = -1 - New() - ..() +/obj/machinery/power/generator/New() + ..() - spawn(5) - circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST) - circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST) + spawn(5) + circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST) + circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST) - if(circ1) - circ1.side = 1 - circ1.update_icon() - if(circ2) - circ2.side = 2 - circ2.update_icon() + if(circ1) + circ1.side = 1 + circ1.update_icon() + if(circ2) + circ2.side = 2 + circ2.update_icon() - if(!circ1 || !circ2) - stat |= BROKEN + if(!circ1 || !circ2) + stat |= BROKEN - updateicon() + updateicon() - proc/updateicon() +/obj/machinery/power/generator/proc/updateicon() - if(stat & (NOPOWER|BROKEN)) - overlays = null - else - overlays = null + if(stat & (NOPOWER|BROKEN)) + overlays = null + else + overlays = null - if(lastgenlev != 0) - overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") + if(lastgenlev != 0) + overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") #define GENRATE 800 // generator output coefficient from Q - process() +/obj/machinery/power/generator/process() - //world << "Generator process ran" + //world << "Generator process ran" - if(!circ1 || !circ2) - return + if(!circ1 || !circ2) + return - //world << "circ1 and circ2 pass" + //world << "circ1 and circ2 pass" - var/datum/gas_mixture/cold_air = circ1.return_transfer_air() - var/datum/gas_mixture/hot_air = circ2.return_transfer_air() + var/datum/gas_mixture/cold_air = circ1.return_transfer_air() + var/datum/gas_mixture/hot_air = circ2.return_transfer_air() - lastgen = 0 + lastgen = 0 - //world << "hot_air = [hot_air]; cold_air = [cold_air];" + //world << "hot_air = [hot_air]; cold_air = [cold_air];" - if(cold_air && hot_air) + if(cold_air && hot_air) - //world << "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];" + //world << "hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];" - //world << "coldair and hotair pass" - var/cold_air_heat_capacity = cold_air.heat_capacity() - var/hot_air_heat_capacity = hot_air.heat_capacity() + //world << "coldair and hotair pass" + var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() - var/delta_temperature = hot_air.temperature - cold_air.temperature + var/delta_temperature = hot_air.temperature - cold_air.temperature - //world << "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]" + //world << "delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]" - if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) - var/efficiency = 0.65 + if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) + var/efficiency = 0.65 - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) + var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency + var/heat = energy_transfer*(1-efficiency) + lastgen = energy_transfer*efficiency - //world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];" + //world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];" - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity + hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" + world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" - add_avail(lastgen) - // update icon overlays only if displayed level has changed + add_avail(lastgen) + // update icon overlays only if displayed level has changed - if(hot_air) - circ2.air2.merge(hot_air) + if(hot_air) + circ2.air2.merge(hot_air) - if(cold_air) - circ1.air2.merge(cold_air) + if(cold_air) + circ1.air2.merge(cold_air) - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) - if(genlev != lastgenlev) - lastgenlev = genlev - updateicon() - - src.updateDialog() - - attack_ai(mob/user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - - attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) - - - proc/interact(mob/user) - if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) - user.machine = null - user << browse(null, "window=teg") - return - - user.machine = src - - var/t = "
Thermo-Electric Generator
" - - t += "Output : [round(lastgen)] W

" - - t += "Cold loop
" - t += "Temperature Inlet: [round(circ1.air1.temperature, 0.1)] K Outlet: [round(circ1.air2.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(circ1.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ1.air2.return_pressure(), 0.1)] kPa
" - - t += "Hot loop
" - t += "Temperature Inlet: [round(circ2.air1.temperature, 0.1)] K Outlet: [round(circ2.air2.temperature, 0.1)] K
" - t += "Pressure Inlet: [round(circ2.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ2.air2.return_pressure(), 0.1)] kPa
" - - t += "

Close" - - t += "
" - user << browse(t, "window=teg;size=460x300") - onclose(user, "teg") - return 1 - - - Topic(href, href_list) - ..() - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.machine = null - return 0 - return 1 - - - power_change() - ..() + var/genlev = max(0, min( round(11*lastgen / 100000), 11)) + if(genlev != lastgenlev) + lastgenlev = genlev updateicon() + src.updateDialog() + +/obj/machinery/power/generator/attack_ai(mob/user) + if(stat & (BROKEN|NOPOWER)) return + interact(user) + + +/obj/machinery/power/generator/attack_hand(mob/user) + add_fingerprint(user) + if(stat & (BROKEN|NOPOWER)) return + interact(user) + + +/obj/machinery/power/generator/proc/interact(mob/user) + if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) + user.machine = null + user << browse(null, "window=teg") + return + + user.machine = src + + var/t = "
Thermo-Electric Generator
" + + t += "Output : [round(lastgen)] W

" + + t += "Cold loop
" + t += "Temperature Inlet: [round(circ1.air1.temperature, 0.1)] K Outlet: [round(circ1.air2.temperature, 0.1)] K
" + t += "Pressure Inlet: [round(circ1.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ1.air2.return_pressure(), 0.1)] kPa
" + + t += "Hot loop
" + t += "Temperature Inlet: [round(circ2.air1.temperature, 0.1)] K Outlet: [round(circ2.air2.temperature, 0.1)] K
" + t += "Pressure Inlet: [round(circ2.air1.return_pressure(), 0.1)] kPa Outlet: [round(circ2.air2.return_pressure(), 0.1)] kPa
" + + t += "

Close" + + t += "
" + user << browse(t, "window=teg;size=460x300") + onclose(user, "teg") + return 1 + + +/obj/machinery/power/generator/Topic(href, href_list) + ..() + if( href_list["close"] ) + usr << browse(null, "window=teg") + usr.machine = null + return 0 + return 1 + + +/obj/machinery/power/generator/power_change() + ..() + updateicon() + diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 9e53367f2b..8fe7006027 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -12,131 +12,131 @@ var/lastgenlev = -1 - New() - ..() - spawn(5) - input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,WEST) - input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,EAST) - if(!input1 || !input2) - stat |= BROKEN - updateicon() +/obj/machinery/power/generator_type2/New() + ..() + spawn(5) + input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,WEST) + input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,EAST) + if(!input1 || !input2) + stat |= BROKEN + updateicon() - proc/updateicon() +/obj/machinery/power/generator_type2/proc/updateicon() - if(stat & (NOPOWER|BROKEN)) - overlays = null - else - overlays = null + if(stat & (NOPOWER|BROKEN)) + overlays = null + else + overlays = null - if(lastgenlev != 0) - overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") + if(lastgenlev != 0) + overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]") #define GENRATE 800 // generator output coefficient from Q - process() - if(!input1 || !input2) - return +/obj/machinery/power/generator_type2/process() + if(!input1 || !input2) + return - var/datum/gas_mixture/air1 = input1.return_exchange_air() - var/datum/gas_mixture/air2 = input2.return_exchange_air() + var/datum/gas_mixture/air1 = input1.return_exchange_air() + var/datum/gas_mixture/air2 = input2.return_exchange_air() - lastgen = 0 + lastgen = 0 - if(air1 && air2) - var/datum/gas_mixture/hot_air = air1 - var/datum/gas_mixture/cold_air = air2 - if(hot_air.temperature < cold_air.temperature) - hot_air = air2 - cold_air = air1 + if(air1 && air2) + var/datum/gas_mixture/hot_air = air1 + var/datum/gas_mixture/cold_air = air2 + if(hot_air.temperature < cold_air.temperature) + hot_air = air2 + cold_air = air1 - var/hot_air_heat_capacity = hot_air.heat_capacity() - var/cold_air_heat_capacity = cold_air.heat_capacity() + var/hot_air_heat_capacity = hot_air.heat_capacity() + var/cold_air_heat_capacity = cold_air.heat_capacity() - var/delta_temperature = hot_air.temperature - cold_air.temperature + var/delta_temperature = hot_air.temperature - cold_air.temperature - if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01) - var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency + if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01) + var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency - var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) + var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) - var/heat = energy_transfer*(1-efficiency) - lastgen = energy_transfer*efficiency + var/heat = energy_transfer*(1-efficiency) + lastgen = energy_transfer*efficiency - hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity - cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity + hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity + cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity - world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" + world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" - if(input1.network) - input1.network.update = 1 + if(input1.network) + input1.network.update = 1 - if(input2.network) - input2.network.update = 1 + if(input2.network) + input2.network.update = 1 - add_avail(lastgen) - // update icon overlays only if displayed level has changed + add_avail(lastgen) + // update icon overlays only if displayed level has changed - var/genlev = max(0, min( round(11*lastgen / 100000), 11)) - if(genlev != lastgenlev) - lastgenlev = genlev - updateicon() + var/genlev = max(0, min( round(11*lastgen / 100000), 11)) + if(genlev != lastgenlev) + lastgenlev = genlev + updateicon() - src.updateDialog() + src.updateDialog() - attack_ai(mob/user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) +/obj/machinery/power/generator_type2/attack_ai(mob/user) + if(stat & (BROKEN|NOPOWER)) return + interact(user) - attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) return - interact(user) +/obj/machinery/power/generator_type2/attack_hand(mob/user) + add_fingerprint(user) + if(stat & (BROKEN|NOPOWER)) return + interact(user) - proc/interact(mob/user) - if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) - user.machine = null - user << browse(null, "window=teg") - return +/obj/machinery/power/generator_type2/proc/interact(mob/user) + if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai))) + user.machine = null + user << browse(null, "window=teg") + return - user.machine = src + user.machine = src - var/t = "
Thermo-Electric Generator
" + var/t = "
Thermo-Electric Generator
" - t += "Output : [round(lastgen)] W

" + t += "Output : [round(lastgen)] W

" - t += "Cold loop
" - t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
" + t += "Cold loop
" + t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
" + t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
" - t += "Hot loop
" - t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
" - t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
" + t += "Hot loop
" + t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
" + t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
" - t += "

Close" + t += "

Close" - t += "
" - user << browse(t, "window=teg;size=460x300") - onclose(user, "teg") - return 1 + t += "
" + user << browse(t, "window=teg;size=460x300") + onclose(user, "teg") + return 1 - Topic(href, href_list) - ..() +/obj/machinery/power/generator_type2/Topic(href, href_list) + ..() - if( href_list["close"] ) - usr << browse(null, "window=teg") - usr.machine = null - return 0 + if( href_list["close"] ) + usr << browse(null, "window=teg") + usr.machine = null + return 0 - return 1 + return 1 - power_change() - ..() - updateicon() \ No newline at end of file +/obj/machinery/power/generator_type2/power_change() + ..() + updateicon() \ No newline at end of file diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 941394d756..d9897de8af 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -106,187 +106,185 @@ display round(lastgen) and plasmatank amount var/time_per_sheet = 10 var/heat = 0 - New() - ..() - component_parts = list() - component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) - component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) - component_parts += new /obj/item/weapon/cable_coil(src) - component_parts += new /obj/item/weapon/cable_coil(src) - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) - component_parts += new board_path(src) - RefreshParts() - +/obj/machinery/power/port_gen/pacman/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/cable_coil(src) + component_parts += new /obj/item/weapon/cable_coil(src) + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new board_path(src) RefreshParts() - var/temp_rating = 0 - var/temp_reliability = 0 - for(var/obj/item/weapon/stock_parts/SP in component_parts) - if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) - max_sheets = SP.rating * SP.rating * 50 - else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor)) - temp_rating += SP.rating - for(var/obj/item/weapon/CP in component_parts) - temp_reliability += CP.reliability - reliability = min(round(temp_reliability / 4), 100) - power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) - examine() - ..() - usr << "\blue The generator has [sheets] units of fuel left, producing [power_gen] per cycle." - if(crit_fail) usr << "\red The generator seems to have broken down." +/obj/machinery/power/port_gen/pacman/RefreshParts() + var/temp_rating = 0 + var/temp_reliability = 0 + for(var/obj/item/weapon/stock_parts/SP in component_parts) + if(istype(SP, /obj/item/weapon/stock_parts/matter_bin)) + max_sheets = SP.rating * SP.rating * 50 + else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor)) + temp_rating += SP.rating + for(var/obj/item/weapon/CP in component_parts) + temp_reliability += CP.reliability + reliability = min(round(temp_reliability / 4), 100) + power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) - HasFuel() - if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) - return 1 - return 0 +/obj/machinery/power/port_gen/pacman/examine() + ..() + usr << "\blue The generator has [sheets] units of fuel left, producing [power_gen] per cycle." + if(crit_fail) usr << "\red The generator seems to have broken down." - UseFuel() - var/needed_sheets = 1 / (time_per_sheet / power_output) - var/temp = min(needed_sheets, sheet_left) - needed_sheets -= temp - sheet_left -= temp - sheets -= round(needed_sheets) - needed_sheets -= round(needed_sheets) - if (sheet_left <= 0 && sheets > 0) - sheet_left = 1 - needed_sheets - sheets-- +/obj/machinery/power/port_gen/pacman/HasFuel() + if(sheets >= 1 / (time_per_sheet / power_output) - sheet_left) + return 1 + return 0 - var/lower_limit = 56 + power_output * 10 - var/upper_limit = 76 + power_output * 10 - var/bias = 0 - if (power_output > 4) - upper_limit = 400 - bias = power_output * 3 +/obj/machinery/power/port_gen/pacman/UseFuel() + var/needed_sheets = 1 / (time_per_sheet / power_output) + var/temp = min(needed_sheets, sheet_left) + needed_sheets -= temp + sheet_left -= temp + sheets -= round(needed_sheets) + needed_sheets -= round(needed_sheets) + if (sheet_left <= 0 && sheets > 0) + sheet_left = 1 - needed_sheets + sheets-- + + var/lower_limit = 56 + power_output * 10 + var/upper_limit = 76 + power_output * 10 + var/bias = 0 + if (power_output > 4) + upper_limit = 400 + bias = power_output * 3 + if (heat < lower_limit) + heat += 3 + else + heat += rand(-7 + bias, 7 + bias) if (heat < lower_limit) - heat += 3 - else - heat += rand(-7 + bias, 7 + bias) - if (heat < lower_limit) - heat = lower_limit - if (heat > upper_limit) - heat = upper_limit + heat = lower_limit + if (heat > upper_limit) + heat = upper_limit - if (heat > 300) - overheat() + if (heat > 300) + overheat() + del(src) + return + +/obj/machinery/power/port_gen/pacman/handleInactive() + heat -= 2 + if (heat < 0) + heat = 0 + else + for(var/mob/M in viewers(1, src)) + if (M.client && M.machine == src) + src.updateUsrDialog() + +/obj/machinery/power/port_gen/pacman/proc/overheat() + explosion(src.loc, 2, 5, 2, -1) + +/obj/machinery/power/port_gen/pacman/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, sheet_path)) + var/obj/item/stack/addstack = O + var/amount = min((max_sheets - sheets), addstack.amount) + if(amount < 1) + user << "\blue The [src.name] is full!" + return + user << "\blue You add [amount] sheets to the [src.name]." + sheets += amount + addstack.use(amount) + return + else if (istype(O, /obj/item/weapon/card/emag)) + emagged = 1 + emp_act(1) + else if(!active) + if(istype(O, /obj/item/weapon/wrench)) + anchored = !anchored + playsound(src.loc, 'Deconstruct.ogg', 50, 1) + if(anchored) + user << "\blue You secure the generator to the floor." + else + user << "\blue You unsecure the generator from the floor." + makepowernets() + else if(istype(O, /obj/item/weapon/screwdriver)) + open = !open + playsound(src.loc, 'Screwdriver.ogg', 50, 1) + if(open) + user << "\blue You open the access panel." + else + user << "\blue You close the access panel." + else if(istype(O, /obj/item/weapon/crowbar) && !open) + var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) + for(var/obj/item/I in component_parts) + if(I.reliability < 100) + I.crit_fail = 1 + I.loc = src.loc + new_frame.state = 2 + new_frame.icon_state = "box_1" del(src) + +/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob) + ..() + if (!anchored) return - handleInactive() - heat -= 2 - if (heat < 0) - heat = 0 - else - for(var/mob/M in viewers(1, src)) - if (M.client && M.machine == src) - src.updateUsrDialog() + interact(user) - proc - overheat() - explosion(src.loc, 2, 5, 2, -1) +/obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob) + interact(user) - attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, sheet_path)) - var/obj/item/stack/addstack = O - var/amount = min((max_sheets - sheets), addstack.amount) - if(amount < 1) - user << "\blue The [src.name] is full!" - return - user << "\blue You add [amount] sheets to the [src.name]." - sheets += amount - addstack.use(amount) - return - else if (istype(O, /obj/item/weapon/card/emag)) - emagged = 1 - emp_act(1) - else if(!active) - if(istype(O, /obj/item/weapon/wrench)) - anchored = !anchored - playsound(src.loc, 'Deconstruct.ogg', 50, 1) - if(anchored) - user << "\blue You secure the generator to the floor." - else - user << "\blue You unsecure the generator from the floor." - makepowernets() - else if(istype(O, /obj/item/weapon/screwdriver)) - open = !open - playsound(src.loc, 'Screwdriver.ogg', 50, 1) - if(open) - user << "\blue You open the access panel." - else - user << "\blue You close the access panel." - else if(istype(O, /obj/item/weapon/crowbar) && !open) - var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) - for(var/obj/item/I in component_parts) - if(I.reliability < 100) - I.crit_fail = 1 - I.loc = src.loc - new_frame.state = 2 - new_frame.icon_state = "box_1" - del(src) +/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob) + interact(user) - attack_hand(mob/user as mob) - ..() - if (!anchored) +/obj/machinery/power/port_gen/pacman/proc/interact(mob/user) + if (get_dist(src, user) > 1 ) + if (!istype(user, /mob/living/silicon/ai)) + user.machine = null + user << browse(null, "window=port_gen") return - interact(user) + user.machine = src - attack_ai(mob/user as mob) - interact(user) + var/dat = text("[name]
") + if (active) + dat += text("Generator: On
") + else + dat += text("Generator: Off
") + dat += text("sheets: [sheets]
") + var/stack_percent = round(sheet_left * 100, 1) + dat += text("Current stack: [stack_percent]%
") + dat += text("Power output: - [power_gen * power_output] +
") + dat += text("Heat: [heat]
") + dat += "
Close" + user << browse("[dat]", "window=port_gen") - attack_paw(mob/user as mob) - interact(user) +/obj/machinery/power/port_gen/pacman/Topic(href, href_list) + if(..()) + return - proc - interact(mob/user) - if (get_dist(src, user) > 1 ) - if (!istype(user, /mob/living/silicon/ai)) - user.machine = null - user << browse(null, "window=port_gen") - return - - user.machine = src - - var/dat = text("[name]
") + src.add_fingerprint(usr) + if(href_list["action"]) + if(href_list["action"] == "enable") + if(!active && HasFuel() && !crit_fail) + active = 1 + icon_state = "portgen1" + src.updateUsrDialog() + if(href_list["action"] == "disable") if (active) - dat += text("Generator: On
") - else - dat += text("Generator: Off
") - dat += text("sheets: [sheets]
") - var/stack_percent = round(sheet_left * 100, 1) - dat += text("Current stack: [stack_percent]%
") - dat += text("Power output: - [power_gen * power_output] +
") - dat += text("Heat: [heat]
") - dat += "
Close" - user << browse("[dat]", "window=port_gen") - - Topic(href, href_list) - if(..()) - return - - src.add_fingerprint(usr) - if(href_list["action"]) - if(href_list["action"] == "enable") - if(!active && HasFuel() && !crit_fail) - active = 1 - icon_state = "portgen1" - src.updateUsrDialog() - if(href_list["action"] == "disable") - if (active) - active = 0 - icon_state = "portgen0" - src.updateUsrDialog() - if(href_list["action"] == "lower_power") - if (power_output > 1) - power_output-- - src.updateUsrDialog() - if (href_list["action"] == "higher_power") - if (power_output < 4 || emagged) - power_output++ - src.updateUsrDialog() - if (href_list["action"] == "close") - usr << browse(null, "window=port_gen") - usr.machine = null + active = 0 + icon_state = "portgen0" + src.updateUsrDialog() + if(href_list["action"] == "lower_power") + if (power_output > 1) + power_output-- + src.updateUsrDialog() + if (href_list["action"] == "higher_power") + if (power_output < 4 || emagged) + power_output++ + src.updateUsrDialog() + if (href_list["action"] == "close") + usr << browse(null, "window=port_gen") + usr.machine = null /obj/machinery/power/port_gen/pacman/super name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator" diff --git a/code/modules/power/sd_DynamicAreaLighting.dm b/code/modules/power/sd_DynamicAreaLighting.dm index 3caf18da5f..50ecfe89cd 100644 --- a/code/modules/power/sd_DynamicAreaLighting.dm +++ b/code/modules/power/sd_DynamicAreaLighting.dm @@ -318,12 +318,11 @@ Turfs have these additional procs and vars: \********************************************************************/ -var - sd_dark_icon = 'icons/effects/ss13_dark_alpha7.dmi' // icon used for darkness - sd_dark_shades = 7 // number of icon state in sd_dark_icon - sd_light_layer = 10 // graphics layer for light effect - sd_light_outside = 0 // how bright it is outside - sd_top_luminosity = 0 +var/sd_dark_icon = 'icons/effects/ss13_dark_alpha7.dmi' // icon used for darkness +var/sd_dark_shades = 7 // number of icon state in sd_dark_icon +var/sd_light_layer = 10 // graphics layer for light effect +var/sd_light_outside = 0 // how bright it is outside +var/sd_top_luminosity = 0 // since we're not using these, comment out all occurances to save CPU /* @@ -351,309 +350,303 @@ proc for(var/turf/T in sd_light_spill_turfs) T.sd_ApplySpill() */ -proc - sd_SetDarkIcon(icon, shades) - // reset the darkness icon and number of shades of darkness - sd_dark_icon = icon - sd_dark_shades = shades - // change existing areas - for(var/area/A) - if(A.sd_darkimage) A.sd_LightLevel(A.sd_light_level,0) +proc/sd_SetDarkIcon(icon, shades) + // reset the darkness icon and number of shades of darkness + sd_dark_icon = icon + sd_dark_shades = shades + // change existing areas + for(var/area/A) + if(A.sd_darkimage) A.sd_LightLevel(A.sd_light_level,0) -atom - New() - ..() - // if this is not an area and is luminous - if(!isarea(src)&&(luminosity>0)) - spawn(1) // delay to allow map load - sd_ApplyLum() +atom/New() + ..() + // if this is not an area and is luminous + if(!isarea(src)&&(luminosity>0)) + spawn(1) // delay to allow map load + sd_ApplyLum() - Del() - // if this is not an area and is luminous - if(!isarea(src)&&(luminosity>0)) - sd_StripLum() - ..() +atom/Del() + // if this is not an area and is luminous + if(!isarea(src)&&(luminosity>0)) + sd_StripLum() + ..() - proc - sd_ApplyLum(list/V = view(luminosity,src), center = src) - if(src.luminosity>sd_top_luminosity) - sd_top_luminosity = src.luminosity - // loop through all the turfs in V - for(var/turf/T in V) - /* increase the turf's brightness depending on the - brightness and distance of the lightsource */ - T.sd_lumcount += (luminosity-get_dist(center,T)) - // update the turf's area +atom/proc/sd_ApplyLum(list/V = view(luminosity,src), center = src) + if(src.luminosity>sd_top_luminosity) + sd_top_luminosity = src.luminosity + // loop through all the turfs in V + for(var/turf/T in V) + /* increase the turf's brightness depending on the + brightness and distance of the lightsource */ + T.sd_lumcount += (luminosity-get_dist(center,T)) + // update the turf's area - // - //if(T.tag == "sdd") - // slog << "\red lc+([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])" - // slog << "now [T.sd_lumcount]" + // + //if(T.tag == "sdd") + // slog << "\red lc+([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])" + // slog << "now [T.sd_lumcount]" - T.sd_LumUpdate() + T.sd_LumUpdate() - sd_StripLum(list/V = view(luminosity,src), center = src) - // loop through all the turfs in V - for(var/turf/T in V) - /* increase the turf's brightness depending on the - brightness and distance of the lightsource */ - T.sd_lumcount -= (luminosity-get_dist(center,T)) - T.sd_lumcount = max(0, T.sd_lumcount) +atom/proc/sd_StripLum(list/V = view(luminosity,src), center = src) + // loop through all the turfs in V + for(var/turf/T in V) + /* increase the turf's brightness depending on the + brightness and distance of the lightsource */ + T.sd_lumcount -= (luminosity-get_dist(center,T)) + T.sd_lumcount = max(0, T.sd_lumcount) - //if(T.tag == "sdd") - // slog << "\red lc-([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])" - // slog << "now [T.sd_lumcount]" + //if(T.tag == "sdd") + // slog << "\red lc-([luminosity-get_dist(center,T)]) from [center] ([center:x],[center:y])" + // slog << "now [T.sd_lumcount]" - // update the turf's area - T.sd_LumUpdate() + // update the turf's area + T.sd_LumUpdate() - sd_ApplyLocalLum(list/affected = view(sd_top_luminosity,src)) - // Reapplies the lighting effect of all atoms in affected. - for(var/atom/A in affected) - if(A.luminosity) A.sd_ApplyLum() +atom/proc/sd_ApplyLocalLum(list/affected = view(sd_top_luminosity,src)) + // Reapplies the lighting effect of all atoms in affected. + for(var/atom/A in affected) + if(A.luminosity) A.sd_ApplyLum() - //if(sd_light_outside && (A in sd_light_spill_turfs)) - // A:sd_ApplySpill() + //if(sd_light_outside && (A in sd_light_spill_turfs)) + // A:sd_ApplySpill() - sd_StripLocalLum() - /* strips all local luminosity +atom/proc/sd_StripLocalLum() + /* strips all local luminosity - RETURNS: list of all the luminous atoms stripped + RETURNS: list of all the luminous atoms stripped - IMPORTANT! Each sd_StripLocalLum() call should have a matching - sd_ApplyLocalLum() to restore the local effect. */ - var/list/affected = list() - for(var/atom/A in view(sd_top_luminosity,src)) - var/turfflag = (isturf(src)?1:0) - if(A.luminosity && (get_dist(src,A) <= A.luminosity + turfflag)) - A.sd_StripLum() - affected += A + IMPORTANT! Each sd_StripLocalLum() call should have a matching + sd_ApplyLocalLum() to restore the local effect. */ + var/list/affected = list() + for(var/atom/A in view(sd_top_luminosity,src)) + var/turfflag = (isturf(src)?1:0) + if(A.luminosity && (get_dist(src,A) <= A.luminosity + turfflag)) + A.sd_StripLum() + affected += A - //if(sd_light_outside && (A in sd_light_spill_turfs)) - // A:sd_StripSpill() - // affected += A + //if(sd_light_outside && (A in sd_light_spill_turfs)) + // A:sd_StripSpill() + // affected += A - return affected + return affected - sd_SetLuminosity(new_luminosity as num) - /* This proc should be called everytime you want to change the - luminosity of an atom instead of setting it directly. +atom/proc/sd_SetLuminosity(new_luminosity as num) + /* This proc should be called everytime you want to change the + luminosity of an atom instead of setting it directly. - new_luminosity is the new value for luminosity. */ - if(luminosity>0) - sd_StripLum() - luminosity = new_luminosity - if(luminosity>0) - sd_ApplyLum() + new_luminosity is the new value for luminosity. */ + if(luminosity>0) + sd_StripLum() + luminosity = new_luminosity + if(luminosity>0) + sd_ApplyLum() - sd_SetOpacity(new_opacity as num) - /* if(opacity != new_opacity) - var/list/affected = sd_StripLocalLum() - opacity = new_opacity - sd_ApplyLocalLum(affected) */ - if(opacity == (new_opacity ? 1 : 0)) return - var - list - affected = new - //spill - atom/A - turf - T - ATurf +atom/proc/sd_SetOpacity(new_opacity as num) + /* if(opacity != new_opacity) + var/list/affected = sd_StripLocalLum() + opacity = new_opacity + sd_ApplyLocalLum(affected) */ + if(opacity == (new_opacity ? 1 : 0)) return + var + list affected = new - for(A in range(sd_top_luminosity,src)) - T = A - while(T && !istype(T)) T = T.loc - if(T) - var/list/V = view(A.luminosity,T) - if(!(src in V)) continue - var/turfflag = 0 - if(A == T) turfflag = 1 - if(A.luminosity && get_dist(A,src)<=A.luminosity+turfflag) - affected[A] = V - //if(sd_light_outside && (A in sd_light_spill_turfs)) - // if(!spill) spill=new - // spill[A] = view(sd_light_outside, T) - opacity = new_opacity - if(opacity) - for(A in affected) - ATurf = A - while(ATurf && !istype(ATurf)) ATurf = ATurf.loc - if(ATurf) - for(T in affected[A]-view(A.luminosity, ATurf)) - T.sd_lumcount -= (A.luminosity-get_dist(A,T)) - T.sd_lumcount = max(0, T.sd_lumcount) + //spill + atom/A + turf + T + ATurf + affected = new + for(A in range(sd_top_luminosity,src)) + T = A + while(T && !istype(T)) T = T.loc + if(T) + var/list/V = view(A.luminosity,T) + if(!(src in V)) continue + var/turfflag = 0 + if(A == T) turfflag = 1 + if(A.luminosity && get_dist(A,src)<=A.luminosity+turfflag) + affected[A] = V + //if(sd_light_outside && (A in sd_light_spill_turfs)) + // if(!spill) spill=new + // spill[A] = view(sd_light_outside, T) + opacity = new_opacity + if(opacity) + for(A in affected) + ATurf = A + while(ATurf && !istype(ATurf)) ATurf = ATurf.loc + if(ATurf) + for(T in affected[A]-view(A.luminosity, ATurf)) + T.sd_lumcount -= (A.luminosity-get_dist(A,T)) + T.sd_lumcount = max(0, T.sd_lumcount) - //if(T.tag == "sdd") - // slog << "\red lc(1)-([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])" - // slog << "now [T.sd_lumcount]" + //if(T.tag == "sdd") + // slog << "\red lc(1)-([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])" + // slog << "now [T.sd_lumcount]" - T.sd_LumUpdate() - /* - for(A in spill) - if(A.opacity && A!=src) continue - ATurf = A - while(ATurf && !istype(ATurf)) ATurf = ATurf.loc - if(ATurf) - //spill[A] -= view(sd_light_outside, A) - for(T in (A==src)?spill[A]:(spill[A]-view(sd_light_outside,ATurf))) - if(T.loc:sd_outside) continue - T.sd_lumcount -= (sd_light_outside-get_dist(A,T)) + T.sd_LumUpdate() + /* + for(A in spill) + if(A.opacity && A!=src) continue + ATurf = A + while(ATurf && !istype(ATurf)) ATurf = ATurf.loc + if(ATurf) + //spill[A] -= view(sd_light_outside, A) + for(T in (A==src)?spill[A]:(spill[A]-view(sd_light_outside,ATurf))) + if(T.loc:sd_outside) continue + T.sd_lumcount -= (sd_light_outside-get_dist(A,T)) - //if(T.tag == "sdd") - // slog << "\red lc(O)-([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])" - // slog << "now [T.sd_lumcount]" + //if(T.tag == "sdd") + // slog << "\red lc(O)-([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])" + // slog << "now [T.sd_lumcount]" - T.sd_LumUpdate() - */ + T.sd_LumUpdate() + */ - // end new_opacity = 1 block + // end new_opacity = 1 block - else - for(A in affected) - ATurf = A - while(ATurf && !istype(ATurf)) ATurf = ATurf.loc - if(ATurf) - for(T in view(A.luminosity, ATurf) - affected[A]) - T.sd_lumcount += (A.luminosity-get_dist(A,T)) - //if(T.tag == "sdd") - // slog << "\red lc(1)+([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])" - // slog << "now [T.sd_lumcount]" + else + for(A in affected) + ATurf = A + while(ATurf && !istype(ATurf)) ATurf = ATurf.loc + if(ATurf) + for(T in view(A.luminosity, ATurf) - affected[A]) + T.sd_lumcount += (A.luminosity-get_dist(A,T)) + //if(T.tag == "sdd") + // slog << "\red lc(1)+([A.luminosity-get_dist(A,T)]) from [A] ([A.x],[A.y])" + // slog << "now [T.sd_lumcount]" - T.sd_LumUpdate() - /* - for(A in spill) - if(A.opacity) continue - ATurf = A - while(ATurf && !istype(ATurf)) ATurf = ATurf.loc - if(ATurf) - for(T in (A==src)?spill[A]:(view(sd_light_outside, ATurf)-spill[A])) - if(T.loc:sd_outside) continue - T.sd_lumcount += (sd_light_outside-get_dist(A,T)) - //if(T.tag == "sdd") - // slog << "\red lc(O)+([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])" - // slog << "now [T.sd_lumcount]" + T.sd_LumUpdate() + /* + for(A in spill) + if(A.opacity) continue + ATurf = A + while(ATurf && !istype(ATurf)) ATurf = ATurf.loc + if(ATurf) + for(T in (A==src)?spill[A]:(view(sd_light_outside, ATurf)-spill[A])) + if(T.loc:sd_outside) continue + T.sd_lumcount += (sd_light_outside-get_dist(A,T)) + //if(T.tag == "sdd") + // slog << "\red lc(O)+([sd_light_outside-get_dist(A,T)]) from [A] ([A:x],[A:y])" + // slog << "now [T.sd_lumcount]" - T.sd_LumUpdate() + T.sd_LumUpdate() - */ - // end new_opacity = 0 block + */ + // end new_opacity = 0 block /// - sd_NewOpacity(var/new_opacity) - if(opacity != new_opacity) - var/list/affected = sd_StripLocalLum() - opacity = new_opacity - var/atom/T = src - while(T && !isturf(T)) - T = T.loc - if(T) - T:sd_lumcount = 0 +atom/proc/sd_NewOpacity(var/new_opacity) + if(opacity != new_opacity) + var/list/affected = sd_StripLocalLum() + opacity = new_opacity + var/atom/T = src + while(T && !isturf(T)) + T = T.loc + if(T) + T:sd_lumcount = 0 - sd_ApplyLocalLum(affected) + sd_ApplyLocalLum(affected) /// turf - var - // set to 1 to have outside light spill indoors from this turf - sd_light_spill = 0 - tmp - sd_lumcount = 0 // the brightness of the turf + var/sd_light_spill = 0 + var/tmp/sd_lumcount = 0 // the brightness of the turf - proc - sd_LumReset() - /* Clear local lum, reset this turf's sd_lumcount, and - re-apply local lum*/ - var/list/affected = sd_StripLocalLum() - sd_lumcount = 0 - //if(src.tag == "sdd") - // slog << "\red lc(LR)=0" - sd_ApplyLocalLum(affected) +turf/proc/sd_LumReset() + /* Clear local lum, reset this turf's sd_lumcount, and + re-apply local lum*/ + var/list/affected = sd_StripLocalLum() + sd_lumcount = 0 + //if(src.tag == "sdd") + // slog << "\red lc(LR)=0" - sd_LumUpdate() - set background = 1 - var/area/Loc = loc - if(!istype(Loc) || !Loc.sd_lighting) return + sd_ApplyLocalLum(affected) - // change the turf's area depending on its brightness - // restrict light to valid levels - var/light = min(max(sd_lumcount,0),sd_dark_shades) - var/ltag = copytext(Loc.tag,1,findtext(Loc.tag,"sd_L")) + "sd_L[light]" +turf/proc/sd_LumUpdate() + set background = 1 + var/area/Loc = loc + if(!istype(Loc) || !Loc.sd_lighting) return - if(Loc.tag!=ltag) //skip if already in this area - var/area/A = locate(ltag) // find an appropriate area - if(!A) - A = new Loc.type() // create area if it wasn't found - A.tag = ltag + // change the turf's area depending on its brightness + // restrict light to valid levels + var/light = min(max(sd_lumcount,0),sd_dark_shades) + var/ltag = copytext(Loc.tag,1,findtext(Loc.tag,"sd_L")) + "sd_L[light]" - // replicate vars - for(var/V in Loc.vars-"contents") - if(issaved(Loc.vars[V])) A.vars[V] = Loc.vars[V] + if(Loc.tag!=ltag) //skip if already in this area + var/area/A = locate(ltag) // find an appropriate area + if(!A) + A = new Loc.type() // create area if it wasn't found + A.tag = ltag + + // replicate vars + for(var/V in Loc.vars-"contents") + if(issaved(Loc.vars[V])) A.vars[V] = Loc.vars[V] - A.tag = ltag - /* - if(A.sd_outside) - if(!(A in sd_outside_areas)) - sd_outside_areas += A - A.sd_light_level = light - A.sd_LightLevel(light + sd_light_outside,0) - else - */ - A.sd_LightLevel(light) - // endelse + A.tag = ltag + /* + if(A.sd_outside) + if(!(A in sd_outside_areas)) + sd_outside_areas += A + A.sd_light_level = light + A.sd_LightLevel(light + sd_light_outside,0) + else + */ + A.sd_LightLevel(light) + // endelse - A.contents += src // move the turf into the area + A.contents += src // move the turf into the area /* - sd_ApplySpill() - if(opacity) return - var/oldlum = luminosity - luminosity = sd_light_outside - // loop through all the turfs in V - for(var/turf/T in view(sd_light_outside,src)) - var/area/A = T.loc - if(!istype(A) || A.sd_outside) continue - /* increase the turf's brightness depending on the - brightness and distance of the lightsource */ - T.sd_lumcount += (sd_light_outside-get_dist(src,T)) - //if(T.tag == "sdd") - // slog << "\red lc(AS)+([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])" - // slog << "now [T.sd_lumcount]" +turf/proc/sd_ApplySpill() + if(opacity) return + var/oldlum = luminosity + luminosity = sd_light_outside + // loop through all the turfs in V + for(var/turf/T in view(sd_light_outside,src)) + var/area/A = T.loc + if(!istype(A) || A.sd_outside) continue + /* increase the turf's brightness depending on the + brightness and distance of the lightsource */ + T.sd_lumcount += (sd_light_outside-get_dist(src,T)) + //if(T.tag == "sdd") + // slog << "\red lc(AS)+([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])" + // slog << "now [T.sd_lumcount]" - // update the turf's area - T.sd_LumUpdate() - luminosity = oldlum + // update the turf's area + T.sd_LumUpdate() + luminosity = oldlum - sd_StripSpill() - if(opacity) return - var/oldlum = luminosity - luminosity = sd_light_outside - // loop through all the turfs in V - for(var/turf/T in view(sd_light_outside,src)) - var/area/A = T.loc - if(!istype(A) || A.sd_outside) continue - /* increase the turf's brightness depending on the - brightness and distance of the lightsource */ - T.sd_lumcount -= (sd_light_outside-get_dist(src,T)) - //if(T.tag == "sdd") - // slog << "\red lc(AS)-([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])" - // slog << "now [T.sd_lumcount]" +turf/proc/sd_StripSpill() + if(opacity) return + var/oldlum = luminosity + luminosity = sd_light_outside + // loop through all the turfs in V + for(var/turf/T in view(sd_light_outside,src)) + var/area/A = T.loc + if(!istype(A) || A.sd_outside) continue + /* increase the turf's brightness depending on the + brightness and distance of the lightsource */ + T.sd_lumcount -= (sd_light_outside-get_dist(src,T)) + //if(T.tag == "sdd") + // slog << "\red lc(AS)-([sd_light_outside-get_dist(src,T)]) from [src] ([src:x],[src:y])" + // slog << "now [T.sd_lumcount]" - // update the turf's area - T.sd_LumUpdate() - luminosity = oldlum + // update the turf's area + T.sd_LumUpdate() + luminosity = oldlum - New() +turf/New() ..() if(sd_light_spill) sd_light_spill_turfs += src @@ -684,91 +677,89 @@ atom/movable/Move() // when something moves sd_ApplyLum() area - var /* Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area */ - sd_lighting = 1 + var/sd_lighting = 1 /* This var determines if an area is outside (affected by sunlight) or not. */ - sd_outside = 0 + var/sd_outside = 0 - sd_light_level = 0 // the current light level of the area + var/sd_light_level = 0 // the current light level of the area - sd_darkimage // tracks the darkness image of the area for easy removal + var/sd_darkimage // tracks the darkness image of the area for easy removal - proc - sd_LightLevel(slevel = sd_light_level as num, keep = 1) - if(!src) return - overlays -= sd_darkimage +area/proc/sd_LightLevel(slevel = sd_light_level as num, keep = 1) + if(!src) return + overlays -= sd_darkimage - if(keep) sd_light_level = slevel + if(keep) sd_light_level = slevel - slevel = min(max(slevel,0),sd_dark_shades) // restrict range + slevel = min(max(slevel,0),sd_dark_shades) // restrict range - if(slevel > 0) - luminosity = 1 - else - luminosity = 0 + if(slevel > 0) + luminosity = 1 + else + luminosity = 0 - sd_darkimage = image(sd_dark_icon,,num2text(slevel),sd_light_layer) - overlays += sd_darkimage + sd_darkimage = image(sd_dark_icon,,num2text(slevel),sd_light_layer) + overlays += sd_darkimage - /* - New() - ..() - if(!tag) tag = "[type]" - spawn(1) // wait a tick - if(sd_lighting) - // see if this area was created by the library - if(!findtext(tag, "sd_L")) - /* show the dark overlay so areas outside of luminous regions - won't be bright as day when they should be dark. */ - sd_LightLevel() - if(sd_outside) - sd_outside_areas += src - */ - proc/sd_New(sd_created) +/* +area/proc/New() + ..() + if(!tag) tag = "[type]" + spawn(1) // wait a tick + if(sd_lighting) + // see if this area was created by the library + if(!findtext(tag, "sd_L")) + /* show the dark overlay so areas outside of luminous regions + won't be bright as day when they should be dark. */ + sd_LightLevel() + if(sd_outside) + sd_outside_areas += src +*/ +area/proc/sd_New(sd_created) - if(!tag) tag = "[type]" - spawn(1) // wait a tick - if(sd_lighting) - // see if this area was created by the library - if(!sd_created) - /* show the dark overlay so areas outside of luminous regions - won't be bright as day when they should be dark. */ - sd_LightLevel() - //if(sd_outside) - // sd_outside_areas += src + if(!tag) tag = "[type]" + spawn(1) // wait a tick + if(sd_lighting) + // see if this area was created by the library + if(!sd_created) + /* show the dark overlay so areas outside of luminous regions + won't be bright as day when they should be dark. */ + sd_LightLevel() + //if(sd_outside) + // sd_outside_areas += src + +area/Del() + ..() + related -= src - Del() - ..() - related -= src -mob /* extend the mob procs to compensate for sight settings. */ - sd_ApplyLum(list/V, center = src) - if(!V) - if(isturf(loc)) - V = view(luminosity,loc) - else - V = view(luminosity,src) - . = ..(V, center) +mob/sd_ApplyLum(list/V, center = src) + if(!V) + if(isturf(loc)) + V = view(luminosity,loc) + else + V = view(luminosity,src) + . = ..(V, center) - sd_StripLum(list/V, center = src) - if(!V) - if(isturf(loc)) - V = view(luminosity,loc) - else - V = view(luminosity,src) - . = ..(V, center) +mob/sd_StripLum(list/V, center = src) + if(!V) + if(isturf(loc)) + V = view(luminosity,loc) + else + V = view(luminosity,src) + . = ..(V, center) - sd_ApplyLocalLum(list/affected) - if(!affected) - if(isturf(loc)) - affected = view(sd_top_luminosity,loc) - else - affected = view(sd_top_luminosity,src) - . = ..(affected) +mob/sd_ApplyLocalLum(list/affected) + if(!affected) + if(isturf(loc)) + affected = view(sd_top_luminosity,loc) + else + affected = view(sd_top_luminosity,src) + . = ..(affected) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 11af9254b7..b146a7bd94 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -17,127 +17,127 @@ var/locked = 0 var/drainratio = 1 - process() - if(P) - if(P.air_contents.toxins <= 0) - investigate_log("out of fuel.","singulo") - P.air_contents.toxins = 0 - eject() - else - P.air_contents.toxins -= 0.001*drainratio - return - - - attack_hand(mob/user as mob) - if(anchored) - if(!src.locked) - toggle_power() - user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ - "You turn the [src.name] [active? "on":"off"].") - investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") - return - else - user << "\red The controls are locked!" - return - ..() - - - attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/device/analyzer)) - user << "\blue The [W.name] detects that [last_power]W were recently produced." - return 1 - else if(istype(W, /obj/item/weapon/tank/plasma)) - if(!src.anchored) - user << "\red The [src] needs to be secured to the floor first." - return 1 - if(src.P) - user << "\red There's already a plasma tank loaded." - return 1 - user.drop_item() - src.P = W - W.loc = src - updateicon() - else if(istype(W, /obj/item/weapon/crowbar)) - if(P && !src.locked) - eject() - return 1 - else if(istype(W, /obj/item/weapon/wrench)) - if(P) - user << "\blue Remove the plasma tank first." - return 1 - playsound(src.loc, 'Ratchet.ogg', 75, 1) - src.anchored = !src.anchored - user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \ - "You [anchored? "secure":"undo"] the external bolts.", \ - "You hear a ratchet") - if(anchored) - connect_to_network() - else - disconnect_from_network() - else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if (src.allowed(user)) - if(active) - src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" - else - src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is active" - else - user << "\red Access denied!" - return 1 +/obj/machinery/power/rad_collector/process() + if(P) + if(P.air_contents.toxins <= 0) + investigate_log("out of fuel.","singulo") + P.air_contents.toxins = 0 + eject() else - ..() - return 1 + P.air_contents.toxins -= 0.001*drainratio + return - ex_act(severity) - switch(severity) - if(2, 3) - eject() - return ..() - - - proc/eject() - locked = 0 - var/obj/item/weapon/tank/plasma/Z = src.P - if (!Z) - return - Z.loc = get_turf(src) - Z.layer = initial(Z.layer) - src.P = null - if(active) +/obj/machinery/power/rad_collector/attack_hand(mob/user as mob) + if(anchored) + if(!src.locked) toggle_power() - else - updateicon() - - proc/receive_pulse(var/pulse_strength) - if(P && active) - var/power_produced = 0 - power_produced = P.air_contents.toxins*pulse_strength*20 - add_avail(power_produced) - last_power = power_produced + user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ + "You turn the [src.name] [active? "on":"off"].") + investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"It is empty"].","singulo") return - return - - - proc/updateicon() - overlays = null - if(P) - overlays += image('icons/obj/singularity.dmi', "ptank") - if(stat & (NOPOWER|BROKEN)) - return - if(active) - overlays += image('icons/obj/singularity.dmi', "on") - - - proc/toggle_power() - active = !active - if(active) - icon_state = "ca_on" - flick("ca_active", src) else - icon_state = "ca" - flick("ca_deactive", src) + user << "\red The controls are locked!" + return +..() + + +/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/device/analyzer)) + user << "\blue The [W.name] detects that [last_power]W were recently produced." + return 1 + else if(istype(W, /obj/item/weapon/tank/plasma)) + if(!src.anchored) + user << "\red The [src] needs to be secured to the floor first." + return 1 + if(src.P) + user << "\red There's already a plasma tank loaded." + return 1 + user.drop_item() + src.P = W + W.loc = src updateicon() - return + else if(istype(W, /obj/item/weapon/crowbar)) + if(P && !src.locked) + eject() + return 1 + else if(istype(W, /obj/item/weapon/wrench)) + if(P) + user << "\blue Remove the plasma tank first." + return 1 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + src.anchored = !src.anchored + user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \ + "You [anchored? "secure":"undo"] the external bolts.", \ + "You hear a ratchet") + if(anchored) + connect_to_network() + else + disconnect_from_network() + else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if (src.allowed(user)) + if(active) + src.locked = !src.locked + user << "The controls are now [src.locked ? "locked." : "unlocked."]" + else + src.locked = 0 //just in case it somehow gets locked + user << "\red The controls can only be locked when the [src] is active" + else + user << "\red Access denied!" + return 1 + else + ..() + return 1 + + +/obj/machinery/power/rad_collector/ex_act(severity) + switch(severity) + if(2, 3) + eject() + return ..() + + +/obj/machinery/power/rad_collector/proc/eject() + locked = 0 + var/obj/item/weapon/tank/plasma/Z = src.P + if (!Z) + return + Z.loc = get_turf(src) + Z.layer = initial(Z.layer) + src.P = null + if(active) + toggle_power() + else + updateicon() + +/obj/machinery/power/rad_collector/proc/receive_pulse(var/pulse_strength) + if(P && active) + var/power_produced = 0 + power_produced = P.air_contents.toxins*pulse_strength*20 + add_avail(power_produced) + last_power = power_produced + return + return + + +/obj/machinery/power/rad_collector/proc/updateicon() + overlays = null + if(P) + overlays += image('icons/obj/singularity.dmi', "ptank") + if(stat & (NOPOWER|BROKEN)) + return + if(active) + overlays += image('icons/obj/singularity.dmi', "on") + + +/obj/machinery/power/rad_collector/proc/toggle_power() + active = !active + if(active) + icon_state = "ca_on" + flick("ca_active", src) + else + icon_state = "ca" + flick("ca_deactive", src) + updateicon() + return diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 5a9d966e38..a61cadbea1 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -13,99 +13,99 @@ var/obj/machinery/field_generator/FG2 = null var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second. - New() - spawn(1) - src.sd_SetLuminosity(5) +/obj/machinery/containment_field/New() + spawn(1) + src.sd_SetLuminosity(5) - Del() - if(FG1 && !FG1.clean_up) - FG1.cleanup() - if(FG2 && !FG2.clean_up) - FG2.cleanup() - ..() +/obj/machinery/containment_field/Del() + if(FG1 && !FG1.clean_up) + FG1.cleanup() + if(FG2 && !FG2.clean_up) + FG2.cleanup() + ..() - attack_hand(mob/user as mob) - if(get_dist(src, user) > 1) - return 0 - else - shock(user) - return 1 - - - blob_act() +/obj/machinery/containment_field/attack_hand(mob/user as mob) + if(get_dist(src, user) > 1) return 0 + else + shock(user) + return 1 - ex_act(severity) +/obj/machinery/containment_field/blob_act() + return 0 + + +/obj/machinery/containment_field/ex_act(severity) + return 0 + + +/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj) + if(istype(AM,/mob/living/silicon) && prob(40)) + shock(AM) + return 1 + if(istype(AM,/mob/living/carbon) && prob(50)) + shock(AM) + return 1 + return 0 + + + +/obj/machinery/containment_field/proc/shock(mob/living/user as mob) + if(hasShocked) return 0 - - - HasProximity(atom/movable/AM as mob|obj) - if(istype(AM,/mob/living/silicon) && prob(40)) - shock(AM) - return 1 - if(istype(AM,/mob/living/carbon) && prob(50)) - shock(AM) - return 1 + if(!FG1 || !FG2) + del(src) return 0 + if(iscarbon(user)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, user.loc) + s.start() + hasShocked = 1 + var/shock_damage = min(rand(30,40),rand(30,40)) + user.burn_skin(shock_damage) + user.updatehealth() + user.visible_message("\red [user.name] was shocked by the [src.name]!", \ + "\red You feel a powerful shock course through your body sending you flying!", \ + "\red You hear a heavy electrical crack") - proc - shock(mob/living/user as mob) - if(hasShocked) - return 0 - if(!FG1 || !FG2) - del(src) - return 0 - if(iscarbon(user)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, user.loc) - s.start() + var/stun = min(shock_damage, 15) + user.Stun(stun) + user.Weaken(10) - hasShocked = 1 - var/shock_damage = min(rand(30,40),rand(30,40)) - user.burn_skin(shock_damage) - user.updatehealth() - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red You feel a powerful shock course through your body sending you flying!", \ - "\red You hear a heavy electrical crack") + user.updatehealth() + var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) + user.throw_at(target, 200, 4) - var/stun = min(shock_damage, 15) - user.Stun(stun) - user.Weaken(10) + sleep(20) + hasShocked = 0 + return - user.updatehealth() - var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - user.throw_at(target, 200, 4) + else if(issilicon(user)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, user.loc) + s.start() - sleep(20) - hasShocked = 0 - return + hasShocked = 1 + var/shock_damage = rand(15,30) + user.take_overall_damage(0,shock_damage) + user.visible_message("\red [user.name] was shocked by the [src.name]!", \ + "\red Energy pulse detected, system damaged!", \ + "\red You hear an electrical crack") + if(prob(20)) + user.Stun(2) - else if(issilicon(user)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, user.loc) - s.start() + sleep(20) + hasShocked = 0 + return - hasShocked = 1 - var/shock_damage = rand(15,30) - user.take_overall_damage(0,shock_damage) - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red Energy pulse detected, system damaged!", \ - "\red You hear an electrical crack") - if(prob(20)) - user.Stun(2) + return - sleep(20) - hasShocked = 0 - return - - return - - set_master(var/master1,var/master2) - if(!master1 || !master2) - return 0 - FG1 = master1 - FG2 = master2 - return 1 +/obj/machinery/containment_field/proc/set_master(var/master1,var/master2) + if(!master1 || !master2) + return 0 + FG1 = master1 + FG2 = master2 + return 1 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f4770c51e3..777b3fc054 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -21,192 +21,192 @@ var/locked = 0 - verb/rotate() - set name = "Rotate" - set category = "Object" - set src in oview(1) +/obj/machinery/emitter/verb/rotate() + set name = "Rotate" + set category = "Object" + set src in oview(1) - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 90) - return 1 + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 90) + return 1 - New() - ..() - return +/obj/machinery/emitter/New() + ..() + return - Del() - investigate_log("deleted at ([x],[y],[z])","singulo") - ..() +/obj/machinery/emitter/Del() + investigate_log("deleted at ([x],[y],[z])","singulo") + ..() - update_icon() - if (active && !(stat & (NOPOWER|BROKEN))) - icon_state = "emitter_+a" - else - icon_state = "emitter" +/obj/machinery/emitter/update_icon() + if (active && !(stat & (NOPOWER|BROKEN))) + icon_state = "emitter_+a" + else + icon_state = "emitter" - attack_hand(mob/user as mob) - src.add_fingerprint(user) - if(state == 2) - if(!src.locked) - if(src.active==1) - src.active = 0 - user << "You turn off the [src]." - src.use_power = 1 - investigate_log("turned off by [user.key]","singulo") - else - src.active = 1 - user << "You turn on the [src]." - src.shot_number = 0 - src.fire_delay = 100 - src.use_power = 2 - investigate_log("turned on by [user.key]","singulo") - update_icon() - else - user << "\red The controls are locked!" - else - user << "\red The [src] needs to be firmly secured to the floor first." - return 1 - - - emp_act(var/severity)//Emitters are hardened but still might have issues - use_power(50) - if((severity == 1)&&prob(1)&&prob(1)) - if(src.active) +/obj/machinery/emitter/attack_hand(mob/user as mob) + src.add_fingerprint(user) + if(state == 2) + if(!src.locked) + if(src.active==1) src.active = 0 + user << "You turn off the [src]." src.use_power = 1 + investigate_log("turned off by [user.key]","singulo") + else + src.active = 1 + user << "You turn on the [src]." + src.shot_number = 0 + src.fire_delay = 100 + src.use_power = 2 + investigate_log("turned on by [user.key]","singulo") + update_icon() + else + user << "\red The controls are locked!" + else + user << "\red The [src] needs to be firmly secured to the floor first." return 1 - process() - if(stat & (NOPOWER|BROKEN)) - return - if(src.state != 2) +/obj/machinery/emitter/emp_act(var/severity)//Emitters are hardened but still might have issues + use_power(50) + if((severity == 1)&&prob(1)&&prob(1)) + if(src.active) src.active = 0 + src.use_power = 1 + return 1 + + +/obj/machinery/emitter/process() + if(stat & (NOPOWER|BROKEN)) + return + if(src.state != 2) + src.active = 0 + return + if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) + src.last_shot = world.time + if(src.shot_number < 3) + src.fire_delay = 2 + src.shot_number ++ + else + src.fire_delay = rand(20,100) + src.shot_number = 0 + use_power(1000) + var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) + playsound(src.loc, 'emitter.ogg', 25, 1) + if(prob(35)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + A.dir = src.dir + if(src.dir == 1)//Up + A.yo = 20 + A.xo = 0 + else if(src.dir == 2)//Down + A.yo = -20 + A.xo = 0 + else if(src.dir == 4)//Right + A.yo = 0 + A.xo = 20 + else if(src.dir == 8)//Left + A.yo = 0 + A.xo = -20 + else // Any other + A.yo = -20 + A.xo = 0 + A.process() + + +/obj/machinery/emitter/attackby(obj/item/W, mob/user) + + if(istype(W, /obj/item/weapon/wrench)) + if(active) + user << "Turn off the [src] first." return - if(((src.last_shot + src.fire_delay) <= world.time) && (src.active == 1)) - src.last_shot = world.time - if(src.shot_number < 3) - src.fire_delay = 2 - src.shot_number ++ - else - src.fire_delay = rand(20,100) - src.shot_number = 0 - use_power(1000) - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) - playsound(src.loc, 'emitter.ogg', 25, 1) - if(prob(35)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - A.dir = src.dir - if(src.dir == 1)//Up - A.yo = 20 - A.xo = 0 - else if(src.dir == 2)//Down - A.yo = -20 - A.xo = 0 - else if(src.dir == 4)//Right - A.yo = 0 - A.xo = 20 - else if(src.dir == 8)//Left - A.yo = 0 - A.xo = -20 - else // Any other - A.yo = -20 - A.xo = 0 - A.process() + switch(state) + if(0) + state = 1 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] secures [src.name] to the floor.", \ + "You secure the external reinforcing bolts to the floor.", \ + "You hear a ratchet") + src.anchored = 1 + if(1) + state = 0 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ + "You undo the external reinforcing bolts.", \ + "You hear a ratchet") + src.anchored = 0 + if(2) + user << "\red The [src.name] needs to be unwelded from the floor." + return - - attackby(obj/item/W, mob/user) - - if(istype(W, /obj/item/weapon/wrench)) - if(active) - user << "Turn off the [src] first." - return - switch(state) - if(0) - state = 1 - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear a ratchet") - src.anchored = 1 - if(1) - state = 0 - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear a ratchet") - src.anchored = 0 - if(2) - user << "\red The [src.name] needs to be unwelded from the floor." + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(active) + user << "Turn off the [src] first." return - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(active) - user << "Turn off the [src] first." - return - switch(state) - if(0) - user << "\red The [src.name] needs to be wrenched to the floor." - if(1) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ - "You start to weld the [src] to the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 2 - user << "You weld the [src] to the floor." - else - user << "\red You need more welding fuel to complete this task." - if(2) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ - "You start to cut the [src] free from the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 1 - user << "You cut the [src] free from the floor." - else - user << "\red You need more welding fuel to complete this task." - return - - if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) - if(emagged) - user << "\red The lock seems to be broken" - return - if(src.allowed(user)) - if(active) - src.locked = !src.locked - user << "The controls are now [src.locked ? "locked." : "unlocked."]" + switch(state) + if(0) + user << "\red The [src.name] needs to be wrenched to the floor." + if(1) + if (WT.remove_fuel(0,user)) + playsound(src.loc, 'Welder2.ogg', 50, 1) + user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ + "You start to weld the [src] to the floor.", \ + "You hear welding") + if (do_after(user,20)) + if(!src || !WT.isOn()) return + state = 2 + user << "You weld the [src] to the floor." else - src.locked = 0 //just in case it somehow gets locked - user << "\red The controls can only be locked when the [src] is online" + user << "\red You need more welding fuel to complete this task." + if(2) + if (WT.remove_fuel(0,user)) + playsound(src.loc, 'Welder2.ogg', 50, 1) + user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ + "You start to cut the [src] free from the floor.", \ + "You hear welding") + if (do_after(user,20)) + if(!src || !WT.isOn()) return + state = 1 + user << "You cut the [src] free from the floor." + else + user << "\red You need more welding fuel to complete this task." + return + + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) + if(emagged) + user << "\red The lock seems to be broken" + return + if(src.allowed(user)) + if(active) + src.locked = !src.locked + user << "The controls are now [src.locked ? "locked." : "unlocked."]" else - user << "\red Access denied." - return - - - if(istype(W, /obj/item/weapon/card/emag) && !emagged) - locked = 0 - emagged = 1 - user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.") - return - - ..() + src.locked = 0 //just in case it somehow gets locked + user << "\red The controls can only be locked when the [src] is online" + else + user << "\red Access denied." return - power_change() - ..() - update_icon() + if(istype(W, /obj/item/weapon/card/emag) && !emagged) + locked = 0 + emagged = 1 + user.visible_message("[user.name] emags the [src.name].","\red You short out the lock.") return + + ..() + return + + +/obj/machinery/emitter/power_change() + ..() + update_icon() + return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 5f2a62253e..c8003d6c06 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -33,318 +33,318 @@ field_generator power level display var/clean_up = 0 - update_icon() - overlays = null - if(!active) - if(warming_up) - overlays += "+a[warming_up]" - if(fields.len) - overlays += "+on" - // Power level indicator - // Scale % power to % num_power_levels and truncate value - var/level = round(num_power_levels * power / field_generator_max_power) - // Clamp between 0 and num_power_levels for out of range power values - level = between(0, level, num_power_levels) - if(level) - overlays += "+p[level]" +/obj/machinery/field_generator/update_icon() + overlays = null + if(!active) + if(warming_up) + overlays += "+a[warming_up]" + if(fields.len) + overlays += "+on" + // Power level indicator + // Scale % power to % num_power_levels and truncate value + var/level = round(num_power_levels * power / field_generator_max_power) + // Clamp between 0 and num_power_levels for out of range power values + level = between(0, level, num_power_levels) + if(level) + overlays += "+p[level]" - return + return - New() - ..() - fields = list() - connected_gens = list() - return +/obj/machinery/field_generator/New() + ..() + fields = list() + connected_gens = list() + return - process() - if(Varedit_start == 1) - if(active == 0) - active = 1 - state = 2 - power = field_generator_max_power - anchored = 1 - warming_up = 3 - start_fields() - update_icon() - Varedit_start = 0 - - if(src.active == 2) - calc_power() - update_icon() - return - - - attack_hand(mob/user as mob) - if(state == 2) - if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on - if(src.active >= 1) - user << "You are unable to turn off the [src.name] once it is online." - return 1 - else - user.visible_message("[user.name] turns on the [src.name]", \ - "You turn on the [src.name].", \ - "You hear heavy droning") - turn_on() - investigate_log("activated by [user.key].","singulo") - - src.add_fingerprint(user) - else - user << "The [src] needs to be firmly secured to the floor first." - return - - - attackby(obj/item/W, mob/user) - if(active) - user << "The [src] needs to be off." - return - else if(istype(W, /obj/item/weapon/wrench)) - switch(state) - if(0) - state = 1 - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the external reinforcing bolts to the floor.", \ - "You hear ratchet") - src.anchored = 1 - if(1) - state = 0 - playsound(src.loc, 'Ratchet.ogg', 75, 1) - user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ - "You undo the external reinforcing bolts.", \ - "You hear ratchet") - src.anchored = 0 - if(2) - user << "\red The [src.name] needs to be unwelded from the floor." - return - else if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - switch(state) - if(0) - user << "\red The [src.name] needs to be wrenched to the floor." - return - if(1) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ - "You start to weld the [src] to the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 2 - user << "You weld the field generator to the floor." - else - return - if(2) - if (WT.remove_fuel(0,user)) - playsound(src.loc, 'Welder2.ogg', 50, 1) - user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ - "You start to cut the [src] free from the floor.", \ - "You hear welding") - if (do_after(user,20)) - if(!src || !WT.isOn()) return - state = 1 - user << "You cut the [src] free from the floor." - else - return - else - ..() - return - - - emp_act() - return 0 - - - blob_act() - if(active) - return 0 - else - ..() - - - bullet_act(var/obj/item/projectile/Proj) - if(Proj.flag != "bullet") - power += Proj.damage - update_icon() - return 0 - - - Del() - src.cleanup() - ..() - - - proc - turn_off() - active = 0 - spawn(1) - src.cleanup() - update_icon() - - turn_on() +/obj/machinery/field_generator/process() + if(Varedit_start == 1) + if(active == 0) active = 1 - warming_up = 1 - spawn(1) - while (warming_up<3 && active) - sleep(50) - warming_up++ - update_icon() - if(warming_up >= 3) - start_fields() + state = 2 + power = field_generator_max_power + anchored = 1 + warming_up = 3 + start_fields() update_icon() + Varedit_start = 0 - + if(src.active == 2) calc_power() - if(Varpower) - return 1 + update_icon() + return - update_icon() - if(src.power > field_generator_max_power) - src.power = field_generator_max_power - var/power_draw = 2 - for (var/obj/machinery/containment_field/F in fields) - if (isnull(F)) - continue - power_draw++ - if(draw_power(round(power_draw/2,1))) +/obj/machinery/field_generator/attack_hand(mob/user as mob) + if(state == 2) + if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on + if(src.active >= 1) + user << "You are unable to turn off the [src.name] once it is online." return 1 else - for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] shuts down!") - turn_off() - investigate_log("ran out of power and deactivated","singulo") - src.power = 0 - return 0 + user.visible_message("[user.name] turns on the [src.name]", \ + "You turn on the [src.name].", \ + "You hear heavy droning") + turn_on() + investigate_log("activated by [user.key].","singulo") + + src.add_fingerprint(user) + else + user << "The [src] needs to be firmly secured to the floor first." + return + + +/obj/machinery/field_generator/attackby(obj/item/W, mob/user) + if(active) + user << "The [src] needs to be off." + return + else if(istype(W, /obj/item/weapon/wrench)) + switch(state) + if(0) + state = 1 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] secures [src.name] to the floor.", \ + "You secure the external reinforcing bolts to the floor.", \ + "You hear ratchet") + src.anchored = 1 + if(1) + state = 0 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ + "You undo the external reinforcing bolts.", \ + "You hear ratchet") + src.anchored = 0 + if(2) + user << "\red The [src.name] needs to be unwelded from the floor." + return + else if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + switch(state) + if(0) + user << "\red The [src.name] needs to be wrenched to the floor." + return + if(1) + if (WT.remove_fuel(0,user)) + playsound(src.loc, 'Welder2.ogg', 50, 1) + user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \ + "You start to weld the [src] to the floor.", \ + "You hear welding") + if (do_after(user,20)) + if(!src || !WT.isOn()) return + state = 2 + user << "You weld the field generator to the floor." + else + return + if(2) + if (WT.remove_fuel(0,user)) + playsound(src.loc, 'Welder2.ogg', 50, 1) + user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \ + "You start to cut the [src] free from the floor.", \ + "You hear welding") + if (do_after(user,20)) + if(!src || !WT.isOn()) return + state = 1 + user << "You cut the [src] free from the floor." + else + return + else + ..() + return + + +/obj/machinery/field_generator/emp_act() + return 0 + + +/obj/machinery/field_generator/blob_act() + if(active) + return 0 + else + ..() + + +/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj) + if(Proj.flag != "bullet") + power += Proj.damage + update_icon() + return 0 + + +/obj/machinery/field_generator/Del() + src.cleanup() + ..() + + + +/obj/machinery/field_generator/proc/turn_off() + active = 0 + spawn(1) + src.cleanup() + update_icon() + +/obj/machinery/field_generator/proc/turn_on() + active = 1 + warming_up = 1 + spawn(1) + while (warming_up<3 && active) + sleep(50) + warming_up++ + update_icon() + if(warming_up >= 3) + start_fields() + update_icon() + + +/obj/machinery/field_generator/proc/calc_power() + if(Varpower) + return 1 + + update_icon() + if(src.power > field_generator_max_power) + src.power = field_generator_max_power + + var/power_draw = 2 + for (var/obj/machinery/containment_field/F in fields) + if (isnull(F)) + continue + power_draw++ + if(draw_power(round(power_draw/2,1))) + return 1 + else + for(var/mob/M in viewers(src)) + M.show_message("\red The [src.name] shuts down!") + turn_off() + investigate_log("ran out of power and deactivated","singulo") + src.power = 0 + return 0 //This could likely be better, it tends to start loopin if you have a complex generator loop setup. Still works well enough to run the engine fields will likely recode the field gens and fields sometime -Mport - draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null) - if(Varpower) - return 1 - if((G && G == src) || (failsafe >= 8))//Loopin, set fail - return 0 - else - failsafe++ - if(src.power >= draw)//We have enough power - src.power -= draw - return 1 - else//Need more power - draw -= src.power - src.power = 0 - for(var/obj/machinery/field_generator/FG in connected_gens) - if(isnull(FG)) - continue - if(FG == last)//We just asked you - continue - if(G)//Another gen is askin for power and we dont have it - if(FG.draw_power(draw,failsafe,G,src))//Can you take the load - return 1 - else - return 0 - else//We are askin another for power - if(FG.draw_power(draw,failsafe,src,src)) - return 1 - else - return 0 - - - start_fields() - if(!src.state == 2 || !anchored) - turn_off() - return - spawn(1) - setup_field(1) - spawn(2) - setup_field(2) - spawn(3) - setup_field(4) - spawn(4) - setup_field(8) - src.active = 2 - - - setup_field(var/NSEW) - var/turf/T = src.loc - var/obj/machinery/field_generator/G - var/steps = 0 - if(!NSEW)//Make sure its ran right - return - for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator - T = get_step(T, NSEW) - if(T.density)//We cant shoot a field though this +/obj/machinery/field_generator/proc/draw_power(var/draw = 0, var/failsafe = 0, var/obj/machinery/field_generator/G = null, var/obj/machinery/field_generator/last = null) + if(Varpower) + return 1 + if((G && G == src) || (failsafe >= 8))//Loopin, set fail + return 0 + else + failsafe++ + if(src.power >= draw)//We have enough power + src.power -= draw + return 1 + else//Need more power + draw -= src.power + src.power = 0 + for(var/obj/machinery/field_generator/FG in connected_gens) + if(isnull(FG)) + continue + if(FG == last)//We just asked you + continue + if(G)//Another gen is askin for power and we dont have it + if(FG.draw_power(draw,failsafe,G,src))//Can you take the load + return 1 + else + return 0 + else//We are askin another for power + if(FG.draw_power(draw,failsafe,src,src)) + return 1 + else return 0 - for(var/atom/A in T.contents) - if(ismob(A)) - continue - if(!istype(A,/obj/machinery/field_generator)) - if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density)) - return 0 - steps += 1 - G = locate(/obj/machinery/field_generator) in T - if(!isnull(G)) - steps -= 1 - if(!G.active) - return 0 - break - if(isnull(G)) - return - T = src.loc - for(var/dist = 0, dist < steps, dist += 1) // creates each field tile - var/field_dir = get_dir(T,get_step(G.loc, NSEW)) - T = get_step(T, NSEW) - if(!locate(/obj/machinery/containment_field) in T) - var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field() - CF.set_master(src,G) - fields += CF - G.fields += CF - CF.loc = T - CF.dir = field_dir - var/listcheck = 0 - for(var/obj/machinery/field_generator/FG in connected_gens) - if (isnull(FG)) - continue - if(FG == G) - listcheck = 1 - break - if(!listcheck) - connected_gens.Add(G) - listcheck = 0 - for(var/obj/machinery/field_generator/FG2 in G.connected_gens) - if (isnull(FG2)) - continue - if(FG2 == src) - listcheck = 1 - break - if(!listcheck) - G.connected_gens.Add(src) - cleanup() - clean_up = 1 - for (var/obj/machinery/containment_field/F in fields) - if (isnull(F)) - continue - del(F) - fields = list() - for(var/obj/machinery/field_generator/FG in connected_gens) - if (isnull(FG)) - continue - FG.connected_gens.Remove(src) - connected_gens.Remove(FG) - connected_gens = list() - clean_up = 0 +/obj/machinery/field_generator/proc/start_fields() + if(!src.state == 2 || !anchored) + turn_off() + return + spawn(1) + setup_field(1) + spawn(2) + setup_field(2) + spawn(3) + setup_field(4) + spawn(4) + setup_field(8) + src.active = 2 - //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the - //singulo eats the evidence". It's not fool-proof but better than nothing. - //I want to avoid using global variables. - spawn(1) - var/temp = 1 //stops spam - for(var/obj/machinery/singularity/O in world) - if(O.last_warning && temp) - if((world.time - O.last_warning) > 50) //to stop message-spam - temp = 0 - message_admins("A singulo exists and a containment field has failed.",1) - investigate_log("has failed whilst a singulo exists.","singulo") - O.last_warning = world.time + +/obj/machinery/field_generator/proc/setup_field(var/NSEW) + var/turf/T = src.loc + var/obj/machinery/field_generator/G + var/steps = 0 + if(!NSEW)//Make sure its ran right + return + for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator + T = get_step(T, NSEW) + if(T.density)//We cant shoot a field though this + return 0 + for(var/atom/A in T.contents) + if(ismob(A)) + continue + if(!istype(A,/obj/machinery/field_generator)) + if((istype(A,/obj/machinery/door)||istype(A,/obj/machinery/the_singularitygen))&&(A.density)) + return 0 + steps += 1 + G = locate(/obj/machinery/field_generator) in T + if(!isnull(G)) + steps -= 1 + if(!G.active) + return 0 + break + if(isnull(G)) + return + T = src.loc + for(var/dist = 0, dist < steps, dist += 1) // creates each field tile + var/field_dir = get_dir(T,get_step(G.loc, NSEW)) + T = get_step(T, NSEW) + if(!locate(/obj/machinery/containment_field) in T) + var/obj/machinery/containment_field/CF = new/obj/machinery/containment_field() + CF.set_master(src,G) + fields += CF + G.fields += CF + CF.loc = T + CF.dir = field_dir + var/listcheck = 0 + for(var/obj/machinery/field_generator/FG in connected_gens) + if (isnull(FG)) + continue + if(FG == G) + listcheck = 1 + break + if(!listcheck) + connected_gens.Add(G) + listcheck = 0 + for(var/obj/machinery/field_generator/FG2 in G.connected_gens) + if (isnull(FG2)) + continue + if(FG2 == src) + listcheck = 1 + break + if(!listcheck) + G.connected_gens.Add(src) + + +/obj/machinery/field_generator/proc/cleanup() + clean_up = 1 + for (var/obj/machinery/containment_field/F in fields) + if (isnull(F)) + continue + del(F) + fields = list() + for(var/obj/machinery/field_generator/FG in connected_gens) + if (isnull(FG)) + continue + FG.connected_gens.Remove(src) + connected_gens.Remove(FG) + connected_gens = list() + clean_up = 0 + + //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the + //singulo eats the evidence". It's not fool-proof but better than nothing. + //I want to avoid using global variables. + spawn(1) + var/temp = 1 //stops spam + for(var/obj/machinery/singularity/O in world) + if(O.last_warning && temp) + if((world.time - O.last_warning) > 50) //to stop message-spam + temp = 0 + message_admins("A singulo exists and a containment field has failed.",1) + investigate_log("has failed whilst a singulo exists.","singulo") + O.last_warning = world.time diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index cb8e51d792..eb9c7756a1 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -10,66 +10,66 @@ var/movement_range = 10 var/energy = 10 - weak - movement_range = 8 - energy = 5 +/obj/effect/accelerated_particle/weak + movement_range = 8 + energy = 5 - strong - movement_range = 15 - energy = 15 +/obj/effect/accelerated_particle/strong + movement_range = 15 + energy = 15 - New(loc, dir = 2) - src.loc = loc - src.dir = dir - if(movement_range > 20) - movement_range = 20 - spawn(0) - move(1) - return +/obj/effect/accelerated_particle/New(loc, dir = 2) + src.loc = loc + src.dir = dir + if(movement_range > 20) + movement_range = 20 + spawn(0) + move(1) + return - Bump(atom/A) - if (A) - if(ismob(A)) - toxmob(A) - if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/))) - A:energy += energy - return - - - Bumped(atom/A) +/obj/effect/accelerated_particle/Bump(atom/A) + if (A) if(ismob(A)) - Bump(A) - return + toxmob(A) + if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/machinery/singularity/))) + A:energy += energy + return - ex_act(severity) - del(src) - return +/obj/effect/accelerated_particle/Bumped(atom/A) + if(ismob(A)) + Bump(A) + return - proc - toxmob(var/mob/living/M) - var/radiation = (energy*2) +/obj/effect/accelerated_particle/ex_act(severity) + del(src) + return + + + +/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M) + var/radiation = (energy*2) /* if(istype(M,/mob/living/carbon/human)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1) - if(istype(M,/mob/living/carbon/monkey)) - if(M:wear_suit) //TODO: check for radiation protection - radiation = round(radiation/2,1)*/ - M.apply_effect((radiation*3),IRRADIATE,0) - M.updatehealth() - //M << "\red You feel odd." - return + if(M:wear_suit) //TODO: check for radiation protection + radiation = round(radiation/2,1) + if(istype(M,/mob/living/carbon/monkey)) + if(M:wear_suit) //TODO: check for radiation protection + radiation = round(radiation/2,1)*/ + M.apply_effect((radiation*3),IRRADIATE,0) + M.updatehealth() + //M << "\red You feel odd." + return - move(var/lag) - if(!step(src,dir)) - src.loc = get_step(src,dir) - movement_range-- - if(movement_range <= 0) - del(src) - else - sleep(lag) - move(lag) +/obj/effect/accelerated_particle/proc/move(var/lag) + if(!step(src,dir)) + src.loc = get_step(src,dir) + movement_range-- + if(movement_range <= 0) + del(src) + else + sleep(lag) + move(lag) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 327363433f..d54ffb2f9e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -71,212 +71,187 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin var/strength = null var/desc_holder = null - end_cap - name = "Alpha Particle Generation Array" - desc_holder = "This is where Alpha particles are generated from \[REDACTED\]" - icon_state = "end_cap" - reference = "end_cap" +/obj/structure/particle_accelerator/end_cap + name = "Alpha Particle Generation Array" + desc_holder = "This is where Alpha particles are generated from \[REDACTED\]" + icon_state = "end_cap" + reference = "end_cap" -/* update_icon() - switch(construction_state) - if(0) - icon_state="[reference]" - if(1) - icon_state="[reference]" - if(2) - icon_state="[reference]w" - if(3) - if(powered) - switch(strength) - if(0) - icon_state="[reference]p0" - if(1) - icon_state="[reference]p1" - if(2) - icon_state="[reference]p2" - else - icon_state="[reference]p" - else - icon_state="[reference]c" +/obj/structure/particle_accelerator/update_icon() + ..() + return + + +/obj/structure/particle_accelerator/verb/rotate() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 270) + return 1 + +/obj/structure/particle_accelerator/verb/rotateccw() + set name = "Rotate Counter Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 90) + return 1 + +/obj/structure/particle_accelerator/examine() + switch(src.construction_state) + if(0) + src.desc = text("A [name], looks like it's not attached to the flooring") + if(1) + src.desc = text("A [name], it is missing some cables") + if(2) + src.desc = text("A [name], the panel is open") + if(3) + src.desc = text("The [name] is assembled") + if(powered) + src.desc = src.desc_holder + ..() + return + + +/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user) + if(istool(W)) + if(src.process_tool_hit(W,user)) return -*/ + ..() + return - update_icon() - ..() + +/obj/structure/particle_accelerator/Move() + ..() + if(master && master.active) + master.toggle_power() + investigate_log("was moved whilst active; it powered down.","singulo") + +/obj/structure/particle_accelerator/ex_act(severity) + switch(severity) + if(1.0) + del(src) return - - - verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 270) - return 1 - - verb/rotateccw() - set name = "Rotate Counter Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 90) - return 1 - - examine() - switch(src.construction_state) - if(0) - src.desc = text("A [name], looks like it's not attached to the flooring") - if(1) - src.desc = text("A [name], it is missing some cables") - if(2) - src.desc = text("A [name], the panel is open") - if(3) - src.desc = text("The [name] is assembled") - if(powered) - src.desc = src.desc_holder - ..() - return - - - attackby(obj/item/W, mob/user) - if(istool(W)) - if(src.process_tool_hit(W,user)) - return - ..() - return - - - Move() - ..() - if(master && master.active) - master.toggle_power() - investigate_log("was moved whilst active; it powered down.","singulo") - - ex_act(severity) - switch(severity) - if(1.0) + if(2.0) + if (prob(50)) del(src) return - if(2.0) - if (prob(50)) - del(src) - return - if(3.0) - if (prob(25)) - del(src) - return + if(3.0) + if (prob(25)) + del(src) + return + else + return + + +/obj/structure/particle_accelerator/blob_act() + if(prob(50)) + del(src) + return + + +/obj/structure/particle_accelerator/meteorhit() + if(prob(50)) + del(src) + return + +/obj/structure/particle_accelerator/update_icon() + switch(construction_state) + if(0,1) + icon_state="[reference]" + if(2) + icon_state="[reference]w" + if(3) + if(powered) + icon_state="[reference]p[strength]" else - return + icon_state="[reference]c" + return + +/obj/structure/particle_accelerator/proc/update_state() + if(master) + master.update_state() + return 0 - blob_act() - if(prob(50)) - del(src) - return +/obj/structure/particle_accelerator/proc/report_ready(var/obj/O) + if(O && (O == master)) + if(construction_state >= 3) + return 1 + return 0 - meteorhit() - if(prob(50)) - del(src) - return - - update_icon() - switch(construction_state) - if(0,1) - icon_state="[reference]" - if(2) - icon_state="[reference]w" - if(3) - if(powered) - icon_state="[reference]p[strength]" - else - icon_state="[reference]c" - return - - proc - update_state() - if(master) - master.update_state() - return 0 +/obj/structure/particle_accelerator/proc/report_master() + if(master) + return master + return 0 - report_ready(var/obj/O) - if(O && (O == master)) - if(construction_state >= 3) - return 1 - return 0 +/obj/structure/particle_accelerator/proc/connect_master(var/obj/O) + if(O && istype(O,/obj/machinery/particle_accelerator/control_box)) + if(O.dir == src.dir) + master = O + return 1 + return 0 - report_master() - if(master) - return master - return 0 +/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) + if(!(O) || !(user)) + return 0 + if(!ismob(user) || !isobj(O)) + return 0 + var/temp_state = src.construction_state - - connect_master(var/obj/O) - if(O && istype(O,/obj/machinery/particle_accelerator/control_box)) - if(O.dir == src.dir) - master = O - return 1 - return 0 - - - process_tool_hit(var/obj/O, var/mob/user) - if(!(O) || !(user)) - return 0 - if(!ismob(user) || !isobj(O)) - return 0 - var/temp_state = src.construction_state - - switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps - if(0) - if(iswrench(O)) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - src.anchored = 1 - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the external bolts.") - temp_state++ - if(1) - if(iswrench(O)) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - src.anchored = 0 - user.visible_message("[user.name] detaches the [src.name] from the floor.", \ - "You remove the external bolts.") - temp_state-- - else if(iscoil(O)) - if(O:use(1,user)) - user.visible_message("[user.name] adds wires to the [src.name].", \ - "You add some wires.") - temp_state++ - if(2) - if(iswirecutter(O))//TODO:Shock user if its on? - user.visible_message("[user.name] removes some wires from the [src.name].", \ - "You remove some wires.") - temp_state-- - else if(isscrewdriver(O)) - user.visible_message("[user.name] closes the [src.name]'s access panel.", \ - "You close the access panel.") - temp_state++ - if(3) - if(isscrewdriver(O)) - user.visible_message("[user.name] opens the [src.name]'s access panel.", \ - "You open the access panel.") - temp_state-- - if(temp_state == src.construction_state)//Nothing changed - return 0 - else - src.construction_state = temp_state - if(src.construction_state < 3)//Was taken apart, update state - update_state() - update_icon() - return 1 - return 0 + switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps + if(0) + if(iswrench(O)) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + src.anchored = 1 + user.visible_message("[user.name] secures the [src.name] to the floor.", \ + "You secure the external bolts.") + temp_state++ + if(1) + if(iswrench(O)) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + src.anchored = 0 + user.visible_message("[user.name] detaches the [src.name] from the floor.", \ + "You remove the external bolts.") + temp_state-- + else if(iscoil(O)) + if(O:use(1,user)) + user.visible_message("[user.name] adds wires to the [src.name].", \ + "You add some wires.") + temp_state++ + if(2) + if(iswirecutter(O))//TODO:Shock user if its on? + user.visible_message("[user.name] removes some wires from the [src.name].", \ + "You remove some wires.") + temp_state-- + else if(isscrewdriver(O)) + user.visible_message("[user.name] closes the [src.name]'s access panel.", \ + "You close the access panel.") + temp_state++ + if(3) + if(isscrewdriver(O)) + user.visible_message("[user.name] opens the [src.name]'s access panel.", \ + "You open the access panel.") + temp_state-- + if(temp_state == src.construction_state)//Nothing changed + return 0 + else + src.construction_state = temp_state + if(src.construction_state < 3)//Was taken apart, update state + update_state() + update_icon() + return 1 + return 0 @@ -298,138 +273,138 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin var/desc_holder = null - verb/rotate() - set name = "Rotate Clockwise" - set category = "Object" - set src in oview(1) +/obj/machinery/particle_accelerator/verb/rotate() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 270) - return 1 + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 270) + return 1 - verb/rotateccw() - set name = "Rotate Counter-Clockwise" - set category = "Object" - set src in oview(1) +/obj/machinery/particle_accelerator/verb/rotateccw() + set name = "Rotate Counter-Clockwise" + set category = "Object" + set src in oview(1) - if (src.anchored || usr:stat) - usr << "It is fastened to the floor!" - return 0 - src.dir = turn(src.dir, 90) - return 1 + if (src.anchored || usr:stat) + usr << "It is fastened to the floor!" + return 0 + src.dir = turn(src.dir, 90) + return 1 - update_icon() - return +/obj/machinery/particle_accelerator/update_icon() + return - examine() - switch(src.construction_state) - if(0) - src.desc = text("A [name], looks like it's not attached to the flooring") - if(1) - src.desc = text("A [name], it is missing some cables") - if(2) - src.desc = text("A [name], the panel is open") - if(3) - src.desc = text("The [name] is assembled") - if(powered) - src.desc = src.desc_holder - ..() - return +/obj/machinery/particle_accelerator/examine() + switch(src.construction_state) + if(0) + src.desc = text("A [name], looks like it's not attached to the flooring") + if(1) + src.desc = text("A [name], it is missing some cables") + if(2) + src.desc = text("A [name], the panel is open") + if(3) + src.desc = text("The [name] is assembled") + if(powered) + src.desc = src.desc_holder + ..() + return - attackby(obj/item/W, mob/user) - if(istool(W)) - if(src.process_tool_hit(W,user)) - return - ..() - return +/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user) + if(istool(W)) + if(src.process_tool_hit(W,user)) + return + ..() + return - ex_act(severity) - switch(severity) - if(1.0) +/obj/machinery/particle_accelerator/ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(50)) del(src) return - if(2.0) - if (prob(50)) - del(src) - return - if(3.0) - if (prob(25)) - del(src) - return - else - return + if(3.0) + if (prob(25)) + del(src) + return + else + return - blob_act() - if(prob(50)) - del(src) - return +/obj/machinery/particle_accelerator/blob_act() + if(prob(50)) + del(src) + return - meteorhit() - if(prob(50)) - del(src) - return - - proc - update_state() - return 0 +/obj/machinery/particle_accelerator/meteorhit() + if(prob(50)) + del(src) + return - process_tool_hit(var/obj/O, var/mob/user) - if(!(O) || !(user)) - return 0 - if(!ismob(user) || !isobj(O)) - return 0 - var/temp_state = src.construction_state - switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps - if(0) - if(iswrench(O)) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - src.anchored = 1 - user.visible_message("[user.name] secures the [src.name] to the floor.", \ - "You secure the external bolts.") - temp_state++ - if(1) - if(iswrench(O)) - playsound(src.loc, 'Ratchet.ogg', 75, 1) - src.anchored = 0 - user.visible_message("[user.name] detaches the [src.name] from the floor.", \ - "You remove the external bolts.") - temp_state-- - else if(iscoil(O)) - if(O:use(1)) - user.visible_message("[user.name] adds wires to the [src.name].", \ - "You add some wires.") - temp_state++ - if(2) - if(iswirecutter(O))//TODO:Shock user if its on? - user.visible_message("[user.name] removes some wires from the [src.name].", \ - "You remove some wires.") - temp_state-- - else if(isscrewdriver(O)) - user.visible_message("[user.name] closes the [src.name]'s access panel.", \ - "You close the access panel.") - temp_state++ - if(3) - if(isscrewdriver(O)) - user.visible_message("[user.name] opens the [src.name]'s access panel.", \ - "You open the access panel.") - temp_state-- - active = 0 - if(temp_state == src.construction_state)//Nothing changed - return 0 - else - if(src.construction_state < 3)//Was taken apart, update state - update_state() - if(use_power) - use_power = 0 - src.construction_state = temp_state - if(src.construction_state >= 3) - use_power = 1 - update_icon() - return 1 - return 0 +/obj/machinery/particle_accelerator/proc/update_state() + return 0 + + +/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user) + if(!(O) || !(user)) + return 0 + if(!ismob(user) || !isobj(O)) + return 0 + var/temp_state = src.construction_state + switch(src.construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps + if(0) + if(iswrench(O)) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + src.anchored = 1 + user.visible_message("[user.name] secures the [src.name] to the floor.", \ + "You secure the external bolts.") + temp_state++ + if(1) + if(iswrench(O)) + playsound(src.loc, 'Ratchet.ogg', 75, 1) + src.anchored = 0 + user.visible_message("[user.name] detaches the [src.name] from the floor.", \ + "You remove the external bolts.") + temp_state-- + else if(iscoil(O)) + if(O:use(1)) + user.visible_message("[user.name] adds wires to the [src.name].", \ + "You add some wires.") + temp_state++ + if(2) + if(iswirecutter(O))//TODO:Shock user if its on? + user.visible_message("[user.name] removes some wires from the [src.name].", \ + "You remove some wires.") + temp_state-- + else if(isscrewdriver(O)) + user.visible_message("[user.name] closes the [src.name]'s access panel.", \ + "You close the access panel.") + temp_state++ + if(3) + if(isscrewdriver(O)) + user.visible_message("[user.name] opens the [src.name]'s access panel.", \ + "You open the access panel.") + temp_state-- + active = 0 + if(temp_state == src.construction_state)//Nothing changed + return 0 + else + if(src.construction_state < 3)//Was taken apart, update state + update_state() + if(use_power) + use_power = 0 + src.construction_state = temp_state + if(src.construction_state >= 3) + use_power = 1 + update_icon() + return 1 + return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm index 39e5dec3e5..8d8e23e996 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm @@ -5,6 +5,6 @@ icon_state = "fuel_chamber" reference = "fuel_chamber" - update_icon() - ..() - return \ No newline at end of file +/obj/structure/particle_accelerator/fuel_chamber/update_icon() + ..() + return \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index d42e1c2d68..f805ffbfe8 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -14,217 +14,215 @@ construction_state = 0 active = 0 dir = 1 - var - list/obj/structure/particle_accelerator/connected_parts + var/list/obj/structure/particle_accelerator/connected_parts + var/assembled = 0 + var/parts = null + +/obj/machinery/particle_accelerator/control_box/New() + connected_parts = list() + ..() + + +/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user as mob) + if(construction_state >= 3) + interact(user) + +/obj/machinery/particle_accelerator/control_box/update_state() + if(construction_state < 3) + use_power = 0 assembled = 0 - parts = null - - New() + active = 0 + for(var/obj/structure/particle_accelerator/part in connected_parts) + part.strength = null + part.powered = 0 + part.update_icon() connected_parts = list() - ..() - - - attack_hand(mob/user as mob) - if(construction_state >= 3) - interact(user) - - update_state() - if(construction_state < 3) - use_power = 0 - assembled = 0 - active = 0 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = null - part.powered = 0 - part.update_icon() - connected_parts = list() - return - if(!part_scan()) - use_power = 1 - active = 0 - connected_parts = list() - return + if(!part_scan()) + use_power = 1 + active = 0 + connected_parts = list() - update_icon() - if(active) - icon_state = "[reference]p1" + return + +/obj/machinery/particle_accelerator/control_box/update_icon() + if(active) + icon_state = "[reference]p1" + else + if(use_power) + if(assembled) + icon_state = "[reference]p" + else + icon_state = "u[reference]p" else - if(use_power) - if(assembled) - icon_state = "[reference]p" + switch(construction_state) + if(0) + icon_state = "[reference]" + if(1) + icon_state = "[reference]" + if(2) + icon_state = "[reference]w" else - icon_state = "u[reference]p" - else - switch(construction_state) - if(0) - icon_state = "[reference]" - if(1) - icon_state = "[reference]" - if(2) - icon_state = "[reference]w" - else - icon_state = "[reference]c" + icon_state = "[reference]c" + return + +/obj/machinery/particle_accelerator/control_box/Topic(href, href_list) + ..() + //Ignore input if we are broken, !silicon guy cant touch us, or nonai controlling from super far away + if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon)) || (get_dist(src, usr) > 8 && !istype(usr, /mob/living/silicon/ai))) + usr.machine = null + usr << browse(null, "window=pacontrol") return - Topic(href, href_list) - ..() - //Ignore input if we are broken, !silicon guy cant touch us, or nonai controlling from super far away - if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon)) || (get_dist(src, usr) > 8 && !istype(usr, /mob/living/silicon/ai))) - usr.machine = null - usr << browse(null, "window=pacontrol") - return + if( href_list["close"] ) + usr << browse(null, "window=pacontrol") + usr.machine = null + return + if(href_list["togglep"]) + src.toggle_power() + investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") + else if(href_list["scan"]) + src.part_scan() + else if(href_list["strengthup"]) + strength++ + if(strength > 2) + strength = 2 + else + investigate_log("increased to [strength] by [usr.key]","singulo") + for(var/obj/structure/particle_accelerator/part in connected_parts) + part.strength = strength + part.update_icon() - if( href_list["close"] ) - usr << browse(null, "window=pacontrol") - usr.machine = null - return - if(href_list["togglep"]) + else if(href_list["strengthdown"]) + strength-- + if(strength < 0) + strength = 0 + else + investigate_log("decreased to [strength] by [usr.key]","singulo") + for(var/obj/structure/particle_accelerator/part in connected_parts) + part.strength = strength + part.update_icon() + src.updateDialog() + src.update_icon() + return + + +/obj/machinery/particle_accelerator/control_box/power_change() + ..() + if(stat & NOPOWER) + active = 0 + use_power = 0 + else if(!stat && construction_state == 3) + use_power = 1 + return + + +/obj/machinery/particle_accelerator/control_box/process() + if(src.active) + //a part is missing! + if( length(connected_parts) < 6 ) + investigate_log("lost a connected part; It powered down.","singulo") src.toggle_power() - investigate_log("turned [active?"ON":"OFF"] by [usr.key]","singulo") - else if(href_list["scan"]) - src.part_scan() - else if(href_list["strengthup"]) - strength++ - if(strength > 2) - strength = 2 - else - investigate_log("increased to [strength] by [usr.key]","singulo") - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = strength - part.update_icon() - - else if(href_list["strengthdown"]) - strength-- - if(strength < 0) - strength = 0 - else - investigate_log("decreased to [strength] by [usr.key]","singulo") - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = strength - part.update_icon() - src.updateDialog() - src.update_icon() - return + return + //emit some particles + for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) + if(PE) + PE.emit_particle(src.strength) + return - power_change() - ..() - if(stat & NOPOWER) - active = 0 - use_power = 0 - else if(!stat && construction_state == 3) - use_power = 1 - return +/obj/machinery/particle_accelerator/control_box/proc/part_scan() + for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src)) + src.dir = F.dir + connected_parts = list() + var/tally = 0 + var/ldir = turn(dir,-90) + var/rdir = turn(dir,90) + var/odir = turn(dir,180) + var/turf/T = src.loc + T = get_step(T,rdir) + if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber)) + tally++ + T = get_step(T,odir) + if(check_part(T,/obj/structure/particle_accelerator/end_cap)) + tally++ + T = get_step(T,dir) + T = get_step(T,dir) + if(check_part(T,/obj/structure/particle_accelerator/power_box)) + tally++ + T = get_step(T,dir) + if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/center)) + tally++ + T = get_step(T,ldir) + if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/left)) + tally++ + T = get_step(T,rdir) + T = get_step(T,rdir) + if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/right)) + tally++ + if(tally >= 6) + assembled = 1 + return 1 + else + assembled = 0 + return 0 - process() - if(src.active) - //a part is missing! - if( length(connected_parts) < 6 ) - investigate_log("lost a connected part; It powered down.","singulo") - src.toggle_power() - return - //emit some particles - for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) - if(PE) - PE.emit_particle(src.strength) - return - - - proc - part_scan() - for(var/obj/structure/particle_accelerator/fuel_chamber/F in orange(1,src)) - src.dir = F.dir - connected_parts = list() - var/tally = 0 - var/ldir = turn(dir,-90) - var/rdir = turn(dir,90) - var/odir = turn(dir,180) - var/turf/T = src.loc - T = get_step(T,rdir) - if(check_part(T,/obj/structure/particle_accelerator/fuel_chamber)) - tally++ - T = get_step(T,odir) - if(check_part(T,/obj/structure/particle_accelerator/end_cap)) - tally++ - T = get_step(T,dir) - T = get_step(T,dir) - if(check_part(T,/obj/structure/particle_accelerator/power_box)) - tally++ - T = get_step(T,dir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/center)) - tally++ - T = get_step(T,ldir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/left)) - tally++ - T = get_step(T,rdir) - T = get_step(T,rdir) - if(check_part(T,/obj/structure/particle_accelerator/particle_emitter/right)) - tally++ - if(tally >= 6) - assembled = 1 +/obj/machinery/particle_accelerator/control_box/proc/check_part(var/turf/T, var/type) + if(!(T)||!(type)) + return 0 + var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T + if(istype(PA, type)) + if(PA.connect_master(src)) + if(PA.report_ready(src)) + src.connected_parts.Add(PA) return 1 - else - assembled = 0 - return 0 + return 0 - check_part(var/turf/T, var/type) - if(!(T)||!(type)) - return 0 - var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T - if(istype(PA, type)) - if(PA.connect_master(src)) - if(PA.report_ready(src)) - src.connected_parts.Add(PA) - return 1 - return 0 +/obj/machinery/particle_accelerator/control_box/proc/toggle_power() + src.active = !src.active + if(src.active) + src.use_power = 2 + for(var/obj/structure/particle_accelerator/part in connected_parts) + part.strength = src.strength + part.powered = 1 + part.update_icon() + else + src.use_power = 1 + for(var/obj/structure/particle_accelerator/part in connected_parts) + part.strength = null + part.powered = 0 + part.update_icon() + return 1 - toggle_power() - src.active = !src.active - if(src.active) - src.use_power = 2 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = src.strength - part.powered = 1 - part.update_icon() - else - src.use_power = 1 - for(var/obj/structure/particle_accelerator/part in connected_parts) - part.strength = null - part.powered = 0 - part.update_icon() - return 1 +/obj/machinery/particle_accelerator/control_box/proc/interact(mob/user) + if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) + if(!istype(user, /mob/living/silicon)) + user.machine = null + user << browse(null, "window=pacontrol") + return + user.machine = src + var/dat = "" + dat += "Particle Accelerator Control Panel
" + dat += "Close

" + dat += "Status:
" + if(!assembled) + dat += "Unable to detect all parts!
" + dat += "Run Scan

" + else + dat += "All parts in place.

" + dat += "Power:" + if(active) + dat += "On
" + else + dat += "Off
" + dat += "Toggle Power

" + dat += "Particle Strength: [src.strength] " + dat += "--|++

" - interact(mob/user) - if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) - if(!istype(user, /mob/living/silicon)) - user.machine = null - user << browse(null, "window=pacontrol") - return - user.machine = src - - var/dat = "" - dat += "Particle Accelerator Control Panel
" - dat += "Close

" - dat += "Status:
" - if(!assembled) - dat += "Unable to detect all parts!
" - dat += "Run Scan

" - else - dat += "All parts in place.

" - dat += "Power:" - if(active) - dat += "On
" - else - dat += "Off
" - dat += "Toggle Power

" - dat += "Particle Strength: [src.strength] " - dat += "--|++

" - - user << browse(dat, "window=pacontrol;size=420x500") - onclose(user, "pacontrol") - return \ No newline at end of file + user << browse(dat, "window=pacontrol;size=420x500") + onclose(user, "pacontrol") + return \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index a9570faf58..f91b92a55e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -8,43 +8,42 @@ var/fire_delay = 50 var/last_shot = 0 - center - icon_state = "emitter_center" - reference = "emitter_center" +/obj/structure/particle_accelerator/particle_emitter/center + icon_state = "emitter_center" + reference = "emitter_center" - left - icon_state = "emitter_left" - reference = "emitter_left" +/obj/structure/particle_accelerator/particle_emitter/left + icon_state = "emitter_left" + reference = "emitter_left" - right - icon_state = "emitter_right" - reference = "emitter_right" +/obj/structure/particle_accelerator/particle_emitter/right + icon_state = "emitter_right" + reference = "emitter_right" - update_icon() - ..() - return +/obj/structure/particle_accelerator/particle_emitter/update_icon() + ..() + return - proc - set_delay(var/delay) - if(delay && delay >= 0) - src.fire_delay = delay - return 1 - return 0 +/obj/structure/particle_accelerator/particle_emitter/proc/set_delay(var/delay) + if(delay && delay >= 0) + src.fire_delay = delay + return 1 + return 0 - emit_particle(var/strength = 0) - if((src.last_shot + src.fire_delay) <= world.time) - src.last_shot = world.time - var/obj/effect/accelerated_particle/A = null - var/turf/T = get_step(src,dir) - switch(strength) - if(0) - A = new/obj/effect/accelerated_particle/weak(T, dir) - if(1) - A = new/obj/effect/accelerated_particle(T, dir) - if(2) - A = new/obj/effect/accelerated_particle/strong(T, dir) - if(A) - A.dir = src.dir - return 1 - return 0 +/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0) + if((src.last_shot + src.fire_delay) <= world.time) + src.last_shot = world.time + var/obj/effect/accelerated_particle/A = null + var/turf/T = get_step(src,dir) + switch(strength) + if(0) + A = new/obj/effect/accelerated_particle/weak(T, dir) + if(1) + A = new/obj/effect/accelerated_particle(T, dir) + if(2) + A = new/obj/effect/accelerated_particle/strong(T, dir) + if(A) + A.dir = src.dir + return 1 + return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm index 9a768212de..e6deff37dd 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_power.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm @@ -5,6 +5,6 @@ icon_state = "power_box" reference = "power_box" - update_icon() - ..() - return +/obj/structure/particle_accelerator/power_box/update_icon() + ..() + return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index b23c354626..9523818ac3 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -32,507 +32,508 @@ var/global/list/uneatable = list( var/teleport_del = 0 var/last_warning - New(loc, var/starting_energy = 50, var/temp = 0) - //CARN: admin-alert for chuckle-fuckery. - last_warning = world.time - var/count = 0 - for(var/obj/machinery/containment_field/CF in world) - count = 1 +/obj/machinery/singularity/New(loc, var/starting_energy = 50, var/temp = 0) + //CARN: admin-alert for chuckle-fuckery. + last_warning = world.time + var/count = 0 + for(var/obj/machinery/containment_field/CF in world) + count = 1 + break + if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) + investigate_log("was created. [count?"":"No containment fields were active"]","singulo") + + src.energy = starting_energy + if(temp) + spawn(temp) + del(src) + ..() + for(var/obj/machinery/singularity_beacon/singubeacon in world) + if(singubeacon.active) + target = singubeacon break - if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) - investigate_log("was created. [count?"":"No containment fields were active"]","singulo") - - src.energy = starting_energy - if(temp) - spawn(temp) - del(src) - ..() - for(var/obj/machinery/singularity_beacon/singubeacon in world) - if(singubeacon.active) - target = singubeacon - break - return + return - Del() - //Could have it do something bad when this happens, explode/implode or something - ..() +/obj/machinery/singularity/Del() + //Could have it do something bad when this happens, explode/implode or something + ..() - attack_hand(mob/user as mob) - consume(user) - return 1 +/obj/machinery/singularity/attack_hand(mob/user as mob) + consume(user) + return 1 - blob_act(severity) - return +/obj/machinery/singularity/blob_act(severity) + return - ex_act(severity) - switch(severity) - if(1.0) - if(prob(25)) - del(src) - return - else - energy += 50 - if(2.0 to 3.0) - energy += round((rand(20,60)/2),1) - return - return - - - Bump(atom/A) - consume(A) - return - - - Bumped(atom/A) - consume(A) - return - - - process() - eat() - dissipate() - check_energy() - if(current_size >= 3) - move() - if(current_size <= 7) - pulse() - if(current_size >= 5) - if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit - event() - return - - - attack_ai() //to prevent ais from gibbing themselves when they click on one. - return - - - proc - dissipate() - if(!dissipate) - return - if(dissipate_track >= dissipate_delay) - src.energy -= dissipate_strength - dissipate_track = 0 - else - dissipate_track++ - - - expand(var/force_size = 0) - var/temp_allowed_size = src.allowed_size - if(force_size) - temp_allowed_size = force_size - switch(temp_allowed_size) - if(1) - current_size = 1 - icon = 'icons/obj/singularity.dmi' - icon_state = "singularity_s1" - pixel_x = 0 - pixel_y = 0 - grav_pull = 4 - consume_range = 0 - dissipate_delay = 10 - dissipate_track = 0 - dissipate_strength = 1 - if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them - current_size = 3 - icon = 'icons/effects/96x96.dmi' - icon_state = "singularity_s3" - pixel_x = -32 - pixel_y = -32 - grav_pull = 6 - consume_range = 1 - dissipate_delay = 5 - dissipate_track = 0 - dissipate_strength = 5 - if(5) - if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2))) - current_size = 5 - icon = 'icons/effects/160x160.dmi' - icon_state = "singularity_s5" - pixel_x = -64 - pixel_y = -64 - grav_pull = 8 - consume_range = 2 - dissipate_delay = 4 - dissipate_track = 0 - dissipate_strength = 20 - if(7) - if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3))) - current_size = 7 - icon = 'icons/effects/224x224.dmi' - icon_state = "singularity_s7" - pixel_x = -96 - pixel_y = -96 - grav_pull = 10 - consume_range = 3 - dissipate_delay = 10 - dissipate_track = 0 - dissipate_strength = 10 - if(9)//this one also lacks a check for gens because it eats everything - current_size = 9 - icon = 'icons/effects/288x288.dmi' - icon_state = "singularity_s9" - pixel_x = -128 - pixel_y = -128 - grav_pull = 10 - consume_range = 4 - dissipate = 0 //It cant go smaller due to e loss - if(current_size == allowed_size) - investigate_log("grew to size [current_size]","singulo") - return 1 - else if(current_size < (--temp_allowed_size)) - expand(temp_allowed_size) - else - return 0 - - - check_energy() - if(energy <= 0) - del(src) - return 0 - switch(energy)//Some of these numbers might need to be changed up later -Mport - if(1 to 199) - allowed_size = 1 - if(200 to 499) - allowed_size = 3 - if(500 to 999) - allowed_size = 5 - if(1000 to 1999) - allowed_size = 7 - if(2000 to INFINITY) - allowed_size = 9 - if(current_size != allowed_size) - expand() - return 1 - - - eat() - set background = 1 - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 - for(var/atom/movable/X in orange(consume_range,src)) - consume(X) - for(var/turf/X in orange(consume_range,src)) - consume(X) - for(var/atom/movable/X in orange(grav_pull,src)) - if(is_type_in_list(X, uneatable)) continue - if(((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))|| (src.current_size >= 9)) - step_towards(X,src) - else if(istype(X,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = X - if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - continue - step_towards(H,src) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 - return - - - consume(var/atom/A) - var/gain = 0 - if(is_type_in_list(A, uneatable)) - return 0 - if (istype(A,/mob/living))//Mobs get gibbed - gain = 20 - if(istype(A,/mob/living/carbon/human)) - if(A:mind) - if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") ) - gain = 100 - spawn() - A:gib() - sleep(1) - else if(istype(A,/obj/)) - - if (istype(A,/obj/item/weapon/storage/backpack/holding)) - var/dist = max((current_size - 2),1) - explosion(src.loc,(dist),(dist*2),(dist*4)) - return - - if(istype(A, /obj/machinery/singularity))//Welp now you did it - var/obj/machinery/singularity/S = A - src.energy += (S.energy/2)//Absorb most of it - del(S) - var/dist = max((current_size - 2),1) - explosion(src.loc,(dist),(dist*2),(dist*4)) - return//Quits here, the obj should be gone, hell we might be - - if((teleport_del) && (!istype(A, /obj/machinery)))//Going to see if it does not lag less to tele items over to Z 2 - var/obj/O = A - O.x = 2 - O.y = 2 - O.z = 2 - else - A:ex_act(1.0) - if(A) del(A) - gain = 2 - else if(isturf(A)) - var/turf/T = A - if(T.intact) - for(var/obj/O in T.contents) - if(O.level != 1) - continue - if(O.invisibility == 101) - src.consume(O) - A:ReplaceWithSpace() - gain = 2 - src.energy += gain - return - - - move(var/movement_dir = 0) - if(!move_self) - return 0 - - if(target && prob(60)) - movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one - else if(!(movement_dir in cardinal)) - movement_dir = pick(NORTH, SOUTH, EAST, WEST) - - if(movement_dir == last_failed_movement) - var/list/L = new/list(NORTH, SOUTH, EAST, WEST) - L.Remove(last_failed_movement) - movement_dir = pick(L) - - if(current_size >= 9)//The superlarge one does not care about things in its way - spawn(0) - step(src, movement_dir) - spawn(1) - step(src, movement_dir) - return 1 - else if(check_turfs_in(movement_dir)) - last_failed_movement = 0//Reset this because we moved - spawn(0) - step(src, movement_dir) - return 1 - else - last_failed_movement = movement_dir - return 0 - - - check_turfs_in(var/direction = 0, var/step = 0) - if(!direction) - return 0 - var/steps = 0 - if(!step) - switch(current_size) - if(1) - steps = 1 - if(3) - steps = 3//Yes this is right - if(5) - steps = 3 - if(7) - steps = 4 - if(9) - steps = 5 - else - steps = step - var/list/turfs = list() - var/turf/T = src.loc - for(var/i = 1 to steps) - T = get_step(T,direction) - if(!isturf(T)) - return 0 - turfs.Add(T) - var/dir2 = 0 - var/dir3 = 0 - switch(direction) - if(NORTH||SOUTH) - dir2 = 4 - dir3 = 8 - if(EAST||WEST) - dir2 = 1 - dir3 = 2 - var/turf/T2 = T - for(var/j = 1 to steps) - T2 = get_step(T2,dir2) - if(!isturf(T2)) - return 0 - turfs.Add(T2) - for(var/k = 1 to steps) - T = get_step(T,dir3) - if(!isturf(T)) - return 0 - turfs.Add(T) - for(var/turf/T3 in turfs) - if(isnull(T3)) - continue - if(!can_move(T3)) - return 0 - return 1 - - - can_move(var/turf/T) - if(!T) - return 0 - if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T)) - return 0 - else if(locate(/obj/machinery/field_generator) in T) - var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T - if(G && G.active) - return 0 - else if(locate(/obj/machinery/shieldwallgen) in T) - var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T - if(S && S.active) - return 0 - return 1 - - - event() - var/numb = pick(1,2,3,4,5,6) - switch(numb) - if(1)//EMP - emp_area() - if(2,3)//tox damage all carbon mobs in area - toxmob() - if(4)//Stun mobs who lack optic scanners - mezzer() - else - return 0 - return 1 - - - toxmob() - var/toxrange = 10 - var/toxdamage = 4 - var/radiation = 15 - var/radiationmin = 3 - if (src.energy>200) - toxdamage = round(((src.energy-150)/50)*4,1) - radiation = round(((src.energy-150)/50)*5,1) - radiationmin = round((radiation/5),1)// - for(var/mob/living/M in view(toxrange, src.loc)) - if(istype(M,/mob/living/)) - M.apply_effect(rand(radiationmin,radiation), IRRADIATE) - toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) - M.apply_effect(toxdamage, TOX) - return - - - mezzer() - for(var/mob/living/carbon/M in oviewers(8, src)) - if(istype(M,/mob/living/carbon/human)) - if(istype(M:glasses,/obj/item/clothing/glasses/meson)) - M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!" - return - M << "\red You look directly into The [src.name] and feel weak." - M.apply_effect(3, STUN) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] stares blankly at The []!", M, src), 1) - return - - - emp_area() - empulse(src, 8, 10) - return - - - pulse() - for(var/obj/machinery/power/rad_collector/R in orange(15,src)) - if(istype(R,/obj/machinery/power/rad_collector)) - R.receive_pulse(energy) - return - - - - narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO - name = "Tear in the Fabric of Reality" - desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." - icon = 'icons/obj/magic_terror.dmi' - pixel_x = -89 - pixel_y = -85 - current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO - contained = 0 //Are we going to move around? - dissipate = 0 //Do we lose energy over time? - move_self = 1 //Do we move on our own? - grav_pull = 10 //How many tiles out do we pull? - consume_range = 3 //How many tiles out do we eat - - process() - eat() - if(!target || prob(5)) - pickcultist() - move() +/obj/machinery/singularity/ex_act(severity) + switch(severity) + if(1.0) if(prob(25)) - mezzer() - - consume(var/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO - if(is_type_in_list(A, uneatable)) - return 0 - if (istype(A,/mob/living))//Mobs get gibbed - A:gib() - else if(istype(A,/obj/)) - A:ex_act(1.0) - if(A) del(A) - else if(isturf(A)) - var/turf/T = A - if(T.intact) - for(var/obj/O in T.contents) - if(O.level != 1) - continue - if(O.invisibility == 101) - src.consume(O) - A:ReplaceWithSpace() - return - - ex_act() //No throwing bombs at it either. --NEO - return - - proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO - var/list/cultists = list() - for(var/datum/mind/cult_nh_mind in ticker.mode.cult) - if(!cult_nh_mind.current) - continue - if(cult_nh_mind.current.stat) - continue - cultists += cult_nh_mind.current - if(cultists.len) - acquire(pick(cultists)) + del(src) return - //If there was living cultists, it picks one to follow. - for(var/mob/living/carbon/human/food in living_mob_list) - if(food.stat) - continue - cultists += food - if(cultists.len) - acquire(pick(cultists)) - return - //no living cultists, pick a living human instead. - for(var/mob/dead/observer/ghost in player_list) - if(!ghost.client) - continue - cultists += ghost - if(cultists.len) - acquire(pick(cultists)) - return - //no living humans, follow a ghost instead. - - proc/acquire(var/mob/food) - target << "\blue NAR-SIE HAS LOST INTEREST IN YOU" - target = food - if(ishuman(target)) - target << "\red NAR-SIE HUNGERS FOR YOUR SOUL" else - target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL" + energy += 50 + if(2.0 to 3.0) + energy += round((rand(20,60)/2),1) + return + return +/obj/machinery/singularity/Bump(atom/A) + consume(A) + return + + +/obj/machinery/singularity/Bumped(atom/A) + consume(A) + return + + +/obj/machinery/singularity/process() + eat() + dissipate() + check_energy() + if(current_size >= 3) + move() + if(current_size <= 7) + pulse() + if(current_size >= 5) + if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit + event() + return + + +/obj/machinery/singularity/attack_ai() //to prevent ais from gibbing themselves when they click on one. + return + + + +/obj/machinery/singularity/proc/dissipate() + if(!dissipate) + return + if(dissipate_track >= dissipate_delay) + src.energy -= dissipate_strength + dissipate_track = 0 + else + dissipate_track++ + + +/obj/machinery/singularity/proc/expand(var/force_size = 0) + var/temp_allowed_size = src.allowed_size + if(force_size) + temp_allowed_size = force_size + switch(temp_allowed_size) + if(1) + current_size = 1 + icon = 'icons/obj/singularity.dmi' + icon_state = "singularity_s1" + pixel_x = 0 + pixel_y = 0 + grav_pull = 4 + consume_range = 0 + dissipate_delay = 10 + dissipate_track = 0 + dissipate_strength = 1 + if(3)//1 to 3 does not check for the turfs if you put the gens right next to a 1x1 then its going to eat them + current_size = 3 + icon = 'icons/effects/96x96.dmi' + icon_state = "singularity_s3" + pixel_x = -32 + pixel_y = -32 + grav_pull = 6 + consume_range = 1 + dissipate_delay = 5 + dissipate_track = 0 + dissipate_strength = 5 + if(5) + if((check_turfs_in(1,2))&&(check_turfs_in(2,2))&&(check_turfs_in(4,2))&&(check_turfs_in(8,2))) + current_size = 5 + icon = 'icons/effects/160x160.dmi' + icon_state = "singularity_s5" + pixel_x = -64 + pixel_y = -64 + grav_pull = 8 + consume_range = 2 + dissipate_delay = 4 + dissipate_track = 0 + dissipate_strength = 20 + if(7) + if((check_turfs_in(1,3))&&(check_turfs_in(2,3))&&(check_turfs_in(4,3))&&(check_turfs_in(8,3))) + current_size = 7 + icon = 'icons/effects/224x224.dmi' + icon_state = "singularity_s7" + pixel_x = -96 + pixel_y = -96 + grav_pull = 10 + consume_range = 3 + dissipate_delay = 10 + dissipate_track = 0 + dissipate_strength = 10 + if(9)//this one also lacks a check for gens because it eats everything + current_size = 9 + icon = 'icons/effects/288x288.dmi' + icon_state = "singularity_s9" + pixel_x = -128 + pixel_y = -128 + grav_pull = 10 + consume_range = 4 + dissipate = 0 //It cant go smaller due to e loss + if(current_size == allowed_size) + investigate_log("grew to size [current_size]","singulo") + return 1 + else if(current_size < (--temp_allowed_size)) + expand(temp_allowed_size) + else + return 0 + + +/obj/machinery/singularity/proc/check_energy() + if(energy <= 0) + del(src) + return 0 + switch(energy)//Some of these numbers might need to be changed up later -Mport + if(1 to 199) + allowed_size = 1 + if(200 to 499) + allowed_size = 3 + if(500 to 999) + allowed_size = 5 + if(1000 to 1999) + allowed_size = 7 + if(2000 to INFINITY) + allowed_size = 9 + if(current_size != allowed_size) + expand() + return 1 + + +/obj/machinery/singularity/proc/eat() + set background = 1 + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 1 + for(var/atom/movable/X in orange(consume_range,src)) + consume(X) + for(var/turf/X in orange(consume_range,src)) + consume(X) + for(var/atom/movable/X in orange(grav_pull,src)) + if(is_type_in_list(X, uneatable)) continue + if(((X) &&(!X:anchored) && (!istype(X,/mob/living/carbon/human)))|| (src.current_size >= 9)) + step_towards(X,src) + else if(istype(X,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = X + if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) + var/obj/item/clothing/shoes/magboots/M = H.shoes + if(M.magpulse) + continue + step_towards(H,src) + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 0 + return + + +/obj/machinery/singularity/proc/consume(var/atom/A) + var/gain = 0 + if(is_type_in_list(A, uneatable)) + return 0 + if (istype(A,/mob/living))//Mobs get gibbed + gain = 20 + if(istype(A,/mob/living/carbon/human)) + if(A:mind) + if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") ) + gain = 100 + spawn() + A:gib() + sleep(1) + else if(istype(A,/obj/)) + + if (istype(A,/obj/item/weapon/storage/backpack/holding)) + var/dist = max((current_size - 2),1) + explosion(src.loc,(dist),(dist*2),(dist*4)) + return + + if(istype(A, /obj/machinery/singularity))//Welp now you did it + var/obj/machinery/singularity/S = A + src.energy += (S.energy/2)//Absorb most of it + del(S) + var/dist = max((current_size - 2),1) + explosion(src.loc,(dist),(dist*2),(dist*4)) + return//Quits here, the obj should be gone, hell we might be + + if((teleport_del) && (!istype(A, /obj/machinery)))//Going to see if it does not lag less to tele items over to Z 2 + var/obj/O = A + O.x = 2 + O.y = 2 + O.z = 2 + else + A:ex_act(1.0) + if(A) del(A) + gain = 2 + else if(isturf(A)) + var/turf/T = A + if(T.intact) + for(var/obj/O in T.contents) + if(O.level != 1) + continue + if(O.invisibility == 101) + src.consume(O) + A:ReplaceWithSpace() + gain = 2 + src.energy += gain + return + + +/obj/machinery/singularity/proc/move(var/movement_dir = 0) + if(!move_self) + return 0 + + if(target && prob(60)) + movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one + else if(!(movement_dir in cardinal)) + movement_dir = pick(NORTH, SOUTH, EAST, WEST) + + if(movement_dir == last_failed_movement) + var/list/L = new/list(NORTH, SOUTH, EAST, WEST) + L.Remove(last_failed_movement) + movement_dir = pick(L) + + if(current_size >= 9)//The superlarge one does not care about things in its way + spawn(0) + step(src, movement_dir) + spawn(1) + step(src, movement_dir) + return 1 + else if(check_turfs_in(movement_dir)) + last_failed_movement = 0//Reset this because we moved + spawn(0) + step(src, movement_dir) + return 1 + else + last_failed_movement = movement_dir + return 0 + + +/obj/machinery/singularity/proc/check_turfs_in(var/direction = 0, var/step = 0) + if(!direction) + return 0 + var/steps = 0 + if(!step) + switch(current_size) + if(1) + steps = 1 + if(3) + steps = 3//Yes this is right + if(5) + steps = 3 + if(7) + steps = 4 + if(9) + steps = 5 + else + steps = step + var/list/turfs = list() + var/turf/T = src.loc + for(var/i = 1 to steps) + T = get_step(T,direction) + if(!isturf(T)) + return 0 + turfs.Add(T) + var/dir2 = 0 + var/dir3 = 0 + switch(direction) + if(NORTH||SOUTH) + dir2 = 4 + dir3 = 8 + if(EAST||WEST) + dir2 = 1 + dir3 = 2 + var/turf/T2 = T + for(var/j = 1 to steps) + T2 = get_step(T2,dir2) + if(!isturf(T2)) + return 0 + turfs.Add(T2) + for(var/k = 1 to steps) + T = get_step(T,dir3) + if(!isturf(T)) + return 0 + turfs.Add(T) + for(var/turf/T3 in turfs) + if(isnull(T3)) + continue + if(!can_move(T3)) + return 0 + return 1 + + +/obj/machinery/singularity/proc/can_move(var/turf/T) + if(!T) + return 0 + if((locate(/obj/machinery/containment_field) in T)||(locate(/obj/machinery/shieldwall) in T)) + return 0 + else if(locate(/obj/machinery/field_generator) in T) + var/obj/machinery/field_generator/G = locate(/obj/machinery/field_generator) in T + if(G && G.active) + return 0 + else if(locate(/obj/machinery/shieldwallgen) in T) + var/obj/machinery/shieldwallgen/S = locate(/obj/machinery/shieldwallgen) in T + if(S && S.active) + return 0 + return 1 + + +/obj/machinery/singularity/proc/event() + var/numb = pick(1,2,3,4,5,6) + switch(numb) + if(1)//EMP + emp_area() + if(2,3)//tox damage all carbon mobs in area + toxmob() + if(4)//Stun mobs who lack optic scanners + mezzer() + else + return 0 + return 1 + + +/obj/machinery/singularity/proc/toxmob() + var/toxrange = 10 + var/toxdamage = 4 + var/radiation = 15 + var/radiationmin = 3 + if (src.energy>200) + toxdamage = round(((src.energy-150)/50)*4,1) + radiation = round(((src.energy-150)/50)*5,1) + radiationmin = round((radiation/5),1)// + for(var/mob/living/M in view(toxrange, src.loc)) + if(istype(M,/mob/living/)) + M.apply_effect(rand(radiationmin,radiation), IRRADIATE) + toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) + M.apply_effect(toxdamage, TOX) + return + + +/obj/machinery/singularity/proc/mezzer() + for(var/mob/living/carbon/M in oviewers(8, src)) + if(istype(M,/mob/living/carbon/human)) + if(istype(M:glasses,/obj/item/clothing/glasses/meson)) + M << "\blue You look directly into The [src.name], good thing you had your protective eyewear on!" + return + M << "\red You look directly into The [src.name] and feel weak." + M.apply_effect(3, STUN) + for(var/mob/O in viewers(M, null)) + O.show_message(text("\red [] stares blankly at The []!", M, src), 1) + return + + +/obj/machinery/singularity/proc/emp_area() + empulse(src, 8, 10) + return + + +/obj/machinery/singularity/proc/pulse() + for(var/obj/machinery/power/rad_collector/R in orange(15,src)) + if(istype(R,/obj/machinery/power/rad_collector)) + R.receive_pulse(energy) + return + + + +/obj/machinery/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO + name = "Tear in the Fabric of Reality" + desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees." + icon = 'icons/obj/magic_terror.dmi' + pixel_x = -89 + pixel_y = -85 + current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO + contained = 0 //Are we going to move around? + dissipate = 0 //Do we lose energy over time? + move_self = 1 //Do we move on our own? + grav_pull = 10 //How many tiles out do we pull? + consume_range = 3 //How many tiles out do we eat + +/obj/machinery/singularity/narsie/process() + eat() + if(!target || prob(5)) + pickcultist() + move() + if(prob(25)) + mezzer() + +/obj/machinery/singularity/narsie/consume(var/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO + if(is_type_in_list(A, uneatable)) + return 0 + if (istype(A,/mob/living))//Mobs get gibbed + A:gib() + else if(istype(A,/obj/)) + A:ex_act(1.0) + if(A) del(A) + else if(isturf(A)) + var/turf/T = A + if(T.intact) + for(var/obj/O in T.contents) + if(O.level != 1) + continue + if(O.invisibility == 101) + src.consume(O) + A:ReplaceWithSpace() + return + +/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO + return + +/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO + var/list/cultists = list() + for(var/datum/mind/cult_nh_mind in ticker.mode.cult) + if(!cult_nh_mind.current) + continue + if(cult_nh_mind.current.stat) + continue + cultists += cult_nh_mind.current + if(cultists.len) + acquire(pick(cultists)) + return + //If there was living cultists, it picks one to follow. + for(var/mob/living/carbon/human/food in living_mob_list) + if(food.stat) + continue + cultists += food + if(cultists.len) + acquire(pick(cultists)) + return + //no living cultists, pick a living human instead. + for(var/mob/dead/observer/ghost in player_list) + if(!ghost.client) + continue + cultists += ghost + if(cultists.len) + acquire(pick(cultists)) + return + //no living humans, follow a ghost instead. + +/obj/machinery/singularity/narsie/proc/acquire(var/mob/food) + target << "\blue NAR-SIE HAS LOST INTEREST IN YOU" + target = food + if(ishuman(target)) + target << "\red NAR-SIE HUNGERS FOR YOUR SOUL" + else + target << "\red NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL" + +//Wizard narsie /obj/machinery/singularity/narsie/wizard grav_pull = 0 - eat() - set background = 1 - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 1 - for(var/atom/movable/X in orange(consume_range,src)) - consume(X) - for(var/turf/X in orange(consume_range,src)) - consume(X) - if(defer_powernet_rebuild != 2) - defer_powernet_rebuild = 0 - return + +/obj/machinery/singularity/narsie/wizard/eat() + set background = 1 + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 1 + for(var/atom/movable/X in orange(consume_range,src)) + consume(X) + for(var/turf/X in orange(consume_range,src)) + consume(X) + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 0 + return diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index bb37d0dc41..63f9f9ab3d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -24,328 +24,328 @@ var/obj/machinery/power/terminal/terminal = null - New() - ..() - spawn(5) - dir_loop: - for(var/d in cardinal) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) - terminal = term - break dir_loop - if(!terminal) - stat |= BROKEN - return - terminal.master = src - updateicon() - return +/obj/machinery/power/smes/New() + ..() + spawn(5) + dir_loop: + for(var/d in cardinal) + var/turf/T = get_step(src, d) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(d, 180)) + terminal = term + break dir_loop + if(!terminal) + stat |= BROKEN + return + terminal.master = src + updateicon() + return - proc/updateicon() - overlays = null - if(stat & BROKEN) return +/obj/machinery/power/smes/proc/updateicon() + overlays = null + if(stat & BROKEN) return - overlays += image('icons/obj/power.dmi', "smes-op[online]") + overlays += image('icons/obj/power.dmi', "smes-op[online]") - if(charging) - overlays += image('icons/obj/power.dmi', "smes-oc1") - else - if(chargemode) - overlays += image('icons/obj/power.dmi', "smes-oc0") + if(charging) + overlays += image('icons/obj/power.dmi', "smes-oc1") + else + if(chargemode) + overlays += image('icons/obj/power.dmi', "smes-oc0") - var/clevel = chargedisplay() - if(clevel>0) - overlays += image('icons/obj/power.dmi', "smes-og[clevel]") - return + var/clevel = chargedisplay() + if(clevel>0) + overlays += image('icons/obj/power.dmi', "smes-og[clevel]") + return - proc/chargedisplay() - return round(5.5*charge/capacity) +/obj/machinery/power/smes/proc/chargedisplay() + return round(5.5*charge/capacity) #define SMESRATE 0.05 // rate of internal charge to external power - process() +/obj/machinery/power/smes/process() - if(stat & BROKEN) return + if(stat & BROKEN) return - //store machine state to see if we need to update the icon overlays - var/last_disp = chargedisplay() - var/last_chrg = charging - var/last_onln = online + //store machine state to see if we need to update the icon overlays + var/last_disp = chargedisplay() + var/last_chrg = charging + var/last_onln = online - if(terminal) - var/excess = terminal.surplus() + if(terminal) + var/excess = terminal.surplus() - if(charging) - if(excess >= 0) // if there's power available, try to charge + if(charging) + if(excess >= 0) // if there's power available, try to charge - var/load = min((capacity-charge)/SMESRATE, chargelevel) // charge at set rate, limited to spare capacity + var/load = min((capacity-charge)/SMESRATE, chargelevel) // charge at set rate, limited to spare capacity - charge += load * SMESRATE // increase the charge + charge += load * SMESRATE // increase the charge - add_load(load) // add the load to the terminal side network + add_load(load) // add the load to the terminal side network - else // if not enough capcity - charging = 0 // stop charging - chargecount = 0 + else // if not enough capcity + charging = 0 // stop charging + chargecount = 0 - else - if(chargemode) - if(chargecount > rand(3,6)) - charging = 1 - chargecount = 0 - - if(excess > chargelevel) - chargecount++ - else - chargecount = 0 - else + else + if(chargemode) + if(chargecount > rand(3,6)) + charging = 1 chargecount = 0 - if(online) // if outputting - lastout = min( charge/SMESRATE, output) //limit output to that stored + if(excess > chargelevel) + chargecount++ + else + chargecount = 0 + else + chargecount = 0 - charge -= lastout*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) + if(online) // if outputting + lastout = min( charge/SMESRATE, output) //limit output to that stored - add_avail(lastout) // add output to powernet (smes side) + charge -= lastout*SMESRATE // reduce the storage (may be recovered in /restore() if excessive) - if(charge < 0.0001) - online = 0 // stop output if charge falls to zero + add_avail(lastout) // add output to powernet (smes side) - // only update icon if state changed - if(last_disp != chargedisplay() || last_chrg != charging || last_onln != online) - updateicon() + if(charge < 0.0001) + online = 0 // stop output if charge falls to zero - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.interact(M) - AutoUpdateAI(src) - return + // only update icon if state changed + if(last_disp != chargedisplay() || last_chrg != charging || last_onln != online) + updateicon() + + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + src.interact(M) + AutoUpdateAI(src) + return // called after all power processes are finished // restores charge level to smes if there was excess this ptick - proc/restore() - if(stat & BROKEN) - return - - if(!online) - loaddemand = 0 - return - - var/excess = powernet.netexcess // this was how much wasn't used on the network last ptick, minus any removed by other SMESes - - excess = min(lastout, excess) // clamp it to how much was actually output by this SMES last ptick - - excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) - - // now recharge this amount - - var/clev = chargedisplay() - - charge += excess * SMESRATE - powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it - - loaddemand = lastout-excess - - if(clev != chargedisplay() ) - updateicon() +/obj/machinery/power/smes/proc/restore() + if(stat & BROKEN) return - - add_load(var/amount) - if(terminal && terminal.powernet) - terminal.powernet.newload += amount - - - attack_ai(mob/user) - add_fingerprint(user) - if(stat & BROKEN) return - interact(user) - - - attack_hand(mob/user) - add_fingerprint(user) - if(stat & BROKEN) return - - if(ishuman(user)) - if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) - call(/obj/item/clothing/gloves/space_ninja/proc/drain)("SMES",src,user:wear_suit) - return - interact(user) - - - proc/interact(mob/user) - if(get_dist(src, user) > 1 && !istype(user, /mob/living/silicon/ai)) - user.machine = null - user << browse(null, "window=smes") - return - - user.machine = src - - var/t = "SMES Power Storage Unit [n_tag? "([n_tag])" : null]
"
-
-		t += "Stored capacity : [round(100.0*charge/capacity, 0.1)]%

" - - t += "Input: [charging ? "Charging" : "Not Charging"] [chargemode ? "Auto Off" : "Auto Off "]
" - - - t += "Input level: M - - - [add_lspace(chargelevel,5)] + + + M
" - - t += "

" - - t += "Output: [online ? "Online Offline" : "Online Offline "]
" - - t += "Output level: M - - - [add_lspace(output,5)] + + + M
" - - t += "Output load: [round(loaddemand)] W
" - - t += "

Close" - - t += "
" - user << browse(t, "window=smes;size=460x300") - onclose(user, "smes") + if(!online) + loaddemand = 0 return + var/excess = powernet.netexcess // this was how much wasn't used on the network last ptick, minus any removed by other SMESes - Topic(href, href_list) - ..() + excess = min(lastout, excess) // clamp it to how much was actually output by this SMES last ptick - if (usr.stat || usr.restrained() ) + excess = min((capacity-charge)/SMESRATE, excess) // for safety, also limit recharge by space capacity of SMES (shouldn't happen) + + // now recharge this amount + + var/clev = chargedisplay() + + charge += excess * SMESRATE + powernet.netexcess -= excess // remove the excess from the powernet, so later SMESes don't try to use it + + loaddemand = lastout-excess + + if(clev != chargedisplay() ) + updateicon() + return + + +/obj/machinery/power/smes/add_load(var/amount) + if(terminal && terminal.powernet) + terminal.powernet.newload += amount + + +/obj/machinery/power/smes/attack_ai(mob/user) + add_fingerprint(user) + if(stat & BROKEN) return + interact(user) + + +/obj/machinery/power/smes/attack_hand(mob/user) + add_fingerprint(user) + if(stat & BROKEN) return + + if(ishuman(user)) + if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) + call(/obj/item/clothing/gloves/space_ninja/proc/drain)("SMES",src,user:wear_suit) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - if(!istype(usr, /mob/living/silicon/ai)) - usr << "\red You don't have the dexterity to do this!" - return - - //world << "[href] ; [href_list[href]]" - - if (( usr.machine==src && ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + interact(user) - if( href_list["close"] ) - usr << browse(null, "window=smes") - usr.machine = null - return +/obj/machinery/power/smes/proc/interact(mob/user) + if(get_dist(src, user) > 1 && !istype(user, /mob/living/silicon/ai)) + user.machine = null + user << browse(null, "window=smes") + return - else if( href_list["cmode"] ) - chargemode = !chargemode - if(!chargemode) - charging = 0 - updateicon() + user.machine = src - else if( href_list["online"] ) - online = !online - updateicon() - else if( href_list["input"] ) + var/t = "SMES Power Storage Unit [n_tag? "([n_tag])" : null]
"
 
-				var/i = text2num(href_list["input"])
+	t += "Stored capacity : [round(100.0*charge/capacity, 0.1)]%

" - var/d = 0 - switch(i) - if(-4) - chargelevel = 0 - if(4) - chargelevel = SMESMAXCHARGELEVEL //30000 + t += "Input: [charging ? "Charging" : "Not Charging"] [chargemode ? "Auto Off" : "Auto Off "]
" - if(1) - d = 100 - if(-1) - d = -100 - if(2) - d = 1000 - if(-2) - d = -1000 - if(3) - d = 10000 - if(-3) - d = -10000 - chargelevel += d - chargelevel = max(0, min(SMESMAXCHARGELEVEL, chargelevel)) // clamp to range + t += "Input level: M - - - [add_lspace(chargelevel,5)] + + + M
" - else if( href_list["output"] ) + t += "

" - var/i = text2num(href_list["output"]) + t += "Output: [online ? "Online Offline" : "Online Offline "]
" - var/d = 0 - switch(i) - if(-4) - output = 0 - if(4) - output = SMESMAXOUTPUT //30000 + t += "Output level: M - - - [add_lspace(output,5)] + + + M
" - if(1) - d = 100 - if(-1) - d = -100 - if(2) - d = 1000 - if(-2) - d = -1000 - if(3) - d = 10000 - if(-3) - d = -10000 + t += "Output load: [round(loaddemand)] W
" - output += d - output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range + t += "

Close" - investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") - src.updateUsrDialog() + t += "
" + user << browse(t, "window=smes;size=460x300") + onclose(user, "smes") + return - else + +/obj/machinery/power/smes/Topic(href, href_list) + ..() + + if (usr.stat || usr.restrained() ) + return + if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if(!istype(usr, /mob/living/silicon/ai)) + usr << "\red You don't have the dexterity to do this!" + return + +//world << "[href] ; [href_list[href]]" + + if (( usr.machine==src && ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + + + if( href_list["close"] ) usr << browse(null, "window=smes") usr.machine = null - return + return + + else if( href_list["cmode"] ) + chargemode = !chargemode + if(!chargemode) + charging = 0 + updateicon() + + else if( href_list["online"] ) + online = !online + updateicon() + else if( href_list["input"] ) + + var/i = text2num(href_list["input"]) + + var/d = 0 + switch(i) + if(-4) + chargelevel = 0 + if(4) + chargelevel = SMESMAXCHARGELEVEL //30000 + + if(1) + d = 100 + if(-1) + d = -100 + if(2) + d = 1000 + if(-2) + d = -1000 + if(3) + d = 10000 + if(-3) + d = -10000 + + chargelevel += d + chargelevel = max(0, min(SMESMAXCHARGELEVEL, chargelevel)) // clamp to range + + else if( href_list["output"] ) + + var/i = text2num(href_list["output"]) + + var/d = 0 + switch(i) + if(-4) + output = 0 + if(4) + output = SMESMAXOUTPUT //30000 + + if(1) + d = 100 + if(-1) + d = -100 + if(2) + d = 1000 + if(-2) + d = -1000 + if(3) + d = 10000 + if(-3) + d = -10000 + + output += d + output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range + + investigate_log("input/output; [chargelevel>output?"":""][chargelevel]/[output] | Output-mode: [online?"on":"off"] | Input-mode: [chargemode?"auto":"off"] by [usr.key]","singulo") + src.updateUsrDialog() + + else + usr << browse(null, "window=smes") + usr.machine = null + return - proc/ion_act() - if(src.z == 1) - if(prob(1)) //explosion - world << "\red SMES explosion in [src.loc.loc]" - for(var/mob/M in viewers(src)) - M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2) - sleep(10*pick(4,5,6,7,10,14)) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() - smoke.set_up(3, 0, src.loc) - smoke.attach(src) - smoke.start() - explosion(src.loc, -1, 0, 1, 3, 0) - del(src) - return - if(prob(15)) //Power drain - world << "\red SMES power drain in [src.loc.loc]" - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - if(prob(50)) - emp_act(1) - else - emp_act(2) - if(prob(5)) //smoke only - world << "\red SMES smoke in [src.loc.loc]" - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() - smoke.set_up(3, 0, src.loc) - smoke.attach(src) - smoke.start() +/obj/machinery/power/smes/proc/ion_act() + if(src.z == 1) + if(prob(1)) //explosion + world << "\red SMES explosion in [src.loc.loc]" + for(var/mob/M in viewers(src)) + M.show_message("\red The [src.name] is making strange noises!", 3, "\red You hear sizzling electronics.", 2) + sleep(10*pick(4,5,6,7,10,14)) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(3, 0, src.loc) + smoke.attach(src) + smoke.start() + explosion(src.loc, -1, 0, 1, 3, 0) + del(src) + return + if(prob(15)) //Power drain + world << "\red SMES power drain in [src.loc.loc]" + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + if(prob(50)) + emp_act(1) + else + emp_act(2) + if(prob(5)) //smoke only + world << "\red SMES smoke in [src.loc.loc]" + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(3, 0, src.loc) + smoke.attach(src) + smoke.start() - emp_act(severity) - online = 0 - charging = 0 - output = 0 - charge -= 1e6/severity - if (charge < 0) - charge = 0 - spawn(100) - output = initial(output) - charging = initial(charging) - online = initial(online) - ..() +/obj/machinery/power/smes/emp_act(severity) + online = 0 + charging = 0 + output = 0 + charge -= 1e6/severity + if (charge < 0) + charge = 0 + spawn(100) + output = initial(output) + charging = initial(charging) + online = initial(online) + ..() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 505862b3bd..2a4fa39123 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -20,129 +20,124 @@ var/ndir = SOUTH var/turn_angle = 0 var/obj/machinery/power/solar_control/control = null - proc - healthcheck() + + +/obj/machinery/power/solar/New() + ..() + spawn(10) updateicon() update_solar_exposure() - broken() + if(powernet) + for(var/obj/machinery/power/solar_control/SC in powernet.nodes) + if(SC.id == id) + control = SC - New() - ..() - spawn(10) - updateicon() - update_solar_exposure() - if(powernet) - for(var/obj/machinery/power/solar_control/SC in powernet.nodes) - if(SC.id == id) - control = SC - - - attackby(obj/item/weapon/W, mob/user) - ..() - if (W) - src.add_fingerprint(user) - src.health -= W.force - src.healthcheck() - return - - - blob_act() - src.health-- +/obj/machinery/power/solar/attackby(obj/item/weapon/W, mob/user) + ..() + if (W) + src.add_fingerprint(user) + src.health -= W.force src.healthcheck() return - healthcheck() - if (src.health <= 0) - if(!(stat & BROKEN)) - broken() - else - new /obj/item/weapon/shard(src.loc) - new /obj/item/weapon/shard(src.loc) - del(src) - return - return +/obj/machinery/power/solar/blob_act() + src.health-- + src.healthcheck() + return - updateicon() - overlays = null - if(stat & BROKEN) - overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER) - else - overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER) - src.dir = angle2dir(adir) - return - - - update_solar_exposure() - if(!sun) - return - if(obscured) - sunfrac = 0 - return - var/p_angle = abs((360+adir)%360 - (360+sun.angle)%360) - if(p_angle > 90) // if facing more than 90deg from sun, zero output - sunfrac = 0 - return - sunfrac = cos(p_angle) ** 2 - - - process() - if(stat & BROKEN) return - if(!control) return - if(obscured) return - - var/sgen = SOLARGENRATE * sunfrac - add_avail(sgen) - if(powernet && control) - if(control in powernet.nodes) //this line right here... - control.gen += sgen - - if(adir != ndir) - spawn(10+rand(0,15)) - adir = (360+adir+dd_range(-10,10,ndir-adir))%360 - updateicon() - update_solar_exposure() - - - broken() - stat |= BROKEN - updateicon() - return - - - meteorhit() - if(stat & !BROKEN) +/obj/machinery/power/solar/proc/healthcheck() + if (src.health <= 0) + if(!(stat & BROKEN)) broken() else + new /obj/item/weapon/shard(src.loc) + new /obj/item/weapon/shard(src.loc) del(src) + return + return - ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(prob(15)) - new /obj/item/weapon/shard( src.loc ) - return - if(2.0) - if (prob(25)) - new /obj/item/weapon/shard( src.loc ) - del(src) - return - if (prob(50)) - broken() - if(3.0) - if (prob(25)) - broken() +/obj/machinery/power/solar/proc/updateicon() + overlays = null + if(stat & BROKEN) + overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER) + else + overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER) + src.dir = angle2dir(adir) + return + + +/obj/machinery/power/solar/proc/update_solar_exposure() + if(!sun) return + if(obscured) + sunfrac = 0 + return + var/p_angle = abs((360+adir)%360 - (360+sun.angle)%360) + if(p_angle > 90) // if facing more than 90deg from sun, zero output + sunfrac = 0 + return + sunfrac = cos(p_angle) ** 2 - blob_act() - if(prob(75)) - broken() - src.density = 0 +/obj/machinery/power/solar/process() + if(stat & BROKEN) return + if(!control) return + if(obscured) return + + var/sgen = SOLARGENRATE * sunfrac + add_avail(sgen) + if(powernet && control) + if(control in powernet.nodes) //this line right here... + control.gen += sgen + + if(adir != ndir) + spawn(10+rand(0,15)) + adir = (360+adir+dd_range(-10,10,ndir-adir))%360 + updateicon() + update_solar_exposure() + + +/obj/machinery/power/solar/proc/broken() + stat |= BROKEN + updateicon() + return + + +/obj/machinery/power/solar/meteorhit() + if(stat & !BROKEN) + broken() + else + del(src) + + +/obj/machinery/power/solar/ex_act(severity) + switch(severity) + if(1.0) + del(src) + if(prob(15)) + new /obj/item/weapon/shard( src.loc ) + return + if(2.0) + if (prob(25)) + new /obj/item/weapon/shard( src.loc ) + del(src) + return + if (prob(50)) + broken() + if(3.0) + if (prob(25)) + broken() + return + + +/obj/machinery/power/solar/blob_act() + if(prob(75)) + broken() + src.density = 0 /obj/machinery/power/solar/fake/process() diff --git a/code/modules/power/switch.dm b/code/modules/power/switch.dm index 992aad1087..30b16f2f2e 100644 --- a/code/modules/power/switch.dm +++ b/code/modules/power/switch.dm @@ -16,69 +16,69 @@ var/on = 0 //up is off, down is on var/busy = 0 //set to 1 when you start pulling - simple - icon_state = "switch-up" - icon_state_on = "switch-down" - icon_state_off = "switch-up" +/obj/structure/powerswitch/simple + icon_state = "switch-up" + icon_state_on = "switch-down" + icon_state_off = "switch-up" - examine() - ..() - if(on) - usr << "The switch is in the on position" - else - usr << "The switch is in the off position" +/obj/structure/powerswitch/examine() + ..() + if(on) + usr << "The switch is in the on position" + else + usr << "The switch is in the off position" - attack_ai(mob/user) - user << "\red You're an AI. This is a manual switch. It's not going to work." +/obj/structure/powerswitch/attack_ai(mob/user) + user << "\red You're an AI. This is a manual switch. It's not going to work." + return + +/obj/structure/powerswitch/attack_hand(mob/user) + + if(busy) + user << "\red This switch is already being toggled." return - attack_hand(mob/user) + ..() - if(busy) - user << "\red This switch is already being toggled." - return + busy = 1 + for(var/mob/O in viewers(user)) + O.show_message(text("\red [user] started pulling the [src]."), 1) - ..() - - busy = 1 + if(do_after(user, 50)) + set_state(!on) for(var/mob/O in viewers(user)) - O.show_message(text("\red [user] started pulling the [src]."), 1) + O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1) + busy = 0 - if(do_after(user, 50)) - set_state(!on) - for(var/mob/O in viewers(user)) - O.show_message(text("\red [user] flipped the [src] into the [on ? "on": "off"] position."), 1) - busy = 0 +/obj/structure/powerswitch/proc/set_state(var/state) + on = state + if(on) + icon_state = icon_state_on + var/list/connection_dirs = list() + for(var/direction in list(1,2,4,8,5,6,9,10)) + for(var/obj/structure/cable/C in get_step(src,direction)) + if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180)) + connection_dirs += direction + break - proc/set_state(var/state) - on = state - if(on) - icon_state = icon_state_on - var/list/connection_dirs = list() - for(var/direction in list(1,2,4,8,5,6,9,10)) - for(var/obj/structure/cable/C in get_step(src,direction)) - if(C.d1 == turn(direction, 180) || C.d2 == turn(direction, 180)) - connection_dirs += direction - break + for(var/direction in connection_dirs) + var/obj/structure/cable/C = new/obj/structure/cable(src.loc) + C.d1 = 0 + C.d2 = direction + C.icon_state = "[C.d1]-[C.d2]" + C.power_switch = src - for(var/direction in connection_dirs) - var/obj/structure/cable/C = new/obj/structure/cable(src.loc) - C.d1 = 0 - C.d2 = direction - C.icon_state = "[C.d1]-[C.d2]" - C.power_switch = src + var/datum/powernet/PN = new() + PN.number = powernets.len + 1 + powernets += PN + C.netnum = PN.number + PN.cables += C - var/datum/powernet/PN = new() - PN.number = powernets.len + 1 - powernets += PN - C.netnum = PN.number - PN.cables += C + C.mergeConnectedNetworks(C.d2) + C.mergeConnectedNetworksOnTurf() - C.mergeConnectedNetworks(C.d2) - C.mergeConnectedNetworksOnTurf() - - else - icon_state = icon_state_off - for(var/obj/structure/cable/C in src.loc) - del(C) \ No newline at end of file + else + icon_state = icon_state_off + for(var/obj/structure/cable/C in src.loc) + del(C) \ No newline at end of file diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index b87a8d02cb..f739ba93fd 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -15,18 +15,18 @@ layer = 2.6 // a bit above wires - New() - ..() - var/turf/T = src.loc - if(level==1) hide(T.intact) - return +/obj/machinery/power/terminal/New() + ..() + var/turf/T = src.loc + if(level==1) hide(T.intact) + return - hide(var/i) - if(i) - invisibility = 101 - icon_state = "term-f" - else - invisibility = 0 - icon_state = "term" +/obj/machinery/power/terminal/hide(var/i) + if(i) + invisibility = 101 + icon_state = "term-f" + else + invisibility = 0 + icon_state = "term" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 0f237a8624..9c9f1398a3 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -15,36 +15,36 @@ var/sun_angle = 0 // sun angle as set by sun datum - // called by datum/sun/calc_position() as sun's angle changes - proc/set_angle(var/angle) - sun_angle = angle +// called by datum/sun/calc_position() as sun's angle changes +/obj/machinery/power/tracker/proc/set_angle(var/angle) + sun_angle = angle - //set icon dir to show sun illumination - dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST + //set icon dir to show sun illumination + dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST - // check we can draw power - if(stat & NOPOWER) - return + // check we can draw power + if(stat & NOPOWER) + return - // find all solar controls and update them - // currently, just update all controllers in world - // ***TODO: better communication system using network - if(powernet) - for(var/obj/machinery/power/solar_control/C in powernet.nodes) - C.tracker_update(angle) + // find all solar controls and update them + // currently, just update all controllers in world + // ***TODO: better communication system using network + if(powernet) + for(var/obj/machinery/power/solar_control/C in powernet.nodes) + C.tracker_update(angle) - // timed process - // make sure we can draw power from the powernet - process() - var/avail = surplus() +// timed process +// make sure we can draw power from the powernet +/obj/machinery/power/tracker/process() + var/avail = surplus() - if(avail > 500) - add_load(500) - stat &= ~NOPOWER - else - stat |= NOPOWER + if(avail > 500) + add_load(500) + stat &= ~NOPOWER + else + stat |= NOPOWER - // override power change to do nothing since we don't care about area power - power_change() - return \ No newline at end of file +// override power change to do nothing since we don't care about area power +/obj/machinery/power/tracker/power_change() + return \ No newline at end of file diff --git a/icons/effects/ss13_dark_alpha7.dmi b/icons/effects/ss13_dark_alpha7.dmi index be73b47a3172320c6e3f6592264c3553be331662..6954df1ad529c8a557a597509963f7248982b5ca 100644 GIT binary patch delta 296 zcmZo?xx_p{rM{&qB%;J6wK%ybv!En1KaYW-VovKRYpxap5x0j{<)Zetx<5uPop@q` z({}|4UoO!}3vSPMnvu8TuH}cP636;yE>w5k&U-OlU1ZiGm5)D6Ej6x)a;E=%cgfmN z_oS2JX^%B_E*c&}(Gh&Vzwu95Ghxk&h``N@5?xPs^@;wqpP1}2$Mj3e3+^uIxakvT zFjO!wFmigjIEGZrd3)PYkjX%Rt4}aFn z{F`t%m|@*yIY!CJ1&qRzH5mDMxf$Nd;a?8YR1X(j1n*zAkD^Gwr%eRzAtwF o@7@02P(N9kQ3fU}!PW4WAuW>A@{YahGzK8>boFyt=akR{09*WcZb)}Hr*fq~K4 z)5S5QV$R#!ihj(2A`TbLSsFF^WJ{zunpUhlq8!2b`UTSl2@`FHhlPu?vv;%J@w`?2 z=gHnD&-#DNj7&?jzNSC#zk2)q6Av{R!Y9vXl%2eqQ4omvxu?zidBpm{`_Eth_)VV6 zC=V4EjMg>YeAxQNf984jRNwLpWo|iLCHe?hLO<$NK*r{M#bb|p1 NJYD@<);T3K0RY3hpm+cP diff --git a/maps/tgstation 3.0.0.dmm b/maps/tgstation 3.0.0.dmm index 85a9482296..925e4f2c2b 100644 --- a/maps/tgstation 3.0.0.dmm +++ b/maps/tgstation 3.0.0.dmm @@ -14,197 +14,236 @@ "an" = (/turf/simulated/floor,/area/lawoffice) "ao" = (/turf/simulated/wall,/area/storage/eva) "ap" = (/turf/simulated/floor,/area/storage/eva) -"aq" = (/turf/simulated/shuttle/wall{tag = "icon-pwall (NORTH)"; icon_state = "pwall"; dir = 1},/area) -"ar" = (/turf/simulated/shuttle/floor,/area) -"as" = (/turf/simulated/wall,/area/security/detectives_office) -"at" = (/turf/simulated/wall,/area/quartermaster/qm) -"au" = (/turf/simulated/wall,/area/quartermaster/storage) -"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area) -"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area) -"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area) -"ay" = (/turf/simulated/floor,/area/security/detectives_office) -"az" = (/turf/simulated/floor,/area/quartermaster/qm) -"aA" = (/turf/simulated/floor,/area/quartermaster/storage) -"aB" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area) -"aC" = (/turf/simulated/wall,/area/storage/primary) -"aD" = (/turf/simulated/floor/plating,/area/storage/primary) -"aE" = (/turf/simulated/floor/plating,/area/security/detectives_office) -"aF" = (/turf/simulated/floor,/area/storage/primary) -"aG" = (/turf/simulated/wall,/area/quartermaster/miningdock) -"aH" = (/turf/simulated/floor/plating,/area/quartermaster/storage) -"aI" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/plating,/area) -"aJ" = (/turf/simulated/floor,/area/quartermaster/miningdock) -"aK" = (/turf/simulated/floor/plating,/area/quartermaster/miningdock) -"aL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area) -"aM" = (/turf/simulated/wall,/area/janitor) -"aN" = (/turf/simulated/wall,/area/storage/art) -"aO" = (/turf/simulated/floor,/area/janitor) -"aP" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/turf/simulated/shuttle/plating,/area) -"aQ" = (/turf/simulated/floor,/area/storage/art) -"aR" = (/turf/simulated/floor/plating,/area/janitor) -"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area) -"aT" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "wall_floor"; tag = ""},/area) -"aU" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "wall_floor"; tag = ""},/area) -"aV" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area) -"aW" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area) -"aX" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area) -"aY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating,/area) -"aZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area) -"ba" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area) -"bb" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area) -"bc" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area) -"bd" = (/turf/simulated/wall,/area/crew_quarters/sleep_female) -"be" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_female) -"bf" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_female) -"bg" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_female) -"bh" = (/turf/simulated/wall,/area/crew_quarters/captain) -"bi" = (/turf/simulated/floor/plating,/area/crew_quarters/captain) -"bj" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) -"bk" = (/turf/simulated/wall,/area/bridge) -"bl" = (/turf/simulated/floor,/area/crew_quarters/sleep_female) -"bm" = (/turf/simulated/floor,/area/bridge) -"bn" = (/turf/simulated/floor/plating,/area/bridge) -"bo" = (/turf/simulated/floor/plating/airless,/area) -"bp" = (/turf/simulated/wall,/area/storage/emergency) -"bq" = (/turf/simulated/floor,/area/storage/emergency) -"br" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/sleep_female) -"bs" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_female) -"bt" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area) -"bu" = (/turf/simulated/floor{icon_state = "wood"},/area/bridge) -"bv" = (/turf/simulated/wall,/area/security/main) -"bw" = (/turf/simulated/wall,/area/security/brig) -"bx" = (/turf/simulated/floor,/area/security/main) -"by" = (/turf/simulated/floor,/area/security/brig) -"bz" = (/turf/simulated/wall,/area/security/warden) -"bA" = (/turf/simulated/wall,/area/engine/engineering) -"bB" = (/turf/simulated/wall,/area/engine/chiefs_office) -"bC" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) -"bD" = (/turf/simulated/floor,/area/engine/engineering) -"bE" = (/turf/simulated/floor,/area/engine/chiefs_office) -"bF" = (/turf/simulated/wall,/area/crew_quarters/bar) -"bG" = (/turf/simulated/floor/plating,/area/crew_quarters/bar) -"bH" = (/turf/simulated/wall,/area/crew_quarters/kitchen) -"bI" = (/turf/simulated/floor/plating,/area/crew_quarters/kitchen) -"bJ" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar) -"bK" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen) -"bL" = (/turf/simulated/floor/plating,/area/engine/engineering) -"bM" = (/turf/simulated/floor/plating/airless,/area/engine/engineering) -"bN" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/kitchen) -"bO" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"bP" = (/obj/structure/lattice,/turf/space,/area) -"bQ" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/turf/space,/area) -"bR" = (/obj/item/weapon/wirecutters,/turf/space,/area) -"bS" = (/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) -"bT" = (/turf/simulated/wall,/area/crew_quarters/heads) -"bU" = (/turf/simulated/floor,/area/crew_quarters/heads) -"bV" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/obj/item/weapon/crowbar,/turf/space,/area) -"bW" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering) -"bX" = (/obj/machinery/the_singularitygen{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering) -"bY" = (/obj/item/weapon/weldingtool,/turf/space,/area) -"bZ" = (/turf/simulated/floor{icon_state = "dark"},/area/security/main) -"ca" = (/turf/simulated/floor/plating,/area/security/main) -"cb" = (/turf/simulated/wall,/area/security/hos) -"cc" = (/turf/simulated/floor{icon_state = "wood"},/area/security/hos) -"cd" = (/turf/simulated/wall,/area/security/nuke_storage) -"ce" = (/turf/simulated/floor{icon_state = "dark"},/area/security/nuke_storage) -"cf" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/theatre) -"cg" = (/turf/simulated/wall,/area/bridge/meeting_room) -"ch" = (/turf/simulated/floor,/area/bridge/meeting_room) -"ci" = (/turf/simulated/floor{icon_state = "dark"},/area/security/hos) -"cj" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station) -"ck" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) -"cl" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/space,/area/shuttle/escape_pod1/station) -"cm" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) -"cn" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) -"co" = (/turf/simulated/wall,/area/crew_quarters/theatre) -"cp" = (/turf/simulated/floor/plating,/area/bridge/meeting_room) -"cq" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) -"cr" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/escape_pod1/station) -"cs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station) -"ct" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod1/station) -"cu" = (/turf/simulated/wall,/area/hydroponics) -"cv" = (/turf/simulated/floor/grass,/area/hydroponics) -"cw" = (/turf/simulated/wall,/area/crew_quarters/sleep_male) -"cx" = (/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/sleep_male) -"cy" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_male) -"cz" = (/turf/simulated/floor,/area/hydroponics) -"cA" = (/turf/simulated/floor,/area/crew_quarters/sleep_male) -"cB" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_male) -"cC" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_male) -"cD" = (/turf/simulated/wall,/area/library) -"cE" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/library) -"cF" = (/turf/simulated/wall,/area/assembly/assembly_line) -"cG" = (/turf/simulated/floor/plating,/area/assembly/assembly_line) -"cH" = (/turf/simulated/floor,/area/assembly/assembly_line) -"cI" = (/turf/simulated/wall,/area/medical/chemistry) -"cJ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"cK" = (/turf/simulated/wall,/area/medical/cryo) -"cL" = (/turf/simulated/wall,/area/medical/morgue) -"cM" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) -"cN" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_male) -"cO" = (/turf/simulated/floor{icon_state = "wood"},/area/library) -"cP" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/assembly_line) -"cQ" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/assembly/assembly_line) -"cR" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) -"cS" = (/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) -"cT" = (/turf/simulated/floor/plating,/area/library) -"cU" = (/turf/simulated/wall,/area/medical/genetics) -"cV" = (/turf/simulated/wall,/area/medical/patients_rooms) -"cW" = (/turf/simulated/floor/plating,/area/medical/medbay) -"cX" = (/turf/simulated/wall,/area/medical/medbay) -"cY" = (/turf/simulated/floor/plating,/area/medical/cryo) -"cZ" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) -"da" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms) -"db" = (/turf/simulated/floor{icon_state = "white"},/area/medical/morgue) -"dc" = (/turf/simulated/floor/plating,/area/medical/genetics) -"dd" = (/turf/simulated/wall,/area/medical/exam_room) -"de" = (/turf/simulated/floor{icon_state = "white"},/area/medical/exam_room) -"df" = (/turf/simulated/wall,/area/toxins/lab) -"dg" = (/turf/simulated/wall,/area/crew_quarters/hor) -"dh" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) -"di" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor) -"dj" = (/turf/simulated/wall,/area/medical/cmo) -"dk" = (/turf/simulated/floor/plating,/area/medical/cmo) -"dl" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) -"dm" = (/turf/simulated/wall,/area/medical/surgery) -"dn" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) -"do" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) -"dp" = (/turf/simulated/wall,/area/medical/virology) -"dq" = (/turf/simulated/wall,/area/turret_protected/ai) -"dr" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) -"ds" = (/turf/simulated/floor/plating,/area/medical/surgery) -"dt" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology) -"du" = (/turf/simulated/floor/plating,/area/medical/virology) -"dv" = (/turf/simulated/floor/plating,/area/toxins/lab) -"dw" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/lab) -"dx" = (/turf/simulated/wall,/area/toxins/xenobiology) -"dy" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/xenobiology) -"dz" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"dA" = (/turf/space,/area/toxins/test_area) -"dB" = (/turf/simulated/wall/r_wall,/area/atmos) -"dC" = (/turf/simulated/floor/engine,/area/atmos) -"dD" = (/turf/simulated/wall,/area/toxins/mixing) -"dE" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) -"dF" = (/turf/simulated/wall,/area/atmos) -"dG" = (/turf/simulated/floor,/area/atmos) -"dH" = (/turf/simulated/floor/plating,/area/atmos) -"dI" = (/turf/simulated/floor/plating,/area/toxins/mixing) -"dJ" = (/turf/simulated/floor,/area/toxins/lab) -"dK" = (/turf/simulated/wall,/area/toxins/storage) -"dL" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/storage) -"dM" = (/turf/simulated/wall,/area/toxins/server) -"dN" = (/turf/simulated/floor/bluegrid,/area/toxins/server) -"dO" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/storage) -"dP" = (/turf/simulated/wall/r_wall,/area/chapel/main) -"dQ" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/main) -"dR" = (/turf/simulated/wall,/area/chapel/main) -"dS" = (/turf/simulated/floor/plating,/area/chapel/main) -"dT" = (/turf/simulated/wall,/area/crew_quarters/locker) -"dU" = (/turf/simulated/floor,/area/crew_quarters/locker) -"dV" = (/turf/simulated/floor{icon_state = "bar"},/area) -"dW" = (/turf/simulated/wall,/area/chapel/office) -"dX" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/office) -"dY" = (/turf/space,/area/shuttle/escape/station) +"aq" = (/obj/item/weapon/paper{name = "atmos room for cargo"},/turf/simulated/floor/plating,/area) +"ar" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plating,/area) +"as" = (/turf/simulated/shuttle/wall{tag = "icon-pwall (NORTH)"; icon_state = "pwall"; dir = 1},/area) +"at" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 6},/turf/simulated/floor,/area) +"au" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/turf/simulated/floor/plating,/area) +"av" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 9},/turf/simulated/floor/plating,/area) +"aw" = (/turf/simulated/shuttle/floor,/area) +"ax" = (/obj/item/weapon/paper{name = "atmos room for mining"},/turf/simulated/floor/plating,/area) +"ay" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor,/area) +"az" = (/turf/simulated/wall,/area/security/detectives_office) +"aA" = (/turf/simulated/wall,/area/quartermaster/qm) +"aB" = (/turf/simulated/wall,/area/quartermaster/storage) +"aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area) +"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area) +"aE" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area) +"aF" = (/turf/simulated/floor,/area/security/detectives_office) +"aG" = (/turf/simulated/floor,/area/quartermaster/qm) +"aH" = (/turf/simulated/floor,/area/quartermaster/storage) +"aI" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area) +"aJ" = (/turf/simulated/wall,/area/storage/primary) +"aK" = (/turf/simulated/floor/plating,/area/storage/primary) +"aL" = (/turf/simulated/floor/plating,/area/security/detectives_office) +"aM" = (/turf/simulated/floor,/area/storage/primary) +"aN" = (/turf/simulated/wall,/area/quartermaster/miningdock) +"aO" = (/turf/simulated/floor/plating,/area/quartermaster/storage) +"aP" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/plating,/area) +"aQ" = (/turf/simulated/floor,/area/quartermaster/miningdock) +"aR" = (/turf/simulated/floor/plating,/area/quartermaster/miningdock) +"aS" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 5},/turf/simulated/floor/plating,/area) +"aT" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 10},/turf/simulated/floor/plating,/area) +"aU" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area) +"aV" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/turf/simulated/floor,/area) +"aW" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden,/turf/simulated/floor,/area) +"aX" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 10},/turf/simulated/floor,/area) +"aY" = (/turf/simulated/wall,/area/janitor) +"aZ" = (/turf/simulated/wall,/area/storage/art) +"ba" = (/turf/simulated/floor,/area/janitor) +"bb" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 8; id = "QMLoad"},/turf/simulated/shuttle/plating,/area) +"bc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area) +"bd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area) +"be" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area) +"bf" = (/turf/simulated/floor,/area/storage/art) +"bg" = (/turf/simulated/floor/plating,/area/janitor) +"bh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area) +"bi" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"; dir = 2},/area) +"bj" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "wall_floor"; tag = ""},/area) +"bk" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "wall_floor"; tag = ""},/area) +"bl" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area) +"bm" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area) +"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area) +"bo" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating,/area) +"bp" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area) +"bq" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area) +"br" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area) +"bs" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area) +"bt" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 9},/turf/simulated/floor,/area) +"bu" = (/obj/item/weapon/paper{name = "atmos room for bridge"},/turf/simulated/floor/plating,/area) +"bv" = (/turf/simulated/wall,/area/crew_quarters/sleep_female) +"bw" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_female) +"bx" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 5},/turf/simulated/floor,/area) +"by" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 4},/turf/simulated/floor,/area) +"bz" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_female) +"bA" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_female) +"bB" = (/turf/simulated/wall,/area/crew_quarters/captain) +"bC" = (/turf/simulated/floor/plating,/area/crew_quarters/captain) +"bD" = (/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bE" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor,/area) +"bF" = (/turf/simulated/wall,/area/bridge) +"bG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area) +"bH" = (/turf/simulated/floor,/area/crew_quarters/sleep_female) +"bI" = (/turf/simulated/floor,/area/bridge) +"bJ" = (/turf/simulated/floor/plating,/area/bridge) +"bK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor,/area) +"bL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area) +"bM" = (/turf/simulated/floor/plating/airless,/area) +"bN" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 1},/turf/simulated/floor,/area) +"bO" = (/turf/simulated/wall,/area/storage/emergency) +"bP" = (/turf/simulated/floor,/area/storage/emergency) +"bQ" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep_female) +"bR" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_female) +"bS" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area) +"bT" = (/turf/simulated/floor/wood,/area/bridge) +"bU" = (/turf/simulated/wall,/area/security/main) +"bV" = (/obj/item/weapon/paper{name = "atmos room for security"},/turf/simulated/floor/plating,/area/security/main) +"bW" = (/turf/simulated/floor/plating,/area/security/main) +"bX" = (/turf/simulated/wall,/area/security/brig) +"bY" = (/turf/simulated/floor/plating,/area/security/brig) +"bZ" = (/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{dir = 8},/turf/simulated/floor,/area) +"ca" = (/turf/simulated/wall,/area/security/warden) +"cb" = (/turf/simulated/floor,/area/security/main) +"cc" = (/turf/simulated/wall,/area/engine/engineering) +"cd" = (/turf/simulated/wall,/area/engine/chiefs_office) +"ce" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/warden) +"cf" = (/turf/simulated/floor,/area/engine/engineering) +"cg" = (/turf/simulated/floor,/area/engine/chiefs_office) +"ch" = (/turf/simulated/wall,/area/crew_quarters/bar) +"ci" = (/turf/simulated/floor/plating,/area/crew_quarters/bar) +"cj" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/turf/simulated/floor/plating,/area/crew_quarters/bar) +"ck" = (/turf/simulated/wall,/area/crew_quarters/kitchen) +"cl" = (/turf/simulated/floor/plating,/area/crew_quarters/kitchen) +"cm" = (/turf/simulated/floor,/area/security/brig) +"cn" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) +"co" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen) +"cp" = (/obj/item/weapon/paper{name = "atmos room for crew quarters"},/turf/simulated/floor/plating,/area/crew_quarters/bar) +"cq" = (/turf/simulated/floor/plating,/area/engine/engineering) +"cr" = (/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cs" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/kitchen) +"ct" = (/obj/machinery/field_generator{anchored = 1; state = 2},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cu" = (/obj/structure/lattice,/turf/space,/area) +"cv" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/turf/space,/area) +"cw" = (/obj/item/weapon/wirecutters,/turf/space,/area) +"cx" = (/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar) +"cy" = (/turf/simulated/wall,/area/crew_quarters/heads) +"cz" = (/turf/simulated/floor,/area/crew_quarters/heads) +"cA" = (/obj/structure/lattice{tag = "icon-lattice-simple (WEST)"; icon_state = "lattice-simple"; dir = 8},/obj/item/weapon/crowbar,/turf/space,/area) +"cB" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cC" = (/obj/machinery/the_singularitygen{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering) +"cD" = (/obj/item/weapon/weldingtool,/turf/space,/area) +"cE" = (/turf/simulated/floor{icon_state = "dark"},/area/security/main) +"cF" = (/turf/simulated/wall,/area/security/hos) +"cG" = (/turf/simulated/floor/wood,/area/security/hos) +"cH" = (/turf/simulated/wall,/area/security/nuke_storage) +"cI" = (/turf/simulated/floor{icon_state = "dark"},/area/security/nuke_storage) +"cJ" = (/turf/simulated/floor/wood,/area/crew_quarters/theatre) +"cK" = (/turf/simulated/wall,/area/bridge/meeting_room) +"cL" = (/turf/simulated/floor,/area/bridge/meeting_room) +"cM" = (/turf/simulated/floor{icon_state = "dark"},/area/security/hos) +"cN" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/escape_pod1/station) +"cO" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"cP" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 1},/turf/space,/area/shuttle/escape_pod1/station) +"cQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape_pod1/station) +"cR" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"cS" = (/turf/simulated/wall,/area/crew_quarters/theatre) +"cT" = (/turf/simulated/floor/plating,/area/bridge/meeting_room) +"cU" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) +"cV" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/escape_pod1/station) +"cW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod1/station) +"cX" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod1/station) +"cY" = (/turf/simulated/wall,/area/hydroponics) +"cZ" = (/turf/simulated/floor/grass,/area/hydroponics) +"da" = (/turf/simulated/wall,/area/crew_quarters/sleep_male) +"db" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep_male) +"dc" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep_male) +"dd" = (/turf/simulated/floor,/area/hydroponics) +"de" = (/turf/simulated/floor,/area/crew_quarters/sleep_male) +"df" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 6},/turf/simulated/floor/plating,/area) +"dg" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1},/turf/simulated/floor,/area) +"dh" = (/turf/simulated/floor{icon_state = "carpet"},/area/crew_quarters/sleep_male) +"di" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/sleep_male) +"dj" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area) +"dk" = (/turf/simulated/wall,/area/library) +"dl" = (/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/library) +"dm" = (/turf/simulated/wall,/area/assembly/assembly_line) +"dn" = (/turf/simulated/floor/plating,/area/assembly/assembly_line) +"do" = (/turf/simulated/floor,/area/assembly/assembly_line) +"dp" = (/turf/simulated/wall,/area/medical/chemistry) +"dq" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"dr" = (/turf/simulated/wall,/area/medical/cryo) +"ds" = (/turf/simulated/wall,/area/medical/morgue) +"dt" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue) +"du" = (/turf/simulated/floor/plating,/area/crew_quarters/sleep_male) +"dv" = (/turf/simulated/floor/wood,/area/library) +"dw" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/assembly_line) +"dx" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/assembly/assembly_line) +"dy" = (/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry) +"dz" = (/turf/simulated/floor{icon_state = "white"},/area/medical/cryo) +"dA" = (/turf/simulated/floor/plating,/area/library) +"dB" = (/turf/simulated/wall,/area/medical/genetics) +"dC" = (/turf/simulated/wall,/area/medical/patients_rooms) +"dD" = (/turf/simulated/floor/plating,/area/medical/medbay) +"dE" = (/turf/simulated/wall,/area/medical/medbay) +"dF" = (/turf/simulated/floor/plating,/area/medical/cryo) +"dG" = (/turf/simulated/floor{icon_state = "white"},/area/medical/genetics) +"dH" = (/turf/simulated/floor{icon_state = "white"},/area/medical/patients_rooms) +"dI" = (/turf/simulated/floor{icon_state = "white"},/area/medical/morgue) +"dJ" = (/obj/item/weapon/paper{name = "atmos room for medbay"},/turf/simulated/floor/plating,/area) +"dK" = (/turf/simulated/floor/plating,/area/medical/genetics) +"dL" = (/turf/simulated/wall,/area/medical/exam_room) +"dM" = (/turf/simulated/floor{icon_state = "white"},/area/medical/exam_room) +"dN" = (/turf/simulated/wall,/area/toxins/lab) +"dO" = (/turf/simulated/wall,/area/crew_quarters/hor) +"dP" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/lab) +"dQ" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor) +"dR" = (/obj/item/weapon/paper{name = "atmos room for science wing"},/turf/simulated/floor/plating,/area) +"dS" = (/turf/simulated/wall,/area/medical/cmo) +"dT" = (/turf/simulated/floor/plating,/area/medical/cmo) +"dU" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) +"dV" = (/turf/simulated/wall,/area/medical/surgery) +"dW" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery) +"dX" = (/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"dY" = (/turf/simulated/wall,/area/medical/virology) +"dZ" = (/turf/simulated/wall,/area/turret_protected/ai) +"ea" = (/turf/simulated/floor/bluegrid,/area/turret_protected/ai) +"eb" = (/turf/simulated/floor/plating,/area/medical/surgery) +"ec" = (/turf/simulated/floor{icon_state = "white"},/area/medical/virology) +"ed" = (/turf/simulated/floor/plating,/area/medical/virology) +"ee" = (/turf/simulated/floor/plating,/area/toxins/lab) +"ef" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/lab) +"eg" = (/turf/simulated/wall,/area/toxins/xenobiology) +"eh" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/xenobiology) +"ei" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"ej" = (/turf/space,/area/toxins/test_area) +"ek" = (/turf/simulated/wall/r_wall,/area/atmos) +"el" = (/turf/simulated/floor/engine,/area/atmos) +"em" = (/turf/simulated/wall,/area/toxins/mixing) +"en" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/mixing) +"eo" = (/turf/simulated/wall,/area/atmos) +"ep" = (/turf/simulated/floor/plating,/area/atmos) +"eq" = (/turf/simulated/floor,/area/atmos) +"er" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos) +"es" = (/obj/machinery/atmospherics/pipe/simple/supplymain/visible{dir = 4},/turf/simulated/floor,/area/atmos) +"et" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor/plating,/area/atmos) +"eu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 4},/turf/simulated/floor,/area/atmos) +"ev" = (/turf/simulated/floor/plating,/area/toxins/mixing) +"ew" = (/turf/simulated/floor,/area/toxins/lab) +"ex" = (/turf/simulated/wall,/area/toxins/storage) +"ey" = (/turf/simulated/floor{icon_state = "white"},/area/toxins/storage) +"ez" = (/turf/simulated/wall,/area/toxins/server) +"eA" = (/turf/simulated/floor/bluegrid,/area/toxins/server) +"eB" = (/turf/simulated/floor{icon_state = "dark"},/area/toxins/storage) +"eC" = (/turf/simulated/wall/r_wall,/area/chapel/main) +"eD" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/main) +"eE" = (/turf/simulated/wall,/area/chapel/main) +"eF" = (/turf/simulated/floor/plating,/area/chapel/main) +"eG" = (/turf/simulated/wall,/area/crew_quarters/locker) +"eH" = (/turf/simulated/floor,/area/crew_quarters/locker) +"eI" = (/turf/simulated/floor{icon_state = "bar"},/area) +"eJ" = (/turf/simulated/wall,/area/chapel/office) +"eK" = (/turf/simulated/floor{icon_state = "carpet"},/area/chapel/office) +"eL" = (/turf/space,/area/shuttle/escape/station) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -294,142 +333,142 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeahajajajajajajajadadadafagagafagagafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacaeaeaeaeaeahajajajajajajahadadadagagagagagagafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakakakakakakakakakakakadadadalalalalalalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakamamamamamamamamamakadadadalananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoaoaoaoapaoaoaoaoaeaeakamamamamamamamamamakadadadanananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamamadadadalananananananalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeamamamamamamamamamamakadadadalalalalanalalalacacacacacacacacacacacacacaqaqaqaqaqaqaqacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamakadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaearararararararaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakakakamamamamamamamakadadadacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacaqaqaqaqaqaqaqacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeaeaeasasasasasasasasasadadadatatatatatatatauauauauauauauauauauauauauauavawawawawawaxacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeacacacacaaacacaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayasadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAaAaAauaBarararararaBacaeaeaCaCaCaCaCaDaDaDaDaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeacacacaeaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayaEadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaeaeaeaeaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeayayayayayayayayayadadadatazazazazazazaAaAaAaAaAaAaAaAaAaAaAaHaHaHaIarararararaBacaeaeaDaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaGaKaGaGaeaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeasayayayayayayayaEadadadatazazazazazazauaAaAaAaAaAaAaAaAaAaAaHaHaHaLarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJaJaJaJaGacacacacacacacacaoaoapapapapaoaoaoacaeaeaeasayayayayayayayasadadadatatatazazatatauaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadacaeacaeaeaeaMaMaMaMaMaMaMaMaMadadadadadadadadadadauaAaAaAaAaAaAaAaAaAaAaHaHaHaLarararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaDaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadaNaNaNaNaeaeaMaOaOaOaOaOaOaOaMadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaHaHaHaParararararaBacaeaeaCaFaFaFaFaFaFaFaFaFaFaFaFaCaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaGaJaJaJaJaJaJaJaJaJaJaJaGadadadadadadadadadadadadadadadaNaQaQaNaeaeaMaOaOaOaOaOaOaOaRadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAauauauaBarararararaBacacacaCaCaDaFaDaDaDaDaDaDaFaDaCaCacacacacacacacacacacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaJaJaJaJaJaJaJaJaJaJaGaGaJaGaGadadadaNaNaNaNaNaNaNaNaNadadadaQaQaQaNaeaeaOaOaOaOaOaOaOaOaOadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaAaAauaSaTarararaUaVacadadadadadadadadadadadadadadadadadadadadadadadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaGaJaJaJaJaJaJaJaGadadadacadadadaNaQaQaQaQaQaQaQaNadadadaNaQaQaNaeaeaMaOaOaOaOaOaOaOaRadadadadadadadadadadaAaAaAaAaAaAaAaAaAaAaAaAaAauaWaXaYaYaYaXaZacadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaJaJaJaJaJaJaJaGadadadadadadadaNaQaQaQaQaQaQaQaNadadadaNaQaQaNaeaeaMaRaOaOaOaOaOaOaMadadadacacadadadadadauaAaAaAaAaAaAaAaAaAaAaAaAauaababbbbbbbcaaacadadadadadadadadadadadadadadadadadadadadadadadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaNaQaQaQaQaQaQaQaNadadadaNaNaNaNaeaeaMaMaMaMaMaMaMaMaMadadadacacadadadadadauauauauauauauauauauauauauauacacacacacacacacadadadbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbebdbdadadadacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaQaQaQaQaNaNaNaNaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbfbdbfbfbdbfbfbdbfbfbdbgbgbgbgbgbdadadadacaeaeacaabhbhbibibhbibibhbhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaJadadadadadadadaNaQaQaQaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbfbdbfbfbdbfbfbdbfbfbdbgbgbgbgbgbdadadadacaeaeacaabhbjbjbjbjbjbjbjbhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaGadadadadadadadaNaQaQaQaNadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadbdbfbdbdbfbdbdbfbdbdbfbdbdbgbgbgbgbgbdadadadacaeaeacaabibjbjbjbjbjbjbjbhbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaJaJaJaJaJaJaJaGadadadacadadadaNaQaQaQaNadadadacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacadadadbdblblblblblblblblblblblblblblblblblbdadadadacaeaeacaabibjbjbjbjbjbjbjbhbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaNaQaNaNadadadaNaNaNaNaNadadacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadblblblblblblblblblblblblblblblblblblbladadadacaeaeacaabibjbjbjbjbjbjbjbjbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacboacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadblblblblblblblblblblblblblblblblblblbladadadacaeaeacaabibjbjbjbjbjbjbjbhbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacboacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbdblblblblblblblblblblblblblblblblblbdadadadacaeaeacaabhbjbjbjbjbjbjbjbhbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbqbpbpbdbrbdbdbdbrbdbdbdbdbsbdbdbdadadadacaeaeacaabhbhbhbhbhbhbhbhbhbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaNaNacacacacacacacadadadacaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaacadadadbpbqbqbqbpbrbrbrbdbrbrbrbdbsbsbsbdbsbdadadadacaeaeacaabkbubububkbubububkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbqbqbqbpbrbrbrbdbrbrbrbdbsbsbsbsbsbdadadadacaeaeacaabkbubububkbubububkbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbpbpbpbdbdbdbdbdbdbdbdbdbebdbdbdbdadadadacaeaeacaabkbkbubkbkbkbubkbkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaabnbmbmbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbzbzbzbzbzbzbzbzbzbzbzbzbzbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbAbAbAbAaaaaaaaaaaaabBbBbBbBbBbBbBbBaaaaaaaaaaaaaaaaaaaaacadadadacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeacaabnbmbmbmbmbmbmbmbmbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbCbCbCbCbCbCbCbzbCbCbCbCbCbzbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbDbDbDbDbDbDbDbDbDbAbAbAbAbAbAbAbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbFbFbFbGbFbFbFbHbHbHbHbHbHbHbIbHbHbHadadadacaeaeacaabkbkbubkbkbkbubkbkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzbCbCbCbCbCbCbCbzbCbCbCbCbCbCbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbHadadadacaeaeacaabkbubububkbubububkbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbzbCbCbCbCbCbCbCbCbCbCbCbCbCbCbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbHadadadacaeaeacaabkbubububkbubububkbmbmbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbvbxbxbxbzbCbCbCbCbCbCbCbzbCbCbCbCbCbCbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAbDbDbDbDbDbAbAbAbDbDbDbDbDbAbDbDbDbDbAbEbEbEbEbEbEbBaaaaaaaaaaaaaaaaaaaaacadadadbJbJbJbJbJbJbJbJbHbKbKbKbKbKbKbKbKbKbKadadadacaeaeacaabkbkbkbkbkbkbkbkbkbmbmbkbkbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbxbvbxbxbxbzbCbCbCbCbCbCbCbzbCbCbCbCbCbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAbAbAbLbLbLbAbMbAbLbLbLbAbAbAbDbDbDbDbAbBbBbEbEbBbBbBaaaaaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbHbHbHbHbHbHbHbKbKbKbKbKbKbHadadadacaeaeacaaaaaaaaaaaaaabkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbxbvbvbvbxbvbvbvbzbzbzbzbzbzbzbzbCbCbCbzbzbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbAbAbAaaaaaaaaaaaaaaaaacadadadbFbJbJbJbJbHbNbNbNbNbNbHbKbKbKbKbKbKbHadadadacacaeacacacacacacacacbkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbxbxbxbvbxbxbxbxbxbxbxbxbxbvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaaaacacacadadadbFbJbJbJbJbHbNbNbNbNbNbNbKbKbKbKbKbKbHadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbMbMbMbMaaaabObPaabPbObPbQbPbOaaaabMbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaacacaeaeadadadbFbFbJbFbFbHbNbNbNbNbNbHbKbKbKbKbKbKbHadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnbnbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacacacaaaaaaaaaaaaaabAbMbMbMbMaaaabPbPaaaaaabRaabPbQaaaabAbAbAbAbDbAbAbAbDbDbDbDbDbDbAaaaaaabtaaboaeaeacadadadbSbSbSbSbSbHbHbHbHbHbHbHbHbHbHbKbHbHbHadadadacacbTbTbUbTbTbTbTbTbTbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbxbxbxbvbxbxbxbxbxbxbxbxbxbvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadaeaeacaaaaaaaaaaaabAbAbMbMbMbMaaaabPbQbPbPbPbPbPaaaaaaaabLbLbDbDbDbDbDbAbAbDbDbDbDbDbAacacacacacacacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbvbxbxbvbvbvbvbvbvbvbvbvbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeacacaaaaaaaaaabAbMbMbMbAbAaaaaaaaabPbMbMbMbPbVbQaaaabLbLbDbDbDbDbDbDbAbDbDbDbDbDbAadadadadadadadadacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbUbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbvaaaabvbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeboboaabtaaaaaabAbMbMbMbAbMaaaabObQbPbWbXbMbPaabOaaaabLbLbDbDbDbDbDbDbDbDbDbDbDbDbDadadadadadadadadadadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbxbxbvaaaabvbxbxbxbxbvbxbxbxbxbxbxbxbxbxbxbxadadadadadadadacaeacacaaaaaaaaaabAbMbMbMbAbAaaaabPbYbPbMbMbMbPaaaaaaaabLbLbDbDbDbDbDbDbAbDbDbDbDbDbAadadadadadadadadacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacadbTbUbUbUbUbUbUbUbUbmbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbZbZbvbvaabvbvbvbvbvbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadaeaeacaaaaaaaaaaaabAbAbMbMbMbMaaaaaaaabPbPbPbPbPaaaaaaaabLbLbDbDbDbDbDbAbAbDbDbDbDbDbAacacacacacacacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadbTbUbUbUbUbUbUbUbUbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZbvaabvbZbZbZbZbvbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacacacaaaaaaaaaaaaaabAbMbMbMbMaaaabPaaaaaaaaaaaabPbQaaaabAbAbAbAbDbAbAbAbDbDbDbDbDbDbAaaaaaabtaaboaeaeacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacacbTbTbUbTbTbTbTbTbTbkbmbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZcaaacabZbZbZbZbZbxbxbxbxbxbxbxbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbMbMbMbMaaaabObPbQbPbObPbQbPbOaaaabMbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaacacaeaeadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnbnbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbZbZbZbZbvaabvbZbZbZbZbvbxbxbxbxbxbxbxbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbDbDbDbDbDbDbDbDbDbDbDbDbAaaaaaaaaaaaaacacacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadadadadadadadadadadadadbmbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvaabvbvbvbvbvbvcbcbcccccccbcbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbAbAbAaaaaaaaaaaaaaaaaacadadadbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSadadadacacacacacacacacacacacbkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbcccccccccccbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbLbLbLbAbAbAbLbLbLbAbMbAbLbLbLbAbAbAbDbDbDbDbAbLbLbLbAbAbAbAaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaabkbmbmbmbmbmbmbnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbccccccccccccbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbLbAbAbDbDbDbDbDbAbAbAbDbDbDbDbDbAbDbDbDbDbAbLbLbLbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgcgcgchcgcgcgcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececiccccccccccccbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAcjckclbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScfcfcfcfcfcfcfcfcfbSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbccccccccccccbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaabAbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbAbDbDbDbDbAcmcncmbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbSbSbSbSbScococococococococobSbSbSbSbSadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcecececececbcccccccccccbbxbxbxbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbDbDbDbDbDbDbDbDbDbAbAbAbAbAbAbAbAcmcqcmbAaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaacgchchchchchchcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdcdcdcdcdcdcbcbcccccccbcbbxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAbAbAbAbAbAbAbAbAbAbAaaaaaaaaaaaaaacrcsctaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadcucucucucucucucucucucucgcgcgcgcgcgcgcgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbxbxbybybybybwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbwbwbwbwbwadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbpbpbpcwcwcwcwcwcwcwcwcwcwcwcwcwcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbqbqbqbpcxcxcxcwcxcxcxcwcycycycycycwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQadadadacaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaacadadadbpbqbqbqbpcxcxcxcwcxcxcxcwcycycycwcycwadadadcuczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadbpbpbqbpbpcwcxcwcwcwcxcwcwcwcwcycwcwcwadadadczczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaNaQaQaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacboacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcwcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcwadadadczczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaNaNaNaNadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacboacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAadadadcuczczczczczczczczczczcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacadadadacacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacadadadcwcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcAcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcwcwcBcwcwcBcwcwcBcwcwcCcCcCcCcCcwadadadcucvcvcvcvcvcvcvcvcvcvcvcvcvcuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcBcwcBcBcwcBcBcwcBcBcwcCcCcCcCcCcwadadadcucucucucucucucucucucucucucucuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadcwcBcBcwcBcBcwcBcBcwcBcBcwcCcCcCcCcCcwadadadacaaaaaaaacDcEcEcEcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaecFcFcFcFcFcFadadcFcFcFcFcFcFcFcFcGcHcHcGcFcFcFcFadadadcIcIcIadadadcIcIcIcJcJcJcJcJcKcKcKcKcKcKcLcLcLcMcLcLacacaeacacaccwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcNcwcwcwcDcOcDcDcDcDcDcDcDcEcEcEcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcFcFcFcPcPcPcPcFcPcPcFcQcQcQcQcHcHcHcHcHcHcHcHcHcFadadadadcIcRcIcRcRcRcIcRcIcJcJcJcJcJcKcScScScScScLcMcMcMcMcMacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecDcOcOcOcOcOcOcOcOcDcEcEcEcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcHcHcHcHcHcHcHcHcHcGadadadadcIcRcRcRcRcRcRcRcRcJcJcJcJcJcScScScScScScLcMcMcMcMcMacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaecTcOcOcOcOcOcOcOcOcEcEcEcEcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcFcHcHcHcHcHcHcHcHcHadadadadcIcRcRcRcRcRcRcRcIcJcJcJcJcJcKcScScScScScLcMcMcMcMcMcUcUcUcUcUcUcUcUcUcUcUcUcUcVcVcVcVcVcVcVcVcVcVcVcDcOcOcOcOcOcOcOcOcDcDcDcDcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcFcQcQcQcQcFcHcHcHcHcHcHcHcHcHadadadadcIcRcRcRcRcRcRcRcIcWcWcXcJcJcKcKcYcScYcKcLcMcMcMcMcMcUcZcZcZcZcZcZcZcZcZcZcZcUdadadacVdadadacVdadadacDcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcQcQcQcQcQcFcHcHcHcHcHcHcHcHcGadadadadcIcRcRcRcRcRcRcRcIcJcJcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcZcZcZcZcZcZcZcZcZcZcZcZcUdadadacVdadadacVdadadacDcOcOcOcOcOcOcOcOcOcOcOcOcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcPcPcPcPcPcPcPcPcPcPcQcQcQcQcQcFcHcHcHcHcHcHcHcHcFadadadadcIcRcRcRcRcRcRcRcIcJcJcJcJcJcJcJcJcJcJcJdbcMcMcMcMcMcUcZcZcZcZcZcZcZcUcUcUcUcUcVdacVcVcVdacVcVcVdacVcDcOcOcOcOcOcOcOcOcOcOcOcOcDcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaecFcFcFcFcFcFcFcFcFcFcFcFcFcGcGcFcFcFcFcFcFcGcFcFcFcFcFadadadcIcIcIcIcIcIcIcIcIcXcXcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcUcZcZcZcZcZcZcZcUcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcOcOcOcOcOcOcOcOcOcOcOcOcOcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaeaeaecXcJcJcJcXcJcJcJcJcJcJcJcJcLcMcMcMcMcMcUcZcZcZcZcZcZcZcUcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcOcOcOcOcOcOcOcOcOcOcOcOcOcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeaeaeaeaecXcJcJcJcJcJcJcJcJcJcJcJcJcLcLcLcLcLcLcUcUcUdccZdccUcUcUcJcJdddddededdddcVdacVcVcVdacVcDcDcDcTcDcDcDcDcDcDcDcDcDcDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaedfdfdfdfdfdfdfdfdfdfdfdfdgdgdgdgdgdgdgdgdgdgdgdgadadadacaeaeacaeaeaecXcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJdddededededddadadacVdadadaacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedfdhdhdhdhdhdhdhdhdhdhdhdgdididididididididididgadadadacaeaeacacacaccXcJcJcJcXcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJcJdddededededddadadacVdadadaacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedfdhdhdhdhdhdhdhdhdhdhdhdgdididididididididididgadadadacaeaeacaeaeaecXcJcJcJcXcXcJcXdjdkdkdkdldkdkdkdkdjdmdndmdmdmdmdmdmdmdmdodmdddededededddpdpdpdpdpdpdpdpaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaeaedfdfdfdfdfdfdfdfdfdfdhdhdqdqdrdqdqdididididididiadadadacaeaeaeaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdodododddddddddddddtdtdtdudtdtdtdpaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaedvdfdwdwdwdwdwdwdwdfdhdhdqdqdrdqdqdididididididiadadadacaeaeacaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododododododpdtdtdtdtdudtdtdtdudtdtdtdpaeaeacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaedvdfdwdwdwdwdwdwdwdfdhdhdqdqdrdqdqdididididididgadadadacaeaeacacacaccXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdodododpdtdtdtdtdudtdtdtdudtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdxdxdxdxdxdxdydydydydwdwdwdfdhdhdqdqdqdqdqdididididididgadadadacaeaeaeaeaeaecXcJcJcJcJcJcJcJdjdldldldldldldldldjdndndsdodododododmdpdtdpdpdtdtdtdtdududtdudududtdudpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdydydydydwdwdwdfdhdhdqdqdqdqdqdididgdgdgdgdgadadadacaeaeaeaeaeaecXcXcXcXcXcXcXcXdjdjdjdjdjdjdjdjdjdjdndndsdodododododmdtdtdtdpdtdtdtdtdtdtdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdhdhdhdfdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadaNaNaNaNaNaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacdmdmdmdmdmdmdmdmdmdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdzdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadaNaQaQaQaNaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedpdtdtdtdpdtdtdtdtdtdudududtdudududpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdzdhdhdhdhdhdhdhdhdhdhdhdfdfdfadadadaQaQaQaQaNaeaedBdBdBdBdBdBdBdBdBdBdBdBdBacacaeaeaeaeaeaeaeaeaeaeaedpdpdpdpdpdtdtdtdtdtdudtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdzdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdhdhdhadadadaNaQaQaQaNaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaacacacacacacacacacacaeaeaeaeaeaedpdpdpdpdpdpdpdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdhdhdhadadadaNaNaNaNaNaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaedpdtdtdtdtdtdtdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdzdzdzdzdzdxdzdzdzdzdzdzdzdxdhdhdhdhdhdhdhdhdhdhdhdfdfdfadadadacaeaeaeaeaeaedBdCdBdCdBdCdBdCdBdCdBdCdBaaaaaaaaaaaaaaaaaaaaacacacacacaeaeaeaeaeaeaeaedpdpdpdpdpdpdpdpaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedxdxdxdxdxdxdxdxdxdxdxdxdxdxdxdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadadacaeaeaeaeaeaedBdBdBdBdBdBdBdBdBdBdBdBdBaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaedDdEdEdEdEdEdEdEdfdhdhdhdhdhdhdhdhdhdhdhdhdhdfadadaddFdFdFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaedDdEdEdEdEdEdEdEdDdDdfdhdhdfdfdfdfdfdhdhdfdfdfadadaddFdGdGdGdGdFdGdFdHdFdHdFdHdFdHdFdHdFdHdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaeacacacdDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdfdfadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadIdIdIdIdIdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdJadadaddFdFdFdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdFdFdHdHdHdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqararaqaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdhdJadadaddGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaadDdEdEdEdEdEdEdEdEdEdEdEdEdEdEdfdhdhdhdhdhdfdfadadaddGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacdDdDdDdDdDdDdEdEdEdEdEdDdKdLdLdfdhdhdhdhdhdhdfadadaddFdFdFdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAdAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaedMdNdNdNdNdNdNdNdKdOdOdfdhdhdhdhdhdhdfadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaedMdNdNdNdNdNdNdNdKdOdOdfdfdfdwdfdfdfdfadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdPdPdPdPdPdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddHdGdGdGdGdHdGdGdGdGdGdGdGdPdQdQdQdPdGdGdGdGdGdGdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddFdGdGdGdGdFdGdGdGdGdGdGdGdPdQdQdQdPdGdGdGdGdGdGdGdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdRdRdRdRdRdRdRdRdRdRdRdRdPdPdQdPdPdFdHdHdHdHdHdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdNdNdNdNdNdNdNdKdOdOdOdOdOdOdOdOdOdKadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedMdMdMdMdMdMdMdMdKdKdKdKdKdKdKdKdKdKdKadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacacacaeaedTdTdTdTdTdTdTacacacacadadaddQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadCdCdCdCdCdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdSaaaadFdFdFdFdFdFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdUdUdUdUdUdTdVdVdVdVadadaddRdRdSdSdRdSdSdRdSdSdRdRdRdRdQdRdRdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaedTdTdTdUdTdTdTdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaedVdVdVdVdVdVdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacdVdVdVdVdVdVdVdVdVdVadadadacaaaaaaaaaaaaaaaaaaaadWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacdVdVdVdVdVdVdVdVdVdVadadadacacaeaeacaeaeacaeaeacdWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadaddWdXdXdXdXdXdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadaddWdWdWdWdWdWdWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeakamamamamamamamamamakadadadalananananananalacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoaoaoaoapaoaoaoaoaeaeakamamamamamamamamamakadadadanananananananalaeaqaeacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamamadadadalananananananalaearaeacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaacaeaeaoapapapapapapapaoaeaeamamamamamamamamamamakadadadalalalalanalalalacaracacacaeacacacacacacacasasasasasasasacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeacacacacaeaeaoapapapapapapapaoaeaeakamamamamamamamamamakadadatauauauauauauauauauavaeaeaeaeaeaeaeaeaeaeaeawawawawawawawaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaxaeacaeaeacaeaeaoapapapapapapapaoaeaeakakakamamamamamamamakadadayacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacasasasasasasasacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaraeacaeaeaeaeaeaoapapapapapapapaoaeaeaeaeazazazazazazazazazadadayaAaAaAaAaAaAaAaBaBaBaBaBaBaBaBaBaBaBaBaBaBaCaDaDaDaDaDaEacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeacaracacaeacacaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFazadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaHaHaBaIawawawawawaIacaeaeaJaJaJaJaJaKaKaKaKaJaJaJaJaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaearaeacacacaeaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFaLadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaeaeaearaeaeaeaeaeaeaeaoapapapapapapapaoaeaeaeaeaFaFaFaFaFaFaFaFaFadadayaAaGaGaGaGaGaGaHaHaHaHaHaHaHaHaHaHaHaOaOaOaPawawawawawaIacaeaeaKaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaNaRaNaNaSauauauauaTaeaeaoapapapapapapapaoaeaeaeaeazaFaFaFaFaFaFaFaLadadayaAaGaGaGaGaGaGaBaHaHaHaHaHaHaHaHaHaHaOaOaOaUawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQaQaQaQaNacacacacacaracacaoaoapapapapaoaoaoacaeaeaeazaFaFaFaFaFaFaFazadadayaAaAaAaGaGaAaAaBaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQaQaQaQaNataVaVaVaVaWaVaVaVaVaVaVaVaVaXacaeacaeaeaeaYaYaYaYaYaYaYaYaYadadayadadadadadadadaBaHaHaHaHaHaHaHaHaHaHaOaOaOaUawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaKaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaQaQaQaQaQaQaNayadadadadadadadadadadadadadayaZaZaZaZaeaeaYbababababababaaYadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaOaOaObbawawawawawaIacaeaeaJaMaMaMaMaMaMaMaMaMaMaMaMaJaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNaQaQaQaQaQaQaQaQaQaQaQaNayadbcbdbdbdbdbdbdbdbdbdbeadayaZbfbfaZaeaeaYbabababababababgadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaBaBaBaIawawawawawaIacacacaJaJaKaMaKaKaKaKaKaKaMaKaJaJacacacacacacacacacacaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaQaQaQaQaQaQaQaQaQaQaNaNaQaNaNayadbhaZaZaZaZaZaZaZaZaZbhadaybfbfbfaZaeaebababababababababaadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaBbibjawawawbkblacadadadadadadadadadadadadadadadadadadadadadadadadadacaeacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaNaQaQaQaQaQaQaQaNadadadacayadbhaZbfbfbfbfbfbfbfaZbhadayaZbfbfaZaeaeaYbabababababababgadadayadadadadadadadaHaHaHaHaHaHaHaHaHaHaHaHaHaBbmbnbobobobnbpacadadadadadadadadadadadadadadadadadadadadadadadadatauaTacaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaQaQaQaQaQaQaQaNadadadadayadbhaZbfbfbfbfbfbfbfaZbhadayaZbfbfaZaeaeaYbgbabababababaaYadadayacacadadadadadaBaHaHaHaHaHaHaHaHaHaHaHaHaBaabqbrbrbrbsaaacadadataVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbtacaracaebuaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhaZbfbfbfbfbfbfbfaZbhadayaZaZaZaZaeacaYaYaYaYaYaYaYaYaYadadayacacadadadadadaBaBaBaBaBaBaBaBaBaBaBaBaBaBacacacacacacacacadadaybvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbvbwbvbvadadadacaSauauaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhbfbfbfbfaZaZaZaZaZbhadbxaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaWaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbybvbzbzbvbzbzbvbzbzbvbzbzbvbAbAbAbAbAbvadadadacaeacacacbBbBbCbCbBbCbCbBbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaQadadadadayadbhaZbfbfbfaZadadadadbhadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaybvbzbzbvbzbzbvbzbzbvbzbzbvbAbAbAbAbAbvadadadacaeaeacaabBbDbDbDbDbDbDbDbBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadadayadbhaZbfbfbfaZadadbcbdbEbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbeadaybvbzbvbvbzbvbvbzbvbvbzbvbvbAbAbAbAbAbvadadadacaeaeacaabCbDbDbDbDbDbDbDbBbFbFbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaQaQaQaQaQaQaQaNadadadacayadbhaZbfbfbfaZadbcbGacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacbhadaybvbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbvadadadacaeaeacaabCbDbDbDbDbDbDbDbBbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNaNaNaNaNaNaNaNaNaZbfaZaZayadbhaZaZaZaZaZadbhacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHadadadacaeaeacaabCbDbDbDbDbDbDbDbDbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfaZayadbKbdbdbdbdbdbdbLacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbMacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHadadadacaeaeacaabCbDbDbDbDbDbDbDbBbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfbfayadadadadadadadadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbMacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybvbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbvadadadacaeaeacaabBbDbDbDbDbDbDbDbBbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfbfbfbfbfaZbxbNaVaVaVaVaVaXadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObPbObObvbQbvbvbvbQbvbvbvbvbRbvbvbvadadadacaeacacacbBbBbBbBbBbBbBbBbBbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZaZaZaZaZaZaZaZaZacaracacacacacayadbhacaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaacbhadaybObPbPbPbObQbQbQbvbQbQbQbvbRbRbRbvbRbvadadadacaeaeaeaebFbTbTbTbFbTbTbTbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaearacaeaeaeacayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObPbPbPbObQbQbQbvbQbQbQbvbRbRbRbRbRbvadadadacaeacaeaebFbTbTbTbFbTbTbTbFbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbVbWbWbXbYbYbYbYayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObObObObvbvbvbvbvbvbvbvbvbwbvbvbvbvadadadacaeacacacbFbFbTbFbFbFbTbFbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbXbYbYbYbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadbZauauauauauauauaTaeaeaeaeaeaeaeaeaeaeaeadadadacaeaeacaabJbIbIbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacbcbcbbYbYbYbYbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaaaaaacdcdcdcdcdcdcdcdaaaaaaaaaaaaaaaaaaaaacbhadayacaeaeaeaeaeaearaeaeaeaeaeaeaeaeaeaeacadadadaeaeaeacaabJbIbIbIbIbIbIbIbIbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacecececececececacecececececacbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccccccccccccfcfcfcfcfcfcfcfcfcccccccccccccccccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychchchcichchchcjckckckckckckckclckckckadadadacaeaeacaabFbFbTbFbFbFbTbFbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacecececececececacececececececbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnchcicjckcococococococococockadadadacaeaeacaabFbTbTbTbFbTbTbTbFbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbUbUcacececececececececececececececbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnchcpcickcococococococococockadadadacaeaeacaabFbTbTbTbFbTbTbTbFbIbIbFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbcbbUcbcbcbcacecececececececacececececececbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqcccccfcfcfcfcfcccccccfcfcfcfcfcccfcfcfcfcccgcgcgcgcgcgcdaaaaaaaaaaaaaaaaaaaaacbhadaycncncncncnchcicickcocococococococococoadadadacaeaeacaabFbFbFbFbFbFbFbFbFbIbIbFbFbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbcbbUcbcbcbcacecececececececacecececececacbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqcccccccqcqcqcccrcccqcqcqcccccccfcfcfcfcccdcdcgcgcdcdcdaaaaaaaaaaaaaaaaaaaaacbhadaychcncncncnckckckckckckckcocococococockadadadacaeaeacaaaaaaaaaaaaaabFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUcbbUbUbUcbbUbUbUcacacacacacacacacecececacacbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfccccccaaaaaaaaaaaaaaaaacbhadaychcncncncnckcscscscscsckcocococococockadadadacacaeacacacacacacacacbFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUcbcbcbbUcbcbcbcbcbcbcbcbcbbUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqccccaaaaaaaaaaaaaaaaaaaaaaaaaacccccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaaaacacacbhadaychcncncncnckcscscscscscscocococococockadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccrcrcrcraaaactcuaacuctcucvcuctaaaacrcccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaacacaeaebhadaychchcnchchckcscscscscsckcocococococockadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJbJbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacacacaaaaaaaaaaaaaacccrcrcrcraaaacucuaaaaaacwaacucvaaaacccccccccfcccccccfcfcfcfcfcfccaaaaaabSaabMaeaeacbhadaycxcxcxcxcxckckckckckckckckckckcockckckadadadacaccycyczcycycycycycybFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUcbcbcbbUcbcbcbcbcbcbcbcbcbbUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhaeaeacaaaaaaaaaaaacccccrcrcrcraaaacucvcucucucucuaaaaaaaacqcqcfcfcfcfcfcccccfcfcfcfcfccacacacacacacacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUbUbUbUcbcbbUbUbUbUbUbUbUbUbUcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaeacacaaaaaaaaaacccrcrcrccccaaaaaaaacucrcrcrcucAcvaaaacqcqcfcfcfcfcfcfcccfcfcfcfcfccadadadadadadadadacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadczczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbbUaaaabUcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaebMbMaabSaaaaaacccrcrcrcccraaaactcvcucBcCcrcuaactaaaacqcqcfcfcfcfcfcfcfcfcfcfcfcfcfadadadadadadadadadbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcbcbbUaaaabUcbcbcbcbbUcbcbcbcbcbcbcbcbcbcbcbadadadadayadbhacaeacacaaaaaaaaaacccrcrcrccccaaaacucDcucrcrcrcuaaaaaaaacqcqcfcfcfcfcfcfcccfcfcfcfcfccadadadadadadadadacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacadcyczczczczczczczczbIbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUcEcEbUbUaabUbUbUbUbUbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhaeaeacaaaaaaaaaaaacccccrcrcrcraaaaaaaacucucucucuaaaaaaaacqcqcfcfcfcfcfcccccfcfcfcfcfccacacacacacacacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadcyczczczczczczczczbFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbUaabUcEcEcEcEbUcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacacacaaaaaaaaaaaaaacccrcrcrcraaaacuaaaaaaaaaaaacucvaaaacccccccccfcccccccfcfcfcfcfcfccaaaaaabSaabMaeaeacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacaccycyczcycycycycycybFbIbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbWaabWcEcEcEcEcEcbcbcbcbcbcbcbcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccrcrcrcraaaactcucvcuctcucvcuctaaaacrcccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaacacaeaebhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJbJbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUcEcEcEcEbUaabUcEcEcEcEbUcbcbcbcbcbcbcbcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqccccaaaaaaaaaaaaaaaaaaaaaaaaaacccccfcfcfcfcfcfcfcfcfcfcfcfccaaaaaaaaaaaaacacacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadadadadadadadadadadadadbIbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUbUbUbUbUbUaabUbUbUbUbUbUcFcFcGcGcGcFcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfccccccaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxcxadadadacacacacacacacacacacacbFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccqcqcqcccccccqcqcqcccrcccqcqcqcccccccfcfcfcfcccqcqcqccccccccaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaabFbIbIbIbIbIbIbJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcGcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccqcccccfcfcfcfcfcccccccfcfcfcfcfcccfcfcfcfcccqcqcqccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcKcKcLcKcKcKcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcMcGcGcGcGcGcGcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccNcOcPccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcJcJcJcJcJcJcJcJcJcxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcGcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaacccfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcccfcfcfcfcccQcRcQccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaycxcxcxcxcxcScScScScScScScScScxcxcxcxcxadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcIcIcIcIcIcFcGcGcGcGcGcFcbcbcbbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaacccccccccccccccfcfcfcfcfcfcfcfcfcccccccccccccccccQcUcQccaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaacKcLcLcLcLcLcLcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHcHcHcHcHcHcFcFcGcGcGcFcFcbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaaaaaaaacVcWcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadcYcYcYcYcYcYcYcYcYcYcYcKcKcKcKcKcKcKcKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccbcbcbcmcmcmcmbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadayadadadadadadadadadadadadadadadadadadadadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbUbUbUbXbXbXbXbXayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObObObOdadadadadadadadadadadadadadaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObPbPbPbOdbdbdbdadbdbdbdadcdcdcdcdcdaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfbfayadbhacaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSaaaaaaaaacbhadaybObPbPbPbOdbdbdbdadbdbdbdadcdcdcdadcdaadadadcYddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaybObObPbObOdadbdadadadbdadadadadcdadadaadadadddddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaZbfbfaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbMacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydadedededededededededededededededededaadadadddddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaZaZaZaZayadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacbMacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydededededededededededededededededededeadadadcYddddddddddddddddddddcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaedfauauauaubyadbhacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbhadaydededededededededededededededededededeadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacacacacayadbhacacacacacacacacacacacacacacacacacacacaeacacacaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacbhadaydadedededededededededededededededededaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaeacayadbKbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbddgbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbGadaydadhdadadhdadadhdadadhdadadidididididaadadadcYcZcZcZcZcZcZcZcZcZcZcZcZcZcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearaeaeaeacayadadadadadadadadadadadadadadadadadadadadadadbhadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaydadhdhdadhdhdadhdhdadhdhdadidididididaadadadcYcYcYcYcYcYcYcYcYcYcYcYcYcYcYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaeacbxaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVdjaVbNaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVbtdadhdhdadhdhdadhdhdadhdhdadidididididaadadadacaaaaaaaadkdldldldkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaearacaeaedmdmdmdmdmdmadaddmdmdmdmdmdmdmdmdndododndmdmdmdmbhadaydpdpdpadadaddpdpdpdqdqdqdqdqdrdrdrdrdrdrdsdsdsdtdsdsacacaeacacacdadadadadadadadadadadadadadadadudadadadkdvdkdkdkdkdkdkdkdldldldkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdmdmdmdwdwdwdwdmdwdwdmdxdxdxdxdodododododododododmadbhadaydpdydpdydydydpdydpdqdqdqdqdqdrdzdzdzdzdzdsdtdtdtdtdtacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedkdvdvdvdvdvdvdvdvdkdldldldkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdodododododododododnadbhadaydpdydydydydydydydydqdqdqdqdqdzdzdzdzdzdzdsdtdtdtdtdtacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedAdvdvdvdvdvdvdvdvdldldldldkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdmdododododododododoadbhadaydpdydydydydydydydpdqdqdqdqdqdrdzdzdzdzdzdsdtdtdtdtdtdBdBdBdBdBdBdBdBdBdBdBdBdBdCdCdCdCdCdCdCdCdCdCdCdkdvdvdvdvdvdvdvdvdkdkdkdkdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdmdxdxdxdxdmdododododododododoadbhadaydpdydydydydydydydpdDdDdEdqdqdrdrdFdzdFdrdsdtdtdtdtdtdBdGdGdGdGdGdGdGdGdGdGdGdBdHdHdHdCdHdHdHdCdHdHdHdkdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeardmdwdwdwdwdwdwdwdwdwdwdxdxdxdxdxdmdododododododododnadbhadaydpdydydydydydydydpdqdqdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdGdGdGdGdGdGdGdGdGdGdGdGdBdHdHdHdCdHdHdHdCdHdHdHdkdvdvdvdvdvdvdvdvdvdvdvdvdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeardmdwdwdwdwdwdwdwdwdwdwdxdxdxdxdxdmdododododododododmadbhadaydpdydydydydydydydpdqdqdqdqdqdqdqdqdqdqdqdIdtdtdtdtdtdBdGdGdGdGdGdGdGdBdBdBdBdBdCdHdCdCdCdHdCdCdCdHdCdkdvdvdvdvdvdvdvdvdvdvdvdvdkdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeardmdmdmdmdmdmdmdmdmdmdmdmdmdndndmdmdmdmdmdmdndmdmdmdmdmbhadaydpdpdpdpdpdpdpdpdpdEdEdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdBdGdGdGdGdGdGdGdBdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdvdvdvdvdvdvdvdvdvdvdvdvdvdkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaSauauaTaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaebhadayacaeaeacaedJaedEdqdqdqdEdqdqdqdqdqdqdqdqdsdtdtdtdtdtdBdGdGdGdGdGdGdGdBdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdvdvdvdvdvdvdvdvdvdvdvdvdvdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaeaeaeaearaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacbhadbZauauauauauaeaedEdqdqdqdqdqdqdqdqdqdqdqdqdsdsdsdsdsdsdBdBdBdKdGdKdBdBdBdqdqdLdLdMdMdLdLdCdHdCdCdCdHdCdkdkdkdAdkdkdkdkdkdkdkdkdkdkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeardNdNdNdNdNdNdNdNdNdNdNdNdOdOdOdOdOdOdOdOdOdOdOdObhadayacaeaeacaeaeaedEdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdLdMdMdMdMdLdHdHdHdCdHdHdHacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeacaeardNdPdPdPdPdPdPdPdPdPdPdPdOdQdQdQdQdQdQdQdQdQdQdObhadayacaeaeacacacacdEdqdqdqdEdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdLdMdMdMdMdLdHdHdHdCdHdHdHacaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaedRaeauauauavdNdPdPdPdPdPdPdPdPdPdPdPdOdQdQdQdQdQdQdQdQdQdQdObhadayacaeaeacaeaeaedEdqdqdqdEdEdqdEdSdTdTdTdUdTdTdTdTdSdVdWdVdVdVdVdVdVdVdVdXdVdLdMdMdMdMdLdYdYdYdYdYdYdYdYaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaeaedNdNdNdNdNdNdNdNdNdNdPdPdZdZeadZdZdQdQdQdQdQdQdQbhadayacaeaeaeaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdXdXdXdLdLdLdLdLdLecececedecececdYaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeeedNefefefefefefefdNdPdPdZdZeadZdZdQdQdQdQdQdQdQbhadayacaeaeacaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdXdXdXdXdYececececedecececedecececdYaeaeacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeeedNefefefefefefefdNdPdPdZdZeadZdZdQdQdQdQdQdQdObhadayacaeaeacacacacdEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdXdXdXdYececececedecececedecececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegegegegegegegehehehehefefefdNdPdPdZdZdZdZdZdQdQdQdQdQdQdObhadayacaeaeaeaeaeaedEdqdqdqdqdqdqdqdSdUdUdUdUdUdUdUdUdSdWdWebdXdXdXdXdXdVdYecdYdYececececededecedededeceddYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegehehehehefefefdNdPdPdZdZdZdZdZdQdQdOdOdOdOdObhadayacaeaeaeaeaeaedEdEdEdEdEdEdEdEdSdSdSdSdSdSdSdSdSdSdWdWebdXdXdXdXdXdVecececdYececececececececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieidPdPdPdNdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaZaZaZaZaZaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacdVdVdVdVdVdVdVdVdVececececececececececececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieieidPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaZbfbfbfaZaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaedYecececdYecececececedededecedededdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieieidPdPdPdPdPdPdPdPdPdPdPdNdNdNbhadaybfbfbfbfaZaeaeekekekekekekekekekekekekekacacaeaeaeaeaeaeaeaeaeaeaedYdYdYdYdYecececececedececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieieieieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdPdPdPbhadayaZbfbfbfaZaeaeekelekelekelekelekelekelekaaacacacacacacacacacacaeaeaeaeaeaedYdYdYdYdYdYdYececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdPdPdPbhadayaZaZaZaZaZaeaeekelekelekelekelekelekelekaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaedYececececececdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegeieieieieiegeieieieieieieiegdPdPdPdPdPdPdPdPdPdPdPdNdNdNbhadayacaeaeaeaeaeaeekelekelekelekelekelekelekaaaaaaaaaaaaaaaaaaaaacacacacacaeaeaeaeaeaeaeaedYdYdYdYdYdYdYdYaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeegegegegegegegegegegegegegegegdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayaeaeaeaeaeaeaeekekekekekekekekekekekekekaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeemenenenenenenendNdPdPdPdPdPdPdPdPdPdPdPdPdPdNbhadayeoeoeoepeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeemenenenenenenenememdNdPdPdNdNdNdNdNdPdPdNdNdNbhadayeoeqeqeqeqeoeqeoepeoepeoepeoepeoepeoepeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaeaeacacacemenenenenenenenenenenenenenendNdPdPdPdPdPdPdNbhadbxeresesesesereseqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdPdNbKbdbdeteueueueueteueqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdNdNadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaevevevevevenenenenenenenenenendNdPdPdPdPdPdPewadadadeoeoeoeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeoeoepepepeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawawasaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdPewadadadeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacaaaaemenenenenenenenenenenenenenendNdPdPdPdPdPdNdNadadadeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacememememememenenenenenemexeyeydNdPdPdPdPdPdPdNadadadeoeoeoeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejejejejejejejejejejejejejejejejejejejaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeezeAeAeAeAeAeAeAexeBeBdNdPdPdPdPdPdPdNadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeezeAeAeAeAeAeAeAexeBeBdNdNdNefdNdNdNdNadadadepeqeqeqeqepeqeqeqeqeqeqeqeCeCeCeCeCeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadepeqeqeqeqepeqeqeqeqeqeqeqeCeDeDeDeCeqeqeqeqeqeqeqepaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeoeqeqeqeqeoeqeqeqeqeqeqeqeCeDeDeDeCeqeqeqeqeqeqeqeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeEeEeEeEeEeEeEeEeEeEeEeEeCeCeDeCeCeoepepepepepeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezeAeAeAeAeAeAeAexeBeBeBeBeBeBeBeBeBexadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeoeoeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeezezezezezezezezexexexexexexexexexexexadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeacadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeacacacacacacaeaeeGeGeGeGeGeGeGacacacacadadadeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeleleleleleoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeFaaaaeoeoeoeoeoeoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeDeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeHeHeHeHeHeGeIeIeIeIadadadeEeEeFeFeEeFeFeEeFeFeEeEeEeEeDeEeEeEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeeGeGeGeHeGeGeGeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaeeIeIeIeIeIeIeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaeaeaceIeIeIeIeIeIeIeIeIeIadadadacaaaaaaaaaaaaaaaaaaaaeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaceIeIeIeIeIeIeIeIeIeIadadadacacaeaeacaeaeacaeaeaceJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadeJeKeKeKeKeKeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadeJeJeJeJeJeJeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadadadadadadadadadadadadadadadadadadadadadadadadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaeaeacaeaeacacadacaeaeaeacadacacacaeaeacaeaeacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadacaaaaaaacadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacadacaaaaaaacadacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLeLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa