From 38c5431702441342f67c9081f1daabe2489d4b71 Mon Sep 17 00:00:00 2001 From: Neerti Date: Thu, 15 Sep 2016 01:19:56 -0400 Subject: [PATCH 1/2] Custom Circuit Additions & Fixes Adds Med Scanner and Advanced Med Scanner circuits. Clock circuit is now functional. Five second delay will delay for five seconds and not one second. Renaming circuitry now respects ability to do so (e.g. being alive). Firing circuit can now be obtained by science normally. Examining inside assembly cases now requires adjacency. --- .../integrated_electronics/_defines.dm | 22 ++- .../integrated_electronics/assemblies.dm | 20 +-- .../integrated_electronics/input_output.dm | 129 +++++++++++++++++- code/modules/integrated_electronics/time.dm | 28 +++- code/modules/research/designs.dm | 19 ++- 5 files changed, 195 insertions(+), 23 deletions(-) diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index 9e0fa6039c8..f25791bd7cd 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -92,6 +92,9 @@ var/mob/M = usr + if(!M.canmove || M.stat || M.restrained()) + return + var/input = sanitizeSafe(input("What do you want to name the circuit?", ,""), MAX_NAME_LEN) if(src && input) @@ -156,13 +159,14 @@ words += "\[[linked.name]\] \ @ [linked.holder]
" if(outputs.len > inputs.len) - height = Floor(outputs.len / inputs.len) - //world << "I wrote [words] at ([i],[j])." + // height = Floor(outputs.len / inputs.len) + height = 1 // Because of bugs, if there's more outputs than inputs, it causes the output side to be hidden. + //world << "I wrote [words] at ([i],[j]). Height = [height]." if(2) if(i == 1) words = "[src.name]

