From 4b3af6d6e251a65d8834315bd32dc86dbafc7006 Mon Sep 17 00:00:00 2001 From: comma Date: Thu, 11 Jul 2013 02:20:07 +0400 Subject: [PATCH 1/5] Removed that ugly hack that deletes cryoxadone from beaker It's counterintuitive IC (IV destroys all clonex when beaker is in), and alleged 'infinimeat crashing server' is complete bullshit. Same amount of meat can be achieved with syringes and beakers, or two big beakers. Spawn speed is not anywhere gamebreaking too. --- code/game/machinery/iv_drip.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 40f5a3b9593..42766ad7db8 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -112,8 +112,6 @@ if (B) beaker.reagents.reagent_list |= B - beaker.reagents.del_reagent("clonexadone") //Fix for infinite meat spawning when taking blood from human - beaker.reagents.update_total() //to an IV drip full of clonex beaker.on_reagent_change() beaker.reagents.handle_reactions() update_icon() From 35e7ec32284fb9d07a1a3574d1ba0f84da0d452e Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 3 Aug 2013 14:08:27 +0200 Subject: [PATCH 2/5] Allow cyborgs to hack vending machines --- code/game/machinery/vending.dm | 1720 ++++++++++++++++---------------- 1 file changed, 860 insertions(+), 860 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d98d57de30b..80703f4916e 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1,860 +1,860 @@ -/datum/data/vending_product - var/product_name = "generic" - var/product_path = null - var/amount = 0 - var/price = 0 - var/display_color = "blue" - - - -/obj/machinery/vending - name = "Vendomat" - desc = "A generic vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "generic" - layer = 2.9 - anchored = 1 - density = 1 - var/active = 1 //No sales pitches if off! - var/vend_ready = 1 //Are we ready to vend?? Is it time?? - var/vend_delay = 10 //How long does it take to vend? - var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now. - - // To be filled out at compile time - var/list/products = list() // For each, use the following pattern: - var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2) - var/list/premium = list() // No specified amount = only one in stock - var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price. - - var/product_slogans = "" //String of slogans separated by semicolons, optional - var/product_ads = "" //String of small ad messages in the vending screen - random chance - var/list/product_records = list() - var/list/hidden_records = list() - var/list/coin_records = list() - var/list/slogan_list = list() - var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it - var/vend_reply //Thank you for shopping! - var/last_reply = 0 - var/last_slogan = 0 //When did we last pitch? - var/slogan_delay = 6000 //How long until we can pitch again? - var/icon_vend //Icon_state when vending! - var/icon_deny //Icon_state when vending! - //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine. - var/seconds_electrified = 0 //Shock customers like an airlock. - var/shoot_inventory = 0 //Fire items at customers! We're broken! - var/shut_up = 1 //Stop spouting those godawful pitches! - var/extended_inventory = 0 //can we access the hidden inventory? - var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar. - var/wires = 15 - var/obj/item/weapon/coin/coin - var/const/WIRE_EXTEND = 1 - var/const/WIRE_SCANID = 2 - var/const/WIRE_SHOCK = 3 - var/const/WIRE_SHOOTINV = 4 - - var/obj/machinery/account_database/linked_db - var/datum/money_account/linked_account - -/obj/machinery/vending/New() - ..() - spawn(4) - src.slogan_list = text2list(src.product_slogans, ";") - - // So not all machines speak at the exact same time. - // The first time this machine says something will be at slogantime + this random value, - // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. - src.last_slogan = world.time + rand(0, slogan_delay) - - src.build_inventory(products) - //Add hidden inventory - src.build_inventory(contraband, 1) - src.build_inventory(premium, 0, 1) - power_change() - - reconnect_database() - linked_account = vendor_account - - return - - return - -/obj/machinery/vending/proc/reconnect_database() - for(var/obj/machinery/account_database/DB in world) - if(DB.z == src.z) - linked_db = DB - break - -/obj/machinery/vending/ex_act(severity) - switch(severity) - if(1.0) - del(src) - return - if(2.0) - if (prob(50)) - del(src) - return - if(3.0) - if (prob(25)) - spawn(0) - src.malfunction() - return - return - else - return - -/obj/machinery/vending/blob_act() - if (prob(50)) - spawn(0) - src.malfunction() - del(src) - return - - return - -/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0) - for(var/typepath in productlist) - var/amount = productlist[typepath] - var/price = prices[typepath] - if(isnull(amount)) amount = 1 - - var/atom/temp = new typepath(null) - var/datum/data/vending_product/R = new /datum/data/vending_product() - R.product_name = temp.name - R.product_path = typepath - R.amount = amount - R.price = price - R.display_color = pick("red","blue","green") - - if(hidden) - hidden_records += R - else if(req_coin) - coin_records += R - else - product_records += R -// world << "Added: [R.product_name]] - [R.amount] - [R.product_path]" - return - -/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/emag)) - src.emagged = 1 - user << "You short out the product lock on [src]" - return - else if(istype(W, /obj/item/weapon/screwdriver)) - src.panel_open = !src.panel_open - user << "You [src.panel_open ? "open" : "close"] the maintenance panel." - src.overlays.Cut() - if(src.panel_open) - src.overlays += image(src.icon, "[initial(icon_state)]-panel") - src.updateUsrDialog() - return - else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters)) - if(src.panel_open) - attack_hand(user) - return - else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) - user.drop_item() - W.loc = src - coin = W - user << "\blue You insert the [W] into the [src]" - return - else if(istype(W, /obj/item/weapon/card) && currently_vending) - //attempt to connect to a new db, and if that doesn't work then fail - if(!linked_db) - reconnect_database() - if(linked_db) - if(linked_account) - var/obj/item/weapon/card/I = W - scan_card(I) - else - usr << "\icon[src]Unable to connect to linked account." - else - usr << "\icon[src]Unable to connect to accounts database." - else - ..() - -/obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I) - if(!currently_vending) return - if (istype(I, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = I - visible_message("[usr] swipes a card through [src].") - if(linked_account) - var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - var/transaction_amount = currently_vending.price - if(transaction_amount <= D.money) - - //transfer the money - D.money -= transaction_amount - linked_account.money += transaction_amount - - //create entries in the two account transaction logs - var/datum/transaction/T = new() - T.target_name = "[linked_account.owner_name] (via [src.name])" - T.purpose = "Purchase of [currently_vending.product_name]" - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = "Purchase of [currently_vending.product_name]" - T.amount = "[transaction_amount]" - T.source_terminal = src.name - T.date = current_date_string - T.time = worldtime2text() - linked_account.transaction_log.Add(T) - - // Vend the item - src.vend(src.currently_vending, usr) - currently_vending = null - else - usr << "\icon[src]You don't have that much money!" - else - usr << "\icon[src]Unable to access account. Check security settings and try again." - else - usr << "\icon[src]EFTPOS is not connected to an account." - -/obj/machinery/vending/attack_paw(mob/user as mob) - return attack_hand(user) - -/obj/machinery/vending/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/vending/attack_hand(mob/user as mob) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - - if(src.seconds_electrified != 0) - if(src.shock(user, 100)) - return - - var/vendorname = (src.name) //import the machine's name - - if(src.currently_vending) - var/dat = "
[vendorname]


" //display the name, and added a horizontal rule - dat += "You have selected [currently_vending.product_name].
Please swipe your ID to pay for the article.

" - dat += "Cancel" - user << browse(dat, "window=vending") - onclose(user, "") - return - - var/dat = "
[vendorname]


" //display the name, and added a horizontal rule - dat += "Select an item:

" //the rest is just general spacing and bolding - - if (premium.len > 0) - dat += "Coin slot: [coin ? coin : "No coin inserted"] (Remove)

" - - if (src.product_records.len == 0) - dat += "No product loaded!" - else - var/list/display_records = src.product_records - if(src.extended_inventory) - display_records = src.product_records + src.hidden_records - if(src.coin) - display_records = src.product_records + src.coin_records - if(src.coin && src.extended_inventory) - display_records = src.product_records + src.hidden_records + src.coin_records - - for (var/datum/data/vending_product/R in display_records) - dat += "[R.product_name]:" - dat += " [R.amount] " - if(R.price) - dat += " (Price: [R.price])" - if (R.amount > 0) - dat += " (Vend)" - else - dat += " SOLD OUT" - dat += "
" - - dat += "
" - - if(panel_open) - var/list/vendwires = list( - "Violet" = 1, - "Orange" = 2, - "Goldenrod" = 3, - "Green" = 4, - ) - dat += "


