diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index 2d3b85d7f1..4953f6166a 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -196,7 +196,7 @@
"aL" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table,
-/obj/item/deck,
+/obj/item/toy/cards/deck,
/obj/item/folder/blue,
/obj/item/pen,
/turf/open/floor/plasteel/floorgrime,
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index f50cf8dc87..8d4aca5fbf 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -54,7 +54,7 @@
if(..())
return
var/mob/living/silicon/ai/AI = usr
- GLOB.crewmonitor.show(AI)
+ GLOB.crewmonitor.show(AI,AI)
/obj/screen/ai/crew_manifest
name = "Crew Manifest"
diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm
index 3f72ff995b..be7e6360aa 100644
--- a/code/datums/cinematic.dm
+++ b/code/datums/cinematic.dm
@@ -57,8 +57,6 @@ GLOBAL_LIST_EMPTY(cinematics)
//Close all open windows if global
if(is_global)
- for (var/datum/html_interface/hi in GLOB.html_interfaces)
- hi.closeAll()
SStgui.close_all_uis()
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 1adddf7d58..585feba979 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -143,10 +143,6 @@
var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC]
B.update_suit_sensors(src)
- var/turf/T = get_turf(src)
- if (T)
- GLOB.crewmonitor.queueUpdate(T.z)
-
//called when a living mob changes health
/mob/living/proc/med_hud_set_health()
var/image/holder = hud_list[HEALTH_HUD]
@@ -158,10 +154,6 @@
/mob/living/carbon/med_hud_set_health()
..()
- var/turf/T = get_turf(src)
- if(T)
- GLOB.crewmonitor.queueUpdate(T.z)
-
//called when a carbon changes stat, virus or XENO_HOST
/mob/living/proc/med_hud_set_status()
var/image/holder = hud_list[STATUS_HUD]
@@ -216,10 +208,6 @@
holder.icon_state = "hud[ckey(wear_id.GetJobName())]"
sec_hud_set_security_status()
- var/turf/T = get_turf(src)
- if (T)
- GLOB.crewmonitor.queueUpdate(T.z)
-
/mob/living/carbon/human/proc/sec_hud_set_implants()
var/image/holder
for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 22978e9ea2..d901fa007b 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -456,21 +456,6 @@ Class Procs:
/obj/machinery/proc/on_deconstruction()
return
-// Hook for html_interface module to prevent updates to clients who don't have this as their active machine.
-/obj/machinery/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi)
- if (hclient.client.mob && (hclient.client.mob.stat == 0 || IsAdminGhost(hclient.client.mob)))
- if (isAI(hclient.client.mob) || IsAdminGhost(hclient.client.mob))
- return TRUE
- else
- return hclient.client.mob.machine == src && Adjacent(hclient.client.mob)
- else
- return FALSE
-
-// Hook for html_interface module to unset the active machine when the window is closed by the player.
-/obj/machinery/proc/hiOnHide(datum/html_interface_client/hclient)
- if (hclient.client.mob && hclient.client.mob.machine == src)
- hclient.client.mob.unset_machine()
-
/obj/machinery/proc/can_be_overridden()
. = 1
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 4386c73ef6..c327f4c17a 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -20,13 +20,14 @@
switchCamera(cameras[camera])
/datum/trackable
+ var/initialized = FALSE
var/list/names = list()
var/list/namecounts = list()
var/list/humans = list()
var/list/others = list()
/mob/living/silicon/ai/proc/trackable_mobs()
-
+ track.initialized = TRUE
track.names.Cut()
track.namecounts.Cut()
track.humans.Cut()
@@ -63,6 +64,9 @@
if(!target_name)
return
+ if(!track.initialized)
+ trackable_mobs()
+
var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])
ai_actual_track(target)
diff --git a/code/game/machinery/computer/crew.css b/code/game/machinery/computer/crew.css
deleted file mode 100644
index 2ebb2e2dda..0000000000
--- a/code/game/machinery/computer/crew.css
+++ /dev/null
@@ -1,154 +0,0 @@
-body
-{
- padding-left: 53%;
- cursor: default;
-}
-
-#ntbgcenter
-{
- background-position: 550px 0px !important;
-}
-
-#minimap
-{
- position: fixed;
- top: 8px;
- left: 8px;
- border: 2px inset #888;
- overflow: hidden;
- min-width: 480px;
- min-height: 480px;
- width: 53%;
- height: 100%;
- max-width: 480px;
- max-height: 480px;
-}
-
-#textbased
-{
- width: 100%;
- padding-left: 20px;
-}
-
-#textbased table
-{
- min-width: 380px;
- width: 100%;
- table-layout: fixed;
-}
-
-#textbased td
-{
- vertical-align: top;
- padding: 2px;
-}
-
-#textbased tbody td
-{
- transition: .2s all;
-}
-
-#textbased tbody tr:hover td, #textbased tbody tr.hover td
-{
- background-color: #515151;
-}
-
-#textarea:after
-{
- content: "";
- clear: both;
-}
-
-.health
-{
- width: 16px;
- height: 16px;
- background-color: #FFF;
- border: 1px solid #434343;
- position: relative;
- top: 2px;
-}
-
-.health-5 { background-color: #17d568; }
-.health-4 { background-color: #2ecc71; }
-.health-3 { background-color: #e67e22; }
-.health-2 { background-color: #ed5100; }
-.health-1 { background-color: #e74c3c; }
-.health-0 { background-color: #ed2814; }
-
-.health > div
-{
- margin-left: 20px;
- margin-top: -4px;
-}
-
-.tt
-{
- position: relative;
- display: inline-block;
- height: 16px;
-}
-
-.tt > div
-{
- display: none;
-}
-
-.tt:hover > div
-{
- position: absolute;
- bottom: -30px;
- left: 50%;
- margin-left: -64px;
-
- display: block;
- width: 128px;
- height: 24px;
- border: 1px solid #313131;
- background-color: #434343;
- padding: 4px;
- z-index: 999;
- text-align: center;
-}
-
-.tt > div > span
-{
- position: relative;
- top: -2px;
-}
-
-.dot
-{
- position: absolute;
- width: 3px;
- height: 3px;
- margin-top: 0px;
- margin-left: 0px;
- border: 1px solid transparent;
-}
-
-.dot.active
-{
- z-index: 9999 !important;
- width: 8px;
- height: 8px;
- margin-top: -2px;
- margin-left: -3px;
-}
-
-.zoom
-{
- position: fixed;
- left: 53%;
- top: 10px;
- display: block;
- width: 24px;
- height: 24px;
- text-align: center;
- margin-left: 20px !important;
-}
-
-.zoom.in
-{
- margin-left: -3px !important;
-}
\ No newline at end of file
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 7397b2a064..40d03a8f5a 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -1,3 +1,5 @@
+#define SENSORS_UPDATE_PERIOD 100 //How often the sensor data updates.
+
/obj/machinery/computer/crew
name = "crew monitoring console"
desc = "Used to monitor active health sensors built into most of the crew's uniforms."
@@ -16,21 +18,22 @@
/obj/machinery/computer/crew/attack_ai(mob/user)
if(stat & (BROKEN|NOPOWER))
return
- GLOB.crewmonitor.show(user)
+ GLOB.crewmonitor.show(user,src)
/obj/machinery/computer/crew/attack_hand(mob/user)
if(..())
return
if(stat & (BROKEN|NOPOWER))
return
- GLOB.crewmonitor.show(user)
+ GLOB.crewmonitor.show(user,src)
GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
/datum/crewmonitor
+ var/list/ui_sources = list() //List of user -> ui source
var/list/jobs
- var/list/interfaces
- var/list/data
+ var/list/data_by_z = list()
+ var/list/last_update = list()
/datum/crewmonitor/New()
. = ..()
@@ -77,196 +80,119 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
jobs["Assistant"] = 999 //Unknowns/custom jobs should appear after civilians, and before assistants
src.jobs = jobs
- src.interfaces = list()
- src.data = list()
- register_asset("crewmonitor.js",'crew.js')
- register_asset("crewmonitor.css",'crew.css')
/datum/crewmonitor/Destroy()
- if (src.interfaces)
- for (var/datum/html_interface/hi in interfaces)
- qdel(hi)
- src.interfaces = null
-
return ..()
-/datum/crewmonitor/proc/show(mob/mob, z)
- if (mob.client)
- sendResources(mob.client)
- if (!z)
- z = mob.z
+/datum/crewmonitor/ui_interact(mob/user, ui_key = "crew", datum/tgui/ui = null, force_open = FALSE, \
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "crew", "crew monitor", 800, 600 , master_ui, state)
+ ui.open()
- if (z > 0 && src.interfaces)
- var/datum/html_interface/hi
+/datum/crewmonitor/proc/show(mob/M, source)
+ ui_sources[M] = source
+ ui_interact(M)
- if (!src.interfaces["[z]"])
- src.interfaces["[z]"] = new/datum/html_interface/nanotrasen(src, "Crew Monitoring", 900, 540, "")
+/datum/crewmonitor/ui_host(mob/user)
+ return ui_sources[user]
- hi = src.interfaces["[z]"]
+/datum/crewmonitor/ui_data(mob/user)
+ var/z = user.z
+ if(!z)
+ var/turf/T = get_turf(user)
+ z = T.z
+ var/list/zdata = update_data(z)
+ . = list()
+ .["sensors"] = zdata
+ .["link_allowed"] = isAI(user)
- hi.updateContent("content", "
")
+/datum/crewmonitor/proc/update_data(z)
+ if(data_by_z["[z]"] && last_update["[z]"] && world.time <= last_update["[z]"] + SENSORS_UPDATE_PERIOD)
+ return data_by_z["[z]"]
- src.update(z, TRUE)
- else
- hi = src.interfaces["[z]"]
- src.update(z,TRUE)
+ var/list/results = list()
+ var/obj/item/clothing/under/U
+ var/obj/item/card/id/I
+ var/turf/pos
+ var/ijob
+ var/name
+ var/assignment
+ var/oxydam
+ var/toxdam
+ var/burndam
+ var/brutedam
+ var/area
+ var/pos_x
+ var/pos_y
+ var/life_status
- // Debugging purposes
- mob << browse_rsc(file("code/game/machinery/computer/crew.js"), "crew.js")
- mob << browse_rsc(file("code/game/machinery/computer/crew.css"), "crew.css")
+ for(var/mob/living/carbon/human/H in GLOB.carbon_list)
+ // Check if their z-level is correct and if they are wearing a uniform.
+ // Accept H.z==0 as well in case the mob is inside an object.
+ if ((H.z == 0 || H.z == z) && istype(H.w_uniform, /obj/item/clothing/under))
+ U = H.w_uniform
- hi = src.interfaces["[z]"]
- hi.show(mob)
- src.updateFor(mob, hi, z)
+ // Are the suit sensors on?
+ if ((U.has_sensor > 0) && U.sensor_mode)
+ pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null
-/datum/crewmonitor/proc/updateFor(hclient_or_mob, datum/html_interface/hi, z)
- // This check will succeed if updateFor is called after showing to the player, but will fail
- // on regular updates. Since we only really need this once we don't care if it fails.
- hi.callJavaScript("clearAll", null, hclient_or_mob)
+ // Special case: If the mob is inside an object confirm the z-level on turf level.
+ if (H.z == 0 && (!pos || pos.z != z))
+ continue
- for (var/list/L in data)
- hi.callJavaScript("add", L, hclient_or_mob)
+ I = H.wear_id ? H.wear_id.GetID() : null
- hi.callJavaScript("onAfterUpdate", null, hclient_or_mob)
+ if (I)
+ name = I.registered_name
+ assignment = I.assignment
+ ijob = jobs[I.assignment]
+ else
+ name = "Unknown"
+ assignment = ""
+ ijob = 80
-/datum/crewmonitor/proc/update(z, ignore_unused = FALSE)
- if (src.interfaces["[z]"])
- var/datum/html_interface/hi = src.interfaces["[z]"]
+ if (U.sensor_mode >= SENSOR_LIVING)
+ life_status = (!H.stat ? TRUE : FALSE)
+ else
+ life_status = null
- if (ignore_unused || hi.isUsed())
- var/list/results = list()
- var/obj/item/clothing/under/U
- var/obj/item/card/id/I
- var/turf/pos
- var/ijob
- var/name
- var/assignment
- var/dam1
- var/dam2
- var/dam3
- var/dam4
- var/area
- var/pos_x
- var/pos_y
- var/life_status
+ if (U.sensor_mode >= SENSOR_VITALS)
+ oxydam = round(H.getOxyLoss(),1)
+ toxdam = round(H.getToxLoss(),1)
+ burndam = round(H.getFireLoss(),1)
+ brutedam = round(H.getBruteLoss(),1)
+ else
+ oxydam = null
+ toxdam = null
+ burndam = null
+ brutedam = null
- for(var/mob/living/carbon/human/H in GLOB.carbon_list)
- // Check if their z-level is correct and if they are wearing a uniform.
- // Accept H.z==0 as well in case the mob is inside an object.
- if ((H.z == 0 || H.z == z) && istype(H.w_uniform, /obj/item/clothing/under))
- U = H.w_uniform
+ if (U.sensor_mode >= SENSOR_COORDS)
+ if (!pos)
+ pos = get_turf(H)
+ area = get_area_name(H, TRUE)
+ pos_x = pos.x
+ pos_y = pos.y
+ else
+ area = null
+ pos_x = null
+ pos_y = null
- // Are the suit sensors on?
- if ((U.has_sensor > 0) && U.sensor_mode)
- pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null
+ results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
+
+ data_by_z["[z]"] = results
+ last_update["[z]"] = world.time
+
+ return results
- // Special case: If the mob is inside an object confirm the z-level on turf level.
- if (H.z == 0 && (!pos || pos.z != z))
- continue
+/datum/crewmonitor/ui_act(action,params)
+ var/mob/living/silicon/ai/AI = usr
+ if(!istype(AI))
+ return
+ switch (action)
+ if ("select_person")
+ AI.ai_camera_track(params["name"])
- I = H.wear_id ? H.wear_id.GetID() : null
-
- if (I)
- name = I.registered_name
- assignment = I.assignment
- ijob = jobs[I.assignment]
- else
- name = "Unknown"
- assignment = ""
- ijob = 80
-
- if (U.sensor_mode >= SENSOR_LIVING)
- life_status = (!H.stat ? "true" : "false")
- else
- life_status = null
-
- if (U.sensor_mode >= SENSOR_VITALS)
- dam1 = round(H.getOxyLoss(),1)
- dam2 = round(H.getToxLoss(),1)
- dam3 = round(H.getFireLoss(),1)
- dam4 = round(H.getBruteLoss(),1)
- else
- dam1 = null
- dam2 = null
- dam3 = null
- dam4 = null
-
- if (U.sensor_mode >= SENSOR_COORDS)
- if (!pos)
- pos = get_turf(H)
- area = get_area_name(H, TRUE)
- pos_x = pos.x
- pos_y = pos.y
- else
- area = null
- pos_x = null
- pos_y = null
-
- results[++results.len] = list(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, pos_x, pos_y, H.can_track(null))
-
- src.data = results
- src.updateFor(null, hi, z) // updates for everyone
-
-/datum/crewmonitor/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi)
- var/z = ""
-
- for (z in src.interfaces)
- if (src.interfaces[z] == hi)
- break
-
- if(hclient.client.mob && IsAdminGhost(hclient.client.mob))
- return TRUE
-
- if (hclient.client.mob && hclient.client.mob.stat == 0 && hclient.client.mob.z == text2num(z))
- if (isAI(hclient.client.mob))
- return TRUE
- else if (iscyborg(hclient.client.mob))
- return (locate(/obj/machinery/computer/crew, range(world.view, hclient.client.mob))) || (locate(/obj/item/device/sensor_device, hclient.client.mob.contents))
- else
- return (locate(/obj/machinery/computer/crew, range(1, hclient.client.mob))) || (locate(/obj/item/device/sensor_device, hclient.client.mob.contents))
- else
- return FALSE
-
-/datum/crewmonitor/Topic(href, href_list[], datum/html_interface_client/hclient)
- if (istype(hclient))
- if (hclient && hclient.client && hclient.client.mob && isAI(hclient.client.mob))
- var/mob/living/silicon/ai/AI = hclient.client.mob
-
- switch (href_list["action"])
- if ("select_person")
- AI.ai_camera_track(href_list["name"])
-
- if ("select_position")
- var/x = text2num(href_list["x"])
- var/y = text2num(href_list["y"])
- var/turf/tile = locate(x, y, AI.z)
-
- var/obj/machinery/camera/C = locate(/obj/machinery/camera) in range(5, tile)
-
- if (!C)
- C = locate(/obj/machinery/camera) in urange(10, tile)
- if (!C)
- C = locate(/obj/machinery/camera) in urange(15, tile)
-
- if (C)
- addtimer(CALLBACK(src, .proc/update_ai, AI, C, AI.eyeobj.loc), min(30, get_dist(get_turf(C), AI.eyeobj) / 4))
-
-/datum/crewmonitor/proc/update_ai(mob/living/silicon/ai/AI, obj/machinery/camera/C, turf/current_loc)
- if (AI && AI.eyeobj && current_loc == AI.eyeobj.loc)
- AI.switchCamera(C)
-
-/mob/living/carbon/human/Move()
- var/old_z = src.z
- . = ..()
- if (src.w_uniform)
- if (old_z != src.z)
- GLOB.crewmonitor.queueUpdate(old_z)
- GLOB.crewmonitor.queueUpdate(src.z)
-
-/datum/crewmonitor/proc/queueUpdate(z)
- addtimer(CALLBACK(src, .proc/update, z), 5, TIMER_UNIQUE)
-
-/datum/crewmonitor/proc/sendResources(var/client/client)
- send_asset(client, "crewmonitor.js")
- send_asset(client, "crewmonitor.css")
- SSminimap.send(client)
+#undef SENSORS_UPDATE_PERIOD
\ No newline at end of file
diff --git a/code/game/machinery/computer/crew.js b/code/game/machinery/computer/crew.js
deleted file mode 100644
index 7a2e3caeba..0000000000
--- a/code/game/machinery/computer/crew.js
+++ /dev/null
@@ -1,588 +0,0 @@
-/*!
- * jQuery scrollintoview() plugin and :scrollable selector filter
- *
- * Version 1.8 (14 Jul 2011)
- * Requires jQuery 1.4 or newer
- */
-
-(function ($) {
- var converter = {
- vertical: { x: false, y: true },
- horizontal: { x: true, y: false },
- both: { x: true, y: true },
- x: { x: true, y: false },
- y: { x: false, y: true }
- };
-
- var settings = {
- duration: "fast",
- direction: "both"
- };
-
- var rootrx = /^(?:html)$/i;
-
- // gets border dimensions
- var borders = function (domElement, styles) {
- styles = styles || (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(domElement, null) : domElement.currentStyle);
- var px = document.defaultView && document.defaultView.getComputedStyle ? true : false;
- var b = {
- top: (parseFloat(px ? styles.borderTopWidth : $.css(domElement, "borderTopWidth")) || 0),
- left: (parseFloat(px ? styles.borderLeftWidth : $.css(domElement, "borderLeftWidth")) || 0),
- bottom: (parseFloat(px ? styles.borderBottomWidth : $.css(domElement, "borderBottomWidth")) || 0),
- right: (parseFloat(px ? styles.borderRightWidth : $.css(domElement, "borderRightWidth")) || 0)
- };
- return {
- top: b.top,
- left: b.left,
- bottom: b.bottom,
- right: b.right,
- vertical: b.top + b.bottom,
- horizontal: b.left + b.right
- };
- };
-
- var dimensions = function ($element) {
- var win = $(window);
- var isRoot = rootrx.test($element[0].nodeName);
- return {
- border: isRoot ? { top: 0, left: 0, bottom: 0, right: 0} : borders($element[0]),
- scroll: {
- top: (isRoot ? win : $element).scrollTop(),
- left: (isRoot ? win : $element).scrollLeft()
- },
- scrollbar: {
- right: isRoot ? 0 : $element.innerWidth() - $element[0].clientWidth,
- bottom: isRoot ? 0 : $element.innerHeight() - $element[0].clientHeight
- },
- rect: (function () {
- var r = $element[0].getBoundingClientRect();
- return {
- top: isRoot ? 0 : r.top,
- left: isRoot ? 0 : r.left,
- bottom: isRoot ? $element[0].clientHeight : r.bottom,
- right: isRoot ? $element[0].clientWidth : r.right
- };
- })()
- };
- };
-
- $.fn.extend({
- scrollintoview: function (options) {
- /// Scrolls the first element in the set into view by scrolling its closest scrollable parent.
- /// Additional options that can configure scrolling:
- /// duration (default: "fast") - jQuery animation speed (can be a duration string or number of milliseconds)
- /// direction (default: "both") - select possible scrollings ("vertical" or "y", "horizontal" or "x", "both")
- /// complete (default: none) - a function to call when scrolling completes (called in context of the DOM element being scrolled)
- ///
- /// Returns the same jQuery set that this function was run on.
-
- options = $.extend({}, settings, options);
- options.direction = converter[typeof (options.direction) === "string" && options.direction.toLowerCase()] || converter.both;
-
- var dirStr = "";
- if (options.direction.x === true) dirStr = "horizontal";
- if (options.direction.y === true) dirStr = dirStr ? "both" : "vertical";
-
- var el = this.eq(0);
- var scroller = el.closest(":scrollable(" + dirStr + ")");
-
- // check if there's anything to scroll in the first place
- if (scroller.length > 0)
- {
- scroller = scroller.eq(0);
-
- var dim = {
- e: dimensions(el),
- s: dimensions(scroller)
- };
-
- var rel = {
- top: dim.e.rect.top - (dim.s.rect.top + dim.s.border.top),
- bottom: dim.s.rect.bottom - dim.s.border.bottom - dim.s.scrollbar.bottom - dim.e.rect.bottom,
- left: dim.e.rect.left - (dim.s.rect.left + dim.s.border.left),
- right: dim.s.rect.right - dim.s.border.right - dim.s.scrollbar.right - dim.e.rect.right
- };
-
- var animOptions = {};
-
- // vertical scroll
- if (options.direction.y === true)
- {
- if (rel.top < 0)
- {
- animOptions.scrollTop = dim.s.scroll.top + rel.top;
- }
- else if (rel.top > 0 && rel.bottom < 0)
- {
- animOptions.scrollTop = dim.s.scroll.top + Math.min(rel.top, -rel.bottom);
- }
- }
-
- // horizontal scroll
- if (options.direction.x === true)
- {
- if (rel.left < 0)
- {
- animOptions.scrollLeft = dim.s.scroll.left + rel.left;
- }
- else if (rel.left > 0 && rel.right < 0)
- {
- animOptions.scrollLeft = dim.s.scroll.left + Math.min(rel.left, -rel.right);
- }
- }
-
- // scroll if needed
- if (!$.isEmptyObject(animOptions))
- {
- if (rootrx.test(scroller[0].nodeName))
- {
- scroller = $("html,body");
- }
- scroller
- .animate(animOptions, options.duration)
- .eq(0) // we want function to be called just once (ref. "html,body")
- .queue(function (next) {
- $.isFunction(options.complete) && options.complete.call(scroller[0]);
- next();
- });
- }
- else
- {
- // when there's nothing to scroll, just call the "complete" function
- $.isFunction(options.complete) && options.complete.call(scroller[0]);
- }
- }
-
- // return set back
- return this;
- }
- });
-
- var scrollValue = {
- auto: true,
- scroll: true,
- visible: false,
- hidden: false
- };
-
- $.extend($.expr[":"], {
- scrollable: function (element, index, meta, stack) {
- var direction = converter[typeof (meta[3]) === "string" && meta[3].toLowerCase()] || converter.both;
- var styles = (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(element, null) : element.currentStyle);
- var overflow = {
- x: scrollValue[styles.overflowX.toLowerCase()] || false,
- y: scrollValue[styles.overflowY.toLowerCase()] || false,
- isRoot: rootrx.test(element.nodeName)
- };
-
- // check if completely unscrollable (exclude HTML element because it's special)
- if (!overflow.x && !overflow.y && !overflow.isRoot)
- {
- return false;
- }
-
- var size = {
- height: {
- scroll: element.scrollHeight,
- client: element.clientHeight
- },
- width: {
- scroll: element.scrollWidth,
- client: element.clientWidth
- },
- // check overflow.x/y because iPad (and possibly other tablets) don't dislay scrollbars
- scrollableX: function () {
- return (overflow.x || overflow.isRoot) && this.width.scroll > this.width.client;
- },
- scrollableY: function () {
- return (overflow.y || overflow.isRoot) && this.height.scroll > this.height.client;
- }
- };
- return direction.y && size.scrollableY() || direction.x && size.scrollableX();
- }
- });
-})(jQuery);
-
-/*!
- * Crew manifest script
- */
-
-var minimap_height = 480;
-var scale_x;
-var scale_y;
-var zoom_factor = null;
-var minimap_mousedown = false;
-var minimap_mousedown_scrollLeft;
-var minimap_mousedown_scrollTop;
-var minimap_mousedown_clientX;
-var minimap_mousedown_clientY;
-var minimap_mousedown_counter = 0;
-
-function disableSelection(){ return false; };
-
-$(window).on("onUpdateContent", function()
-{
- $("#textbased").html("");
-
- $("#minimap").append("
");
-
- $("body")[0].onselectstart = disableSelection;
-
- $("#minimap").on("click", function(e)
- {
- if (!$(e.target).is(".zoom,.dot"))
- {
- var x = ((((e.clientX + this.scrollLeft - 8) / scale_x) / tile_size) + 1).toFixed(0);
- var y = ((maxy - (((e.clientY + this.scrollTop - 8) / scale_y) / tile_size)) + 1).toFixed(0);
-
- window.location.href = "byond://?src=" + hSrc + "&action=select_position&x=" + x + "&y=" + y;
- }
- }).on("mousedown", function(e)
- {
- minimap_mousedown_scrollLeft = this.scrollLeft;
- minimap_mousedown_scrollTop = this.scrollTop;
- minimap_mousedown_clientX = e.clientX;
- minimap_mousedown_clientY = e.clientY;
-
- var c = ++minimap_mousedown_counter;
- setTimeout(function()
- {
- if (c == minimap_mousedown_counter)
- {
- minimap_mousedown = true;
- $("#minimap").css("cursor", "move");
- }
- }, 100);
- });
-
- $(document).on("mousemove", function(e)
- {
- if (minimap_mousedown)
- {
- var offsetX = minimap_mousedown_clientX - e.clientX;
- var offsetY = minimap_mousedown_clientY - e.clientY;
-
- var minimap = document.getElementById("minimap");
- minimap.scrollLeft = minimap_mousedown_scrollLeft + offsetX;
- minimap.scrollTop = minimap_mousedown_scrollTop + offsetY;
- }
- }).on("mouseup", function()
- {
- ++minimap_mousedown_counter;
- if (minimap_mousedown)
- {
- document.body.focus();
- minimap_mousedown = false;
- $("#minimap").css("cursor", "");
- }
- });
-
- $(window).on("resize", onResize);
-
- scaleMinimap(1.00);
-});
-
-function zoomIn()
-{
- scaleMinimap(Math.min(6.00, zoom_factor + 1.00));
-}
-
-function zoomOut()
-{
- scaleMinimap(Math.max(1.00, zoom_factor - 1.00));
-}
-
-function scaleMinimap(factor)
-{
- var $minimap = $("#minimap");
-
- if (factor != zoom_factor)
- {
- zoom_factor = factor;
-
- var old_map_width = $minimap.width();
- var old_map_height = $minimap.height();
- var old_canvas_size = $("#minimap > img").height(); // height is assumed to be the same
- var new_canvas_size = minimap_height * factor; // ditto
-
- var old_scrollLeft = $minimap[0].scrollLeft;
- var old_scrollTop = $minimap[0].scrollTop;
-
- var old_factor = old_canvas_size / minimap_height;
- var diff_factor = factor - old_factor;
-
- var old_centerX = ((old_map_width / 2) * diff_factor) + old_scrollLeft;
- var old_centerY = ((old_map_height / 2) * diff_factor) + old_scrollTop;
-
- $("#minimap > img").css("height", new_canvas_size + "px");
- $minimap.css("max-width", new_canvas_size + "px");
-
- var new_map_width = $minimap.width();
- var new_map_height = $minimap.height();
-
- var new_centerX = (new_map_width / 2) + old_centerX;
- var new_centerY = (new_map_height / 2) + old_centerY;
-
- var scrollLeft = new_centerX - (new_map_width / 2);
- var scrollTop = new_centerY - (new_map_height / 2);
-
- scale_x = new_canvas_size / (maxx * tile_size);
- scale_y = new_canvas_size / (maxy * tile_size);
-
- onResize();
-
- $minimap[0].scrollLeft = scrollLeft;
- $minimap[0].scrollTop = scrollTop;
-
- $(".dot").each(function()
- {
- var $this = $(this);
- var tx = translateX(parseInt($this.attr("data-x")));
- var ty = translateY(parseInt($this.attr("data-y")));
-
- // Workaround for IE bug where it doesn't modify the positions.
- setTimeout(function(){ $this.css({ "top": ty + "px", "left": tx + "px" });}, 0);
- });
- }
-}
-
-function onResize()
-{
- if (zoom_factor == 1.00)
- {
- $(".zoom").css("left", "442px");
- $("#minimap").css("max-height", Math.min($(window).height() - 16, 480) + "px");
- }
- else
- {
- $(".zoom").css("left", ($("#minimap").width() - 34) + "px");
- $("#minimap").css("max-height", Math.min($(window).height() - 16, $("#minimap > img").height()) + "px");
- }
-
- if (expandHealth())
- {
- $(".colhealth").css("width", "150px");
- $(".health").removeClass("tt");
- }
- else
- {
- $(".colhealth").css("width", "24px");
- $(".health").addClass("tt");
- }
-
- $("body").css("padding-left", Math.min($(window).width() - 400, $("#minimap").width() - 10) + "px");
-}
-
-function expandHealth()
-{
- return $("#textbased").width() > 510;
-}
-
-var updateMap = true;
-
-function switchTo(i)
-{
- if (i == 1)
- {
- $("#minimap").hide();
- $("#textbased").show();
- }
- else
- {
- $("#textbased").hide();
- $("#minimap").show();
- }
-}
-
-var orig_scrollTop = 0;
-
-function clearAll()
-{
- orig_scrollTop = $(window).scrollTop();
- $("#textbased-tbody").empty();
- $("#minimap .dot").remove();
-}
-
-function onAfterUpdate()
-{
- $(window).scrollTop(orig_scrollTop);
-}
-
-function isHead(ijob)
-{
- return (ijob % 10 == 0); // head roles always end in 0
-}
-
-function getColor(ijob)
-{
- if (ijob == 0) { return "#C06616"; } // captain
- else if (ijob >= 10 && ijob < 20) { return "#E74C3C"; } // security
- else if (ijob >= 20 && ijob < 30) { return "#3498DB"; } // medical
- else if (ijob >= 30 && ijob < 40) { return "#9B59B6"; } // science
- else if (ijob >= 40 && ijob < 50) { return "#F1C40F"; } // engineering
- else if (ijob >= 50 && ijob < 60) { return "#F39C12"; } // cargo
- else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // CentCom
- else { return "#C38312"; } // other / unknown
-}
-
-function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, pos_x, pos_y, in_range)
-{
- try { ijob = parseInt(ijob); }
- catch (ex) { ijob = 0; }
-
- var ls = "";
-
- if (life_status === null) { ls = (life_status ? "Deceased" : "Living"); }
-
- var healthHTML = "";
-
- if (dam1 != "" || dam2 != "" || dam3 != "" || dam4 != "")
- {
- var avg_dam = parseInt(dam1) + parseInt(dam2) + parseInt(dam3) + parseInt(dam4);
- var i;
-
- if (avg_dam <= 0) { i = 5; }
- else if (avg_dam <= 25) { i = 4; }
- else if (avg_dam <= 50) { i = 3; }
- else if (avg_dam <= 75) { i = 2; }
- else { i = 0; }
-
- healthHTML = "(" + dam1 + "/" + dam2 + "/" + dam3 + "/" + dam4 + ")
";
- }
- else
- {
- healthHTML = "";
- }
-
- var trElem = $("
").attr("data-ijob", ijob);
- var tdElem;
- var spanElem;
-
- tdElem = $(" | ");
-
- var italics = false;
-
- if (name.length >= 7 && name.substring(0, 3) == "")
- {
- name = name.substring(3, name.length - 4);
- italics = true;
- }
-
- spanElem = $("").text(name);
-
- if (italics)
- {
- spanElem.css("font-style", "italic");
- }
-
- if (isHead(ijob)) { spanElem.css("font-weight", "bold"); }
-
- var color = getColor(ijob);
-
- if (color) { spanElem.css("color", color); }
-
- tdElem.append(spanElem);
-
- if (assignment) { tdElem.append($("").text(" (" + assignment + ")")); }
-
- trElem.append(tdElem);
-
- tdElem = $(" | ");
- tdElem.html(healthHTML);
-
- trElem.append(tdElem);
-
- tdElem = $(" | ");
-
- if (area && pos_x && pos_y)
- {
- tdElem.append($("").text(area).addClass("tt").append($("").append($("").text("(" + pos_x + ", " + pos_y + ")"))));
- tdElem.css("cursor", "pointer").on("click", function()
- {
- window.clipboardData.setData("Text", pos_x + ", " + pos_y);
- });
- }
- else { tdElem.text("Not Available"); }
-
- trElem.append(tdElem);
-
- var item = $("#textbased-tbody > tr").filter(function(){ return parseInt($(this).attr("data-ijob")) >= ijob; }).eq(0);
-
- if (item.length > 0) { trElem.insertBefore(item); }
- else { $("#textbased-tbody").append(trElem); }
-
- if (updateMap && pos_x && pos_y && (in_range == "1"))
- {
- var x = parseInt(pos_x);
- var y = maxy - parseInt(pos_y);
-
- var tx = translateX(x);
- var ty = translateY(y);
-
- var dotElem = $("");
-
- $("#minimap").append(dotElem);
-
- var counter = 0;
-
- function enable()
- {
- ++counter;
- dotElem.addClass("active").css({ "border-color": color });
- }
-
- function disable()
- {
- ++counter;
- dotElem.removeClass("active").css({ "border-color": "transparent" });
- }
-
- function click(e)
- {
- e.preventDefault();
- e.stopPropagation();
-
- window.location.href = "byond://?src=" + hSrc + "&action=select_person&name=" + encodeURIComponent(name);
- }
-
- trElem.on("mouseover", function()
- {
- enable();
-
- if (zoom_factor > 1.00)
- {
- var c = counter;
- setTimeout(function()
- {
- if (c == counter)
- {
- var minimap = document.getElementById("minimap");
- var half = $(minimap).height() / 2;
- var offset = $(dotElem).offset();
-
- minimap.scrollLeft = offset.left + minimap.scrollLeft - half;
- minimap.scrollTop = offset.top + minimap.scrollTop - half;
- }
- }, 100);
- }
- }).on("mouseout", disable).on("click", click);
- dotElem.on("mouseover", function()
- {
- trElem.addClass("hover");
- enable();
- trElem.scrollintoview();
- }).on("mouseout", function()
- {
- trElem.removeClass("hover");
- disable();
- }).on("click", click);
- }
-}
-
-function translateX(n) { return (translate(n - 1.5, scale_x) ).toFixed(0); }
-function translateY(n) { return (translate(n + 0.75, scale_y) ).toFixed(0); }
-
-function translate(n, scale)
-{
- return (n * tile_size) * scale;
-}
\ No newline at end of file
diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm
index e42a42bf01..edfd4368ff 100644
--- a/code/game/objects/items/devices/sensor_device.dm
+++ b/code/game/objects/items/devices/sensor_device.dm
@@ -7,4 +7,4 @@
slot_flags = SLOT_BELT
/obj/item/device/sensor_device/attack_self(mob/user)
- GLOB.crewmonitor.show(user) //Proc already exists, just had to call it
+ GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 03a13e0beb..cccdb199bb 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
/datum/asset/simple/goonchat
verify = FALSE
assets = list(
- "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js',
+ "jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
@@ -350,12 +350,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
)
-//Registers HTML Interface assets.
-/datum/asset/HTML_interface/register()
- for(var/path in typesof(/datum/html_interface))
- var/datum/html_interface/hi = new path()
- hi.registerResources()
-
//this exists purely to avoid meta by pre-loading all language icons.
/datum/asset/language/register()
for(var/path in typesof(/datum/language))
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 9ae87488ce..193d23e7bf 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -49,9 +49,6 @@
var/obj/screen/click_catcher/void
- // Used by html_interface module.
- var/hi_last_pos
-
var/ip_intel = "Disabled"
//datum that controls the displaying and hiding of tooltips
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index e7bf3ea9d7..e69de29bb2 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -1,279 +0,0 @@
-/datum/playingcard
- var/name = "playing card"
- var/card_icon = "card_back"
- var/suit
- var/number
-
-/* Deck */
-
-/obj/item/deck
- name = "deck of cards"
- desc = "A simple deck of playing cards."
- icon = 'icons/obj/playing_cards.dmi'
- icon_state = "deck"
- w_class = WEIGHT_CLASS_SMALL
- flags_1 = NOBLUDGEON_1
-
- var/list/cards = list()
-
-/obj/item/deck/Initialize()
- . = ..()
-
- var/cardcolor
- var/datum/playingcard/card
-
- for (var/suit in list("spades", "clubs", "diamonds", "hearts"))
- if (suit == "spades" || suit == "clubs")
- cardcolor = "black_"
- else
- cardcolor = "red_"
-
- for (var/number in list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"))
- card = new()
- card.name = "[number] of [suit]"
- card.card_icon = "[cardcolor]num"
- card.suit = suit
- card.number = number
-
- src.cards.Add(card)
-
- for (var/number in list("jack", "queen", "king"))
- card = new()
- card.name = "[number] of [suit]"
- card.card_icon = "[cardcolor]col"
- card.suit = suit
- card.number = number
-
- src.cards.Add(card)
-
- for (var/i = 0, i < 2, i++)
- card = new()
- card.name = "joker"
- card.card_icon = "joker"
- card.suit = "joker"
- card.number = ""
-
- src.cards.Add(card)
-
-/obj/item/deck/attackby(obj/O, mob/user)
- if (istype(O, /obj/item/hand))
- var/obj/item/hand/H = O
-
- for (var/datum/playingcard/P in H.cards)
- src.cards.Add(P)
-
- qdel (O)
-
- user.show_message("You place your cards on the bottom of the deck.")
- else
- return ..()
-
-/obj/item/deck/attack_self(mob/user)
- var/list/newcards = list()
- var/datum/playingcard/card
-
- while (cards.len)
- card = pick(cards)
- newcards.Add(card)
- src.cards.Remove(card)
-
- src.cards = newcards
-
- user.visible_message("\The [user] shuffles [src].")
-
-/obj/item/deck/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
- if(flag)
- return //It's adjacent, is the user, or is on the user's person
-
- if(isliving(A))
- src.dealTo(A, user)
- else
- return ..()
-
-/obj/item/deck/attack(mob/living/M, mob/living/user, def_zone)
- if (istype(M))
- src.dealTo(M, user)
- else
- return ..()
-
-/obj/item/deck/proc/dealTo(mob/living/target, mob/living/source)
- if (!cards.len)
- source.show_message("There are no cards in the deck.")
- return
-
- var/datum/playingcard/card = src.cards[1]
-
- src.cards.Remove(card)
-
- var/obj/item/hand/H = new(get_turf(src))
-
- H.concealed = 1
- H.update_conceal()
-
- H.cards.Add(card)
- H.update_icon()
-
- source.visible_message("\The [source] deals a card to \the [target].")
- H.throw_at(get_step(target, target.dir), 10, 1, source)
-
-/* Hand */
-
-/obj/item/hand
- name = "hand of cards"
- desc = "Some playing cards."
- icon = 'icons/obj/playing_cards.dmi'
- icon_state = "empty"
- w_class = WEIGHT_CLASS_TINY
-
- var/concealed = 0
- var/blank = 0
- var/list/cards = list()
- var/datum/html_interface/hi
- resistance_flags = FLAMMABLE
-
-/obj/item/hand/New(loc)
- . = ..()
-
- src.hi = new/datum/html_interface/cards(src, "Your hand", 540, 302)
- src.update_conceal()
-
-/obj/item/hand/Destroy()
- if (src.hi)
- qdel(src.hi)
-
- return ..()
-
-/obj/item/hand/attackby(obj/O, mob/user)
- if(cards.len == 1 && istype(O, /obj/item/pen))
- var/datum/playingcard/P = cards[1]
- if(!blank)
- to_chat(user, "You cannot write on that card.")
- return
- var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Writing") as text|null, 50)
- if(!cardtext)
- return
- P.name = cardtext
- blank = 0
- else if(istype(O, /obj/item/hand))
- var/obj/item/hand/H = O
-
- for(var/datum/playingcard/P in src.cards)
- H.cards.Add(P)
-
- H.update_icon()
-
- qdel(src)
- else
- return ..()
-
-/obj/item/hand/verb/discard(datum/playingcard/card in cards)
- set category = "Object"
- set name = "Discard"
- set desc = "Place a card from your hand in front of you."
-
- if (!card)
- return
-
- var/obj/item/hand/H = new(src.loc)
-
- H.concealed = 0
- H.update_conceal()
-
- H.cards.Add(card)
- src.cards.Remove(card)
-
- H.update_icon()
-
- ASSERT(H)
-
- usr.visible_message("\The [usr] plays \the [card.name].")
- H.forceMove(get_step(usr,usr.dir))
-
- src.update_icon()
-
-/obj/item/hand/verb/toggle_conceal()
- set category = "Object"
- set name = "Toggle conceal"
- set desc = "Toggle concealment of your hand"
-
- src.concealed = !src.concealed
-
- src.update_conceal()
-
- usr.visible_message("\The [usr] [concealed ? "conceals" : "reveals"] their hand.")
-
- src.update_icon()
-
-/obj/item/hand/attack_self(mob/user)
- src.hi.show(user)
-
-/obj/item/hand/examine()
- . = ..()
-
- if((!concealed || src.loc == usr) && cards.len)
- usr.show_message("It contains: ", 1)
-
- for (var/datum/playingcard/card in cards)
- usr.show_message("The [card.name].", 1)
-
-/obj/item/hand/proc/update_conceal()
- if (src.concealed)
- src.hi.updateContent("headbar", "You are currently concealing your hand. Reveal your hand.")
- else
- src.hi.updateContent("headbar", "You are currently revealing your hand. Conceal your hand.")
-
-/obj/item/hand/update_icon()
- if (!cards.len)
- qdel (src)
- else
- if(cards.len > 1)
- name = "hand of cards"
- desc = "Some playing cards."
- else
- name = "a playing card"
- desc = "A playing card."
-
- cut_overlays()
-
- if (cards.len == 1)
- var/datum/playingcard/P = cards[1]
- var/mutable_appearance/card_overlay = mutable_appearance(icon, (concealed ? "card_back" : "[P.card_icon]") )
-
- card_overlay.pixel_x = card_overlay.pixel_x + (-5 + rand(10))
- card_overlay.pixel_y = card_overlay.pixel_y + (-5 + rand(10))
-
- add_overlay(card_overlay)
- else
- var/origin = -12
- var/offset = round(32 / cards.len)
-
- var/i = 0
- var/mutable_appearance/card_overlay
-
- for(var/datum/playingcard/P in cards)
- card_overlay = mutable_appearance(icon, (concealed ? "card_back" : P.card_icon))
- card_overlay.pixel_x = origin + (offset * i)
-
- add_overlay(card_overlay)
- i = i + 1
-
- var/html = ""
-
- for(var/datum/playingcard/card in cards)
- html = html + ""
-
- src.hi.updateContent("hand", html)
-
-/obj/item/hand/Topic(href, href_list[], datum/html_interface_client/hclient)
- if (istype(hclient))
- switch (href_list["action"])
- if ("play_card")
- var/datum/playingcard/card = locate(href_list["card"]) in cards
- if (card && istype(card))
- src.discard(card)
- if ("toggle_conceal")
- src.toggle_conceal()
-
-// Hook for html_interface module to prevent updates to clients who don't have this in their inventory.
-/obj/item/hand/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi)
- return (hclient.client.mob && hclient.client.mob.stat == 0 && (src in hclient.client.mob.contents))
diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm
index 5a4f949fcb..f5b4d8a86f 100644
--- a/code/modules/games/cas.dm
+++ b/code/modules/games/cas.dm
@@ -3,7 +3,11 @@
// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL:
// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode
// Original code by Zuhayr, Polaris Station, ported with modifications
-
+/datum/playingcard
+ var/name = "playing card"
+ var/card_icon = "card_back"
+ var/suit
+ var/number
/obj/item/toy/cards/deck/cas
name = "\improper CAS deck (white)"
diff --git a/code/modules/html_interface/js/jquery.min.js b/code/modules/goonchat/browserassets/js/jquery.min.js
similarity index 100%
rename from code/modules/html_interface/js/jquery.min.js
rename to code/modules/goonchat/browserassets/js/jquery.min.js
diff --git a/code/modules/html_interface/cards/cards.css b/code/modules/html_interface/cards/cards.css
deleted file mode 100644
index dbcb6e52e0..0000000000
--- a/code/modules/html_interface/cards/cards.css
+++ /dev/null
@@ -1,112 +0,0 @@
-html, body, div.wrapper > table
-{
- width: 100%;
- height: 100%;
-}
-
-body
-{
- background-color: #EAEAEA;
- font-family: verdana,Geneva,sans-serif;
- font-size: 12px;
- color: #272727;
-}
-
-a
-{
- color: #5353B1;
-}
-
-div.wrapper
-{
- position: absolute; top: 24px; left: 0px; right: 0px; bottom: 0px;
-}
-
-div#headbar
-{
- background-color: #B2B2B2;
- border-bottom: 1px solid #C2C2C2;
- height: 24px;
- padding: 4px 8px;
- box-sizing: border-box;
-}
-
-div#hand
-{
- padding: 8px 8px;
- padding-bottom: 4px;
- background-color: #EAEAEA;
- text-align: center;
-}
-
-a.card
-{
- display: inline-block;
- margin: 0px 2px;
-
- background-image: url(cards.png);
- background-repeat: no-repeat;
- width: 94px;
- height: 129px;
-
- box-sizing: border-box;
- background-position: 0px 0px;
- background-origin: border-box;
-
- text-decoration: none;
- font-size: 0px;
-}
-
-a.card.clubs.ten { background-position: -5px -5px; }
-a.card.diamonds.ten { background-position: -109px -5px; }
-a.card.hearts.ten { background-position: -213px -5px; }
-a.card.spades.ten { background-position: -317px -5px; }
-a.card.clubs.two { background-position: -421px -5px; }
-a.card.diamonds.two { background-position: -525px -5px; }
-a.card.hearts.two { background-position: -629px -5px; }
-a.card.spades.two { background-position: -733px -5px; }
-a.card.clubs.three { background-position: -5px -144px; }
-a.card.diamonds.three { background-position: -109px -144px; }
-a.card.hearts.three { background-position: -213px -144px; }
-a.card.spades.three { background-position: -317px -144px; }
-a.card.clubs.four { background-position: -421px -144px; }
-a.card.diamonds.four { background-position: -525px -144px; }
-a.card.hearts.four { background-position: -629px -144px; }
-a.card.spades.four { background-position: -733px -144px; }
-a.card.clubs.five { background-position: -5px -283px; }
-a.card.diamonds.five { background-position: -109px -283px; }
-a.card.hearts.five { background-position: -213px -283px; }
-a.card.spades.five { background-position: -317px -283px; }
-a.card.clubs.six { background-position: -421px -283px; }
-a.card.diamonds.six { background-position: -525px -283px; }
-a.card.hearts.six { background-position: -629px -283px; }
-a.card.spades.six { background-position: -733px -283px; }
-a.card.clubs.seven { background-position: -5px -422px; }
-a.card.diamonds.seven { background-position: -109px -422px; }
-a.card.hearts.seven { background-position: -213px -422px; }
-a.card.spades.seven { background-position: -317px -422px; }
-a.card.clubs.eight { background-position: -421px -422px; }
-a.card.diamonds.eight { background-position: -525px -422px; }
-a.card.hearts.eight { background-position: -629px -422px; }
-a.card.spades.eight { background-position: -733px -422px; }
-a.card.clubs.nine { background-position: -5px -561px; }
-a.card.diamonds.nine { background-position: -109px -561px; }
-a.card.hearts.nine { background-position: -213px -561px; }
-a.card.spades.nine { background-position: -317px -561px; }
-a.card.clubs.ace { background-position: -421px -561px; }
-a.card.diamonds.ace { background-position: -525px -561px; }
-a.card.hearts.ace { background-position: -629px -561px; }
-a.card.spades.ace { background-position: -733px -561px; }
-a.card.clubs.jack { background-position: -5px -700px; }
-a.card.diamonds.jack { background-position: -109px -700px; }
-a.card.hearts.jack { background-position: -213px -700px; }
-a.card.spades.jack { background-position: -317px -700px; }
-a.card.clubs.king { background-position: -421px -700px; }
-a.card.diamonds.king { background-position: -525px -700px; }
-a.card.hearts.king { background-position: -629px -700px; }
-a.card.spades.king { background-position: -733px -700px; }
-a.card.clubs.queen { background-position: -837px -5px; }
-a.card.diamonds.queen { background-position: -837px -144px; }
-a.card.hearts.queen { background-position: -837px -283px; }
-a.card.spades.queen { background-position: -837px -422px; }
-a.card.joker { background-position: -837px -561px; }
\ No newline at end of file
diff --git a/code/modules/html_interface/cards/cards.dm b/code/modules/html_interface/cards/cards.dm
deleted file mode 100644
index 38b851a5fd..0000000000
--- a/code/modules/html_interface/cards/cards.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-// Used by playing cards; /obj/item/hand
-// Subtype exists because of sendResources; these must be sent when the client connects.
-
-/datum/html_interface/cards/New()
- . = ..()
-
- src.head = src.head + ""
- src.updateLayout("")
-
-/datum/html_interface/cards/registerResources(var/list/resources = list())
- resources["cards.css"] = 'cards.css'
- resources["cards.png"] = 'cards.png'
- ..(resources)
\ No newline at end of file
diff --git a/code/modules/html_interface/cards/cards.png b/code/modules/html_interface/cards/cards.png
deleted file mode 100644
index 8001168246..0000000000
Binary files a/code/modules/html_interface/cards/cards.png and /dev/null differ
diff --git a/code/modules/html_interface/css/bootstrap.min.css b/code/modules/html_interface/css/bootstrap.min.css
deleted file mode 100644
index f3e39a0bff..0000000000
--- a/code/modules/html_interface/css/bootstrap.min.css
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * Bootstrap v3.2.0 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=979b48f103c9d446c891)
- * Config saved to config.json and https://gist.github.com/979b48f103c9d446c891
- *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:240px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:240px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:240px){.container{width:750px}}@media (min-width:600px){.container{width:970px}}@media (min-width:960px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:240px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:600px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:960px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:239px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:240px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:240px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:240px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:240px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:240px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:240px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:240px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:240px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:240px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:240px){.navbar{border-radius:4px}}@media (min-width:240px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:240px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:180px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:240px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:240px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:240px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:240px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:240px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:239px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:240px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:240px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:240px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:239px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:240px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:240px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:239px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:239px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:240px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#777;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:240px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:600px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:240px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:239px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:239px){.visible-xs-block{display:block !important}}@media (max-width:239px){.visible-xs-inline{display:inline !important}}@media (max-width:239px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:240px) and (max-width:599px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-block{display:block !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-inline{display:inline !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:600px) and (max-width:959px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:600px) and (max-width:959px){.visible-md-block{display:block !important}}@media (min-width:600px) and (max-width:959px){.visible-md-inline{display:inline !important}}@media (min-width:600px) and (max-width:959px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:960px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:960px){.visible-lg-block{display:block !important}}@media (min-width:960px){.visible-lg-inline{display:inline !important}}@media (min-width:960px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:239px){.hidden-xs{display:none !important}}@media (min-width:240px) and (max-width:599px){.hidden-sm{display:none !important}}@media (min-width:600px) and (max-width:959px){.hidden-md{display:none !important}}@media (min-width:960px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/code/modules/html_interface/css/html_interface.css b/code/modules/html_interface/css/html_interface.css
deleted file mode 100644
index 85c07f3b85..0000000000
--- a/code/modules/html_interface/css/html_interface.css
+++ /dev/null
@@ -1,11 +0,0 @@
-html
-{
- -ms-overflow-style: scrollbar;
-}
-
-body
-{
- font-family: Arial;
- overflow-y: scroll;
- overflow-x: auto;
-}
\ No newline at end of file
diff --git a/code/modules/html_interface/html_interface.dm b/code/modules/html_interface/html_interface.dm
deleted file mode 100644
index a8b48079fa..0000000000
--- a/code/modules/html_interface/html_interface.dm
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
-Author: NullQuery
-Created on: 2014-09-24
-
- ** CAUTION - A WORD OF WARNING **
-
-If there is no getter or setter available and you aren't extending my code with a sub-type, DO NOT ACCESS VARIABLES DIRECTLY!
-
-Add a getter/setter instead, even if it does nothing but return or set the variable. Thank you for your patience with me. -NQ
-
- ** Public API **
-
- var/datum/html_interface/hi = new/datum/html_interface(ref, title, width = 700, height = 480, head = "")
-
-Creates a new HTML interface object with [ref] as the object and [title] as the initial title of the page. [width] and [height] is the initial width and height
-of the window. The text in [head] is added just before the end tag.
-
- hi.setTitle(title)
-
-Changes the title of the page.
-
- hi.getTitle()
-
-Returns the current title of the page.
-
- hi.updateLayout(layout)
-
-Updates the overall layout of the page (the HTML code between the body tags).
-
-This should be used sparingly.
-
- hi.updateContent(id, content, ignore_cache = FALSE)
-
-Updates a portion of the page, i.e., the DOM element with the appropriate ID. The contents of the element are replaced with the provided HTML.
-
-The content is cached on the server-side to minimize network traffic when the client "should have" the same HTML. The client may not have
-the same HTML if scripts cause the content to change. In this case set the ignore_cache parameter.
-
- hi.executeJavaScript(jscript, client = null)
-
-Executes Javascript on the browser.
-
-The client is optional and may be a /mob, /client or /html_interface_client object. If not specified the code is executed on all clients.
-
- hi.show(client)
-
-Shows the HTML interface to the provided client. This will create a window, apply the current layout and contents. It will then wait for events.
-
- hi.hide(client)
-
-Hides the HTML interface from the provided client. This will close the browser window.
-
- hi.isUsed()
-
-Returns TRUE if the interface is being used (has an active client) or FALSE if not.
-
- hi.closeAll()
-
-Closes the interface on all clients.
-
- ** Additional notes **
-
-When working with byond:// links make sure to reference the HTML interface object and NOT the original object. Topic() will still be called on
-your object, but it will pass through the HTML interface first allowing interception at a higher level.
-
-If you want to use custom resources(images/css/js) with an existing interface:
-You have to use modules/client/asset_cache to ensure they get sent BEFORE the interface opens
-
- ** Sample code **
-
-/mob/var/datum/html_interface/hi
-
-/mob/verb/test()
- if (!hi)
- hi = new/datum/html_interface(src, "[src.key]")
-
- hi.updateLayout("")
- hi.updateContent("content", "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
")
-
- hi.show(src)
-
-*/
-
-GLOBAL_LIST_EMPTY(html_interfaces)
-
-/datum/html_interface
- // The atom we should report to.
- var/atom/ref
-
- // The current title of the browser window.
- var/title
-
- // A list of content elements that have been changed. This is necessary when showing the browser control to new clients.
- var/list/content_elements = new/list()
-
- // The HTML layout, typically what's in-between the tag. May be overridden by extensions.
- var/layout
-
- // An associative list of clients currently viewing this screen. The key is the /client object, the value is the /datum/html_interface_client object.
- var/list/clients
-
- // This goes just before the closing HEAD tag. I haven't exposed any getters/setters for it because it's only being used by extensions.
- var/head = ""
-
- // The initial width of the browser control, used when the window is first shown to a client.
- var/width
-
- // The initial height of the browser control, used when the window is first shown to a client.
- var/height
-
- // A type associated list of assets the interface needs.
- //Sent to the client when the interface opens on the client for the first time.
- var/static/list/asset_list
-
-/datum/html_interface/New(atom/ref, title, width = 700, height = 480, head = "")
- GLOB.html_interfaces.Add(src)
-
- . = ..()
-
- src.ref = ref
- src.title = title
- src.width = width
- src.height = height
- src.head = head
-
-/datum/html_interface/Destroy()
- src.closeAll()
-
- GLOB.html_interfaces.Remove(src)
-
- return ..()
-
-/* * Hooks */
-/datum/html_interface/proc/specificRenderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE)
-
-//if you need to override this, either call ..() or add your resources to asset_list
-/datum/html_interface/proc/registerResources(var/list/resources = list())
- resources["jquery.min.js"] = 'js/jquery.min.js'
- resources["bootstrap.min.js"] = 'js/bootstrap.min.js'
- resources["bootstrap.min.css"] = 'css/bootstrap.min.css'
- resources["html_interface.css"] = 'css/html_interface.css'
- resources["html_interface.js"] = 'js/html_interface.js'
- var/assetlist = list()
- for (var/R in resources)
- register_asset(R,resources[R])
- assetlist += R
- if (!asset_list)
- asset_list = list()
- asset_list[type] = assetlist
-
-/datum/html_interface/proc/createWindow(datum/html_interface_client/hclient)
- winclone(hclient.client, "window", "browser_[REF(src)]")
-
- var/list/params = list(
- "size" = "[width]x[height]",
- "statusbar" = "false",
- "on-close" = "byond://?src=[REF(src)]&html_interface_action=onclose"
- )
-
- if (hclient.client.hi_last_pos)
- params["pos"] = "[hclient.client.hi_last_pos]"
-
- winset(hclient.client, "browser_[REF(src)]", list2params(params))
-
- winset(hclient.client, "browser_[REF(src)].browser", list2params(list("parent" = "browser_[REF(src)]", "type" = "browser", "pos" = "0,0", "size" = "[width]x[height]", "anchor1" = "0,0", "anchor2" = "100,100", "use-title" = "true", "auto-format" = "false")))
-
-/* * Public API */
-/datum/html_interface/proc/getTitle()
- return src.title
-
-/datum/html_interface/proc/setTitle(title, ignore_cache = FALSE)
- src.title = title
-
- var/datum/html_interface_client/hclient
-
- for (var/client in src.clients)
- hclient = src._getClient(src.clients[client])
-
- if (hclient && hclient.active)
- src._renderTitle(src.clients[client], ignore_cache)
-
-/datum/html_interface/proc/executeJavaScript(jscript, datum/html_interface_client/hclient = null)
- if (hclient)
- hclient = getClient(hclient)
-
- if (istype(hclient))
- if (hclient.is_loaded)
- hclient.client << output(list2params(list(jscript)), "browser_[REF(src)].browser:eval")
- else
- for (var/client in src.clients)
- if(src.clients[client])
- src.executeJavaScript(jscript, src.clients[client])
-
-/datum/html_interface/proc/callJavaScript(func, list/arguments, datum/html_interface_client/hclient = null)
- if (!arguments)
- arguments = new/list()
-
- if (hclient)
- hclient = getClient(hclient)
-
- if (istype(hclient))
- if (hclient.is_loaded)
- hclient.client << output(list2params(arguments), "browser_[REF(src)].browser:[func]")
- else
- for (var/client in src.clients)
- if (src.clients[client])
- src.callJavaScript(func, arguments, src.clients[client])
-
-/datum/html_interface/proc/updateLayout(layout)
- src.layout = layout
-
- var/datum/html_interface_client/hclient
-
- for (var/client in src.clients)
- hclient = src._getClient(src.clients[client])
-
- if (hclient && hclient.active)
- src._renderLayout(hclient)
-
-/datum/html_interface/proc/updateContent(id, content, ignore_cache = FALSE)
- src.content_elements[id] = content
-
- var/datum/html_interface_client/hclient
-
- for (var/client in src.clients)
- hclient = src._getClient(src.clients[client])
-
- if (hclient && hclient.active)
- spawn (-1) src._renderContent(id, hclient, ignore_cache)
-
-/datum/html_interface/proc/show(datum/html_interface_client/hclient)
- hclient = getClient(hclient, TRUE)
-
- if (istype(hclient))
- if ((type in asset_list) && islist(asset_list[type]))
- send_asset_list(hclient.client, asset_list[type], TRUE)
-
- if (!winexists(hclient.client, "browser_[REF(src)]"))
- src.createWindow(hclient)
- //src._renderTitle(hclient, TRUE)
- //src._renderLayout(hclient)
-
- hclient.is_loaded = FALSE
- hclient.client << output(replacetextEx(replacetextEx(file2text('html_interface.html'), "\[hsrc\]", "[REF(src)]"), "", "[head]"), "browser_[REF(src)].browser")
-
- winshow(hclient.client, "browser_[REF(src)]", TRUE)
-
- while (hclient.client && hclient.active && !hclient.is_loaded)
- sleep(2)
-
-/datum/html_interface/proc/hide(datum/html_interface_client/hclient)
- hclient = getClient(hclient)
-
- if (istype(hclient))
- if (src.clients)
- src.clients.Remove(hclient.client)
-
- if (!src.clients.len)
- src.clients = null
-
- hclient.client.hi_last_pos = winget(hclient.client, "browser_[REF(src)]" ,"pos")
-
- winshow(hclient.client, "browser_[REF(src)]", FALSE)
- winset(hclient.client, "browser_[REF(src)]", "parent=none")
-
- if (hascall(src.ref, "hiOnHide"))
- call(src.ref, "hiOnHide")(hclient)
-
-// Convert a /mob to /client, and /client to /datum/html_interface_client
-/datum/html_interface/proc/getClient(client, create_if_not_exist = FALSE)
- if (istype(client, /datum/html_interface_client))
- return src._getClient(client)
- else if (ismob(client))
- var/mob/mob = client
- client = mob.client
-
- if (istype(client, /client))
- if (create_if_not_exist && (!src.clients || !(client in src.clients)))
- if (!src.clients)
- src.clients = new/list()
- if (!(client in src.clients))
- src.clients[client] = new/datum/html_interface_client(client)
-
- if (src.clients && (client in src.clients))
- return src._getClient(src.clients[client])
- else
- return null
- else
- return null
-
-/datum/html_interface/proc/enableFor(datum/html_interface_client/hclient)
- hclient.active = TRUE
-
- src.show(hclient)
-
-/datum/html_interface/proc/disableFor(datum/html_interface_client/hclient)
- hclient.active = FALSE
-
-/datum/html_interface/proc/isUsed()
- if (src.clients && src.clients.len > 0)
- var/datum/html_interface_client/hclient
-
- for (var/key in clients)
- hclient = _getClient(clients[key])
-
- if (hclient)
- if (hclient.active)
- return TRUE
- else
- clients.Remove(key)
-
- return FALSE
-
-/datum/html_interface/proc/closeAll()
- if (src.clients)
- for (var/client in src.clients)
- src.hide(src.clients[client])
-
-/* * Danger Zone */
-
-/datum/html_interface/proc/_getClient(datum/html_interface_client/hclient)
- if (hclient)
- if (hclient.client)
- // res = if the client has been active in the past 10 minutes and the client is allowed to view the object (context-sensitive).
- var/res = hclient.client.inactivity <= 6000 && (hascall(src.ref, "hiIsValidClient") ? call(src.ref, "hiIsValidClient")(hclient, src) : TRUE)
-
- if (res)
- if (!hclient.active) src.enableFor(hclient)
- else
- if (hclient.active) src.disableFor(hclient)
-
- return hclient
- else
- return null
- else
- return null
-
-/datum/html_interface/proc/_renderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE, ignore_loaded = FALSE)
- if (hclient && (ignore_loaded || hclient.is_loaded))
- // Only render if we have new content.
-
- if (ignore_cache || src.title != hclient.title)
- hclient.title = title
-
- src.specificRenderTitle(hclient)
-
- hclient.client << output(list2params(list(title)), "browser_[REF(src)].browser:setTitle")
-
-/datum/html_interface/proc/_renderLayout(datum/html_interface_client/hclient, ignore_loaded = FALSE)
- if (hclient && (ignore_loaded || hclient.is_loaded))
- var/html = src.layout
-
- // Only render if we have new content.
- if (html != hclient.layout)
- hclient.layout = html
-
- hclient.client << output(list2params(list(html)), "browser_[REF(src)].browser:updateLayout")
-
- for (var/id in src.content_elements)
- src._renderContent(id, hclient, ignore_loaded = ignore_loaded)
-
-/datum/html_interface/proc/_renderContent(id, datum/html_interface_client/hclient, ignore_cache = FALSE, ignore_loaded = FALSE)
- if (hclient && (ignore_loaded || hclient.is_loaded))
- var/html = src.content_elements[id]
-
- // Only render if we have new content.
- if (ignore_cache || !(id in hclient.content_elements) || html != hclient.content_elements[id])
- hclient.content_elements[id] = html
-
- hclient.client << output(list2params(list(id, html)), "browser_[REF(src)].browser:updateContent")
-
-/datum/html_interface/Topic(href, href_list[])
- var/datum/html_interface_client/hclient = getClient(usr.client)
-
- if (istype(hclient))
- if ("html_interface_action" in href_list)
- switch (href_list["html_interface_action"])
-
- if ("onload")
- hclient.layout = null
- hclient.content_elements.len = 0
-
- src._renderTitle(hclient, TRUE, TRUE)
- src._renderLayout(hclient, TRUE)
-
- hclient.is_loaded = TRUE
-
- if ("onclose")
- src.hide(hclient)
- else if (src.ref && hclient.active)
- src.ref.Topic(href, href_list, hclient)
\ No newline at end of file
diff --git a/code/modules/html_interface/html_interface.html b/code/modules/html_interface/html_interface.html
deleted file mode 100644
index 4bf76c6180..0000000000
--- a/code/modules/html_interface/html_interface.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/code/modules/html_interface/html_interface_client.dm b/code/modules/html_interface/html_interface_client.dm
deleted file mode 100644
index b9bac9b4d3..0000000000
--- a/code/modules/html_interface/html_interface_client.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/html_interface_client
- // The /client object represented by this model.
- var/client/client
-
- // The layout currently visible to the client.
- var/layout
-
- // The content elements (mirrored from /datum/html_interface) currently visible to the client.
- var/list/content_elements = new/list()
-
- // The current title for this client
- var/title
-
- // TRUE if the browser control has loaded and will accept input, FALSE if not.
- var/is_loaded = FALSE
-
- // TRUE if this client should receive updates, FALSE if not.
- var/active = TRUE
-
- // A list of extra variables, for use by extensions.
- var/list/extra_vars
-
-/datum/html_interface_client/New(client/client)
- . = ..()
-
- src.client = client
-
-/datum/html_interface_client/proc/putExtraVar(key, value)
- if (!src.extra_vars)
- src.extra_vars = new/list()
- src.extra_vars[key] = value
-
-/datum/html_interface_client/proc/removeExtraVar(key)
- if (src.extra_vars)
- . = src.extra_vars[key]
-
- src.extra_vars.Remove(key)
-
- if (!src.extra_vars.len)
- src.extra_vars = null
-
- return .
-
-/datum/html_interface_client/proc/getExtraVar(key)
- if (src.extra_vars)
- return src.extra_vars[key]
\ No newline at end of file
diff --git a/code/modules/html_interface/js/bootstrap.min.js b/code/modules/html_interface/js/bootstrap.min.js
deleted file mode 100644
index e33d8a5324..0000000000
--- a/code/modules/html_interface/js/bootstrap.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * Bootstrap v3.2.0 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-/*!
- * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d0f6f16a67c7502ee009)
- * Config saved to config.json and https://gist.github.com/d0f6f16a67c7502ee009
- */
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),s=i.data("bs.alert");s||i.data("bs.alert",s=new o(this)),"string"==typeof e&&s[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.2.0",o.prototype.close=function(e){function i(){n.detach().trigger("closed.bs.alert").remove()}var o=t(this),s=o.attr("data-target");s||(s=o.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var n=t(s);e&&e.preventDefault(),n.length||(n=o.hasClass("alert")?o:o.parent()),n.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(n.removeClass("in"),t.support.transition&&n.hasClass("fade")?n.one("bsTransitionEnd",i).emulateTransitionEnd(150):i())};var s=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=s,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.button"),n="object"==typeof e&&e;s||o.data("bs.button",s=new i(this,n)),"toggle"==e?s.toggle():e&&s.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.2.0",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,s=o.is("input")?"val":"html",n=o.data();e+="Text",null==n.resetText&&o.data("resetText",o[s]()),o[s](null==n[e]?this.options[e]:n[e]),setTimeout(t.proxy(function(){"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")&&(i.prop("checked")&&this.$element.hasClass("active")?t=!1:e.find(".active").removeClass("active")),t&&i.prop("checked",!this.$element.hasClass("active")).trigger("change")}t&&this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),i.preventDefault()})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.carousel"),n=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),r="string"==typeof e?e:n.slide;s||o.data("bs.carousel",s=new i(this,n)),"number"==typeof e?s.to(e):r?s[r]():n.interval&&s.pause().cycle()})}var i=function(e,i){this.$element=t(e).on("keydown.bs.carousel",t.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.2.0",i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},i.prototype.keydown=function(t){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.to=function(e){var i=this,o=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){i.to(e)}):o==e?this.pause().cycle():this.slide(e>o?"next":"prev",t(this.$items[e]))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,i){var o=this.$element.find(".item.active"),s=i||o[e](),n=this.interval,r="next"==e?"left":"right",a="next"==e?"first":"last",l=this;if(!s.length){if(!this.options.wrap)return;s=this.$element.find(".item")[a]()}if(s.hasClass("active"))return this.sliding=!1;var h=s[0],p=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(p),!p.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var c=t(this.$indicators.children()[this.getItemIndex(s)]);c&&c.addClass("active")}var d=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,o.addClass(r),s.addClass(r),o.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),o.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(d)},0)}).emulateTransitionEnd(1e3*o.css("transition-duration").slice(0,-1))):(o.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this},t(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(i){var o,s=t(this),n=t(s.attr("data-target")||(o=s.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(n.hasClass("carousel")){var r=t.extend({},n.data(),s.data()),a=s.attr("data-slide-to");a&&(r.interval=!1),e.call(n,r),a&&n.data("bs.carousel").to(a),i.preventDefault()}}),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){e&&3===e.which||(t(s).remove(),t(n).each(function(){var o=i(t(this)),s={relatedTarget:this};o.hasClass("open")&&(o.trigger(e=t.Event("hide.bs.dropdown",s)),e.isDefaultPrevented()||o.removeClass("open").trigger("hidden.bs.dropdown",s))}))}function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new r(this)),"string"==typeof e&&o[e].call(i)})}var s=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(e){t(e).on("click.bs.dropdown",this.toggle)};r.VERSION="3.2.0",r.prototype.toggle=function(o){var s=t(this);if(!s.is(".disabled, :disabled")){var n=i(s),r=n.hasClass("open");if(e(),!r){"ontouchstart"in document.documentElement&&!n.closest(".navbar-nav").length&&t('').insertAfter(t(this)).on("click",e);var a={relatedTarget:this};if(n.trigger(o=t.Event("show.bs.dropdown",a)),o.isDefaultPrevented())return;s.trigger("focus"),n.toggleClass("open").trigger("shown.bs.dropdown",a)}return!1}},r.prototype.keydown=function(e){if(/(38|40|27)/.test(e.keyCode)){var o=t(this);if(e.preventDefault(),e.stopPropagation(),!o.is(".disabled, :disabled")){var s=i(o),r=s.hasClass("open");if(!r||r&&27==e.keyCode)return 27==e.which&&s.find(n).trigger("focus"),o.trigger("click");var a=" li:not(.divider):visible a",l=s.find('[role="menu"]'+a+', [role="listbox"]'+a);if(l.length){var h=l.index(l.filter(":focus"));38==e.keyCode&&h>0&&h--,40==e.keyCode&&h').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),s&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;s?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){i.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},i.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},i.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var o=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=o,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(i){var o=t(this),s=o.attr("href"),n=t(o.attr("data-target")||s&&s.replace(/.*(?=#[^\s]+$)/,"")),r=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(s)&&s},n.data(),o.data());o.is("a")&&i.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){o.is(":visible")&&o.trigger("focus")})}),e.call(n,r,this)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.tooltip"),n="object"==typeof e&&e;(s||"destroy"!=e)&&(s||o.data("bs.tooltip",s=new i(this,n)),"string"==typeof e&&s[e]())})}var i=function(t,e){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",t,e)};i.VERSION="3.2.0",i.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(this.options.viewport.selector||this.options.viewport);for(var s=this.options.trigger.split(" "),n=s.length;n--;){var r=s[n];if("click"==r)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=r){var a="hover"==r?"mouseenter":"focusin",l="hover"==r?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show()},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide()},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var i=t.contains(document.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!i)return;var o=this,s=this.tip(),n=this.getUID(this.type);this.setContent(),s.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&s.addClass("fade");var r="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,l=a.test(r);l&&(r=r.replace(a,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(r).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element);var h=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(l){var d=r,f=this.$element.parent(),u=this.getPosition(f);r="bottom"==r&&h.top+h.height+c-u.scroll>u.height?"top":"top"==r&&h.top-u.scroll-c<0?"bottom":"right"==r&&h.right+p>u.width?"left":"left"==r&&h.left-pr.top+r.height&&(s.top=r.top+r.height-l)}else{var h=e.left-n,p=e.left+n+i;hr.width&&(s.left=r.left+r.width-p)}return s},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){return this.$tip=this.$tip||t(this.options.template)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.popover"),n="object"==typeof e&&e;(s||"destroy"!=e)&&(s||o.data("bs.popover",s=new i(this,n)),"string"==typeof e&&s[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.2.0",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").empty()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},i.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.tab");s||o.data("bs.tab",s=new i(this)),"string"==typeof e&&s[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.2.0",i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var s=i.find(".active:last a")[0],n=t.Event("show.bs.tab",{relatedTarget:s});if(e.trigger(n),!n.isDefaultPrevented()){var r=t(o);this.activate(e.closest("li"),i),this.activate(r,r.parent(),function(){e.trigger({type:"shown.bs.tab",relatedTarget:s})})}}},i.prototype.activate=function(e,i,o){function s(){n.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),e.addClass("active"),r?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu")&&e.closest("li.dropdown").addClass("active"),o&&o()}var n=i.find("> .active"),r=o&&t.support.transition&&n.hasClass("fade");r?n.one("bsTransitionEnd",s).emulateTransitionEnd(150):s(),n.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this},t(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(i){i.preventDefault(),e.call(t(this),"show")})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.affix"),n="object"==typeof e&&e;s||o.data("bs.affix",s=new i(this,n)),"string"==typeof e&&s[e]()})}var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.2.0",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=t(document).height(),o=this.$target.scrollTop(),s=this.$element.offset(),n=this.options.offset,r=n.top,a=n.bottom;"object"!=typeof n&&(a=r=n),"function"==typeof r&&(r=n.top(this.$element)),"function"==typeof a&&(a=n.bottom(this.$element));var l=null!=this.unpin&&o+this.unpin<=s.top?!1:null!=a&&s.top+this.$element.height()>=e-a?"bottom":null!=r&&r>=o?"top":!1;if(this.affixed!==l){null!=this.unpin&&this.$element.css("top","");var h="affix"+(l?"-"+l:""),p=t.Event(h+".bs.affix");this.$element.trigger(p),p.isDefaultPrevented()||(this.affixed=l,this.unpin="bottom"==l?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(h).trigger(t.Event(h.replace("affix","affixed"))),"bottom"==l&&this.$element.offset({top:e-this.$element.height()-a}))}}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},o.offsetBottom&&(o.offset.bottom=o.offsetBottom),o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.collapse"),n=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e);!s&&n.toggle&&"show"==e&&(e=!e),s||o.data("bs.collapse",s=new i(this,n)),"string"==typeof e&&s[e]()})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.transitioning=null,this.options.parent&&(this.$parent=t(this.options.parent)),this.options.toggle&&this.toggle()};i.VERSION="3.2.0",i.DEFAULTS={toggle:!0},i.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},i.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var i=t.Event("show.bs.collapse");if(this.$element.trigger(i),!i.isDefaultPrevented()){var o=this.$parent&&this.$parent.find("> .panel > .in");if(o&&o.length){var s=o.data("bs.collapse");if(s&&s.transitioning)return;e.call(o,"hide"),s||o.data("bs.collapse",null)}var n=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[n](0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[n](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var a=t.camelCase(["scroll",n].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(350)[n](this.$element[0][a])}}},i.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var o=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(o,this)).emulateTransitionEnd(350):o.call(this)}}},i.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var o=t.fn.collapse;t.fn.collapse=e,t.fn.collapse.Constructor=i,t.fn.collapse.noConflict=function(){return t.fn.collapse=o,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(i){var o,s=t(this),n=s.attr("data-target")||i.preventDefault()||(o=s.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""),r=t(n),a=r.data("bs.collapse"),l=a?"toggle":s.data(),h=s.attr("data-parent"),p=h&&t(h);a&&a.transitioning||(p&&p.find('[data-toggle="collapse"][data-parent="'+h+'"]').not(s).addClass("collapsed"),s[r.hasClass("in")?"addClass":"removeClass"]("collapsed")),e.call(r,l)})}(jQuery),+function(t){"use strict";function e(i,o){var s=t.proxy(this.process,this);this.$body=t("body"),this.$scrollElement=t(t(i).is("body")?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s),this.refresh(),this.process()}function i(i){return this.each(function(){var o=t(this),s=o.data("bs.scrollspy"),n="object"==typeof i&&i;s||o.data("bs.scrollspy",s=new e(this,n)),"string"==typeof i&&s[i]()})}e.VERSION="3.2.0",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e="offset",i=0;t.isWindow(this.$scrollElement[0])||(e="position",i=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var o=this;this.$body.find(this.selector).map(function(){var o=t(this),s=o.data("target")||o.attr("href"),n=/^#./.test(s)&&t(s);return n&&n.length&&n.is(":visible")&&[[n[e]().top+i,s]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){o.offsets.push(this[0]),o.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),s=this.offsets,n=this.targets,r=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return r!=(t=n[n.length-1])&&this.activate(t);if(r&&e<=s[0])return r!=(t=n[0])&&this.activate(t);for(t=s.length;t--;)r!=n[t]&&e>=s[t]&&(!s[t+1]||e<=s[t+1])&&this.activate(n[t])},e.prototype.activate=function(e){this.activeTarget=e,t(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var i=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',o=t(i).parents("li").addClass("active");o.parent(".dropdown-menu").length&&(o=o.closest("li.dropdown").addClass("active")),o.trigger("activate.bs.scrollspy")};var o=t.fn.scrollspy;t.fn.scrollspy=i,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=o,this},t(window).on("load.bs.scrollspy.data-api",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);i.call(e,e.data())})})}(jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,o=this;t(this).one("bsTransitionEnd",function(){i=!0});var s=function(){i||t(o).trigger(t.support.transition.end)};return setTimeout(s,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){return t(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery);
\ No newline at end of file
diff --git a/code/modules/html_interface/js/html_interface.js b/code/modules/html_interface/js/html_interface.js
deleted file mode 100644
index 83300ee27c..0000000000
--- a/code/modules/html_interface/js/html_interface.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var is_loading = false;
-var load_count = 0;
-
-function onload()
-{
- if (!is_loading)
- {
- var count = ++load_count;
- is_loading = true;
- $("body").html("");
-
- window.location.href = "byond://?src=" + hSrc + "&html_interface_action=onload";
-
- // The request may fail which would prevent the player from refreshing the screen again. Try to detect this retry.
- setTimeout(function()
- {
- if (count == load_count && is_loading && $("body").html() == "")
- {
- is_loading = false;
- onload();
- }
- }, 500);
- }
-}
-
-$(document).ready(function()
-{
- $(document).on("keydown", function(e)
- {
- if (!e.ctrlKey && e.which == 116)
- {
- e.preventDefault();
-
- onload();
- }
- });
-
- onload();
-});
-
-function fixText(text) { return text.replace(/ΓΏ/g, ""); }
-
-function setTitle(new_title) { $("title").html(fixText(new_title)); $(window).trigger("onUpdateTitle"); }
-function updateLayout(new_html) { $("body").html(fixText(new_html)); $(window).trigger("onUpdateLayout"); setTimeout(function(){ is_loading = false; }, 200); }
-function updateContent(id, new_html) { $("#" + id).html(fixText(new_html)); $(window).trigger("onUpdateContent"); }
\ No newline at end of file
diff --git a/code/modules/html_interface/nanotrasen/hi-nanotrasen.css b/code/modules/html_interface/nanotrasen/hi-nanotrasen.css
deleted file mode 100644
index 702a381c07..0000000000
--- a/code/modules/html_interface/nanotrasen/hi-nanotrasen.css
+++ /dev/null
@@ -1,321 +0,0 @@
-body
-{
- background-color: #272727;
- background-image: url(uiBg.png);
- background-repeat: repeat-x;
- background-position: center top;
-
- font-family: verdana,Geneva,sans-serif;
- font-size: 12px;
- color: #FFFFFF;
- line-height: 170%; /* NullQuery: 170% of what? */
-}
-
-/* Fix for IE8 */
-body
-{
- background-color: #1F1F1F\9 !important;
-}
-
-#ntbgcenter
-{
- position: absolute;
- top: 0px;
- left: 0px;
- right: 0px;
- height: 246px;
-
- background-image: url(uiBgcenter.png);
- background-position: center;
- background-repeat: no-repeat;
-
- z-index: -1;
-}
-
-#content
-{
- padding: 8px;
- font-family: Verdana, Geneva, sans-serif;
-}
-
-hr
-{
- background-color: #40628a;
- height: 1px;
-}
-
-a, a:link, a:visited, a:active, .linkOn, .linkOff
-{
- color: #ffffff;
- text-decoration: none;
- background: #40628a;
- border: 1px solid #161616;
- padding: 1px 4px 1px 4px;
- margin: 0 2px 0 0;
- cursor:default;
-}
-
-a.nobg, a.nobg:link, a.nobg:visited, a.nobg:active
-{
- color: #ffffff;
- text-decoration: none;
- background: transparent;
- border: none;
- padding: 0px;
- margin: 0px;
- cursor:default;
- font-weight:bold;
-}
-a.nobg:hover
-{
- color:#40628a;
-}
-
-a:hover
-{
- color: #40628a;
- background: #ffffff;
-}
-
-a.white, a.white:link, a.white:visited, a.white:active
-{
- color: #40628a;
- text-decoration: none;
- background: #ffffff;
- border: 1px solid #161616;
- padding: 1px 4px 1px 4px;
- margin: 0 2px 0 0;
- cursor:default;
-}
-
-a.white:hover
-{
- color: #ffffff;
- background: #40628a;
-}
-
-.linkOn, a.linkOn:link, a.linkOn:visited, a.linkOn:active, a.linkOn:hover
-{
- color: #ffffff;
- background: #2f943c;
- border-color: #24722e;
-}
-
-.linkOff, a.linkOff:link, a.linkOff:visited, a.linkOff:active, a.linkOff:hover
-{
- color: #ffffff;
- background: #999999;
- border-color: #666666;
-}
-
-a.icon, .linkOn.icon, .linkOff.icon
-{
- position: relative;
- padding: 1px 4px 2px 20px;
-}
-
-a.icon img, .linkOn.icon img
-{
- position: absolute;
- top: 0;
- left: 0;
- width: 18px;
- height: 18px;
-}
-
-ul
-{
- padding: 4px 0 0 10px;
- margin: 0;
- list-style-type: none;
-}
-
-li
-{
- padding: 0 0 2px 0;
-}
-
-img, a img
-{
- border-style:none;
-}
-
-h1, h2, h3, h4, h5, h6
-{
- margin: 0;
- padding: 16px 0 8px 0;
- color: #517087;
-}
-
-h1
-{
- font-size: 15px;
-}
-
-h2
-{
- font-size: 14px;
-}
-
-h3
-{
- font-size: 13px;
-}
-
-h4
-{
- font-size: 12px;
-}
-
-.good
-{
- color: #00ff00;
-}
-
-.average
-{
- color: #d09000;
-}
-
-.bad
-{
- color: #ff0000;
-}
-
-.highlight
-{
- color: #8BA5C4;
-}
-
-.dark
-{
- color: #272727;
-}
-
-.notice
-{
- position: relative;
- background: #E9C183;
- color: #15345A;
- font-size: 10px;
- font-style: italic;
- padding: 2px 4px 0 4px;
- margin: 4px;
-}
-
-.notice.icon
-{
- padding: 2px 4px 0 20px;
-}
-
-.notice img
-{
- position: absolute;
- top: 0;
- left: 0;
- width: 16px;
- height: 16px;
-}
-
-div.notice
-{
- clear: both;
-}
-
-.statusDisplay
-{
- background: #000000;
- color: #ffffff;
- border: 1px solid #40628a;
- padding: 4px;
- margin: 3px 0;
-}
-
-.statusLabel
-{
- width: 138px;
- float: left;
- overflow: hidden;
- color: #98B0C3;
-}
-
-.statusValue
-{
- float: left;
-}
-
-.block
-{
- padding: 8px;
- margin: 10px 4px 4px 4px;
- border: 1px solid #40628a;
- background-color: #202020;
-}
-
-.block h3
-{
- padding: 0;
-}
-
-.progressBar
-{
- width: 240px;
- height: 14px;
- border: 1px solid #666666;
- float: left;
- margin: 0 5px;
- overflow: hidden;
-}
-
-.progressFill
-{
- width: 100%;
- height: 100%;
- background: #40628a;
- overflow: hidden;
-}
-
-.progressFill.good
-{
- color: #ffffff;
- background: #00ff00;
-}
-
-.progressFill.average
-{
- color: #ffffff;
- background: #d09000;
-}
-
-.progressFill.bad
-{
- color: #ffffff;
- background: #ff0000;
-}
-
-.progressFill.highlight
-{
- color: #ffffff;
- background: #8BA5C4;
-}
-
-.clearBoth
-{
- clear: both;
-}
-
-.clearLeft
-{
- clear: left;
-}
-
-.clearRight
-{
- clear: right;
-}
-
-.line
-{
- width: 100%;
- clear: both;
-}
\ No newline at end of file
diff --git a/code/modules/html_interface/nanotrasen/nanotrasen.dm b/code/modules/html_interface/nanotrasen/nanotrasen.dm
deleted file mode 100644
index ac7a7f242f..0000000000
--- a/code/modules/html_interface/nanotrasen/nanotrasen.dm
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
-Author: NullQuery
-Created on: 2014-09-25
-
-Extension to implement Nanotrasen styled windows.
-
-Additional procs:
-
- hi.setEyeColor(color, client)
-
-Use this to set the color of the 'eye' in the top-left corner of the window.
-
-The client is optional and may be a /mob, /client or /html_interface_client object. It must be specified, since the eye icon is specific to a client.
-
-*/
-
-/datum/html_interface/nanotrasen/New()
- . = ..()
-
- // Add appropriate CSS and set the default layout.
- src.head = src.head + ""
- src.updateLayout("")
-
-/datum/html_interface/nanotrasen/updateLayout(layout)
- // Wrap the layout in our custom HTML
- return ..("[layout]
")
-
-/datum/html_interface/specificRenderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE)
- // Update the title in our custom header (in addition to default functionality)
- winset(hclient.client, "browser_[REF(src)].uiTitle", list2params(list("text" = "[src.title]")))
-
-/datum/html_interface/nanotrasen/registerResources(var/list/resources = list())
- resources["uiBg.png"] = 'uiBg.png'
- resources["uiBgcenter.png"] = 'uiBgcenter.png'
- resources["hi-nanotrasen.css"] = 'hi-nanotrasen.css'
- ..(resources)
-
-/datum/html_interface/nanotrasen/createWindow(datum/html_interface_client/hclient)
- . = ..() // we want the default window
-
- // Remove the titlebar
- winset(hclient.client, "browser_[REF(src)]", list2params(list(
- "titlebar" = "false"
- )))
-
- // Reposition the browser
- winset(hclient.client, "browser_[REF(src)].browser", list2params(list(
- "pos" = "0,35",
- "size" = "[width]x[height - 35]"
- )))
-
- // Add top background image
- winset(hclient.client, "browser_[REF(src)].topbg", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "label",
- "pos" = "0,0",
- "size" = "[width]x35",
- "anchor1" = "0,0",
- "anchor2" = "100,0",
- "image" = "['uiBgtop.png']",
- "image-mode" = "tile",
- "is-disabled" = "true"
- )))
-
- // Add Nanotrasen logo
- winset(hclient.client, "browser_[REF(src)].uiTitleFluff", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "label",
- "pos" = "[width - 42 - 4 - 24 - 4 - 24 - 4],5",
- "size" = "42x24",
- "anchor1" = "100,0",
- "anchor2" = "100,0",
- "image" = "['uiTitleFluff.png']",
- "image-mode" = "tile",
- "is-disabled" = "true"
- )))
-
- // Add Eye picture
- winset(hclient.client, "browser_[REF(src)].uiTitleEye", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "label",
- "pos" = "8,5",
- "size" = "42x24",
- "anchor1" = "0,0",
- "anchor2" = "0,0",
- "image" = "['uiEyeGreen.png']",
- "image-mode" = "tile",
- "is-disabled" = "true"
- )))
-
- // Add title text
- winset(hclient.client, "browser_[REF(src)].uiTitle", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "label",
- "is-transparent" = "true",
- "pos" = "64,0",
- "size" = "580x35",
- "anchor1" = "0,0",
- "anchor2" = "100,0",
- "is-disabled" = "true",
- "text" = "[src.title]",
- "align" = "left",
- "font-family" = "verdana,Geneva,sans-serif",
- "font-size" = "12", // ~ 16px
- "text-color" = "#E9C183"
- )))
-
- // Add minimize button
- // TODO: Style the button (add image)
- winset(hclient.client, "browser_[REF(src)].uiTitleMinimize", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "button",
- "is-flat" = "true",
- "background-color"="#383838", // should be unnecessary if image is used
- "text-color" = "#FFFFFF", // should be unnecessary if image is used
- "is-transparent" = "true",
- "pos" = "[width - 24 - 4 - 24 - 4],5",
- "size" = "24x24",
- "anchor1" = "100,0",
- "anchor2" = "100,0",
- "text" = "-",
- "font-family" = "verdana,Geneva,sans-serif", // should be unnecessary if image is used
- "font-size" = "12", // ~ 16px - should be unnecessary if image is used
-
- // Disable resizing (disables maximizing), minimize window, bind window.on-size to catch 'restore window' button to enable resizing if restored.
- "command" = ".winset \"browser_[REF(src)].can-resize=false;browser_[REF(src)].is-minimized=true;browser_[REF(src)].on-size=\".swinset \\\"browser_[REF(src)].can-resize=true;browser_[REF(src)].on-size=\\\"\"\""
- )))
-
- // Add close button
- // TODO: Style the button (add image)
- winset(hclient.client, "browser_[REF(src)].uiTitleClose", list2params(list(
- "parent" = "browser_[REF(src)]",
- "type" = "button",
- "is-flat" = "true",
- "background-color"="#383838", // should be unnecessary if image is used
- "text-color" = "#FFFFFF", // should be unnecessary if image is used
- "command" = "byond://?src=[REF(src)];html_interface_action=onclose",
- "is-transparent" = "true",
- "pos" = "[width - 24 - 4],5",
- "size" = "24x24",
- "anchor1" = "100,0",
- "anchor2" = "100,0",
- "text" = "X",
- "font-family" = "verdana,Geneva,sans-serif", // should be unnecessary if image is used
- "font-size" = "12" // ~ 16px - should be unnecessary if image is used
- )))
-
-/datum/html_interface/nanotrasen/enableFor(datum/html_interface_client/hclient)
- . = ..()
-
- src.setEyeColor("green", hclient)
-
-/datum/html_interface/nanotrasen/disableFor(datum/html_interface_client/hclient)
- hclient.active = FALSE
-
- src.setEyeColor("red", hclient)
-
-/datum/html_interface/nanotrasen/proc/setEyeColor(color, datum/html_interface_client/hclient)
- hclient = getClient(hclient)
-
- if (istype(hclient))
- var/resource
- switch (color)
- if ("green")
- resource = 'uiEyeGreen.png'
- if ("orange")
- resource = 'uiEyeOrange.png'
- if ("red")
- resource = 'uiEyeRed.png'
- else
- CRASH("Invalid color: [color]")
-
- if (hclient.getExtraVar("eye_color") != color)
- hclient.putExtraVar("eye_color", color)
-
- winset(hclient.client, "browser_[REF(src)].uiTitleEye", list2params(list("image" = "[resource]")))
- else
- WARNING("Invalid object passed to /datum/html_interface/nanotrasen/proc/setEyeColor")
\ No newline at end of file
diff --git a/code/modules/html_interface/nanotrasen/uiBg.png b/code/modules/html_interface/nanotrasen/uiBg.png
deleted file mode 100644
index bba99d3106..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiBg.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiBgcenter.png b/code/modules/html_interface/nanotrasen/uiBgcenter.png
deleted file mode 100644
index b258f18019..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiBgcenter.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiBgtop.png b/code/modules/html_interface/nanotrasen/uiBgtop.png
deleted file mode 100644
index a3579d6df9..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiBgtop.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiEyeGreen.png b/code/modules/html_interface/nanotrasen/uiEyeGreen.png
deleted file mode 100644
index 0205f4ae00..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiEyeGreen.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiEyeOrange.png b/code/modules/html_interface/nanotrasen/uiEyeOrange.png
deleted file mode 100644
index cce6cfe537..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiEyeOrange.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiEyeRed.png b/code/modules/html_interface/nanotrasen/uiEyeRed.png
deleted file mode 100644
index 662f0d522f..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiEyeRed.png and /dev/null differ
diff --git a/code/modules/html_interface/nanotrasen/uiTitleFluff.png b/code/modules/html_interface/nanotrasen/uiTitleFluff.png
deleted file mode 100644
index 5d499f7afa..0000000000
Binary files a/code/modules/html_interface/nanotrasen/uiTitleFluff.png and /dev/null differ
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index 2d75ebab6a..3e9cb0bb12 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -57,7 +57,7 @@
* This allows modules/datums to have the UI attached to them,
* and be a part of another object.
**/
-/datum/proc/ui_host()
+/datum/proc/ui_host(mob/user)
return src // Default src.
/**
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index dc1e11635a..fc30d171fb 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -15,7 +15,7 @@
* return UI_state The state of the UI.
**/
/datum/proc/ui_status(mob/user, datum/ui_state/state)
- var/src_object = ui_host()
+ var/src_object = ui_host(user)
. = UI_CLOSE
if(!state)
return
diff --git a/code/modules/tgui/subsystem.dm b/code/modules/tgui/subsystem.dm
index f70eb87b0c..90a00fb607 100644
--- a/code/modules/tgui/subsystem.dm
+++ b/code/modules/tgui/subsystem.dm
@@ -72,7 +72,7 @@
var/update_count = 0
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
- if(ui && ui.src_object && ui.user && ui.src_object.ui_host()) // Check the UI is valid.
+ if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user)) // Check the UI is valid.
ui.process(force = 1) // Update the UI.
update_count++ // Count each UI we update.
return update_count
@@ -94,7 +94,7 @@
var/close_count = 0
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
- if(ui && ui.src_object && ui.user && ui.src_object.ui_host()) // Check the UI is valid.
+ if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user)) // Check the UI is valid.
ui.close() // Close the UI.
close_count++ // Count each UI we close.
return close_count
@@ -111,7 +111,7 @@
for(var/src_object_key in open_uis)
for(var/ui_key in open_uis[src_object_key])
for(var/datum/tgui/ui in open_uis[src_object_key][ui_key])
- if(ui && ui.src_object && ui.user && ui.src_object.ui_host()) // Check the UI is valid.
+ if(ui && ui.src_object && ui.user && ui.src_object.ui_host(ui.user)) // Check the UI is valid.
ui.close() // Close the UI.
close_count++ // Count each UI we close.
return close_count
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index bb545547f9..e39e3e126d 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -300,7 +300,7 @@
* optional force bool If the UI should be forced to update.
**/
/datum/tgui/process(force = 0)
- var/datum/host = src_object.ui_host()
+ var/datum/host = src_object.ui_host(user)
if(!src_object || !host || !user) // If the object or user died (or something else), abort.
close()
return
diff --git a/interface/interface.dm b/interface/interface.dm
index c362f9943e..27a47beeec 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -219,11 +219,4 @@ Any-Mode: (hotkey doesn't need to be on)
"}
to_chat(src, hotkey_mode)
- to_chat(src, other)
-
-// Needed to circumvent a bug where .winset does not work when used on the window.on-size event in skins.
-// Used by /datum/html_interface/nanotrasen (code/modules/html_interface/nanotrasen/nanotrasen.dm)
-/client/verb/_swinset(var/x as text)
- set name = ".swinset"
- set hidden = 1
- winset(src, null, x)
+ to_chat(src, other)
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 2bb9a3cfbd..0587e305d8 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1551,7 +1551,6 @@
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
-#include "code\modules\games\cards.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\goonchat\browserOutput.dm"
#include "code\modules\goonchat\jsErrorHandler.dm"
@@ -1563,10 +1562,6 @@
#include "code\modules\holodeck\items.dm"
#include "code\modules\holodeck\mobs.dm"
#include "code\modules\holodeck\turfs.dm"
-#include "code\modules\html_interface\html_interface.dm"
-#include "code\modules\html_interface\html_interface_client.dm"
-#include "code\modules\html_interface\cards\cards.dm"
-#include "code\modules\html_interface\nanotrasen\nanotrasen.dm"
#include "code\modules\hydroponics\biogenerator.dm"
#include "code\modules\hydroponics\gene_modder.dm"
#include "code\modules\hydroponics\grown.dm"
diff --git a/tgui/src/interfaces/crew.ract b/tgui/src/interfaces/crew.ract
new file mode 100644
index 0000000000..54f1e3341c
--- /dev/null
+++ b/tgui/src/interfaces/crew.ract
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+ | Name |
+ Status |
+ Vitals |
+ Position |
+ {{#if data.link_allowed}}
+ Tracking |
+ {{/if}}
+
+
+
+ {{#each sorted_sensors}}
+
+ |
+
+ {{name}} ({{assignment}})
+
+ |
+
+ {{#if oxydam != null}}
+
+ {{else}}
+ {{#if life_status}}
+
+ {{else}}
+
+ {{/if}}
+ {{/if}}
+ |
+
+ {{#if oxydam != null}}
+
+ (
+ {{oxydam}}
+ /
+ {{toxdam}}
+ /
+ {{burndam}}
+ /
+ {{brutedam}}
+ )
+
+ {{else}}
+ {{#if life_status}}
+ Alive
+ {{else}}
+ Dead
+ {{/if}}
+ {{/if}}
+ |
+
+ {{#if pos_x != null}}
+ {{area}}
+ {{else}}
+ N/A
+ {{/if}}
+ |
+ {{#if data.link_allowed }}
+
+ Track
+ |
+ {{/if}}
+
+ {{/each}}
+
+
+
+
+
+
\ No newline at end of file