[src.desc]" height = row_height - //world << "I wrote the center piece because i was equal to 1, at ([i],[j])." + //world << "I wrote the center piece because i was equal to 1, at ([i],[j]). Height = [height]." else continue if(3) @@ -179,8 +183,9 @@ words += "\[[linked.name]\] \ @ [linked.holder]
" if(inputs.len > outputs.len) - height = Floor(inputs.len / outputs.len) - //world << "I wrote [words] at ([i],[j])." + // height = Floor(inputs.len / outputs.len) + height = 1 // See above. + //world << "I wrote [words] at ([i],[j]). Height = [height]." HTML += "[words]" //HTML += "[words]" //world << "Writing to ([i],[j])." @@ -209,11 +214,15 @@ HTML += "" HTML += "" + HTML += "
Complexity: [complexity]" HTML += "
[extended_desc]" HTML += "" user << browse(HTML, "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") + //user << sanitize(HTML, "window=debug;size=400x400;border=1;can_resize=1;can_close=1;can_minimize=1") + //world << sanitize(HTML) + user.set_machine(src) onclose(user, "circuit-\ref[src]") @@ -224,6 +233,9 @@ if(!user || !user.Adjacent(get_turf(src)) ) return 1 + if(!user.canmove || user.stat || user.restrained()) + return + if(href_list["wire"]) if(ishuman(user) && Adjacent(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/assemblies.dm index 97690b977f8..983d84570a3 100644 --- a/code/modules/integrated_electronics/assemblies.dm +++ b/code/modules/integrated_electronics/assemblies.dm @@ -37,14 +37,15 @@ /obj/item/device/electronic_assembly/examine(mob/user) ..() - if(!opened) - for(var/obj/item/integrated_circuit/output/screen/S in contents) - if(S.stuff_to_display) - user << "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'." - else - var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents - if(IC) - IC.examine(user) + if(user.Adjacent(src)) + if(!opened) + for(var/obj/item/integrated_circuit/output/screen/S in contents) + if(S.stuff_to_display) + user << "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'." + else + var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents + if(IC) + IC.examine(user) /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/integrated_circuit)) @@ -98,7 +99,8 @@ /obj/item/device/electronic_assembly/attack_self(mob/user) var/list/available_inputs = list() for(var/obj/item/integrated_circuit/input/input in contents) - available_inputs.Add(input) + if(input.can_be_asked_input) + available_inputs.Add(input) var/obj/item/integrated_circuit/input/choice = input(user, "What do you want to interact with?", "Interaction") as null|anything in available_inputs if(choice) choice.ask_for_input(user) diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm index 8f9c2cac040..f36c6a36e5a 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/input_output.dm @@ -1,3 +1,6 @@ +/obj/item/integrated_circuit/input + var/can_be_asked_input = 0 + /obj/item/integrated_circuit/input/proc/ask_for_input(mob/user) return @@ -9,6 +12,7 @@ number_of_outputs = 0 number_of_activators = 1 complexity = 1 + can_be_asked_input = 1 activator_names = list( "on pressed" ) @@ -28,6 +32,7 @@ number_of_outputs = 1 number_of_activators = 1 complexity = 2 + can_be_asked_input = 1 output_names = list( "number entered" ) @@ -37,7 +42,7 @@ /obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) var/new_input = input(user, "Enter a number, please.","Number pad") as num - if(new_input && isnum(new_input)) + if(isnum(new_input)) var/datum/integrated_io/O = outputs[1] O.data = new_input O.push_data() @@ -53,6 +58,7 @@ number_of_outputs = 1 number_of_activators = 1 complexity = 2 + can_be_asked_input = 1 output_names = list( "string entered" ) @@ -70,6 +76,127 @@ if(A.linked) A.holder.work() +/obj/item/integrated_circuit/input/med_scanner + name = "integrated medical analyser" + desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is." + number_of_inputs = 1 + number_of_outputs = 2 + number_of_activators = 1 + complexity = 4 + input_names = list( + "target ref" + ) + output_names = list( + "total health %", + "total missing health" + ) + activator_names = list( + "scan" + ) + +/obj/item/integrated_circuit/input/med_scanner/work() + if(..()) + var/datum/integrated_io/I = inputs[1] + if(!I.data || !ishuman(I.data)) //Invalid input + return + var/mob/living/carbon/human/H = I.data + if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. + var/total_health = round(H.health/H.maxHealth)*100 + var/missing_health = H.maxHealth - H.health + + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] + + total.data = total_health + missing.data = missing_health + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/input/adv_med_scanner + name = "integrated advanced medical analyser" + desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is. \ + This type is much more precise, allowing the machine to know much more about the target than a normal analyzer." + number_of_inputs = 1 + number_of_outputs = 7 + number_of_activators = 1 + complexity = 12 + input_names = list( + "target ref" + ) + output_names = list( + "total health %", + "total missing health", + "brute damage", + "burn damage", + "tox damage", + "oxy damage", + "clone damage" + ) + activator_names = list( + "scan" + ) + +/obj/item/integrated_circuit/input/adv_med_scanner/work() + if(..()) + var/datum/integrated_io/I = inputs[1] + if(!I.data || !ishuman(I.data)) //Invalid input + return + var/mob/living/carbon/human/H = I.data + if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. + var/total_health = round(H.health/H.maxHealth)*100 + var/missing_health = H.maxHealth - H.health + + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] + var/datum/integrated_io/brute = outputs[3] + var/datum/integrated_io/burn = outputs[4] + var/datum/integrated_io/tox = outputs[5] + var/datum/integrated_io/oxy = outputs[6] + var/datum/integrated_io/clone = outputs[7] + + total.data = total_health + missing.data = missing_health + brute.data = H.getBruteLoss() + burn.data = H.getFireLoss() + tox.data = H.getToxLoss() + oxy.data = H.getOxyLoss() + clone.data = H.getCloneLoss() + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/input/local_locator + name = "local locator" + desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \ + that is holding the machine containing it." + number_of_inputs = 0 + number_of_outputs = 1 + number_of_activators = 1 + complexity = 4 + output_names = list( + "located ref" + ) + activator_names = list( + "locate" + ) + +/obj/item/integrated_circuit/input/local_locator/work() + if(..()) + var/mob/living/L = null + var/datum/integrated_io/O = outputs[1] + O.data = null + if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. + var/obj/item/device/electronic_assembly/assembly = src.loc + if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. + L = assembly.loc + + if(L) + O.data = L + + O.push_data() + + /obj/item/integrated_circuit/output/screen name = "screen" desc = "This small screen can display a single piece of data, when the machine is examined closely." diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/time.dm index 99c8a42436e..6f8d18cdb1d 100644 --- a/code/modules/integrated_electronics/time.dm +++ b/code/modules/integrated_electronics/time.dm @@ -26,7 +26,7 @@ name = "five-sec delay circuit" desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ This circuit is set to send a pulse after a delay of five seconds." - delay = 10 + delay = 50 /obj/item/integrated_circuit/time/delay/one_sec name = "one-sec delay circuit" @@ -109,12 +109,26 @@ name = "integrated clock" desc = "Tells you what the local time is, specific to your station or planet." number_of_inputs = 0 - number_of_outputs = 6 + number_of_outputs = 4 number_of_activators = 1 output_names = list( "time (string)", - "minute (string)", - "hour (string)", - "minute (number)", - "hour (number)", - ) \ No newline at end of file + "hours (number)", + "minutes (number)", + "seconds (number)" + ) + +/obj/item/integrated_circuit/time/clock/work() + if(..()) + var/datum/integrated_io/time = outputs[1] + var/datum/integrated_io/hour = outputs[2] + var/datum/integrated_io/min = outputs[3] + var/datum/integrated_io/sec = outputs[4] + + time.data = time2text(station_time_in_ticks, "hh:mm:ss") + hour.data = text2num(time2text(station_time_in_ticks, "hh")) + min.data = text2num(time2text(station_time_in_ticks, "mm")) + sec.data = text2num(time2text(station_time_in_ticks, "ss")) + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 943dd7a903b..8461d87ea7e 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1682,6 +1682,23 @@ CIRCUITS BELOW build_path = /obj/item/integrated_circuit/output/screen sort_string = "WAAED" +/datum/design/circuit/integrated_circuit/input_output/med_scanner + id = "cc-medscanner" + build_path = /obj/item/integrated_circuit/input/med_scanner + req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 2, TECH_BIOMED = 2) + sort_string = "WAAEE" + +/datum/design/circuit/integrated_circuit/input_output/adv_med_scanner + id = "cc-advmedscanner" + build_path = /obj/item/integrated_circuit/input/adv_med_scanner + req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 3, TECH_BIOMED = 4) + sort_string = "WAAEF" + +/datum/design/circuit/integrated_circuit/input_output/local_locator + id = "cc-locallocator" + build_path = /obj/item/integrated_circuit/input/local_locator + sort_string = "WAAEG" + /datum/design/circuit/integrated_circuit/logic/AssembleDesignName() @@ -1740,7 +1757,7 @@ CIRCUITS BELOW sort_string = "WAAGA" req_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_COMBAT = 5) -/datum/design/circuit/integrated_circuit/manipulation/weapon_firing +/datum/design/circuit/integrated_circuit/manipulation/smoke id = "cc-smoke" build_path = /obj/item/integrated_circuit/manipulation/smoke sort_string = "WAAGB" From 5412d7e113d28f6fe9d3a42ee52615c0f81e8ab7 Mon Sep 17 00:00:00 2001 From: Neerti Date: Thu, 15 Sep 2016 08:23:22 -0400 Subject: [PATCH 2/2] More Additions You can now cancel inputting on a text or numberpad. Zero is now displayed properly on the UI and not be shown as null. The small and medium assemblies now have real sprites. Total health percentage for med scanners and advanced med scanners now reports a proper percentage and not 1 or 0. The constant memory chip now can be set by using it in hand, making it usable. The constant memory chip now accepts refs as data to store. To use, select 'ref' when using inhand, then hit it against the thing you want to store. --- .../integrated_electronics/_defines.dm | 2 +- .../integrated_electronics/assemblies.dm | 11 +++++- .../integrated_electronics/input_output.dm | 8 ++--- code/modules/integrated_electronics/memory.dm | 33 +++++++++++++----- icons/obj/electronic_assemblies.dmi | Bin 1370 -> 2514 bytes 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index f25791bd7cd..7e0655c80ce 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -277,7 +277,7 @@ ..() /datum/integrated_io/proc/display_data() - if(!data) + if(isnull(data)) return "(null)" // Empty data means nothing to show. if(istext(data)) return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/assemblies.dm index 983d84570a3..e727f4c3d81 100644 --- a/code/modules/integrated_electronics/assemblies.dm +++ b/code/modules/integrated_electronics/assemblies.dm @@ -3,19 +3,21 @@ desc = "It's a case, for building electronics with." w_class = 2 icon = 'icons/obj/electronic_assemblies.dmi' - icon_state = "setup" + icon_state = "setup_small" var/max_components = 10 var/max_complexity = 30 var/opened = 0 /obj/item/device/electronic_assembly/medium name = "electronic mechanism" + icon_state = "setup_medium" w_class = 3 max_components = 20 max_complexity = 50 /obj/item/device/electronic_assembly/large name = "electronic machine" + icon_state = "setup" w_class = 4 max_components = 30 max_complexity = 60 @@ -35,6 +37,12 @@ IC.work() */ +/obj/item/device/electronic_assembly/update_icon() + if(opened) + icon_state = initial(icon_state) + "-open" + else + icon_state = initial(icon_state) + /obj/item/device/electronic_assembly/examine(mob/user) ..() if(user.Adjacent(src)) @@ -87,6 +95,7 @@ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) opened = !opened user << "You [opened ? "opened" : "closed"] \the [src]." + update_icon() if(istype(I, /obj/item/device/integrated_electronics/wirer)) if(opened) var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm index f36c6a36e5a..4bb4c013097 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/input_output.dm @@ -41,7 +41,7 @@ ) /obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) - var/new_input = input(user, "Enter a number, please.","Number pad") as num + var/new_input = input(user, "Enter a number, please.","Number pad") as null|num if(isnum(new_input)) var/datum/integrated_io/O = outputs[1] O.data = new_input @@ -67,7 +67,7 @@ ) /obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) - var/new_input = input(user, "Enter some words, please.","Number pad") as text + var/new_input = input(user, "Enter some words, please.","Number pad") as null|text if(new_input && istext(new_input)) var/datum/integrated_io/O = outputs[1] O.data = new_input @@ -101,7 +101,7 @@ return var/mob/living/carbon/human/H = I.data if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. - var/total_health = round(H.health/H.maxHealth)*100 + var/total_health = round(H.health/H.maxHealth, 0.1)*100 var/missing_health = H.maxHealth - H.health var/datum/integrated_io/total = outputs[1] @@ -144,7 +144,7 @@ return var/mob/living/carbon/human/H = I.data if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. - var/total_health = round(H.health/H.maxHealth)*100 + var/total_health = round(H.health/H.maxHealth, 0.1)*100 var/missing_health = H.maxHealth - H.health var/datum/integrated_io/total = outputs[1] diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/memory.dm index 3305cf0a939..ec06c7784b2 100644 --- a/code/modules/integrated_electronics/memory.dm +++ b/code/modules/integrated_electronics/memory.dm @@ -58,26 +58,41 @@ number_of_outputs = 1 number_of_activators = 1 activator_names = list( - "trigger output" + "push data" ) + var/accepting_refs = 0 /obj/item/integrated_circuit/memory/constant/work() - if(..()) - var/datum/integrated_io/O = outputs[1] - O.push_data() - -/obj/item/integrated_circuit/memory/constant/attack_hand(mob/user) var/datum/integrated_io/O = outputs[1] - var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number") + O.push_data() + +/obj/item/integrated_circuit/memory/constant/attack_self(mob/user) + var/datum/integrated_io/O = outputs[1] + var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref") var/new_data = null switch(type_to_use) if("string") + accepting_refs = 0 new_data = input("Now type in a string.","[src] string writing") as null|text if(istext(new_data)) O.data = new_data - user << "You set \the [src]'s memory to '[new_data]'." + user << "You set \the [src]'s memory to [O.display_data()]." if("number") + accepting_refs = 0 new_data = input("Now type in a number.","[src] number writing") as null|num if(isnum(new_data)) O.data = new_data - user << "You set \the [src]'s memory to '[new_data]'." \ No newline at end of file + user << "You set \the [src]'s memory to [O.display_data()]." + if("ref") + accepting_refs = 1 + user << "You turn \the [src]'s ref scanner on. Slide it across \ + an object for a ref of that object to save it in memory." + +/obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity) + if(accepting_refs && proximity) + var/datum/integrated_io/O = outputs[1] + O.data = target + visible_message("[user] slides \a [src]'s over \the [target].") + user << "You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \ + now off." + accepting_refs = 0 \ No newline at end of file diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi index e4fd3c230bbfe419d4b55a94489b5b07ec47bca3..18ba8650eed85494b2240b066e411cfaa3d2f180 100644 GIT binary patch delta 2511 zcmV;=2{88B3epoLiBL{Q4GJ0x0000DNk~Le0002s0002M2m=5B04iUf0RR6pJv}|Zz`zd=53#YamzS4HN=i33H(+33H8nLQ zB_$XcA7%gmGcy1h8vg(QnE*4H3cMwWe*gdg0d!JMQvg8b*k%9#0Y7?FSad{Xb7OL8 zaCB*JZU6vyoRyWqZo)7OhR@AYRB+v<0oAk%mkBg+7_U&djYlITO_w+@-hL5m2x;qV zl*^y!>t8!|l4<#}e%)-#)!RnxF+}70a#>ankE%ErO>^eG6A^~BRe-lDC z*sLe2&?dyZG*iWU0EcIN0YPg+*_j1nYA8S}VqLOi25VXn;o9s?lz`AgZ<8deykD^6 zxxw(cp!4A<#3~{8EaYZSEQlWoEK6C8v8E3AJ>CV(D#+lAZS6xXi{#p0{#EaZFM6+8 z#s|L9bK_EuPz>@#{~`IZ_sKOFe+J+)A^ao>*CZmz@ood607FWHjJo%O)Ub{YEZ+oI z>@DUFwMp)8c#&7p!ZFMF-S<#Mz=P@axYtdo(diO|u{)&t6~VZ}zyF<<>+S0FSbPE6 z9cB3{BhK&u_8}~xij?-?FX5EvnX_DUFfB)sG3jze1 z85tpC-1(fQ&H0hguaN|3LbF&f48t%CV@PgXUo3A`PnIk7@9O)q+Y`11n6m+ z3G}xV*RyN_T?>PC(St36&IqCnh^+@3oP7kBtCdFtb4db6u+qT@#M6brye1ixC|wwoowHu+E&z3P z3>CqYh+yjI0J}V>s|cbxP+oL^?7X!KV}k19437F|Fb8#X)@THCIKrw269qg6D;=Ce zF?C`Q5pxjLXK)=%8iwdIxejK;br95L4=Rud);bV@m^x{Y)EB01e>{S41+n!&gXV5t z13yhb#MT*xVHk#C7=|GrlOuD7N}kLf;-P5P0Z!zuLYl2ydxnO&2Uu-+L89n@Y?Wo0 z|M2{0OcK4b=h~Ik>T0EAEW{!CQF7Bpw}UtXu2T_&{a1wKNBs;2bYW-&)pi)tIv<@j zh;)%`qR_DsrgmkKfAVMqo1J|`Un9DdB~X5CK@2fU$5&A*f^y^3B(H$lQpI@bp z);hm4$RIuh^*Q7i!pjFmaE&Gnv`>hTd+=>bJjuedFfc zE3kfD1ynzte;blp_bLMj7{v2ywW>38XX})~I&}gVp!C|H(4p)Sks+lbL`9g&?~M{c znZ3=iA&TVJDizGoQF=2%;QEaLsD4bB_3H>?Llm5Y^$-DixGp^~f+qV1WzfBcsHg!M zqF8<{%kbnArB7Y|g37N^sS7%_F>U<}!!QiPFbu;me+)C6&1Q^4t`oVXyis2vhg>sN z)3N4z95Ojb_C^oB4K@lr4w)J%d$XzI1g1ee4v7erU(>&{io8~#f3JSi4^iI6eaIz1 zB2;H@oc~88Nv`%Kffonz)^GKrFF*wt|5Sk-f{dERAQ-_h3ZP9M~omiIxT;~VgHCbUG*JiQ0LcDBL5aMg7FMC`L)z(u&u|6ASQMV_SagU2%>W= z{v51cvGp?8znu6O)cG}dh*o;E2x0~ui;V5Ce>MnR2J7@1c9}qQ-9R`z)jQB?9-nW} zd6}>r8iUwn9;Goj#T;~E8LTc7!{2+NBWP|^+~t!t1IqUq`DT`m;H8Onw?6&*Z>y_* zrW}PEx5qFH!!QgpHrvH_i|-ddEPlM`S&MTHKJRg*%YFTEHl$%x-TX+ESHv~=+2Cx! ze^9-sex%APV1qlbOrsM9KjSSJsu$Id#m>VaY;X@+^V4-huoeu}i|WT>=ixB2!Oz${ z8LAhRAz^Sw&O^-LuFctc)xZY>U|@i58AQrUko?+yw?FKfPtO6Rn+8_>3mQ0Iw++JO zrN2jo%iwOmKO8oPpAJ7Cz8roz?01h2fBmWc^z^2I&l1GI*?PyI`qMaWgT|j@Yj`K( zW3hki=)a=+RT#wbYrFfy;iaK(kkGHfAeOuk242!HhV;c@@I_^RpS}v7dipF3erW&< z3TT7VEi$OVL)YN0r>g}1lcJ|L4V>^Y5o%Dz@2QR;WN`EF{BRWCAp_4s!}VuXe+Oi6 zTYWHtuB(L498~e6hUgVU&~=&bu9ElN2oieJKpj6gLdPn`kS^nUv~=$XV)?bl-(IZC z+)F1yl-@LO+FLak;h;^g{gl3F&!M9=hiv`Wn`2#lGc-13a|1( zwEw~-n8c5@v*xRZ;AL>m+`d7NIXG|VRg_`Ec(u7YJ(Snq+k889&oH$fO1J*<^}6)Y z{dG<-wI1y6n}w*~KEc#_u)jYnWc}70m|7ph;9HG4!KvGTN%av7zP*_}e=~6gM+2hk zWw|ZOcZowE!(g-PDNk^+SFsD|W%=>v`{{Jj22UfeqWuPxL<2|Hl|f1A&~L%uRv0W5 z7c$tLBeC_Zn1k&I#-4*0H&|}BatfZ_KW^1vxzz!@*$9>&TlKV@-K@bZ-ENcRYI&;$ zvo!lFlV6bx+IJfL2E^8te?J+(NOQ1rFW76qwE7qZ?YsGY118nkpohU*AEMK*qUFc? zd;Pc+#bBCZ4KQk&Vg}?(ECq*j>e5uSy@opnV1Oos70H_9jZU6uPB#|W_ zf55=NDk>_it*vzc)A#@Y00DGTPE!Ct=GbNc0097cR9JLGWpiV4X>fFDZ*Bkpc$|&Y zv2Ft)3;@vi_zINlRntaQmo8PJDns%MC*R@TA;Ce6Nz}hDYSgGpWp4&OER2D*ecyi^ zPIh-Zmpe`fU4%(p>dU~J)vG3Lef~W$P((?@R8Bc^QA|1Y`?GyF7o&3$OU$rEbo4z>FB$6+BySUtTsD^UWe}ARi z_NB%FDT7?eP?x=-^($279Cf&6OhMkPoC#Le>K7 z925$Vka8)SIU6WdXhq`Sh&VW^1YgP#SBh{@-WwN6DS23xx4#D3fx-@Mf0G2Qf#G~- zP8YfT`yequ4qCqtIKB_2(QADMg(f5sE90G`4$>-W*3_L9WufJD84kVOIWJ)Ht;O7JeS9Y`vm z)3Hl{Oo?uhb5f2S=>Ajz1q2qbI^52|D$lE0b0q-B;B(;HMf$h^Pb8%P%=dH=*DR`g z7uk!fKTv=m%~*dc2PDs1`QC>O?gM8!_QQ7{@IZky<9HW+PUy2Jf6xIHoN)RyZ53&D z#`;;83K0wId+A}W19Caup<`R|bV%=Z{ zixJlq6l$Md$O2wSFK`9I4b=^1P23i+9Z07mI%4X`>QA>Q=GP-wLAf|DM_gZ^ymSoP z>kEQRiNqW^GR1Jjf2P>yK!<6*Ip<~io;7l-J)=?7!&lLD*2t~)5fKp)5fR;BxahR| zGqxCZDllXV{b?8YUG@Xh9@>?l@3x0#mf-tnU%vPKKuPxnUqhOl#2yx)!YOG$x%=(A zd3&EY+V^Y0`~03Dpatpt8l7k&xx{T~;=S@Kn&+F0QNvMAOFR9m-gfqIb_wZKV8 z|3skPro&p`F-V{(&%X%hZTd5)|HeGO2t<807*qoM6N<$g3PLYng9R*