Access Panel
" - for(var/wiredesc in vendwires) - var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] - dat += "[wiredesc] wire: " - if(!is_uncut) - dat += "Mend" - else - dat += "Cut " - dat += "Pulse " - dat += "
" - - dat += "
" - dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].
" - dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].
" - dat += "The green light is [src.extended_inventory ? "on" : "off"].
" - dat += "The [(src.wires & WIRE_SCANID) ? "purple" : "yellow"] light is on.
" - - if (product_slogans != "") - dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle" - - user << browse(dat, "window=vending") - onclose(user, "") - return - -/obj/machinery/vending/Topic(href, href_list) - if(stat & (BROKEN|NOPOWER)) - return - if(usr.stat || usr.restrained()) - return - - if(istype(usr,/mob/living/silicon)) - if(istype(usr,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = usr - if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - else - usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" - return - - if(href_list["remove_coin"]) - if(!coin) - usr << "There is no coin in this machine." - return - - coin.loc = src.loc - if(!usr.get_active_hand()) - usr.put_in_hands(coin) - usr << "\blue You remove the [coin] from the [src]" - coin = null - - - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) - usr.set_machine(src) - if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) - - if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH - usr << "\red Access denied." //Unless emagged of course - flick(src.icon_deny,src) - return - - var/datum/data/vending_product/R = locate(href_list["vend"]) - if (!R || !istype(R) || !R.product_path || R.amount <= 0) - return - - if(R.price == null) - src.vend(R, usr) - else - src.currently_vending = R - src.updateUsrDialog() - - return - - else if (href_list["cancel_buying"]) - src.currently_vending = null - src.updateUsrDialog() - return - - else if ((href_list["cutwire"]) && (src.panel_open)) - var/twire = text2num(href_list["cutwire"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(twire)) - src.mend(twire) - else - src.cut(twire) - - else if ((href_list["pulsewire"]) && (src.panel_open)) - var/twire = text2num(href_list["pulsewire"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(twire)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(twire) - - else if ((href_list["togglevoice"]) && (src.panel_open)) - src.shut_up = !src.shut_up - - src.add_fingerprint(usr) - src.updateUsrDialog() - else - usr << browse(null, "window=vending") - return - return - -/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) - if ((!src.allowed(user)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH - user << "\red Access denied." //Unless emagged of course - flick(src.icon_deny,src) - return - src.vend_ready = 0 //One thing at a time!! - - if (R in coin_records) - if(!coin) - user << "\blue You need to insert a coin to get this item." - return - if(coin.string_attached) - if(prob(50)) - user << "\blue You successfully pull the coin out before the [src] could swallow it." - else - user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." - del(coin) - else - del(coin) - - R.amount-- - - if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply) - spawn(0) - src.speak(src.vend_reply) - src.last_reply = world.time - - use_power(5) - if (src.icon_vend) //Show the vending animation if needed - flick(src.icon_vend,src) - spawn(src.vend_delay) - new R.product_path(get_turf(src)) - src.vend_ready = 1 - return - - src.updateUsrDialog() - -/obj/machinery/vending/process() - if(stat & (BROKEN|NOPOWER)) - return - - if(!src.active) - return - - if(src.seconds_electrified > 0) - src.seconds_electrified-- - - //Pitch to the people! Really sell it! - if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5)) - var/slogan = pick(src.slogan_list) - src.speak(slogan) - src.last_slogan = world.time - - if(src.shoot_inventory && prob(2)) - src.throw_item() - - return - -/obj/machinery/vending/proc/speak(var/message) - if(stat & NOPOWER) - return - - if (!message) - return - - for(var/mob/O in hearers(src, null)) - O.show_message("[src] beeps, \"[message]\"",2) - return - -/obj/machinery/vending/power_change() - if(stat & BROKEN) - icon_state = "[initial(icon_state)]-broken" - else - if( powered() ) - icon_state = initial(icon_state) - stat &= ~NOPOWER - else - spawn(rand(0, 15)) - src.icon_state = "[initial(icon_state)]-off" - stat |= NOPOWER - -//Oh no we're malfunctioning! Dump out some product and break. -/obj/machinery/vending/proc/malfunction() - for(var/datum/data/vending_product/R in src.product_records) - if (R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if (!dump_path) - continue - - while(R.amount>0) - new dump_path(src.loc) - R.amount-- - break - - stat |= BROKEN - src.icon_state = "[initial(icon_state)]-broken" - return - -//Somebody cut an important wire and now we're following a new definition of "pitch." -/obj/machinery/vending/proc/throw_item() - var/obj/throw_item = null - var/mob/living/target = locate() in view(7,src) - if(!target) - return 0 - - for(var/datum/data/vending_product/R in src.product_records) - if (R.amount <= 0) //Try to use a record that actually has something to dump. - continue - var/dump_path = R.product_path - if (!dump_path) - continue - - R.amount-- - throw_item = new dump_path(src.loc) - break - if (!throw_item) - return 0 - spawn(0) - throw_item.throw_at(target, 16, 3) - src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") - return 1 - -/obj/machinery/vending/proc/isWireColorCut(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/vending/proc/isWireCut(var/wireIndex) - var/wireFlag = APCIndexToFlag[wireIndex] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/vending/proc/cut(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - var/wireIndex = APCWireColorToIndex[wireColor] - src.wires &= ~wireFlag - switch(wireIndex) - if(WIRE_EXTEND) - src.extended_inventory = 0 - if(WIRE_SHOCK) - src.seconds_electrified = -1 - if (WIRE_SHOOTINV) - if(!src.shoot_inventory) - src.shoot_inventory = 1 - - -/obj/machinery/vending/proc/mend(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function - src.wires |= wireFlag - switch(wireIndex) -// if(WIRE_SCANID) - if(WIRE_SHOCK) - src.seconds_electrified = 0 - if (WIRE_SHOOTINV) - src.shoot_inventory = 0 - -/obj/machinery/vending/proc/pulse(var/wireColor) - var/wireIndex = APCWireColorToIndex[wireColor] - switch(wireIndex) - if(WIRE_EXTEND) - src.extended_inventory = !src.extended_inventory -// if (WIRE_SCANID) - if (WIRE_SHOCK) - src.seconds_electrified = 30 - if (WIRE_SHOOTINV) - src.shoot_inventory = !src.shoot_inventory - - -/obj/machinery/vending/proc/shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) - return 1 - else - return 0 - -/* - * Vending machine types - */ - -/* - -/obj/machinery/vending/[vendors name here] // --vending machine template :) - name = "" - desc = "" - icon = '' - icon_state = "" - vend_delay = 15 - products = list() - contraband = list() - premium = list() - -*/ - -/* -/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink - name = "Tank Vendor" - desc = "A vendor with a wide variety of masks and gas tanks." - icon = 'icons/obj/objects.dmi' - icon_state = "dispenser" - product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath" - product_amounts = "10;10;10;5;25" - vend_delay = 0 -*/ - -/obj/machinery/vending/boozeomat - name = "Booze-O-Mat" - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." - icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles - icon_deny = "boozeomat-deny" - products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5, - /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/beer = 6, - /obj/item/weapon/reagent_containers/food/drinks/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, - /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4, - /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/tonic = 8, - /obj/item/weapon/reagent_containers/food/drinks/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/sodawater = 15, - /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9) - contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) - vend_delay = 15 - product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" - product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" - req_access_txt = "25" - -/obj/machinery/vending/assist - products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4, - /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4) - contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2) - product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" - -/obj/machinery/vending/coffee - name = "Hot Drinks machine" - desc = "A vending machine which dispenses hot drinks." - product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" - icon_state = "coffee" - icon_vend = "coffee-vend" - vend_delay = 34 - products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) - contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10) - prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) - - - - -/obj/machinery/vending/snack - name = "Getmore Chocolate Corp" - desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars" - product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" - product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" - icon_state = "snack" - products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, - /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6, - /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6) - contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) - prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25, - /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30, - /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25) - - - -/obj/machinery/vending/cola - name = "Robust Softdrinks" - desc = "A softdrink vendor provided by Robust Industries, LLC." - icon_state = "Cola_Machine" - product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" - product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." - products = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 10, - /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/starkist = 10, - /obj/item/weapon/reagent_containers/food/drinks/space_up = 10) - contraband = list(/obj/item/weapon/reagent_containers/food/drinks/thirteenloko = 5) - prices = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 20,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 20, - /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 20,/obj/item/weapon/reagent_containers/food/drinks/starkist = 20, - /obj/item/weapon/reagent_containers/food/drinks/space_up = 20) - -//This one's from bay12 -/obj/machinery/vending/cart - name = "PTech" - desc = "Cartridges for PDAs" - product_slogans = "Carts to go!" - icon_state = "cart" - icon_deny = "cart-deny" - products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10, - /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10, - /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10) - - -/obj/machinery/vending/cigarette - name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating - desc = "If you want to get cancer, might as well do it in style" - product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!" - product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." - vend_delay = 34 - icon_state = "cigs" - products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4) - contraband = list(/obj/item/weapon/lighter/zippo = 4) - premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2) - prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60) - - -/obj/machinery/vending/medical - name = "NanoMed Plus" - desc = "Medical drug dispenser." - icon_state = "med" - icon_deny = "med-deny" - product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" - req_access_txt = "5" - products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4, - /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4, - /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12, - /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2) - contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6) - - -//This one's from bay12 -/obj/machinery/vending/plasmaresearch - name = "Toximate 3000" - desc = "All the fine parts you need in one vending machine!" - products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6, - /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6, - /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6) - -/obj/machinery/vending/wallmed1 - name = "NanoMed" - desc = "Wall-mounted Medical Equipment dispenser." - product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" - icon_state = "wallmed" - icon_deny = "wallmed-deny" - req_access_txt = "5" - density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude - products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/syringe/inaprovaline = 4,/obj/item/device/healthanalyzer = 1) - contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1) - -/obj/machinery/vending/wallmed2 - name = "NanoMed" - desc = "Wall-mounted Medical Equipment dispenser." - icon_state = "wallmed" - icon_deny = "wallmed-deny" - req_access_txt = "5" - density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude - products = list(/obj/item/weapon/reagent_containers/syringe/inaprovaline = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3, - /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3) - contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3) - -/obj/machinery/vending/security - name = "SecTech" - desc = "A security equipment vendor" - product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" - icon_state = "sec" - icon_deny = "sec-deny" - req_access_txt = "1" - products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, - /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) - contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2) - -/obj/machinery/vending/hydronutrients - name = "NutriMax" - desc = "A plant nutrients vendor" - product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" - product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." - icon_state = "nutri" - icon_deny = "nutri-deny" - products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20, - /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5) - contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) - -/obj/machinery/vending/hydroseeds - name = "MegaSeed Servitor" - desc = "When you need seeds fast!" - product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" - product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" - icon_state = "seeds" - products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3, - /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3, - /obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3, - /obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3, - /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3, - /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3) - contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2, - /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2) - premium = list(/obj/item/toy/waterflower = 1) - - -/obj/machinery/vending/magivend - name = "MagiVend" - desc = "A magic vending machine." - icon_state = "MagiVend" - product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" - vend_delay = 15 - vend_reply = "Have an enchanted evening!" - product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" - products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2) - contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave - -/obj/machinery/vending/dinnerware - name = "Dinnerware" - desc = "A kitchen and restaurant equipment vendor" - product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." - icon_state = "dinnerware" - products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2) - contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) - -/obj/machinery/vending/sovietsoda - name = "BODA" - desc = "Old sweet water vending machine" - icon_state = "sovietsoda" - product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." - products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30) - contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20) - -/obj/machinery/vending/tool - name = "YouTool" - desc = "Tools for tools." - icon_state = "tool" - icon_deny = "tool-deny" - //req_access_txt = "12" //Maintenance access - products = list(/obj/item/weapon/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5, - /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5) - contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2) - premium = list(/obj/item/clothing/gloves/yellow = 1) - -/obj/machinery/vending/engivend - name = "Engi-Vend" - desc = "Spare tool vending. What? Did you expect some witty description?" - icon_state = "engivend" - icon_deny = "engivend-deny" - req_access_txt = "11" //Engineering Equipment access - products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10) - contraband = list(/obj/item/weapon/cell/potato = 3) - premium = list(/obj/item/weapon/storage/belt/utility = 3) - -//This one's from bay12 -/obj/machinery/vending/engineering - name = "Robco Tool Maker" - desc = "Everything you need for do-it-yourself station repair." - icon_state = "engi" - icon_deny = "engi-deny" - req_access_txt = "11" - products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4, - /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12, - /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12, - /obj/item/weapon/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8, - /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5, - /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5) - // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty. - // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it. - // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu - -//This one's from bay12 -/obj/machinery/vending/robotics - name = "Robotech Deluxe" - desc = "All the tools you need to create your own robot army." - icon_state = "robotics" - icon_deny = "robotics-deny" - req_access_txt = "29" - products = list(/obj/item/clothing/suit/storage/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/weapon/cable_coil = 4,/obj/item/device/flash = 4, - /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3, - /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5, - /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5) - //everything after the power cell had no amounts, I improvised. -Sayu - +/datum/data/vending_product + var/product_name = "generic" + var/product_path = null + var/amount = 0 + var/price = 0 + var/display_color = "blue" + + + +/obj/machinery/vending + name = "Vendomat" + desc = "A generic vending machine." + icon = 'icons/obj/vending.dmi' + icon_state = "generic" + layer = 2.9 + anchored = 1 + density = 1 + var/active = 1 //No sales pitches if off! + var/vend_ready = 1 //Are we ready to vend?? Is it time?? + var/vend_delay = 10 //How long does it take to vend? + var/datum/data/vending_product/currently_vending = null // A /datum/data/vending_product instance of what we're paying for right now. + + // To be filled out at compile time + var/list/products = list() // For each, use the following pattern: + var/list/contraband = list() // list(/type/path = amount,/type/path2 = amount2) + var/list/premium = list() // No specified amount = only one in stock + var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price. + + var/product_slogans = "" //String of slogans separated by semicolons, optional + var/product_ads = "" //String of small ad messages in the vending screen - random chance + var/list/product_records = list() + var/list/hidden_records = list() + var/list/coin_records = list() + var/list/slogan_list = list() + var/list/small_ads = list() // small ad messages in the vending screen - random chance of popping up whenever you open it + var/vend_reply //Thank you for shopping! + var/last_reply = 0 + var/last_slogan = 0 //When did we last pitch? + var/slogan_delay = 6000 //How long until we can pitch again? + var/icon_vend //Icon_state when vending! + var/icon_deny //Icon_state when vending! + //var/emagged = 0 //Ignores if somebody doesn't have card access to that machine. + var/seconds_electrified = 0 //Shock customers like an airlock. + var/shoot_inventory = 0 //Fire items at customers! We're broken! + var/shut_up = 1 //Stop spouting those godawful pitches! + var/extended_inventory = 0 //can we access the hidden inventory? + var/panel_open = 0 //Hacking that vending machine. Gonna get a free candy bar. + var/wires = 15 + var/obj/item/weapon/coin/coin + var/const/WIRE_EXTEND = 1 + var/const/WIRE_SCANID = 2 + var/const/WIRE_SHOCK = 3 + var/const/WIRE_SHOOTINV = 4 + + var/obj/machinery/account_database/linked_db + var/datum/money_account/linked_account + +/obj/machinery/vending/New() + ..() + spawn(4) + src.slogan_list = text2list(src.product_slogans, ";") + + // So not all machines speak at the exact same time. + // The first time this machine says something will be at slogantime + this random value, + // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. + src.last_slogan = world.time + rand(0, slogan_delay) + + src.build_inventory(products) + //Add hidden inventory + src.build_inventory(contraband, 1) + src.build_inventory(premium, 0, 1) + power_change() + + reconnect_database() + linked_account = vendor_account + + return + + return + +/obj/machinery/vending/proc/reconnect_database() + for(var/obj/machinery/account_database/DB in world) + if(DB.z == src.z) + linked_db = DB + break + +/obj/machinery/vending/ex_act(severity) + switch(severity) + if(1.0) + del(src) + return + if(2.0) + if (prob(50)) + del(src) + return + if(3.0) + if (prob(25)) + spawn(0) + src.malfunction() + return + return + else + return + +/obj/machinery/vending/blob_act() + if (prob(50)) + spawn(0) + src.malfunction() + del(src) + return + + return + +/obj/machinery/vending/proc/build_inventory(var/list/productlist,hidden=0,req_coin=0) + for(var/typepath in productlist) + var/amount = productlist[typepath] + var/price = prices[typepath] + if(isnull(amount)) amount = 1 + + var/atom/temp = new typepath(null) + var/datum/data/vending_product/R = new /datum/data/vending_product() + R.product_name = temp.name + R.product_path = typepath + R.amount = amount + R.price = price + R.display_color = pick("red","blue","green") + + if(hidden) + hidden_records += R + else if(req_coin) + coin_records += R + else + product_records += R +// world << "Added: [R.product_name]] - [R.amount] - [R.product_path]" + return + +/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/card/emag)) + src.emagged = 1 + user << "You short out the product lock on [src]" + return + else if(istype(W, /obj/item/weapon/screwdriver)) + src.panel_open = !src.panel_open + user << "You [src.panel_open ? "open" : "close"] the maintenance panel." + src.overlays.Cut() + if(src.panel_open) + src.overlays += image(src.icon, "[initial(icon_state)]-panel") + src.updateUsrDialog() + return + else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters)) + if(src.panel_open) + attack_hand(user) + return + else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) + user.drop_item() + W.loc = src + coin = W + user << "\blue You insert the [W] into the [src]" + return + else if(istype(W, /obj/item/weapon/card) && currently_vending) + //attempt to connect to a new db, and if that doesn't work then fail + if(!linked_db) + reconnect_database() + if(linked_db) + if(linked_account) + var/obj/item/weapon/card/I = W + scan_card(I) + else + usr << "\icon[src]Unable to connect to linked account." + else + usr << "\icon[src]Unable to connect to accounts database." + else + ..() + +/obj/machinery/vending/proc/scan_card(var/obj/item/weapon/card/I) + if(!currently_vending) return + if (istype(I, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/C = I + visible_message("[usr] swipes a card through [src].") + if(linked_account) + var/attempt_pin = input("Enter pin code", "Vendor transaction") as num + var/datum/money_account/D = linked_db.attempt_account_access(C.associated_account_number, attempt_pin, 2) + if(D) + var/transaction_amount = currently_vending.price + if(transaction_amount <= D.money) + + //transfer the money + D.money -= transaction_amount + linked_account.money += transaction_amount + + //create entries in the two account transaction logs + var/datum/transaction/T = new() + T.target_name = "[linked_account.owner_name] (via [src.name])" + T.purpose = "Purchase of [currently_vending.product_name]" + if(transaction_amount > 0) + T.amount = "([transaction_amount])" + else + T.amount = "[transaction_amount]" + T.source_terminal = src.name + T.date = current_date_string + T.time = worldtime2text() + D.transaction_log.Add(T) + // + T = new() + T.target_name = D.owner_name + T.purpose = "Purchase of [currently_vending.product_name]" + T.amount = "[transaction_amount]" + T.source_terminal = src.name + T.date = current_date_string + T.time = worldtime2text() + linked_account.transaction_log.Add(T) + + // Vend the item + src.vend(src.currently_vending, usr) + currently_vending = null + else + usr << "\icon[src]You don't have that much money!" + else + usr << "\icon[src]Unable to access account. Check security settings and try again." + else + usr << "\icon[src]EFTPOS is not connected to an account." + +/obj/machinery/vending/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/vending/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/vending/attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + + if(src.seconds_electrified != 0) + if(src.shock(user, 100)) + return + + var/vendorname = (src.name) //import the machine's name + + if(src.currently_vending) + var/dat = "
[vendorname]


" //display the name, and added a horizontal rule + dat += "You have selected [currently_vending.product_name].
Please swipe your ID to pay for the article.

" + dat += "Cancel" + user << browse(dat, "window=vending") + onclose(user, "") + return + + var/dat = "
[vendorname]


" //display the name, and added a horizontal rule + dat += "Select an item:

" //the rest is just general spacing and bolding + + if (premium.len > 0) + dat += "Coin slot: [coin ? coin : "No coin inserted"] (Remove)

" + + if (src.product_records.len == 0) + dat += "No product loaded!" + else + var/list/display_records = src.product_records + if(src.extended_inventory) + display_records = src.product_records + src.hidden_records + if(src.coin) + display_records = src.product_records + src.coin_records + if(src.coin && src.extended_inventory) + display_records = src.product_records + src.hidden_records + src.coin_records + + for (var/datum/data/vending_product/R in display_records) + dat += "[R.product_name]:" + dat += " [R.amount] " + if(R.price) + dat += " (Price: [R.price])" + if (R.amount > 0) + dat += " (Vend)" + else + dat += " SOLD OUT" + dat += "
" + + dat += "
" + + if(panel_open) + var/list/vendwires = list( + "Violet" = 1, + "Orange" = 2, + "Goldenrod" = 3, + "Green" = 4, + ) + dat += "


Access Panel
" + for(var/wiredesc in vendwires) + var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] + dat += "[wiredesc] wire: " + if(!is_uncut) + dat += "Mend" + else + dat += "Cut " + dat += "Pulse " + dat += "
" + + dat += "
" + dat += "The orange light is [(src.seconds_electrified == 0) ? "off" : "on"].
" + dat += "The red light is [src.shoot_inventory ? "off" : "blinking"].
" + dat += "The green light is [src.extended_inventory ? "on" : "off"].
" + dat += "The [(src.wires & WIRE_SCANID) ? "purple" : "yellow"] light is on.
" + + if (product_slogans != "") + dat += "The speaker switch is [src.shut_up ? "off" : "on"]. Toggle" + + user << browse(dat, "window=vending") + onclose(user, "") + return + +/obj/machinery/vending/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + if(usr.stat || usr.restrained()) + return + + if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) + if(!coin) + usr << "There is no coin in this machine." + return + + coin.loc = src.loc + if(!usr.get_active_hand()) + usr.put_in_hands(coin) + usr << "\blue You remove the [coin] from the [src]" + coin = null + + + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + usr.set_machine(src) + if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) + + if(istype(usr,/mob/living/silicon)) + if(istype(usr,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = usr + if(!(R.module && istype(R.module,/obj/item/weapon/robot_module/butler) )) + usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" + return + else + usr << "\red The vending machine refuses to interface with you, as you are not in its target demographic!" + return + + if ((!src.allowed(usr)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH + usr << "\red Access denied." //Unless emagged of course + flick(src.icon_deny,src) + return + + var/datum/data/vending_product/R = locate(href_list["vend"]) + if (!R || !istype(R) || !R.product_path || R.amount <= 0) + return + + if(R.price == null) + src.vend(R, usr) + else + src.currently_vending = R + src.updateUsrDialog() + + return + + else if (href_list["cancel_buying"]) + src.currently_vending = null + src.updateUsrDialog() + return + + else if ((href_list["cutwire"]) && (src.panel_open)) + var/twire = text2num(href_list["cutwire"]) + if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) + usr << "You need wirecutters!" + return + if (src.isWireColorCut(twire)) + src.mend(twire) + else + src.cut(twire) + + else if ((href_list["pulsewire"]) && (src.panel_open)) + var/twire = text2num(href_list["pulsewire"]) + if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + usr << "You need a multitool!" + return + if (src.isWireColorCut(twire)) + usr << "You can't pulse a cut wire." + return + else + src.pulse(twire) + + else if ((href_list["togglevoice"]) && (src.panel_open)) + src.shut_up = !src.shut_up + + src.add_fingerprint(usr) + src.updateUsrDialog() + else + usr << browse(null, "window=vending") + return + return + +/obj/machinery/vending/proc/vend(datum/data/vending_product/R, mob/user) + if ((!src.allowed(user)) && (!src.emagged) && (src.wires & WIRE_SCANID)) //For SECURE VENDING MACHINES YEAH + user << "\red Access denied." //Unless emagged of course + flick(src.icon_deny,src) + return + src.vend_ready = 0 //One thing at a time!! + + if (R in coin_records) + if(!coin) + user << "\blue You need to insert a coin to get this item." + return + if(coin.string_attached) + if(prob(50)) + user << "\blue You successfully pull the coin out before the [src] could swallow it." + else + user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." + del(coin) + else + del(coin) + + R.amount-- + + if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply) + spawn(0) + src.speak(src.vend_reply) + src.last_reply = world.time + + use_power(5) + if (src.icon_vend) //Show the vending animation if needed + flick(src.icon_vend,src) + spawn(src.vend_delay) + new R.product_path(get_turf(src)) + src.vend_ready = 1 + return + + src.updateUsrDialog() + +/obj/machinery/vending/process() + if(stat & (BROKEN|NOPOWER)) + return + + if(!src.active) + return + + if(src.seconds_electrified > 0) + src.seconds_electrified-- + + //Pitch to the people! Really sell it! + if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5)) + var/slogan = pick(src.slogan_list) + src.speak(slogan) + src.last_slogan = world.time + + if(src.shoot_inventory && prob(2)) + src.throw_item() + + return + +/obj/machinery/vending/proc/speak(var/message) + if(stat & NOPOWER) + return + + if (!message) + return + + for(var/mob/O in hearers(src, null)) + O.show_message("[src] beeps, \"[message]\"",2) + return + +/obj/machinery/vending/power_change() + if(stat & BROKEN) + icon_state = "[initial(icon_state)]-broken" + else + if( powered() ) + icon_state = initial(icon_state) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + src.icon_state = "[initial(icon_state)]-off" + stat |= NOPOWER + +//Oh no we're malfunctioning! Dump out some product and break. +/obj/machinery/vending/proc/malfunction() + for(var/datum/data/vending_product/R in src.product_records) + if (R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if (!dump_path) + continue + + while(R.amount>0) + new dump_path(src.loc) + R.amount-- + break + + stat |= BROKEN + src.icon_state = "[initial(icon_state)]-broken" + return + +//Somebody cut an important wire and now we're following a new definition of "pitch." +/obj/machinery/vending/proc/throw_item() + var/obj/throw_item = null + var/mob/living/target = locate() in view(7,src) + if(!target) + return 0 + + for(var/datum/data/vending_product/R in src.product_records) + if (R.amount <= 0) //Try to use a record that actually has something to dump. + continue + var/dump_path = R.product_path + if (!dump_path) + continue + + R.amount-- + throw_item = new dump_path(src.loc) + break + if (!throw_item) + return 0 + spawn(0) + throw_item.throw_at(target, 16, 3) + src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") + return 1 + +/obj/machinery/vending/proc/isWireColorCut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/vending/proc/isWireCut(var/wireIndex) + var/wireFlag = APCIndexToFlag[wireIndex] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/vending/proc/cut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] + src.wires &= ~wireFlag + switch(wireIndex) + if(WIRE_EXTEND) + src.extended_inventory = 0 + if(WIRE_SHOCK) + src.seconds_electrified = -1 + if (WIRE_SHOOTINV) + if(!src.shoot_inventory) + src.shoot_inventory = 1 + + +/obj/machinery/vending/proc/mend(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function + src.wires |= wireFlag + switch(wireIndex) +// if(WIRE_SCANID) + if(WIRE_SHOCK) + src.seconds_electrified = 0 + if (WIRE_SHOOTINV) + src.shoot_inventory = 0 + +/obj/machinery/vending/proc/pulse(var/wireColor) + var/wireIndex = APCWireColorToIndex[wireColor] + switch(wireIndex) + if(WIRE_EXTEND) + src.extended_inventory = !src.extended_inventory +// if (WIRE_SCANID) + if (WIRE_SHOCK) + src.seconds_electrified = 30 + if (WIRE_SHOOTINV) + src.shoot_inventory = !src.shoot_inventory + + +/obj/machinery/vending/proc/shock(mob/user, prb) + if(stat & (BROKEN|NOPOWER)) // unpowered, no shock + return 0 + if(!prob(prb)) + return 0 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + if (electrocute_mob(user, get_area(src), src, 0.7)) + return 1 + else + return 0 + +/* + * Vending machine types + */ + +/* + +/obj/machinery/vending/[vendors name here] // --vending machine template :) + name = "" + desc = "" + icon = '' + icon_state = "" + vend_delay = 15 + products = list() + contraband = list() + premium = list() + +*/ + +/* +/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink + name = "Tank Vendor" + desc = "A vendor with a wide variety of masks and gas tanks." + icon = 'icons/obj/objects.dmi' + icon_state = "dispenser" + product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath" + product_amounts = "10;10;10;5;25" + vend_delay = 0 +*/ + +/obj/machinery/vending/boozeomat + name = "Booze-O-Mat" + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." + icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles + icon_deny = "boozeomat-deny" + products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,/obj/item/weapon/reagent_containers/food/drinks/beer = 6, + /obj/item/weapon/reagent_containers/food/drinks/ale = 6,/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 4, + /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 4,/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 4, + /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 4,/obj/item/weapon/reagent_containers/food/drinks/tonic = 8, + /obj/item/weapon/reagent_containers/food/drinks/cola = 8, /obj/item/weapon/reagent_containers/food/drinks/sodawater = 15, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/weapon/reagent_containers/food/drinks/ice = 9) + contraband = list(/obj/item/weapon/reagent_containers/food/drinks/tea = 10) + vend_delay = 15 + product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?" + product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!" + req_access_txt = "25" + +/obj/machinery/vending/assist + products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4, + /obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4) + contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2) + product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!" + +/obj/machinery/vending/coffee + name = "Hot Drinks machine" + desc = "A vending machine which dispenses hot drinks." + product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" + icon_state = "coffee" + icon_vend = "coffee-vend" + vend_delay = 34 + products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) + contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10) + prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) + + + + +/obj/machinery/vending/snack + name = "Getmore Chocolate Corp" + desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars" + product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" + product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" + icon_state = "snack" + products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6, + /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6, + /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6) + contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) + prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25, + /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30, + /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25) + + + +/obj/machinery/vending/cola + name = "Robust Softdrinks" + desc = "A softdrink vendor provided by Robust Industries, LLC." + icon_state = "Cola_Machine" + product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" + product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." + products = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 10, + /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/starkist = 10, + /obj/item/weapon/reagent_containers/food/drinks/space_up = 10) + contraband = list(/obj/item/weapon/reagent_containers/food/drinks/thirteenloko = 5) + prices = list(/obj/item/weapon/reagent_containers/food/drinks/cola = 20,/obj/item/weapon/reagent_containers/food/drinks/space_mountain_wind = 20, + /obj/item/weapon/reagent_containers/food/drinks/dr_gibb = 20,/obj/item/weapon/reagent_containers/food/drinks/starkist = 20, + /obj/item/weapon/reagent_containers/food/drinks/space_up = 20) + +//This one's from bay12 +/obj/machinery/vending/cart + name = "PTech" + desc = "Cartridges for PDAs" + product_slogans = "Carts to go!" + icon_state = "cart" + icon_deny = "cart-deny" + products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10, + /obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/toxins = 10,/obj/item/device/pda/heads = 10, + /obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10) + + +/obj/machinery/vending/cigarette + name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating + desc = "If you want to get cancer, might as well do it in style" + product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!" + product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." + vend_delay = 34 + icon_state = "cigs" + products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4) + contraband = list(/obj/item/weapon/lighter/zippo = 4) + premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2) + prices = list(/obj/item/weapon/storage/fancy/cigarettes = 60,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 60) + + +/obj/machinery/vending/medical + name = "NanoMed Plus" + desc = "Medical drug dispenser." + icon_state = "med" + icon_deny = "med-deny" + product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" + req_access_txt = "5" + products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4, + /obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4, + /obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12, + /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2) + contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6) + + +//This one's from bay12 +/obj/machinery/vending/plasmaresearch + name = "Toximate 3000" + desc = "All the fine parts you need in one vending machine!" + products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6, + /obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6, + /obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6) + +/obj/machinery/vending/wallmed1 + name = "NanoMed" + desc = "Wall-mounted Medical Equipment dispenser." + product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" + icon_state = "wallmed" + icon_deny = "wallmed-deny" + req_access_txt = "5" + density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude + products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/syringe/inaprovaline = 4,/obj/item/device/healthanalyzer = 1) + contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1) + +/obj/machinery/vending/wallmed2 + name = "NanoMed" + desc = "Wall-mounted Medical Equipment dispenser." + icon_state = "wallmed" + icon_deny = "wallmed-deny" + req_access_txt = "5" + density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude + products = list(/obj/item/weapon/reagent_containers/syringe/inaprovaline = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3, + /obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3) + contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3) + +/obj/machinery/vending/security + name = "SecTech" + desc = "A security equipment vendor" + product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" + icon_state = "sec" + icon_deny = "sec-deny" + req_access_txt = "1" + products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, + /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) + contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2) + +/obj/machinery/vending/hydronutrients + name = "NutriMax" + desc = "A plant nutrients vendor" + product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" + product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." + icon_state = "nutri" + icon_deny = "nutri-deny" + products = list(/obj/item/beezeez = 45,/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/pestspray = 20, + /obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) + +/obj/machinery/vending/hydroseeds + name = "MegaSeed Servitor" + desc = "When you need seeds fast!" + product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" + product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" + icon_state = "seeds" + products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3, + /obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3, + /obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3, + /obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3, + /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3, + /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3) + contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/nettleseed = 2, + /obj/item/seeds/plumpmycelium = 2,/obj/item/seeds/reishimycelium = 2) + premium = list(/obj/item/toy/waterflower = 1) + + +/obj/machinery/vending/magivend + name = "MagiVend" + desc = "A magic vending machine." + icon_state = "MagiVend" + product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" + vend_delay = 15 + vend_reply = "Have an enchanted evening!" + product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!" + products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave + +/obj/machinery/vending/dinnerware + name = "Dinnerware" + desc = "A kitchen and restaurant equipment vendor" + product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." + icon_state = "dinnerware" + products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2) + contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) + +/obj/machinery/vending/sovietsoda + name = "BODA" + desc = "Old sweet water vending machine" + icon_state = "sovietsoda" + product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." + products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30) + contraband = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola = 20) + +/obj/machinery/vending/tool + name = "YouTool" + desc = "Tools for tools." + icon_state = "tool" + icon_deny = "tool-deny" + //req_access_txt = "12" //Maintenance access + products = list(/obj/item/weapon/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5, + /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5) + contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2) + premium = list(/obj/item/clothing/gloves/yellow = 1) + +/obj/machinery/vending/engivend + name = "Engi-Vend" + desc = "Spare tool vending. What? Did you expect some witty description?" + icon_state = "engivend" + icon_deny = "engivend-deny" + req_access_txt = "11" //Engineering Equipment access + products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10) + contraband = list(/obj/item/weapon/cell/potato = 3) + premium = list(/obj/item/weapon/storage/belt/utility = 3) + +//This one's from bay12 +/obj/machinery/vending/engineering + name = "Robco Tool Maker" + desc = "Everything you need for do-it-yourself station repair." + icon_state = "engi" + icon_deny = "engi-deny" + req_access_txt = "11" + products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4, + /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12, + /obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12, + /obj/item/weapon/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8, + /obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5, + /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5) + // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty. + // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it. + // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu + +//This one's from bay12 +/obj/machinery/vending/robotics + name = "Robotech Deluxe" + desc = "All the tools you need to create your own robot army." + icon_state = "robotics" + icon_deny = "robotics-deny" + req_access_txt = "29" + products = list(/obj/item/clothing/suit/storage/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/weapon/cable_coil = 4,/obj/item/device/flash = 4, + /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3, + /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5, + /obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5) + //everything after the power cell had no amounts, I improvised. -Sayu + From 747c71096e87748cc97777bec7e048076e9a844e Mon Sep 17 00:00:00 2001 From: comma Date: Sun, 4 Aug 2013 00:32:37 +0400 Subject: [PATCH 3/5] Fixed monkeys not getting space rabies via syringes. --- code/modules/organs/blood.dm | 26 ++++++++++++------- .../reagents/reagent_containers/syringes.dm | 6 ++--- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 78ccd65c287..dd31d28ac76 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -189,18 +189,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 . = ..() vessel.remove_reagent("blood",amount) // Removes blood if human -//Transfers blood from container ot vessels, respecting blood types compatability. -/mob/living/carbon/human/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) - var/datum/reagent/blood/our = get_blood(vessel) +//Transfers blood from container ot vessels +/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) var/datum/reagent/blood/injected = get_blood(container.reagents) if (!injected) return - if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) - reagents.add_reagent("toxin",amount * 0.5) - reagents.update_total() - else - vessel.add_reagent("blood", amount, injected.data) - vessel.update_total() src.virus2 |= virus_copylist(injected.data["virus2"]) if (injected.data["antibodies"] && prob(5)) antibodies |= injected.data["antibodies"] @@ -208,11 +201,24 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 chems = params2list(injected.data["trace_chem"]) for(var/C in chems) src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood - //world << "added [(text2num(chems[C])/560) * amount] = [text2num(chems[C])]/560*[amount] units of [C] to [src]" //DEBUG reagents.update_total() container.reagents.remove_reagent("blood", amount) +//Transfers blood from container ot vessels, respecting blood types compatability. +/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount) + var/datum/reagent/blood/our = get_blood(vessel) + var/datum/reagent/blood/injected = get_blood(container.reagents) + if (!injected || !our) + return + if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) ) + reagents.add_reagent("toxin",amount * 0.5) + reagents.update_total() + else + vessel.add_reagent("blood", amount, injected.data) + vessel.update_total() + ..() + //Gets human's own blood. /mob/living/carbon/proc/get_blood(datum/reagents/container) var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d93ce042295..38e9c6f6882 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -154,9 +154,9 @@ B = d break var/trans - if(B && ishuman(target)) - var/mob/living/carbon/human/H = target - H.inject_blood(src,5) + if(B && istype(target,/mob/living/carbon)) + var/mob/living/carbon/C = target + C.inject_blood(src,5) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." From 51feddafa631ce704b24e490d6d95b728c5d43d3 Mon Sep 17 00:00:00 2001 From: Segrain Date: Sun, 4 Aug 2013 00:35:35 +0300 Subject: [PATCH 4/5] Medical doors fix. --- maps/tgstation.2.1.0.0.1.dmm | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 5bdd20f9044..58910b36afc 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -1110,6 +1110,7 @@ "avr" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/turf/simulated/floor/plating/airless,/area/solar/auxport) "avs" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall,/area/security/vacantoffice2) "avt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/security/vacantoffice2) +"avu" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "Medbay_privacy_room2"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "avv" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/security/vacantoffice2) "avw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/lawoffice) "avx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/lawoffice) @@ -1535,6 +1536,7 @@ "aDB" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor,/area/gateway) "aDC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/gateway) "aDD" = (/obj/structure/table,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/turf/simulated/floor,/area/gateway) +"aDE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) "aDF" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aDG" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -30},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) "aDH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) @@ -1611,6 +1613,7 @@ "aFa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/gateway) "aFb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/gateway) "aFc" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/gateway) +"aFd" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) "aFe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aFf" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/radio/off,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aFg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva) @@ -1701,6 +1704,7 @@ "aGN" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/gateway) "aGO" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/gateway) "aGP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/gateway) +"aGQ" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (EAST)"; icon_state = "comfychair_teal"; dir = 4},/obj/machinery/door_control{id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) "aGR" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/fpmaint) "aGS" = (/obj/machinery/light/small{dir = 8},/obj/structure/dispenser/oxygen,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva) "aGT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_command{name = "E.V.A."; req_access_txt = "0"; req_one_access_txt = "11;24;5;1"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva) @@ -2551,6 +2555,7 @@ "aXg" = (/obj/machinery/camera{c_tag = "Bridge Center"; dir = 1},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "aXh" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "aXi" = (/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) +"aXj" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/machinery/door_control{id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) "aXk" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "aXl" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Bridge APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "aXm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/bridge) @@ -3200,15 +3205,15 @@ "bjG" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/toxins/misc_lab) "bjH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/toxins/misc_lab) "bjI" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bjJ" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bjJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjK" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bjL" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bjM" = (/obj/machinery/washing_machine,/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay) -"bjN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) +"bjN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjO" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay) "bjP" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) "bjQ" = (/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (WEST)"; icon_state = "comfychair_teal"; dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; level = 2; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) -"bjR" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) +"bjR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bjT" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay) "bjU" = (/turf/simulated/floor,/area/assembly/chargebay) @@ -3287,7 +3292,7 @@ "blp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "blq" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall/r_wall,/area/crew_quarters/captain) "blr" = (/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central) -"bls" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/structure/stool/bed/chair/comfy/teal{tag = "icon-comfychair_teal (EAST)"; icon_state = "comfychair_teal"; dir = 4},/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) +"bls" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "blt" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/atmos) "blu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance"; req_access_txt = "24;12"},/turf/simulated/floor/plating,/area/atmos) "blv" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/firecloset,/obj/item/taperoll/engineering,/turf/simulated/floor,/area/engine/break_room) @@ -3600,7 +3605,7 @@ "brq" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/storage/box/matches,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "brr" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/captain) "brs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain) -"brt" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/medical/sleeper) +"brt" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "Medbay_privacy_room1"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bru" = (/obj/structure/table,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "brv" = (/obj/machinery/vending/snack,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central) "brw" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/sleeper) @@ -3841,10 +3846,9 @@ "bvX" = (/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; sortType = 11; tag = ""},/turf/simulated/floor,/area/hallway/primary/central) "bvY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/central) "bvZ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/sleeper) -"bwa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) +"bwa" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bwb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore) -"bwc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) -"bwd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) +"bwc" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 4; req_access_txt = "5"},/obj/structure/stool/bed/chair/office/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bwe" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Recovery Room"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bwf" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bwg" = (/obj/machinery/vending/medical{pixel_x = -2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) @@ -4160,11 +4164,9 @@ "bCe" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bCf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{dir = 4; icon_state = "whitehall"; tag = "icon-whitehall (WEST)"},/area/medical/sleeper) "bCg" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bCh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bCi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = ""; name = "Break Room"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bCj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = -3},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/inaprovaline{pixel_x = 5; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) "bCk" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) -"bCl" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bCm" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/clothing/tie/stethoscope,/obj/machinery/vending/wallmed1{pixel_y = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bCn" = (/obj/structure/window/reinforced{dir = 8},/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) "bCo" = (/mob/living/carbon/monkey,/turf/simulated/floor,/area/medical/genetics) @@ -4424,7 +4426,6 @@ "bHi" = (/obj/structure/stool/bed/roller,/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 26; range = 3},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHj" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bHk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay) -"bHl" = (/obj/machinery/door/airlock/glass_medical{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHm" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/asmaint) "bHn" = (/turf/simulated/wall/r_wall,/area/medical/cmo) "bHo" = (/obj/machinery/door/airlock/glass_command{name = "Chief Medical Officer"; req_access_txt = "40"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -5088,7 +5089,6 @@ "bTW" = (/obj/structure/sign/nosmoking_2{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/stool/bed/chair/office/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bTX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) "bTY" = (/obj/structure/table/reinforced,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay) -"bTZ" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -26; pixel_y = 6; range = 3; req_access_txt = "5"},/obj/structure/stool/bed/chair/office/light{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bUa" = (/obj/structure/table,/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/box/syringes,/obj/item/clothing/glasses/science{pixel_x = 0; pixel_y = 1},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"; tag = "icon-whitehall (WEST)"},/area/medical/chemistry) "bUb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bUc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -10183,9 +10183,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdpbdpbdpbdpbdpbdpbdpbdpbdpbdpaaaaaaazObaNaPhbiFbembiGbembiHbiIbiJbiKbembiLaQGbiMaQGbiNaYcaYcaYcaYcaYcaYcbiObiPbiQaQGbiRaZOaZOaZObiSaZOaZOaZObiTaZOaZOaZOaZObiUbiVbiWbiXbcqbcqbeAbiYbfYbeCaIJbiZbfZbjabhybadbadbadbadbjbbadbjcbjdbjebjfbbxbjgbbxbjhbjibjjbjkbhLbjlbbLbjmbjnbgobjobbLbjpbjqbjrbjsbgsbOpbOqbOobjwbOtbOubOrbOsbqfbxGbqfbqfbxJbOBbOAbOzbOybOxbHnbOwbYAbPsbYAcaqbPlbgzbPibPhbOmbOnbgEbDAbjSbjTbjUbjVbjWbjXbjYbjZbkabjZbkbbkcbkdbkebgJbkfbkgbkhbgObkibkjbkkbklbkmbknbgObZjbZgcdbbgEaaaaaaaaaaagaJCaJCaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazMasGbcdaABaZpaTuaTuaTuaABaTubkoayTaxRaxRbembkpbkqbkrbiJbksbktbkubkvbkvbkvbkvbkwbkxbkxbkxbhhbhhbhhbkybkzbkzbkzbkAaZObkBbkCbkDbkEbkFbkGbkHbkIbkJbkKbkLbkMbkNbkObkPbkQbkRbkSbkTbkTbkUbjrbkVbkWbkXbkYbkZblablbblcbldbleblfbjjbjjbjjbjjblgbjjbjjbjjbjjblhblibljblkbllblmblnbloblpblqblraIJaIJbgsbXibXjbXkbjwbWTbWUbOrbWVbWXbWYbWXbWXbWibVYbWPbWlbWSbWQbHnbVRbYAbVWbYAcaqbVXbgzblJblKblLbXlbgEbDAblNblOblPblPblQblRblSblTblTblTblUblVblWblXblYblZbmabmbbmcbmdbmebkmbmfbmgbmhbgObPDbZgblLbgEaaaaaaaaaaaaaaaaJCaJCaJCaJCaJCaJCaJCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmjbmkavkaySawSawSawSaPhaxRaxRbembmlbmmbiJbmnbembembemaPkbmobmpbmqbmrbmqbmqbmqbmrbmqaPkaPkaZOaZOaZObmsaZObkHbkHbmtbkHbkHbkHbkHbkHbmubmvbmwbmxbmybmzbmzbmzbmAbmBbmCbmDbmEbmFbmGbmHbmIbmIbmJbmKbmLbmMbmNbmObmPbmQbmRbmSbmTbmUbmVbmSbmWbmQbmXbhLbmYbmZbmYbagbagbagbnabdVbnbaIJaIJbgsbVbbVcbHfbjwbUJbUWbOrbxGbqfbVabUYbUZbVgbHnbVfbVebVVbVSbHnbVRbVdbYAbYAcaqbPlbgzbgEbgEbgEbgEbgEbDAbjSbnqbnrbnsbntbnubnvbnwbnxbnybnybnzbjZbnAbgJbnBbnCbnDbgObnEbnFbnGbnHbnIbnJbgObPDbZgcnqbgEaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaabmjavkavkaySaxQaxQaxQbnLaxQaxQbembnMbnNbnObiJbemaaaaaaaaaaabaabbnPbnPbnPbnPbnPbnPbnPaaaaaabnQbnRbnSbnTbnUbkHbkHbkHbkHbkHbkHbkHbkHbnVbiXbcqbnWbnXbnYaZUaZUbnZbkNaZUaZUboabobbocbodboebofbofbogbofbohboibofabHbojbokbmSbolbmUbolbmSbombojbmXbonboobeRbopboqborbosbotboubovaIJbowboxbUwbUDbHfbjwbUabhXbUfbxGbqfbTYbTZbqfbTWbHnbOAbTXbTTbTJbHnbTUbTFbTabSXbTIbSXbSUbSSbSSbSSbSSbSSbSTbjSboQbjUbjUbntboRboSboTboUboVboVboWboXbSQbgJboZbnCbpabgObpbbpcbpdbnHbkmbpebgObZjbZgckBbgEaaaaaaaaaaaaaabbpgbphbpibphbpibphbpjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaabmjavkavkaySaxQaxQaxQbnLaxQaxQbembnMbnNbnObiJbemaaaaaaaaaaabaabbnPbnPbnPbnPbnPbnPbnPaaaaaabnQbnRbnSbnTbnUbkHbkHbkHbkHbkHbkHbkHbkHbnVbiXbcqbnWbnXbnYaZUaZUbnZbkNaZUaZUboabobbocbodboebofbofbogbofbohboibofabHbojbokbmSbolbmUbolbmSbombojbmXbonboobeRbopboqborbosbotboubovaIJbowboxbUwbUDbHfbjwbUabhXbUfbxGbqfbTYbwcbqfbTWbHnbOAbTXbTTbTJbHnbTUbTFbTabSXbTIbSXbSUbSSbSSbSSbSSbSSbSTbjSboQbjUbjUbntboRboSboTboUboVboVboWboXbSQbgJboZbnCbpabgObpbbpcbpdbnHbkmbpebgObZjbZgckBbgEaaaaaaaaaaaaaabbpgbphbpibphbpibphbpjaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxPaySaySbpkaTubplazMasGbpmbplbembpnbpobppbgWbemaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaabpqbprbkHbpsbptbptbptbptbptbpubptbptbptbpvbpwbpxbpybpzbpAaZUbpBbeAbpCbpDbpEbeCbpFbpGbodbodbofbpHbpIbpJbpKbpLbofbpMbpNbpObpPbpQbpRbpQbpSbpTbpUbpVbonbpWbeRbpXbagbpYbmYbpZbqabovaIJaIJbgsbSubSvbHfbStbRXbhXbeabRWbRSbqlbRRbqfbSPbSObSNbSMbSLbSGbHnbgzbSwbgzbgzbqrbqrbqrbqrbqrbqrbqrbqrbDAbjSbnqbnrbnsbqsbqtbqubqvbqwbqwbqwboWbjZbqxbqybqzbkgbqAbgObqBbqCbqDbqEbkmbqFbgObPDblKbgEbgEaaaaaaaaaaaaaabbqGbqHbqIbqJbqJbqKbqGaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbqMbqNbqObqPbkHbkHbkHbqQbqQbqQbqQbnTbkHbkHbkHbmubqRbcqbqSbqTbqUbqVbqWbeAbcqbqXbqYbeCbpFbqZbrabrbbrcbrdbrebrfbrgbrhbofabHbribrjbmSbpQbrkbpQbmSbrlbrmbmXbrnbrobrpbrqbagbrrbmYbrsbqabovaIJbGkbgsbHcbHebHfbHgbHhbhXbHibxGbqfbHjbHkbHlaWTbHnbHpbHobHrbHqbHnbHsbHubHtbHwbHvbHybHxbIubHzbIxbIybIvbIwbIzbrTbrUbrVbrWbrXbjYbrYbqwbqwbqwbrZbjZbsabgJbsbbsbbscbgObsdbsebsfbsgbkmbshbgObPDbPCbgEaaaaaaaaaaaaaaaaabbsjbskbqIbqJbqIbslbpiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbqMbqNbqObqPbkHbkHbkHbqQbqQbqQbqQbnTbkHbkHbkHbmubqRbcqbqSbqTbqUbqVbqWbeAbcqbqXbqYbeCbpFbqZbrabrbbrcbrdbrebrfbrgbrhbofabHbribrjbmSbpQbrkbpQbmSbrlbrmbmXbrnbrobrpbrqbagbrrbmYbrsbqabovaIJbGkbgsbHcbHebHfbHgbHhbhXbHibxGbqfbHjbHkbwaaWTbHnbHpbHobHrbHqbHnbHsbHubHtbHwbHvbHybHxbIubHzbIxbIybIvbIwbIzbrTbrUbrVbrWbrXbjYbrYbqwbqwbqwbrZbjZbsabgJbsbbsbbscbgObsdbsebsfbsgbkmbshbgObPDbPCbgEaaaaaaaaaaaaaaaaabbsjbskbqIbqJbqIbslbpiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbsmbsnbsmbsobspbkHbkHbkHbkHbkHbkHbnTbkHbsqaZOaZObsrbcqbcqbssbstbsubsvbeAbcqbcqbswaIJbpFbsxbsybszbsAbsBbsCbsDbsEbsFbofabHbrmbrmbsGbsHbsIbmSbsJbsKbsLbsMbsNbsObsObsObsObsObsObsPbsQbsRaGWbGabGbbGebGfbGcbGdbhXbhXbGgbxGbqfbqfbqfbqfbFTbFSbqfbFRbqfbCgbFUbsUbFWbqfbFVbERbFZbDgbFYbFXbCnbAUbqrbGhbGibtqbtqbtrbtsbttbjYbtubjZbjZbtvbtwbjZbtxbjYbtybtzbtAbtBbtCbtDbtEbtFbtGbgObgObOvbgEbgEbtIbtJbtJbtJbtKbkfbqGbqJbqIbqJbqJbqKbqGaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaagaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbtLbtMbtLbtNbkHbkHbkHbqQbqQbqQbqQbnTbkHbtObtPaZObtQbcqbcqbssbtRbtSbsvbtTbtUbpxbtVbtWbtXbovaRrbszbtYbtZbuabubbucbudbuebufbugbuhbuibujbrkbujbsKbukbulbulbsNbumbunbuobupbuqburbusbutdKMaIJbDpbEEbDnbEybEzbEAbEHbEIbEFbEJbEFbEGbEFbEFbEMbELbEFbELbEFbEFbEFbEKbEQbEPbFQbERbENbDgbuNbuNbDQbCobqrbDAbjSbuQbuRbuSbuTbuTbjYbuUbuVbuWbjYbuXbjZbuYbuZbvabvbbvcbvdbvebvfbvgbvhbvibsbbkgbvjbvkbvlbvmbvnbvnbvnbvnbvobvpbphbpibvqbpibphbvraabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbvsbqNbvtbvubkHbkHbkHbkHbkHbkHbkHbnTbkHbtObvvaZObvwbdFbcqbvxbpxbvybpxbvzbcqbqXbpEbeCaIJbovaRrbszbofbvAbvBbvCbvDbvEbogbvFbvGbvHbvIbsLbvJbvKbvLbvMbvNbvObsNbvPbvQbvRbvSbvTbvTbvUbvVbvWaIJbDpbDqbDnbDobqfbDmbDvbDwbDrbDubDrbDtbDrbDsbCsbsUbCrbsUbsUbtbbCqbwmbwmbDlbDkbDibDhbDgbDfbCzbCnbCobqrbCpbjSbisbwtbwubwtbwtbjYbjYbjYbjYbjYbwvbwwbwxbwybwzbwAbwBbwCbwCbwDbwEbnCbwFbwGbwHbvjbnCbvlbwIbnCbwJbnCbwKbkfbtIbtJbtKbwLbkfaaaaaaaabaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10194,15 +10194,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPbzYbzZbAaaZOaZObAbbqNbqNbqNbAcaZOaZObAdbAebAfaZObAgbAgbAgbAhbAgbAibAjbAkbAlbAmbAibeCaIJbAnbAoaTVbofbuebApbAqbAqbArbAsbAtaqvbAubAtbAvbAwbAxbAybAzbAzbAzbAAbsObsObsObsObsObsObsObsQdKTaXudKUbxFbxFbKEbKFbKGbxFbxFbKCbKDbKAbAIbAIbKBbIXbLIbLJbIXbITbjLbqfbwmbLGbLCbLHbKxbKIbKHbLBbKxbKxbKybKvbKwbKubAZbAZbAZbAZbAZbBabAZbAZbBbbBcbBdbBebBebBfbBgbvjbBhbzMbBibBjbBkbBlbBmbBnbylbiEbzTbpfaaaaaabkfbBobBpbkfbvobkfbkfbvobkfaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBqaabaaaaaaaaaaaabAgbBrbBsbBtbBubAibBvbBwbBxbBybAibeCaIJbBzbBAbBBbBAbBCbBDbBEbBFbBGbBHaXubBIaXubBJbBKbBLbBMbBNbBOaIJaMcbBPaMdbcSbBEbBQbBRaIJbBSbBTbzeaIJdKRbxFbKsbKtbKqbKrbKobKpbKmbKnboJbAIbAIbIYbIXbIWbIVbIUbITbjLbISbwmbIRbIQbIPbIObINbIMbILbIKbIJbqrbqrbCpbIIbAZbCtbCubCvbCwbCxbCybIHbBbbCAbCBbCCbBebBebCDbvjbBhbCEbCFbCGbCHbCIbCJbCKbylbiEbzTbgQbgQbgQbgQbgQbkfbkfaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGmaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAgbCLbCMbCNbCObCPbCQbCRbCSbCTbAibeCbCUbCVaIJaIJaIJaIJbcSbBEbBQbCWaIJaIJbCXaIJaIJbCYbCZbDaaIJaIJaIJaIJbBPaIJbcSbBEbBQbDeaXubDcbDbbDjbDdbtmbtlbtobtnbtHbtpbuCbuBbuEbuDbuGbuFbuHbxFbthbtibtjbtkbxFbjLbqfbwmbwmbwmbwmbwmbqrbqrbqrbqrbqrbqrbtebtdbtfbAZbDxbDybDzbtgbDBbDCbDDbBbbDEbDFbDGbDGbBebDHbDIbDJbDKbDLbDMbCJbDNbDObDPbylbiEbzTbgQaTTbDRbDRbgQaabaabaabaabaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbDSbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbwdbwcbwabvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbuKbuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbrubrtbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqobrEbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbjRbjNbjJbvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbuKbuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbruaXjbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqobrEbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbtabqmbqnbqobtcbeabGjbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbjLbAHbqmbqnbqobAFbAEbIZbeWbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbClbChbxGbjLbCgbCibAXbAXbAXbAXbAWbBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbrtblsbxGbjLbCgbCibAXbAXbAXbAXbAWbBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbxHbsUbwqbwrbwsbxCbzibeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbzvbeabeabeabeabeabeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipbiqbirbitbiwbiabFNbGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbjJbjNbjObjLbjMbjRblsbjPbjQbjAbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIavuaDEbjObjLbjMaFdaGQbjPbjQbjAbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabQfbQgbLnbFGbFGbFGbFGbFGbFIbFIbFIbFIbFIbFIbFIbFIbQhbQibfubQkbQlbQmbQnbQnbQobfebfdbfbbfibQtbfgbQvaTSbQxbQybQzbQAbQBbQCbQDbQEbQFaabaaaaaaaaaaaaaaaaaabFNbedbeWaWTbdZbeaaWTbeabdZbeXaWTbeabeabeabeabeabFNbGjbeYbGlbQJbQJbQKbQLbeZbQNbQLbQObQPbQQbQRbQSbnCbQTbOJbKObQUbQVaabbOLbPVbQWbOObQXbOObQYbQZbRabGsbQcbGxbRbbRcbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbQebFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbRdbhZbRfbRgbRgbRhbRibRjbRkbRlbRmbRnbRobRnbRpbRkbhVbhUbRsbRtbRubRvbRwbRwbRxbRybfdbhSbfibQtbhTbQvbgAbRCbRDbREbRFbRGbRFbRHbRIbRJaabbRKbRKbRKbRKbRKaaabFNbggbgtbOjbOkbOlbOjbgubgxbgvbgwbgubOlbOlbOlbOlbOlbgCbgBbGlbRTbRUbRVbgRbgDbRYbRZbGlbGlbqzbSabqzbqzbqzbSbbScbSdbqzbGsbGsbGsbGsbGsbSebGsbGsbGsbGsbGsbQcbGxbSfbRcbgQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSgaaaaabaabbShbShbShbShbShbShbShbShbSibSjbRkbSkbRlbRlbRnbSlbRpbRkbSmbSnbRsbSobSpbQnbSqboFbSrbSsboKboIboHboGbRFbQvbSxbRCbSybSzbSAbSBbSCbSDbSEbSFbnpbSHbSIbSJbSKbRKaaabFNboAboBboCboDboEdSMbSRbnKboybozbSRbSRbSVbSWbSRbSRdOGbeWbGlbGlbGlbGlbGlbGlbSYbGlbGlbSZbnobTbbTcbTdbqzbSabTebTfbqzaTRbThbTibTjbTkbQcbzTbzTbTlbzTbxBbQcbGxbTmbgQbgQbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbNGbNEbNEbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 8c6e7fc987538ce8f29b89d724ba8afb1b77784f Mon Sep 17 00:00:00 2001 From: Segrain Date: Sun, 4 Aug 2013 14:34:39 +0300 Subject: [PATCH 5/5] Fix for psychiatrist's office. --- maps/tgstation.2.1.0.0.1.dmm | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 9e21d488e09..544bde27163 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -3135,9 +3135,9 @@ "bio" = (/obj/structure/disposalpipe/segment,/obj/effect/landmark{name = "lightsout"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bip" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "biq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/machinery/camera{c_tag = "Psychiatric Office"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/turf/simulated/floor{tag = "icon-bcarpet09"; icon_state = "bcarpet09"},/area/medical/medbay) -"bir" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bir" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/door_control{id = "Medbay_privacy_room2"; name = "Privacy Shutters"; pixel_y = -25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bis" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) -"bit" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) +"bit" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/medical/medbay) "biu" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/chargebay) "biv" = (/obj/machinery/computer/rdconsole/robotics,/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics) "biw" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{tag = "icon-bcarpet08"; icon_state = "bcarpet08"},/area/medical/medbay) @@ -3211,8 +3211,8 @@ "bjM" = (/obj/machinery/washing_machine,/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 2; icon_state = "whitegreencorner"},/area/medical/medbay) "bjN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjO" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay) -"bjP" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) -"bjQ" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/machinery/door_control{id = "medpriv1"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet07"; icon_state = "bcarpet07"},/area/medical/medbay) +"bjP" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/medical/medbay) +"bjQ" = (/obj/effect/landmark/start{name = "Psychiatrist"},/obj/machinery/door_control{id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/turf/simulated/floor{tag = "icon-bcarpet07"; icon_state = "bcarpet07"},/area/medical/medbay) "bjR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_surgery"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/sleeper) "bjS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bjT" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/assembly/chargebay) @@ -3863,7 +3863,7 @@ "bwo" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bwp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bwq" = (/obj/structure/noticeboard{pixel_y = 28},/obj/structure/stool/psychbed,/turf/simulated/floor{tag = "icon-bcarpet02"; icon_state = "bcarpet02"},/area/medical/medbay) -"bwr" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) +"bwr" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_psychiatry"; name = "Privacy Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bws" = (/obj/structure/table,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/tie/stethoscope,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bwt" = (/turf/simulated/wall,/area/assembly/chargebay) "bwu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/assembly/chargebay) @@ -4102,7 +4102,7 @@ "bAT" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/maintenance/asmaint) "bAU" = (/turf/simulated/floor,/area/medical/genetics) "bAV" = (/obj/machinery/optable,/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper) -"bAW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "medpriv4"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) +"bAW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Medbay_privacy_room1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bAX" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/medbay) "bAY" = (/obj/structure/disposalpipe/sortjunction{sortType = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bAZ" = (/turf/simulated/wall/r_wall,/area/toxins/server) @@ -4429,7 +4429,7 @@ "bHi" = (/obj/structure/stool/bed/roller,/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyer"; name = "Medbay Exit Button"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = 26; range = 3},/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHj" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/medbay) "bHk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/medical/medbay) -"bHl" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) +"bHl" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "Medbay_privacy_room1"; name = "Privacy Shutters"; pixel_y = 25},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bHm" = (/obj/machinery/atmospherics/pipe/manifold{color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/wall,/area/maintenance/asmaint) "bHn" = (/turf/simulated/wall/r_wall,/area/medical/cmo) "bHo" = (/obj/machinery/door/airlock/glass_command{name = "Chief Medical Officer"; req_access_txt = "40"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo) @@ -10201,14 +10201,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAgbCLbCMbCNbCObCPbCQbCRbCSbCTbAibeCbCUbCVaIJaIJaIJaIJbcSbBEbBQbCWaIJaIJbCXaIJaIJbCYbCZbDaaIJaIJaIJaIJbBPaIJbcSbBEbBQbDeaXubDcbDbbDjbDdbtmbtlbtobtnbtHbtpbuCbuBbuEbuDbuGbuFbuHbxFbthbtibtjbtkbxFbjLbqfbwmbwmbwmbwmbwmbqrbqrbqrbqrbqrbqrbtebtdbtfbAZbDxbDybDzbtgbDBbDCbDDbBbbDEbDFbDGbDGbBebDHbDIbDJbDKbDLbDMbCJbDNbDObDPbylbiEbzTbgQaTTbDRbDRbgQaabaabaabaabaabaabaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabbDSbDTbDTbDUbDVbDVbDWbDWbDWbDWbDXaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnPbnPbnPbnPbnPaaaaaaaaaaaaaaaaaaaaaaaabDYbDZbEabDZbEbaaaaaaaaabAgbAgbEcbEdbCNbEdbEebEfbEgbEhbEibAibEjbeCbEkbElbtWbEmbtWbEnbEobEpbtXaIJbEqbErbjrbjrbEsaXuaXuaXuaXuaXuaXubEtbEubEvbEwbExbECbEBbEDbuIbvYbvXbECbuPbjRbjNbjJbvZbxFbxFbNYbwebNYbxFbxFbxFbxFbxFbxFbxFbxFbjLbqfbwfbwibwjbwgbwhbeabwnbwkbwlbtabuJbuMbuLbuObAZbESbETbCvbEUbEVbEWbEXbBbbEYbDFbDGbDGbBebEZbFabFbbFcbFdbFebFfbFgbFhbFibFjbFkbFlbFlbFlbFlbFmbmiaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbFnbFobFpbFobDVbDWbDWbFqbFrbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbFtbFubFtbFsbFvbFwbFxbAgbFybEdbFzbFAbFBbFCbFDbFDbFEbFFbAibFGbFGbFHbFGaTVaTVaTVaTVbFIbFIbFIbFIbFIbFIbFIbFIbFJbbNbbNbFKbFKbFKbFKbFLbFMbFKbFKbFKbFKbFNbFObFPaIPbrvbrxbrwbqqbqpbruaXjbrBbxFbrDbrCbrybNYbrzbrzbqgbqhbqibqkbNYbqebqfbqfbqfbqfbqfbjLbqlbqmbqnbqoblsbeabGjbeWbGlbGlbGlbGlbGlbGlbGlbGlbGlbBbbGmbGnbGobGobBebGpbGqbGrbGsbGsbGsbGsbGtbGubGvbGwbGsbGsbGsbGsbzTbGxbGyaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbGzbFobFobGAbDWbDWbFqbFqbGBbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbrtbqmbqnbqobrEbAEbGjbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbCgbCibAXbAXbAXbAXbzvbIZbeWbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbHlbAWbxGbAHbsUbChbClbwsbxCbAFbeabBUbAYbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGCbGDbGCbEabGEbGFbGGbAgbGHbGIbEdbGJbGKbAibGLbGMbGNbGObAibGPbGPbGQbFGaaaaaaaaaaaabFIbGRbGSbGTbGUbGVbGWbFIbGXbGYbGZbFKbHabHbbrNbHdbrGbrFbrIbrHbrKbrJbrMbrLbHmbrQbFNbxFbrPbrCboJbrObsTbxFbsSbsibrSbrRbAIbAIbAIbAIbAIbsZbsVbsYbsUbsUbsUbsUbtbbjLbrtbqmbqnbqobrEbAEbIZbeWbGlbHAbHBbHBbHCbHDbHEbHFbHGbBbbHHbHIbHJbHJbBebHKbHLbBhbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbGsbgQbEObgQbHYbHYbHYbHYbHYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFsbGCbGCbGCbIabIbbEdbEdbIcbIdbEdbEdbIebIfbAibAibAibIgbAibAibIhbIibIjbIkaaabIlbImbInbIobIpbGWbIqbIrbIsbItbADbzDbzCbzBbzAbzzbIAbIBbICbIDbIEbIFbFKbFKbIGbACbzEbARbAQbATbASbAIbrCbAVbrObAIbALbAMbrCbANbxFbAPbAObAIbAIbAJbAKbeabeabeabeabeabAGbjLbCgbCibAXbAXbAXbAXbzvbBUbAYbGlbJabJbbHBbJcbHBbHBbHBbJdbBbbJebDFbJfbJfbBebBgbJgbJhbJibJjbJjbJjbJjbJkbJlbJmbJnbJobJpbGsbJqbJrbJsbJtbJubJvbJwbJxaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbJybJzbJzbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEabGDbGDbGDbEabJAbJBbJCbJDbJEbEdbJFbJGbJHbJIbJJbJJbJKbJJbJJbJLbJMbJNbJOaaabJPbJQbJRbJSbJTbGWbJUbJVbJWbJXbFIbJYbJZbKabFKbKbbKcbKdbKebKfbKgbKhbKibKjbKkbKldKSbCbbCabBZbzhbCfbCebCdbCcbBWbxFbBVbrCbBYbxFbBXbrObAIbAIbCjbKzbeabCmbCkbHlbAWbxGbAHbsUbChbClbwsbxCbAFbeabGjbeWbGlbHAbKJbHBbHBbHBbHBbHBbKKbBbbKLbDFbKMbKMbBebKNbKObBhbKPbJlbJlbKQbKRbKSbKTbKUbKVbKWbKXbKYbKZbLabLbbLcbLdbLebJwbLfaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLbqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaabFsbLhbLibLjbFsbLkbFwbFxbAgbAgbLlbLlbLlbAgbAgbFGbFGbFGbFGbLmbFGbFGbLnbJOaaabJPbLobLpbLqbLrbLsbLtbLubLrbLrbLvbLwbLxbLybFKbFKbFKbFKbFKbFKbLzbFKbFKbLAbwpbwobLDbLEbLFbLEbzhbymbxVbzgbzfbxSbxFbxUbxTbxObxFbxRbxQbxKbxLbxMbxNbeabxIbqfbxJbxEbxGbjLbuKbtcbeabeabeabeabeabGjbeWbGlbGlbMcbHBbHBbHBbMdbGlbGlbBbbMebMfbKMbKMbBebMgbKObBhbHMbMhbMibMjbMkbMlbMmbMnbJlbMobMpbGsbMqbMrbMsbHYbMtbMubMvbMwaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbMybFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbDZbMAbDZbMBaaaaabaaaaaabAgbMCbMDbMEbAgaaaaaaaaabFGbMFbMGbIhbFGbLnbJOaaabJPbMHbMIbMJbMKbGWbMLbMMbMNbMObFIbMPbMQbMRbMSbMTbMTbMTbMTbMUbzkbMWbMWbMXbMYbzmbzlbzubztbzsbYBbzrbzpbYBbzobzrbYBbYBbzpbzobYBbYBbzobYBbYBbzpbYBbzxbdZbeaaWTbeabzwbjLbxJbwrbxHbwdbwqbzibeabzybeWbGlbNnbNobNpbNqbNrbNsbNtbNnbBebNubNvbCCbBebBebNwbKObNxbHYbHYbGsbGsbGsbGsbGwbGsbNybJlbNzbGsbNAbHXbgQbHYbNBbNCbNDbHYaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbNEbNEbNEbNEbNEbNEbNFbFqbNGbNEbMybFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipaGvaGQbbPbiaaGubFNbGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbirbitbjObjLbjMbjPbjQbiwbjAbiqbFNbGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabQfbQgbLnbFGbFGbFGbFGbFGbFIbFIbFIbFIbFIbFIbFIbFIbQhbQibfubQkbQlbQmbQnbQnbQobfebfdbfbbfibQtbfgbQvaTSbQxbQybQzbQAbQBbQCbQDbQEbQFaabaaaaaaaaaaaaaaaaaabFNbedbeWaWTbdZbeaaWTbeabdZbeXaWTbeabeabeabeabeabFNbGjbeYbGlbQJbQJbQKbQLbeZbQNbQLbQObQPbQQbQRbQSbnCbQTbOJbKObQUbQVaabbOLbPVbQWbOObQXbOObQYbQZbRabGsbQcbGxbRbbRcbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbQebFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaaaaabFGbNHbNIbNJbFGbLnbNKaaabNLbImbNMbNNbNObGWbGWbNPbNQbNRbNSbNTbNUbNVbNWbNWbNWbNWbNWbjzbjybNZbjxbjvbOcbjubjtbifbiebihbigbOjbOkbOlbOlbOjbOlbOlbOkbOlbOlbOlbOlbOlbOlbOkbiiaWTbijbikbilbimbinbiobipaGvaGQbbPbiaaGubeabGjbeWbGlbidbicbibbOCbODbOEbOFbOGbBebBebOHbBebBebOIbOJbKObnCbOKaabbOLbOMbONbOObOPbOObOQbORbOSbGsbOTbGxbOUbHYbOVbOWbOWbOXaacaacaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOYbFobFobFobFobFobFobFobOZbFrbFqbFqbFqbFqbPabFrbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaabaabbFGbFGbFGbFGbFGbPbbFGaaaaaaaaaaaabFIbPcbPdbPebPfbFIbPgbFIblxblwbPjbPkbPkblvbPmbPnbPobPpbPqbPrbPrbPrbltblubPrbPrbPubPqbPvbPrbPrbPrbltbPrbFNbFNbFNbFNbFNbFNbFNbFNbFNbeWaWTbjKbjIbirbitbjObjLbjMbjPbjQbiwbjAbiqbeabGjbjBbjDbjCbjFbjEbjHbjGbPObPObPPbPQbPRbPSbnCbPTbnCbOJbKObnCbPUaabbOLbPVbPVbPWbPXbPYbPZbQabQbbGsbQcbGxbzTbHYbHYbHYbHYbHYaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbJzbJzbJzbJzbJzbJzbQdbFqbJybJzbQebFqbFqbFqbFqbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabQfbQgbLnbFGbFGbFGbFGbFGbFIbFIbFIbFIbFIbFIbFIbFIbQhbQibfubQkbQlbQmbQnbQnbQobfebfdbfbbfibQtbfgbQvaTSbQxbQybQzbQAbQBbQCbQDbQEbQFaabaaaaaaaaaaaaaaaaaabFNbedbeWaWTbdZbeaaWTbeabdZbeXaWTbeabeabeabeabeabeabGjbeYbGlbQJbQJbQKbQLbeZbQNbQLbQObQPbQQbQRbQSbnCbQTbOJbKObQUbQVaabbOLbPVbQWbOObQXbOObQYbQZbRabGsbQcbGxbRbbRcbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDWbFqbFqbFqbFqbFqbFqbMxbFqbQebFqbFqbFqbFqbFqbDWbDWaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbRdbhZbRfbRgbRgbRhbRibRjbRkbRlbRmbRnbRobRnbRpbRkbhVbhUbRsbRtbRubRvbRwbRwbRxbRybfdbhSbfibQtbhTbQvbgAbRCbRDbREbRFbRGbRFbRHbRIbRJaabbRKbRKbRKbRKbRKaaabFNbggbgtbOjbOkbOlbOjbgubgxbgvbgwbgubOlbOlbOlbOlbOlbgCbgBbGlbRTbRUbRVbgRbgDbRYbRZbGlbGlbqzbSabqzbqzbqzbSbbScbSdbqzbGsbGsbGsbGsbGsbSebGsbGsbGsbGsbGsbQcbGxbSfbRcbgQaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabDWbDWbLgbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabSgaaaaabaabbShbShbShbShbShbShbShbShbSibSjbRkbSkbRlbRlbRnbSlbRpbRkbSmbSnbRsbSobSpbQnbSqboFbSrbSsboKboIboHboGbRFbQvbSxbRCbSybSzbSAbSBbSCbSDbSEbSFbnpbSHbSIbSJbSKbRKaaabFNboAboBboCboDboEdSMbSRbnKboybozbSRbSRbSVbSWbSRbSRdOGbeWbGlbGlbGlbGlbGlbGlbSYbGlbGlbSZbnobTbbTcbTdbqzbSabTebTfbqzaTRbThbTibTjbTkbQcbzTbzTbTlbzTbxBbQcbGxbTmbgQbgQbgQaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbDVbDWbNGbNEbNEbFqbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTnbTobTpbTqbTqbTqbTrbTsbTtbTubTvbTwbTxbShbTybSjbRkbTzbRlbRmbRlbRnbTAbRkbTBbSnbRsbRtbTCbQnbQnbQnbTDbTEbqdbTGbTHbRFbqcbqbbRFbTKbSybSzbTLbTMbTMbTNbTObTPaabbTQbTRbSKbTSbRKaabbFNboPboYbFNaaaaabaaabTVboOboMboNbTVaabaabaaaaabbFNdSLboLbOlbOlbOlbOlbOlbOlbOjbOlbOlbOlbOlbOkbUbbOlbgubUcbUdbUebzjbznbUgbUgbUgbUhbUibUgbUgbUgbUgbxPbUjbUkbUlbUmbUnbgQbgQbgQbgQaaaaabaaaaaaaaaamRamRamRaabaaaaaaaabaaaaaaaabaaaaaabHZbDWbGzbDWbDWbFqbFqbFqbFqbFqbFqbFqbDWbDWaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa