")
+ t = replacetext(t, "\[td\]", "| ")
+ t = replacetext(t, "\[cell\]", " | ")
+ t = replacetext(t, "\[logo\]", " ")
+ return t
+
+
+/datum/computer_file/program/filemanager/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+ ui = new(user, src, ui_key, "file_manager", "NTOS File Manage", 575, 700, state = state)
+ ui.open()
+ ui.set_autoupdate(state = 1)
+
+/datum/computer_file/program/filemanager/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ var/obj/item/weapon/computer_hardware/hard_drive/HDD
+ var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD
+ if(error)
+ data["error"] = error
+ if(open_file)
+ var/datum/computer_file/data/file
+
+ if(!computer || !computer.hard_drive)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
+ else
+ HDD = computer.hard_drive
+ file = HDD.find_file_by_name(open_file)
+ if(!istype(file))
+ data["error"] = "I/O ERROR: Unable to open file."
+ else
+ data["filedata"] = parse_tags(file.stored_data)
+ data["filename"] = "[file.filename].[file.filetype]"
+ else
+ if(!computer || !computer.hard_drive)
+ data["error"] = "I/O ERROR: Unable to access hard drive."
+ else
+ HDD = computer.hard_drive
+ RHDD = computer.portable_drive
+ var/list/files[0]
+ for(var/datum/computer_file/F in HDD.stored_files)
+ files.Add(list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ )))
+ data["files"] = files
+ if(RHDD)
+ data["usbconnected"] = 1
+ var/list/usbfiles[0]
+ for(var/datum/computer_file/F in RHDD.stored_files)
+ usbfiles.Add(list(list(
+ "name" = F.filename,
+ "type" = F.filetype,
+ "size" = F.size,
+ "undeletable" = F.undeletable
+ )))
+ data["usbfiles"] = usbfiles
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm
new file mode 100644
index 00000000000..a34163f8eef
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm
@@ -0,0 +1,164 @@
+/datum/computer_file/program/ntnetdownload
+ filename = "ntndownloader"
+ filedesc = "NTNet Software Download Tool"
+ program_icon_state = "generic"
+ extended_desc = "This program allows downloads of software from official NT repositories"
+ unsendable = 1
+ undeletable = 1
+ size = 4
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD
+ available_on_ntnet = 0
+ ui_header = "downloader_finished.gif"
+ var/datum/computer_file/program/downloaded_file = null
+ var/hacked_download = 0
+ var/download_completion = 0 //GQ of downloaded data.
+ var/download_netspeed = 0
+ var/downloaderror = ""
+ var/obj/item/modular_computer/my_computer = null
+
+/datum/computer_file/program/ntnetdownload/proc/begin_file_download(filename)
+ if(downloaded_file)
+ return 0
+
+ var/datum/computer_file/program/PRG = ntnet_global.find_ntnet_file_by_name(filename)
+
+ if(!PRG || !istype(PRG))
+ return 0
+
+ // Attempting to download antag only program, but without having emagged computer. No.
+ if(PRG.available_on_syndinet && !computer_emagged)
+ return 0
+
+ if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG))
+ return 0
+
+ ui_header = "downloader_running.gif"
+
+ if(PRG in ntnet_global.available_station_software)
+ generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.")
+ hacked_download = 0
+ else if(PRG in ntnet_global.available_antag_software)
+ generate_network_log("Began downloading file **ENCRYPTED**.[PRG.filetype] from unspecified server.")
+ hacked_download = 1
+ else
+ generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from unspecified server.")
+ hacked_download = 0
+
+ downloaded_file = PRG.clone()
+
+/datum/computer_file/program/ntnetdownload/proc/abort_file_download()
+ if(!downloaded_file)
+ return
+ generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
+ downloaded_file = null
+ download_completion = 0
+ ui_header = "downloader_finished.gif"
+
+/datum/computer_file/program/ntnetdownload/proc/complete_file_download()
+ if(!downloaded_file)
+ return
+ generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
+ if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file))
+ // The download failed
+ downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance."
+ downloaded_file = null
+ download_completion = 0
+ ui_header = "downloader_finished.gif"
+
+/datum/computer_file/program/ntnetdownload/process_tick()
+ if(!downloaded_file)
+ return
+ if(download_completion >= downloaded_file.size)
+ complete_file_download()
+ // Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity
+ download_netspeed = 0
+ // Speed defines are found in misc.dm
+ switch(ntnet_status)
+ if(1)
+ download_netspeed = NTNETSPEED_LOWSIGNAL
+ if(2)
+ download_netspeed = NTNETSPEED_HIGHSIGNAL
+ if(3)
+ download_netspeed = NTNETSPEED_ETHERNET
+ download_completion += download_netspeed
+
+/datum/computer_file/program/ntnetdownload/ui_act(action, params)
+ if(..())
+ return 1
+ switch(action)
+ if("PRG_downloadfile")
+ if(!downloaded_file)
+ begin_file_download(params["filename"])
+ return 1
+ if("PRG_reseterror")
+ if(downloaderror)
+ download_completion = 0
+ download_netspeed = 0
+ downloaded_file = null
+ downloaderror = ""
+ return 1
+ return 0
+
+/datum/computer_file/program/ntnetdownload/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+ ui = new(user, src, ui_key, "ntnet_downloader", "NTNet Download Program", 575, 700, state = state)
+ ui.open()
+ ui.set_autoupdate(state = 1)
+
+/datum/computer_file/program/ntnetdownload/ui_data(mob/user)
+
+ my_computer = computer
+
+ if(!istype(my_computer))
+ return
+
+ var/list/data = get_header_data()
+
+ // This IF cuts on data transferred to client, so i guess it's worth it.
+ if(downloaderror) // Download errored. Wait until user resets the program.
+ data["error"] = downloaderror
+ else if(downloaded_file) // Download running. Wait please..
+ data["downloadname"] = downloaded_file.filename
+ data["downloaddesc"] = downloaded_file.filedesc
+ data["downloadsize"] = downloaded_file.size
+ data["downloadspeed"] = download_netspeed
+ data["downloadcompletion"] = round(download_completion, 0.1)
+ else // No download running, pick file.
+ data["disk_size"] = my_computer.hard_drive.max_capacity
+ data["disk_used"] = my_computer.hard_drive.used_capacity
+ var/list/all_entries[0]
+ for(var/A in ntnet_global.available_station_software)
+ var/datum/computer_file/program/P = A
+ // Only those programs our user can run will show in the list
+ if(!P.can_run(user,transfer = 1))
+ continue
+ all_entries.Add(list(list(
+ "filename" = P.filename,
+ "filedesc" = P.filedesc,
+ "fileinfo" = P.extended_desc,
+ "size" = P.size
+ )))
+ data["hackedavailable"] = 0
+ if(computer_emagged) // If we are running on emagged computer we have access to some "bonus" software
+ var/list/hacked_programs[0]
+ for(var/S in ntnet_global.available_antag_software)
+ var/datum/computer_file/program/P = S
+ data["hackedavailable"] = 1
+ hacked_programs.Add(list(list(
+ "filename" = P.filename,
+ "filedesc" = P.filedesc,
+ "fileinfo" = P.extended_desc,
+ "size" = P.size
+ )))
+ data["hacked_programs"] = hacked_programs
+
+ data["downloadable_programs"] = all_entries
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
new file mode 100644
index 00000000000..e12299b250b
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm
@@ -0,0 +1,94 @@
+/datum/computer_file/program/ntnetmonitor
+ filename = "ntmonitor"
+ filedesc = "NTNet Diagnostics and Monitoring"
+ program_icon_state = "comm_monitor"
+ extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes"
+ size = 12
+ requires_ntnet = 1
+ required_access = access_network //Network control is a more secure program.
+ available_on_ntnet = 1
+
+/datum/computer_file/program/ntnetmonitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+
+ ui = new(user, src, ui_key, "ntnet_monitor", "NTNet Diagnostics and Monitoring Tool", 575, 700, state = state)
+ ui.open()
+ ui.set_autoupdate(state = 1)
+
+
+/datum/computer_file/program/ntnetmonitor/ui_act(action, params)
+ if(..())
+ return 1
+ switch(action)
+ if("resetIDS")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.resetIDS()
+ return 1
+ if("toggleIDS")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.toggleIDS()
+ return 1
+ if("toggleWireless")
+ . = 1
+ if(!ntnet_global)
+ return 1
+
+ // NTNet is disabled. Enabling can be done without user prompt
+ if(ntnet_global.setting_disabled)
+ ntnet_global.setting_disabled = 0
+ return 1
+
+ // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on)
+ var/mob/user = usr
+ if(!user)
+ return 1
+ var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No")
+ if(response == "Yes")
+ ntnet_global.setting_disabled = 1
+ return 1
+ if("purgelogs")
+ . = 1
+ if(ntnet_global)
+ ntnet_global.purge_logs()
+ if("updatemaxlogs")
+ . = 1
+ var/mob/user = usr
+ var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):"))
+ if(ntnet_global)
+ ntnet_global.update_max_log_count(logcount)
+ if("toggle_function")
+ . = 1
+ if(!ntnet_global)
+ return 1
+ ntnet_global.toggle_function(text2num(params["id"]))
+
+/datum/computer_file/program/ntnetmonitor/ui_data(mob/user)
+ if(!ntnet_global)
+ return
+ var/list/data = get_header_data()
+
+ data["ntnetstatus"] = ntnet_global.check_function()
+ data["ntnetrelays"] = ntnet_global.relays.len
+ data["idsstatus"] = ntnet_global.intrusion_detection_enabled
+ data["idsalarm"] = ntnet_global.intrusion_detection_alarm
+
+ data["config_softwaredownload"] = ntnet_global.setting_softwaredownload
+ data["config_peertopeer"] = ntnet_global.setting_peertopeer
+ data["config_communication"] = ntnet_global.setting_communication
+ data["config_systemcontrol"] = ntnet_global.setting_systemcontrol
+
+ data["ntnetlogs"] = list()
+
+ for(var/i in ntnet_global.logs)
+ data["ntnetlogs"] += list(list("entry" = i))
+ data["ntnetmaxlogs"] = ntnet_global.setting_maxlogcount
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm
new file mode 100644
index 00000000000..e8cbe357113
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm
@@ -0,0 +1,236 @@
+/datum/computer_file/program/chatclient
+ filename = "ntnrc_client"
+ filedesc = "NTNet Relay Chat Client"
+ program_icon_state = "command"
+ extended_desc = "This program allows communication over NTNRC network"
+ size = 8
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_COMMUNICATION
+ network_destination = "NTNRC server"
+ ui_header = "ntnrc_idle.gif"
+ available_on_ntnet = 1
+ var/last_message = null // Used to generate the toolbar icon
+ var/username
+ var/datum/ntnet_conversation/channel = null
+ var/operator_mode = 0 // Channel operator mode
+ var/netadmin_mode = 0 // Administrator mode (invisible to other users + bypasses passwords)
+
+/datum/computer_file/program/chatclient/New()
+ username = "DefaultUser[rand(100, 999)]"
+
+/datum/computer_file/program/chatclient/ui_act(action, params)
+ if(..())
+ return 1
+
+ switch(action)
+ if("PRG_speak")
+ . = 1
+ if(!channel)
+ return 1
+ var/mob/living/user = usr
+ var/message = sanitize(input(user, "Enter message or leave blank to cancel: "))
+ if(!message || !channel)
+ return
+ channel.add_message(message, username)
+ log_chat("[user]/([user.ckey]) as [username] sent to [channel.title]: [message]")
+
+ if("PRG_joinchannel")
+ . = 1
+ var/datum/ntnet_conversation/C
+ for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels)
+ if(chan.id == text2num(params["id"]))
+ C = chan
+ break
+
+ if(!C)
+ return 1
+
+ if(netadmin_mode)
+ channel = C // Bypasses normal leave/join and passwords. Technically makes the user invisible to others.
+ return 1
+
+ if(C.password)
+ var/mob/living/user = usr
+ var/password = sanitize(input(user,"Access Denied. Enter password:"))
+ if(C && (password == C.password))
+ C.add_client(src)
+ channel = C
+ return 1
+ C.add_client(src)
+ channel = C
+ if("PRG_leavechannel")
+ . = 1
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ if("PRG_newchannel")
+ . = 1
+ var/mob/living/user = usr
+ var/channel_title = sanitize(input(user,"Enter channel name or leave blank to cancel:"))
+ if(!channel_title)
+ return
+ var/datum/ntnet_conversation/C = new/datum/ntnet_conversation()
+ C.add_client(src)
+ C.operator = src
+ channel = C
+ C.title = channel_title
+ if("PRG_toggleadmin")
+ . = 1
+ if(netadmin_mode)
+ netadmin_mode = 0
+ if(channel)
+ channel.remove_client(src) // We shouldn't be in channel's user list, but just in case...
+ channel = null
+ return 1
+ var/mob/living/user = usr
+ if(can_run(usr, 1, access_network))
+ if(channel)
+ var/response = alert(user, "Really engage admin-mode? You will be disconnected from your current channel!", "NTNRC Admin mode", "Yes", "No")
+ if(response == "Yes")
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ else
+ return
+ netadmin_mode = 1
+ if("PRG_changename")
+ . = 1
+ var/mob/living/user = usr
+ var/newname = sanitize(input(user,"Enter new nickname or leave blank to cancel:"))
+ if(!newname)
+ return 1
+ if(channel)
+ channel.add_status_message("[username] is now known as [newname].")
+ username = newname
+
+ if("PRG_savelog")
+ . = 1
+ if(!channel)
+ return
+ var/mob/living/user = usr
+ var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:")
+ if(!logname || !channel)
+ return 1
+ var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile()
+ // Now we will generate HTML-compliant file that can actually be viewed/printed.
+ logfile.filename = logname
+ logfile.stored_data = "\[b\]Logfile dump from NTNRC channel [channel.title]\[/b\]\[BR\]"
+ for(var/logstring in channel.messages)
+ logfile.stored_data += "[logstring]\[BR\]"
+ logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]"
+ logfile.calculate_size()
+ if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(logfile))
+ if(!computer)
+ // This program shouldn't even be runnable without computer.
+ CRASH("Var computer is null!")
+ return 1
+ if(!computer.hard_drive)
+ computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive connection error\" warning.")
+ else // In 99.9% cases this will mean our HDD is full
+ computer.visible_message("\The [computer] shows an \"I/O Error - Hard drive may be full. Please free some space and try again. Required space: [logfile.size]GQ\" warning.")
+ if("PRG_renamechannel")
+ . = 1
+ if(!operator_mode || !channel)
+ return 1
+ var/mob/living/user = usr
+ var/newname = sanitize(input(user, "Enter new channel name or leave blank to cancel:"))
+ if(!newname || !channel)
+ return
+ channel.add_status_message("Channel renamed from [channel.title] to [newname] by operator.")
+ channel.title = newname
+ if("PRG_deletechannel")
+ . = 1
+ if(channel && ((channel.operator == src) || netadmin_mode))
+ qdel(channel)
+ channel = null
+ if("PRG_setpassword")
+ . = 1
+ if(!channel || ((channel.operator != src) && !netadmin_mode))
+ return 1
+
+ var/mob/living/user = usr
+ var/newpassword = sanitize(input(user, "Enter new password for this channel. Leave blank to cancel, enter 'nopassword' to remove password completely:"))
+ if(!channel || !newpassword || ((channel.operator != src) && !netadmin_mode))
+ return 1
+
+ if(newpassword == "nopassword")
+ channel.password = ""
+ else
+ channel.password = newpassword
+
+/datum/computer_file/program/chatclient/process_tick()
+ ..()
+ if(program_state != PROGRAM_STATE_KILLED)
+ ui_header = "ntnrc_idle.gif"
+ if(channel)
+ // Remember the last message. If there is no message in the channel remember null.
+ last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null
+ else
+ last_message = null
+ return 1
+ if(channel && channel.messages && channel.messages.len)
+ ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif"
+ else
+ ui_header = "ntnrc_idle.gif"
+
+/datum/computer_file/program/chatclient/kill_program(forced = 0)
+ if(channel)
+ channel.remove_client(src)
+ channel = null
+ ..(forced)
+
+/datum/computer_file/program/chatclient/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+
+ ui = new(user, src, ui_key, "ntnet_chat", "NTNet Relay Chat Client", 575, 700, state = state)
+ ui.open()
+ ui.set_autoupdate(state = 1)
+
+
+/datum/computer_file/program/chatclient/ui_data(mob/user)
+ if(!ntnet_global || !ntnet_global.chat_channels)
+ return
+
+ var/list/data = list()
+
+ data = get_header_data()
+
+
+ data["adminmode"] = netadmin_mode
+ if(channel)
+ data["title"] = channel.title
+ var/list/messages[0]
+ for(var/M in channel.messages)
+ messages.Add(list(list(
+ "msg" = M
+ )))
+ data["messages"] = messages
+ var/list/clients[0]
+ for(var/C in channel.clients)
+ var/datum/computer_file/program/chatclient/cl = C
+ clients.Add(list(list(
+ "name" = cl.username
+ )))
+ data["clients"] = clients
+ operator_mode = (channel.operator == src) ? 1 : 0
+ data["is_operator"] = operator_mode || netadmin_mode
+
+ else // Channel selection screen
+ var/list/all_channels[0]
+ for(var/C in ntnet_global.chat_channels)
+ var/datum/ntnet_conversation/conv = C
+ if(conv && conv.title)
+ all_channels.Add(list(list(
+ "chan" = conv.title,
+ "id" = conv.id
+ )))
+ data["all_channels"] = all_channels
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm
new file mode 100644
index 00000000000..d9d0c6b8a30
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm
@@ -0,0 +1,195 @@
+var/global/nttransfer_uid = 0
+
+/datum/computer_file/program/nttransfer
+ filename = "nttransfer"
+ filedesc = "NTNet P2P Transfer Client"
+ extended_desc = "This program allows for simple file transfer via direct peer to peer connection."
+ program_icon_state = "comm_logs"
+ size = 7
+ requires_ntnet = 1
+ requires_ntnet_feature = NTNET_PEERTOPEER
+ network_destination = "other device via P2P tunnel"
+ available_on_ntnet = 1
+
+ var/error = "" // Error screen
+ var/server_password = "" // Optional password to download the file.
+ var/datum/computer_file/provided_file = null // File which is provided to clients.
+ var/datum/computer_file/downloaded_file = null // File which is being downloaded
+ var/list/connected_clients = list() // List of connected clients.
+ var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from.
+ var/download_completion = 0 // Download progress in GQ
+ var/download_netspeed = 0 // Our connectivity speed in GQ/s
+ var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed.
+ var/unique_token // UID of this program
+ var/upload_menu = 0 // Whether we show the program list and upload menu
+
+/datum/computer_file/program/nttransfer/New()
+ unique_token = nttransfer_uid
+ nttransfer_uid++
+ ..()
+
+/datum/computer_file/program/nttransfer/process_tick()
+ // Server mode
+ update_netspeed()
+ if(provided_file)
+ for(var/datum/computer_file/program/nttransfer/C in connected_clients)
+ // Transfer speed is limited by device which uses slower connectivity.
+ // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer
+ // so they can all run on same speed.
+ C.actual_netspeed = min(C.download_netspeed, download_netspeed)
+ C.download_completion += C.actual_netspeed
+ if(C.download_completion >= provided_file.size)
+ C.finish_download()
+ else if(downloaded_file) // Client mode
+ if(!remote)
+ crash_download("Connection to remote server lost")
+
+/datum/computer_file/program/nttransfer/kill_program(forced = 0)
+ if(downloaded_file) // Client mode, clean up variables for next use
+ finalize_download()
+
+ if(provided_file) // Server mode, disconnect all clients
+ for(var/datum/computer_file/program/nttransfer/P in connected_clients)
+ P.crash_download("Connection terminated by remote server")
+ downloaded_file = null
+ ..(forced)
+
+/datum/computer_file/program/nttransfer/proc/update_netspeed()
+ download_netspeed = 0
+ switch(ntnet_status)
+ if(1)
+ download_netspeed = NTNETSPEED_LOWSIGNAL
+ if(2)
+ download_netspeed = NTNETSPEED_HIGHSIGNAL
+ if(3)
+ download_netspeed = NTNETSPEED_ETHERNET
+
+// Finishes download and attempts to store the file on HDD
+/datum/computer_file/program/nttransfer/proc/finish_download()
+ if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file))
+ error = "I/O Error: Unable to save file. Check your hard drive and try again."
+ finalize_download()
+
+// Crashes the download and displays specific error message
+/datum/computer_file/program/nttransfer/proc/crash_download(var/message)
+ error = message ? message : "An unknown error has occured during download"
+ finalize_download()
+
+// Cleans up variables for next use
+/datum/computer_file/program/nttransfer/proc/finalize_download()
+ if(remote)
+ remote.connected_clients.Remove(src)
+ downloaded_file = null
+ remote = null
+ download_completion = 0
+
+
+/datum/computer_file/program/nttransfer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if (!ui)
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+
+ ui = new(user, src, ui_key, "ntnet_transfer", "NTNet P2P Transfer Client", 575, 700, state = state)
+ ui.open()
+ ui.set_autoupdate(state = 1)
+
+/datum/computer_file/program/nttransfer/ui_act(action, params)
+ if(..())
+ return 1
+ switch(action)
+ if("PRG_downloadfile")
+ for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
+ if("[P.unique_token]" == params["id"])
+ remote = P
+ break
+ if(!remote || !remote.provided_file)
+ return
+ if(remote.server_password)
+ var/pass = sanitize(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required"))
+ if(pass != remote.server_password)
+ error = "Incorrect Password"
+ return
+ downloaded_file = remote.provided_file.clone()
+ remote.connected_clients.Add(src)
+ return 1
+ if("PRG_reset")
+ error = ""
+ upload_menu = 0
+ finalize_download()
+ if(src in ntnet_global.fileservers)
+ ntnet_global.fileservers.Remove(src)
+ for(var/datum/computer_file/program/nttransfer/T in connected_clients)
+ T.crash_download("Remote server has forcibly closed the connection")
+ provided_file = null
+ return 1
+ if("PRG_setpassword")
+ var/pass = sanitize(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none"))
+ if(!pass)
+ return
+ if(pass == "none")
+ server_password = ""
+ return
+ server_password = pass
+ return 1
+ if("PRG_uploadfile")
+ for(var/datum/computer_file/F in computer.hard_drive.stored_files)
+ if("[F.uid]" == params["id"])
+ if(F.unsendable)
+ error = "I/O Error: File locked."
+ return
+ if(istype(F, /datum/computer_file/program))
+ var/datum/computer_file/program/P = F
+ if(!P.can_run(usr,transfer = 1))
+ error = "Access Error: Insufficient rights to upload file."
+ provided_file = F
+ ntnet_global.fileservers.Add(src)
+ return
+ error = "I/O Error: Unable to locate file on hard drive."
+ return 1
+ if("PRG_uploadmenu")
+ upload_menu = 1
+
+
+/datum/computer_file/program/nttransfer/ui_data(mob/user)
+
+ var/list/data = get_header_data()
+
+ if(error)
+ data["error"] = error
+ else if(downloaded_file)
+ data["downloading"] = 1
+ data["download_size"] = downloaded_file.size
+ data["download_progress"] = download_completion
+ data["download_netspeed"] = actual_netspeed
+ data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]"
+ else if (provided_file)
+ data["uploading"] = 1
+ data["upload_uid"] = unique_token
+ data["upload_clients"] = connected_clients.len
+ data["upload_haspassword"] = server_password ? 1 : 0
+ data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
+ else if (upload_menu)
+ var/list/all_files[0]
+ for(var/datum/computer_file/F in computer.hard_drive.stored_files)
+ all_files.Add(list(list(
+ "uid" = F.uid,
+ "filename" = "[F.filename].[F.filetype]",
+ "size" = F.size
+ )))
+ data["upload_filelist"] = all_files
+ else
+ var/list/all_servers[0]
+ for(var/datum/computer_file/program/nttransfer/P in ntnet_global.fileservers)
+ all_servers.Add(list(list(
+ "uid" = P.unique_token,
+ "filename" = "[P.provided_file.filename].[P.provided_file.filetype]",
+ "size" = P.provided_file.size,
+ "haspassword" = P.server_password ? 1 : 0
+ )))
+ data["servers"] = all_servers
+
+ return data
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm
new file mode 100644
index 00000000000..316b90ec00c
--- /dev/null
+++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm
@@ -0,0 +1,93 @@
+
+
+/datum/computer_file/program/power_monitor
+ filename = "powermonitor"
+ filedesc = "Power Monitoring"
+ program_icon_state = "power_monitor"
+ extended_desc = "This program connects to sensors around the station to provide information about electrical systems"
+ ui_header = "power_norm.gif"
+ transfer_access = access_engine
+ usage_flags = PROGRAM_CONSOLE
+ requires_ntnet = 0
+ network_destination = "power monitoring system"
+ size = 9
+ var/has_alert = 0
+ var/obj/structure/cable/attached
+ var/list/history = list()
+ var/record_size = 60
+ var/record_interval = 50
+ var/next_record = 0
+
+
+
+
+/datum/computer_file/program/power_monitor/run_program(mob/living/user)
+ . = ..(user)
+ search()
+ history["supply"] = list()
+ history["demand"] = list()
+
+
+/datum/computer_file/program/power_monitor/process_tick()
+ if(!attached)
+ search()
+ else
+ record()
+
+/datum/computer_file/program/power_monitor/proc/search()
+ var/turf/T = get_turf(computer)
+ attached = locate() in T
+
+/datum/computer_file/program/power_monitor/proc/record()
+ if(world.time >= next_record)
+ next_record = world.time + record_interval
+
+ var/list/supply = history["supply"]
+ supply += attached.powernet.viewavail
+ if(supply.len > record_size)
+ supply.Cut(1, 2)
+
+ var/list/demand = history["demand"]
+ demand += attached.powernet.viewload
+ if(demand.len > record_size)
+ demand.Cut(1, 2)
+
+/datum/computer_file/program/power_monitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
+ datum/tgui/master_ui = null, datum/ui_state/state = default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+
+ var/datum/asset/assets = get_asset_datum(/datum/asset/simple/headers)
+ assets.send(user)
+
+
+ ui = new(user, src, ui_key, "power_monitor_prog", "Power Monitoring", 1200, 1000, master_ui, state)
+ ui.open()
+
+/datum/computer_file/program/power_monitor/ui_data()
+ var/list/data = get_header_data()
+ data["stored"] = record_size
+ data["interval"] = record_interval / 10
+ data["attached"] = attached ? TRUE : FALSE
+ if(attached)
+ data["supply"] = attached.powernet.viewavail
+ data["demand"] = attached.powernet.viewload
+ data["history"] = history
+
+ data["areas"] = list()
+ if(attached)
+ for(var/obj/machinery/power/terminal/term in attached.powernet.nodes)
+ var/obj/machinery/power/apc/A = term.master
+ if(istype(A))
+ data["areas"] += list(list(
+ "name" = A.area.name,
+ "charge" = A.cell.percent(),
+ "load" = A.lastused_total,
+ "charging" = A.charging,
+ "eqp" = A.equipment,
+ "lgt" = A.lighting,
+ "env" = A.environ
+ ))
+
+ return data
+
diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm
new file mode 100644
index 00000000000..c79df6c6dea
--- /dev/null
+++ b/code/modules/modular_computers/hardware/battery_module.dm
@@ -0,0 +1,79 @@
+// This device is wrapper for actual power cell. I have decided to not use power cells directly as even low-end cells available on station
+// have tremendeous capacity in comparsion. Higher tier cells would provide your device with nearly infinite battery life, which is something i want to avoid.
+/obj/item/weapon/computer_hardware/battery_module
+ name = "standard battery"
+ desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops. It's rating is 750."
+ icon_state = "battery_normal"
+ critical = 1
+ malfunction_probability = 1
+ origin_tech = list("powerstorage" = 1, "engineering" = 1)
+ var/battery_rating = 750
+ var/obj/item/weapon/stock_parts/cell/battery = null
+
+/obj/item/weapon/computer_hardware/battery_module/advanced
+ name = "advanced battery"
+ desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 1100."
+ icon_state = "battery_advanced"
+ origin_tech = list("powerstorage" = 2, "engineering" = 2)
+ hardware_size = 2
+ battery_rating = 1100
+
+/obj/item/weapon/computer_hardware/battery_module/super
+ name = "super battery"
+ desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500."
+ icon_state = "battery_super"
+ origin_tech = list("powerstorage" = 3, "engineering" = 3)
+ hardware_size = 2
+ battery_rating = 1500
+
+/obj/item/weapon/computer_hardware/battery_module/ultra
+ name = "ultra battery"
+ desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 2000."
+ icon_state = "battery_ultra"
+ origin_tech = list("powerstorage" = 5, "engineering" = 4)
+ hardware_size = 3
+ battery_rating = 2000
+
+/obj/item/weapon/computer_hardware/battery_module/micro
+ name = "micro battery"
+ desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 500."
+ icon_state = "battery_micro"
+ origin_tech = list("powerstorage" = 2, "engineering" = 2)
+ battery_rating = 500
+
+/obj/item/weapon/computer_hardware/battery_module/nano
+ name = "nano battery"
+ desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 300."
+ icon_state = "battery_nano"
+ origin_tech = list("powerstorage" = 1, "engineering" = 1)
+ battery_rating = 300
+
+// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes.
+/obj/item/weapon/computer_hardware/battery_module/lambda
+ name = "lambda coil"
+ desc = "A very complex device that creates it's own bluespace dimension. This dimension may be used to store massive amounts of energy."
+ icon_state = "battery_lambda"
+ hardware_size = 1
+ battery_rating = 1000000
+
+/obj/item/weapon/computer_hardware/battery_module/diagnostics(var/mob/user)
+ ..()
+ user << "Internal battery charge: [battery.charge]/[battery.maxcharge] CU"
+
+/obj/item/weapon/computer_hardware/battery_module/New()
+ battery = new/obj/item/weapon/stock_parts/cell(src)
+ battery.maxcharge = battery_rating
+ battery.charge = battery.maxcharge/2
+ ..()
+
+/obj/item/weapon/computer_hardware/battery_module/proc/charge_to_full()
+ if(battery)
+ battery.charge = battery.maxcharge
+
+/obj/item/weapon/computer_hardware/battery_module/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.battery_module)
+ user << "This computer's battery slot is already occupied by \the [M.battery_module]."
+ return
+ found = 1
+ M.battery_module = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
new file mode 100644
index 00000000000..aba6bcae84c
--- /dev/null
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -0,0 +1,29 @@
+/obj/item/weapon/computer_hardware/card_slot
+ name = "RFID card slot"
+ desc = "Slot that allows this computer to write data on RFID cards. Necessary for some programs to run properly."
+ power_usage = 10 //W
+ critical = 0
+ icon_state = "cardreader"
+ hardware_size = 1
+ origin_tech = list("programming" = 2)
+
+ var/obj/item/weapon/card/id/stored_card = null
+ var/obj/item/weapon/card/id/stored_card2 = null
+
+/obj/item/weapon/computer_hardware/card_slot/Destroy()
+ if(holder2 && (holder2.card_slot == src))
+ holder2.card_slot = null
+ if(stored_card)
+ stored_card.forceMove(get_turf(holder2))
+ if(stored_card2)
+ stored_card2.forceMove(get_turf(holder2))
+ holder2 = null
+ ..()
+
+/obj/item/weapon/computer_hardware/card_slot/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.card_slot)
+ user << "This computer's card slot is already occupied by \the [M.card_slot]."
+ return
+ found = 1
+ M.card_slot = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
new file mode 100644
index 00000000000..fcca93b2b69
--- /dev/null
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -0,0 +1,175 @@
+/obj/item/weapon/computer_hardware/hard_drive/
+ name = "basic hard drive"
+ desc = "A small power efficient solid state drive, with 128GQ of storage capacity for use in basic computers where power efficiency is desired."
+ power_usage = 25 // SSD or something with low power usage
+ icon_state = "hdd_normal"
+ hardware_size = 1
+ origin_tech = list("programming" = 1, "engineering" = 1)
+ var/max_capacity = 128
+ var/used_capacity = 0
+ var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
+
+/obj/item/weapon/computer_hardware/hard_drive/advanced
+ name = "advanced hard drive"
+ desc = "A small hybrid hard drive with 256GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired."
+ max_capacity = 256
+ origin_tech = list("programming" = 2, "engineering" = 2)
+ power_usage = 50 // Hybrid, medium capacity and medium power storage
+ icon_state = "hdd_advanced"
+ hardware_size = 2
+
+/obj/item/weapon/computer_hardware/hard_drive/super
+ name = "super hard drive"
+ desc = "A small hard drive with 512GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency."
+ max_capacity = 512
+ origin_tech = list("programming" = 3, "engineering" = 3)
+ power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link.
+ icon_state = "hdd_super"
+ hardware_size = 2
+
+/obj/item/weapon/computer_hardware/hard_drive/cluster
+ name = "cluster hard drive"
+ desc = "A large storage cluster consisting of multiple hard drives for usage in high capacity storage systems. Has capacity of 2048 GQ."
+ power_usage = 500
+ origin_tech = list("programming" = 4, "engineering" = 4)
+ max_capacity = 2048
+ icon_state = "hdd_cluster"
+ hardware_size = 3
+
+// For tablets, etc. - highly power efficient.
+/obj/item/weapon/computer_hardware/hard_drive/small
+ name = "small hard drive"
+ desc = "A small highly efficient solid state drive for portable devices."
+ power_usage = 10
+ origin_tech = list("programming" = 2, "engineering" = 2)
+ max_capacity = 64
+ icon_state = "hdd_small"
+ hardware_size = 1
+
+/obj/item/weapon/computer_hardware/hard_drive/micro
+ name = "micro hard drive"
+ desc = "A small micro hard drive for portable devices."
+ power_usage = 2
+ origin_tech = list("programming" = 1, "engineering" = 1)
+ max_capacity = 32
+ icon_state = "hdd_micro"
+ hardware_size = 1
+
+/obj/item/weapon/computer_hardware/hard_drive/diagnostics(var/mob/user)
+ ..()
+ // 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
+ user << "NT-NFS File Table Status: [stored_files.len]/999"
+ user << "Storage capacity: [used_capacity]/[max_capacity]GQ"
+
+// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
+/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+
+ if(!can_store_file(F.size))
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(!stored_files)
+ return 0
+
+ // This file is already stored. Don't store it again.
+ if(F in stored_files)
+ return 0
+
+ F.holder = src
+ stored_files.Add(F)
+ recalculate_size()
+ return 1
+
+// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
+/obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs()
+ store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar
+ store_file(new/datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository
+ store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation.
+
+
+// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
+/obj/item/weapon/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+
+ if(!stored_files)
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(F in stored_files)
+ stored_files -= F
+ recalculate_size()
+ return 1
+ else
+ return 0
+
+// Loops through all stored files and recalculates used_capacity of this drive
+/obj/item/weapon/computer_hardware/hard_drive/proc/recalculate_size()
+ var/total_size = 0
+ for(var/datum/computer_file/F in stored_files)
+ total_size += F.size
+
+ used_capacity = total_size
+
+// Checks whether file can be stored on the hard drive.
+/obj/item/weapon/computer_hardware/hard_drive/proc/can_store_file(var/size = 1)
+ // In the unlikely event someone manages to create that many files.
+ // BYOND is acting weird with numbers above 999 in loops (infinite loop prevention)
+ if(stored_files.len >= 999)
+ return 0
+ if(used_capacity + size > max_capacity)
+ return 0
+ else
+ return 1
+
+// Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file.
+/obj/item/weapon/computer_hardware/hard_drive/proc/try_store_file(var/datum/computer_file/F)
+ if(!F || !istype(F))
+ return 0
+ var/name = F.filename + "." + F.filetype
+ for(var/datum/computer_file/file in stored_files)
+ if((file.filename + "." + file.filetype) == name)
+ return 0
+ return can_store_file(F.size)
+
+
+
+// Tries to find the file by filename. Returns null on failure
+/obj/item/weapon/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
+ if(!check_functionality())
+ return null
+
+ if(!filename)
+ return null
+
+ if(!stored_files)
+ return null
+
+ for(var/datum/computer_file/F in stored_files)
+ if(F.filename == filename)
+ return F
+ return null
+
+/obj/item/weapon/computer_hardware/hard_drive/Destroy()
+ if(holder2 && (holder2.hard_drive == src))
+ holder2.hard_drive = null
+ stored_files = null
+ ..()
+
+/obj/item/weapon/computer_hardware/hard_drive/New()
+ install_default_programs()
+ ..()
+
+/obj/item/weapon/computer_hardware/hard_drive/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.hard_drive)
+ user << "This computer's hard drive slot is already occupied by \the [M.hard_drive]."
+ return
+ found = 1
+ M.hard_drive = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm
new file mode 100644
index 00000000000..4b0d378286a
--- /dev/null
+++ b/code/modules/modular_computers/hardware/hardware.dm
@@ -0,0 +1,99 @@
+/obj/item/weapon/computer_hardware/
+ name = "Hardware"
+ desc = "Unknown Hardware."
+ icon = 'icons/obj/modular_components.dmi'
+ var/obj/item/modular_computer/holder2 = null
+ var/power_usage = 0 // If the hardware uses extra power, change this.
+ var/enabled = 1 // If the hardware is turned off set this to 0.
+ var/critical = 1 // Prevent disabling for important component, like the HDD.
+ var/hardware_size = 1 // Limits which devices can contain this component. 1: Tablets/Laptops/Consoles, 2: Laptops/Consoles, 3: Consoles only
+ var/damage = 0 // Current damage level
+ var/max_damage = 100 // Maximal damage level.
+ var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things
+ var/damage_failure = 50 // "Failure" threshold. When damage exceeds this value the hardware piece will not work at all.
+ var/malfunction_probability = 10// Chance of malfunction when the component is damaged
+
+/obj/item/weapon/computer_hardware/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
+ // Multitool. Runs diagnostics
+ if(istype(W, /obj/item/device/multitool))
+ user << "***** DIAGNOSTICS REPORT *****"
+ diagnostics(user)
+ user << "******************************"
+ return 1
+ // Nanopaste. Repair all damage if present for a single unit.
+ var/obj/item/stack/S = W
+/*
+ if(istype(S, /obj/item/stack/sheet/glass))
+ if(!damage)
+ user << "\The [src] doesn't seem to require repairs."
+ return 1
+ if(S.use(1))
+ user << "You apply a bit of \the [W] to \the [src]. It immediately repairs all damage."
+ damage = 0
+ return 1
+*/
+ // Cable coil. Works as repair method, but will probably require multiple applications and more cable.
+ if(istype(S, /obj/item/stack/cable_coil))
+ if(!damage)
+ user << "\The [src] doesn't seem to require repairs."
+ return 1
+ if(S.use(1))
+ user << "You patch up \the [src] with a bit of \the [W]."
+ take_damage(-10)
+ return 1
+ return ..()
+
+
+// Called on multitool click, prints diagnostic information to the user.
+/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user)
+ user << "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]"
+
+/obj/item/weapon/computer_hardware/New(var/obj/L)
+ w_class = hardware_size
+ if(istype(L, /obj/machinery/modular_computer))
+ var/obj/machinery/modular_computer/C = L
+ if(C.cpu)
+ holder2 = C.cpu
+ return
+ if(istype(L, /obj/item/modular_computer))
+ holder2 = L
+ return
+
+/obj/item/weapon/computer_hardware/Destroy()
+ holder2 = null
+ return ..()
+
+// Handles damage checks
+/obj/item/weapon/computer_hardware/proc/check_functionality()
+ // Too damaged to work at all.
+ if(damage > damage_failure)
+ return 0
+ // Still working. Well, sometimes...
+ if(damage > damage_malfunction)
+ if(prob(malfunction_probability))
+ return 0
+ // Good to go.
+ return 1
+
+/obj/item/weapon/computer_hardware/examine(var/mob/user)
+ . = ..()
+ if(damage > damage_failure)
+ user << "It seems to be severely damaged!"
+ else if(damage > damage_malfunction)
+ user << "It seems to be damaged!"
+ else if(damage)
+ user << "It seems to be slightly damaged."
+
+// Damages the component. Contains necessary checks. Negative damage "heals" the component.
+/obj/item/weapon/computer_hardware/proc/take_damage(var/amount)
+ damage += round(amount) // We want nice rounded numbers here.
+ damage = max(0, min(damage, max_damage)) // Clamp the value.
+
+// Attempts to install the hardware into apropriate slot.
+/obj/item/weapon/computer_hardware/proc/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(found)
+ user << "You install \the [src] into \the [M]"
+ holder2 = M
+ if(!user.drop_item(src))
+ return
+ forceMove(M)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm
new file mode 100644
index 00000000000..83b33418647
--- /dev/null
+++ b/code/modules/modular_computers/hardware/nano_printer.dm
@@ -0,0 +1,60 @@
+/obj/item/weapon/computer_hardware/nano_printer
+ name = "nano printer"
+ desc = "Small integrated printer with paper recycling module."
+ power_usage = 50
+ origin_tech = list("programming" = 2, "engineering" = 2)
+ critical = 0
+ icon_state = "printer"
+ hardware_size = 1
+ var/stored_paper = 5
+ var/max_paper = 10
+
+/obj/item/weapon/computer_hardware/nano_printer/diagnostics(var/mob/user)
+ ..()
+ user << "Paper buffer level: [stored_paper]/[max_paper]"
+
+/obj/item/weapon/computer_hardware/nano_printer/proc/print_text(var/text_to_print, var/paper_title = null)
+ if(!stored_paper)
+ return 0
+ if(!enabled)
+ return 0
+ if(!check_functionality())
+ return 0
+
+ var/obj/item/weapon/paper/P = new/obj/item/weapon/paper(get_turf(holder2))
+
+ // Damaged printer causes the resulting paper to be somewhat harder to read.
+ if(damage > damage_malfunction)
+ P.info = stars(text_to_print, 100-malfunction_probability)
+ else
+ P.info = text_to_print
+ if(paper_title)
+ P.name = paper_title
+ P.update_icon()
+ stored_paper--
+ P = null
+ return 1
+
+/obj/item/weapon/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/paper))
+ if(stored_paper >= max_paper)
+ user << "You try to add \the [W] into [src], but it's paper bin is full"
+ return
+
+ user << "You insert \the [W] into [src]."
+ qdel(W)
+ stored_paper++
+
+/obj/item/weapon/computer_hardware/nano_printer/Destroy()
+ if(holder2 && (holder2.nano_printer == src))
+ holder2.nano_printer = null
+ holder2 = null
+ ..()
+
+/obj/item/weapon/computer_hardware/nano_printer/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.nano_printer)
+ user << "This computer's nano printer slot is already occupied by \the [M.nano_printer]."
+ return
+ found = 1
+ M.nano_printer = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
new file mode 100644
index 00000000000..41a69042b4a
--- /dev/null
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -0,0 +1,104 @@
+var/global/ntnet_card_uid = 1
+
+/obj/item/weapon/computer_hardware/network_card/
+ name = "basic NTNet network card"
+ desc = "A basic network card for usage with standard NTNet frequencies."
+ power_usage = 50
+ origin_tech = list("programming" = 2, TECH_ENGINEERING = 1)
+ critical = 0
+ icon_state = "netcard_basic"
+ hardware_size = 1
+ var/identification_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
+ var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
+ var/long_range = 0
+ var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
+ malfunction_probability = 1
+
+/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user)
+ ..()
+ user << "NIX Unique ID: [identification_id]"
+ user << "NIX User Tag: [identification_string]"
+ user << "Supported protocols:"
+ user << "511.m SFS (Subspace) - Standard Frequency Spread"
+ if(long_range)
+ user << "511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandiwdth"
+ if(ethernet)
+ user << "OpenEth (Physical Connection) - Physical network connection port"
+
+/obj/item/weapon/computer_hardware/network_card/New(var/l)
+ ..(l)
+ identification_id = ntnet_card_uid
+ ntnet_card_uid++
+
+/obj/item/weapon/computer_hardware/network_card/advanced
+ name = "advanced NTNet network card"
+ desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station."
+ long_range = 1
+ origin_tech = list("programming" = 4, "engineering" = 2)
+ power_usage = 100 // Better range but higher power usage.
+ icon_state = "netcard_advanced"
+ hardware_size = 1
+
+/obj/item/weapon/computer_hardware/network_card/wired
+ name = "wired NTNet network card"
+ desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection."
+ ethernet = 1
+ origin_tech = list("programming" = 5, "engineering" = 3)
+ power_usage = 100 // Better range but higher power usage.
+ icon_state = "netcard_ethernet"
+ hardware_size = 3
+
+/obj/item/weapon/computer_hardware/network_card/Destroy()
+ if(holder2 && (holder2.network_card == src))
+ holder2.network_card = null
+ holder2 = null
+ ..()
+
+// Returns a string identifier of this network card
+/obj/item/weapon/computer_hardware/network_card/proc/get_network_tag()
+ return "[identification_string] (NID [identification_id])"
+
+// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
+/obj/item/weapon/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
+ if(!holder2) // Hardware is not installed in anything. No signal. How did this even get called?
+ return 0
+
+ if(!enabled)
+ return 0
+
+ if(!check_functionality())
+ return 0
+
+ if(ethernet) // Computer is connected via wired connection.
+ return 3
+
+ if(!ntnet_global || !ntnet_global.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
+ return 0
+
+ if(holder2)
+
+ var/turf/T = get_turf(holder2)
+ if((T && istype(T)) && (T.z == ZLEVEL_STATION || T.z == ZLEVEL_MINING))
+ // Computer is on station. Low/High signal depending on what type of network card you have
+ if(long_range)
+ return 2
+ else
+ return 1
+
+ if(long_range) // Computer is not on station, but it has upgraded network card. Low signal.
+ return 1
+
+ return 0 // Computer is not on station and does not have upgraded network card. No signal.
+
+/obj/item/weapon/computer_hardware/network_card/Destroy()
+ if(holder2 && (holder2.network_card == src))
+ holder2.network_card = null
+ ..()
+
+/obj/item/weapon/computer_hardware/network_card/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.network_card)
+ user << "This computer's network card slot is already occupied by \the [M.network_card]."
+ return
+ found = 1
+ M.network_card = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm
new file mode 100644
index 00000000000..e4ff4d7d09e
--- /dev/null
+++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm
@@ -0,0 +1,41 @@
+// These are basically USB data sticks and may be used to transfer files between devices
+/obj/item/weapon/computer_hardware/hard_drive/portable/
+ name = "basic data crystal"
+ desc = "Small crystal with imprinted photonic circuits that can be used to store data. It's capacity is 16 GQ."
+ power_usage = 10
+ icon_state = "flashdrive_basic"
+ hardware_size = 1
+ max_capacity = 16
+ origin_tech = list("programming" = 1)
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/advanced
+ name = "advanced data crystal"
+ desc = "Small crystal with imprinted high-density photonic circuits that can be used to store data. It's capacity is 64 GQ."
+ power_usage = 20
+ icon_state = "flashdrive_advanced"
+ hardware_size = 1
+ max_capacity = 64
+ origin_tech = list("programming" = 2)
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/super
+ name = "super data crystal"
+ desc = "Small crystal with imprinted ultra-density photonic circuits that can be used to store data. It's capacity is 256 GQ."
+ power_usage = 40
+ icon_state = "flashdrive_super"
+ hardware_size = 1
+ max_capacity = 256
+ origin_tech = list("programming" = 4)
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/New()
+ ..()
+ stored_files = list()
+ recalculate_size()
+
+
+/obj/item/weapon/computer_hardware/hard_drive/portable/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.portable_drive)
+ user << "This computer's portable drive slot is already occupied by \the [M.portable_drive]."
+ return
+ found = 1
+ M.portable_drive = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm
new file mode 100644
index 00000000000..75037392160
--- /dev/null
+++ b/code/modules/modular_computers/hardware/processor_unit.dm
@@ -0,0 +1,49 @@
+// CPU that allows the computer to run programs.
+// Better CPUs are obtainable via research and can run more programs on background.
+
+/obj/item/weapon/computer_hardware/processor_unit
+ name = "standard processor"
+ desc = "A standard CPU used in most computers. It can run up to three programs simultaneously."
+ icon_state = "cpu_normal"
+ hardware_size = 2
+ power_usage = 50
+ critical = 1
+ malfunction_probability = 1
+ origin_tech = list("programming" = 3, "engineering" = 2)
+
+ var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description.
+
+/obj/item/weapon/computer_hardware/processor_unit/small
+ name = "standard microprocessor"
+ desc = "A standard miniaturised CPU used in portable devices. It can run up to two programs simultaneously."
+ icon_state = "cpu_small"
+ hardware_size = 1
+ power_usage = 25
+ max_idle_programs = 1
+ origin_tech = list("programming" = 2, "engineering" = 2)
+
+/obj/item/weapon/computer_hardware/processor_unit/photonic
+ name = "photonic processor"
+ desc = "An advanced experimental CPU that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power."
+ icon_state = "cpu_normal_photonic"
+ hardware_size = 2
+ power_usage = 250
+ max_idle_programs = 4
+ origin_tech = list("programming" = 5, "engineering" = 4)
+
+/obj/item/weapon/computer_hardware/processor_unit/photonic/small
+ name = "photonic microprocessor"
+ desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously."
+ icon_state = "cpu_small_photonic"
+ hardware_size = 1
+ power_usage = 75
+ max_idle_programs = 2
+ origin_tech = list("programming" = 4, "engineering" = 3)
+
+/obj/item/weapon/computer_hardware/processor_unit/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(M.processor_unit)
+ user << "This computer's processor slot is already occupied by \the [M.processor_unit]."
+ return
+ found = 1
+ M.processor_unit = src
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm
new file mode 100644
index 00000000000..deae760d467
--- /dev/null
+++ b/code/modules/modular_computers/hardware/tesla_link.dm
@@ -0,0 +1,31 @@
+/obj/item/weapon/computer_hardware/tesla_link
+ name = "tesla link"
+ desc = "An advanced tesla link that wirelessly recharges connected device from nearby area power controller."
+ critical = 0
+ enabled = 1
+ icon_state = "teslalink"
+ hardware_size = 2 // Can't be installed into tablets
+ origin_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2)
+ var/obj/machinery/modular_computer/holder
+
+/obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L)
+ if(istype(L, /obj/machinery/modular_computer))
+ holder = L
+ return
+ ..(L)
+
+/obj/item/weapon/computer_hardware/tesla_link/Destroy()
+ if(holder && (holder.tesla_link == src))
+ holder.tesla_link = null
+ ..()
+
+/obj/item/weapon/computer_hardware/tesla_link/try_install_component(mob/living/user, obj/item/modular_computer/M, found = 0)
+ if(istype(M, /obj/item/modular_computer/processor))
+ var/obj/item/modular_computer/processor/P = M
+ if(P.machinery_computer.tesla_link)
+ user << "This computer's tesla link slot is already occupied by \the [P.machinery_computer.tesla_link]."
+ return
+ holder = P.machinery_computer
+ P.machinery_computer.tesla_link = src
+ found = 1
+ ..(user, M, found)
\ No newline at end of file
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index 6693981e0fa..1df674feb32 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -55,7 +55,7 @@ Contents:
if(!candidates.len)
return NOT_ENOUGH_PLAYERS
- var/mob/dead/selected_candidate = popleft(candidates)
+ var/mob/dead/selected_candidate = pick_n_take(candidates)
var/key = selected_candidate.key
//Prepare ninja player mind
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 21191f9fb0f..7524010b166 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -91,20 +91,6 @@
/obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics.
return 0
-
-/obj/machinery/am_shielding/blob_act()
- stability -= 20
- if(prob(100-stability))
- if(prob(10))//Might create a node
- new /obj/effect/blob/node(src.loc,150)
- else
- new /obj/effect/blob(src.loc,60)
- qdel(src)
- return
- check_stability()
- return
-
-
/obj/machinery/am_shielding/ex_act(severity, target)
stability -= (80 - (severity * 20))
check_stability()
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index fb20f6c8ee1..a5e754cd015 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -93,6 +93,10 @@ By design, d1 is the smallest direction and d2 is the highest
cable_list -= src //remove it from global cable list
return ..() // then go ahead and delete the cable
+/obj/structure/cable/blob_act(obj/effect/blob/B)
+ if(invisibility != INVISIBILITY_MAXIMUM)
+ qdel(src)
+
/obj/structure/cable/Deconstruct()
var/turf/T = loc
stored.loc = T
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 97855e2e162..7b2f9cab0f8 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -116,6 +116,10 @@
return
return ..()
+/obj/machinery/light_construct/blob_act(obj/effect/blob/B)
+ if(B && B.loc == loc)
+ qdel(src)
+
/obj/machinery/light_construct/small
name = "small light fixture frame"
@@ -522,6 +526,15 @@
if(prob(25))
broken()
+/obj/machinery/light/blob_act(obj/effect/blob/B)
+ if(B && B.loc == loc)
+ broken()
+ qdel(src)
+ else if(prob(50))
+ broken()
+ else
+ flicker()
+
// called when area power state changes
/obj/machinery/light/power_change()
var/area/A = get_area(src)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 8d37a225f4a..abe46e6732d 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -111,18 +111,6 @@
projectile_type = /obj/item/projectile/meteor
select_name = "goddamn meteor"
-/obj/item/ammo_casing/energy/kinetic
- projectile_type = /obj/item/projectile/kinetic
- select_name = "kinetic"
- e_cost = 500
- fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
-
-/obj/item/ammo_casing/energy/kinetic/super
- projectile_type = /obj/item/projectile/kinetic/super
-
-/obj/item/ammo_casing/energy/kinetic/hyper
- projectile_type = /obj/item/projectile/kinetic/hyper
-
/obj/item/ammo_casing/energy/disabler
projectile_type = /obj/item/projectile/beam/disabler
select_name = "disable"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
new file mode 100644
index 00000000000..4d5d8ffa6a2
--- /dev/null
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -0,0 +1,238 @@
+/obj/item/weapon/gun/energy/kinetic_accelerator
+ name = "proto-kinetic accelerator"
+ desc = "A self recharging, "
+ icon_state = "kineticgun"
+ item_state = "kineticgun"
+ ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
+ cell_type = /obj/item/weapon/stock_parts/cell/emproof
+ needs_permit = 0
+ unique_rename = 1
+ origin_tech = "combat=3;powerstorage=3;engineering=3"
+ weapon_weight = WEAPON_LIGHT
+ can_flashlight = 1
+ flight_x_offset = 15
+ flight_y_offset = 9
+ var/overheat_time = 16
+ var/holds_charge = FALSE
+ var/unique_frequency = FALSE // modified by KA modkits
+ var/overheat = FALSE
+
+ var/list/max_mod_capacity = 2
+ var/list/modkits = list()
+
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/weapon/crowbar))
+ if(modkits.len)
+ user << "You pry the modifications out."
+ for(var/obj/item/modkit/M in modkits)
+ M.forceMove(get_turf(user))
+ else
+ user << "There are no modifications currently installed."
+ else if(istype(A, /obj/item/modkit))
+ var/obj/item/modkit/MK = A
+ var/current_mod_capacity = 0
+ for(var/obj/item/modkit/M in modkits)
+ current_mod_capacity += M.cost
+ if((current_mod_capacity + MK.cost) > max_mod_capacity)
+ user << "You don't have room to install this modkit. Use a crowbar to remove existing modkits."
+ return
+ else
+ user << "You install the modkit."
+ MK.install(src)
+ else
+ ..()
+
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
+ for(var/obj/item/modkit/M in src)
+ M.modify_projectile(K)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/New()
+ . = ..()
+ if(!holds_charge)
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
+ . = ..()
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
+ . = ..()
+ if(!can_shoot())
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/dropped()
+ . = ..()
+ if(!holds_charge)
+ // Put it on a delay because moving item from slot to hand
+ // calls dropped().
+ sleep(1)
+ if(!ismob(loc))
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
+ power_supply.use(500)
+ update_icon()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
+ if(overheat)
+ return
+ overheat = TRUE
+
+ var/carried = 0
+ if(!unique_frequency)
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
+ loc.GetAllContents())
+
+ carried++
+
+ carried = max(carried, 1)
+ else
+ carried = 1
+
+ addtimer(src, "reload", overheat_time * carried)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
+ return
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
+ power_supply.give(500)
+ if(!suppressed)
+ playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ else
+ loc << "[src] silently charges up."
+ update_icon()
+ overheat = FALSE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
+ cut_overlays()
+ if(!can_shoot())
+ add_overlay("kineticgun_empty")
+
+ if(F && can_flashlight)
+ var/iconF = "flight"
+ if(F.on)
+ iconF = "flight_on"
+ add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
+
+
+
+
+
+
+
+
+
+
+//Casing
+
+
+/obj/item/ammo_casing/energy/kinetic
+ projectile_type = /obj/item/projectile/kinetic
+ select_name = "kinetic"
+ e_cost = 500
+ fire_sound = 'sound/weapons/Kenetic_accel.ogg' // fine spelling there chap
+
+/obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
+ ..()
+ if(loc && istype(loc, /obj/item/weapon/gun/energy/kinetic_accelerator))
+ var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc
+ KA.modify_projectile(BB)
+
+/obj/item/ammo_casing/energy/kinetic/hyper
+ projectile_type = /obj/item/projectile/kinetic/hyper
+
+
+
+//Projectiles
+
+/obj/item/projectile/kinetic
+ name = "kinetic force"
+ icon_state = null
+ damage = 10
+ damage_type = BRUTE
+ flag = "bomb"
+ range = 3
+ var/damage_multiplier = 4
+
+/obj/item/projectile/kinetic/super
+ damage = 11
+ range = 4
+
+/obj/item/projectile/kinetic/New()
+ var/turf/proj_turf = get_turf(src)
+ if(!istype(proj_turf, /turf))
+ return
+ var/datum/gas_mixture/environment = proj_turf.return_air()
+ var/pressure = environment.return_pressure()
+ if(pressure < 50)
+ name = "full strength [name]"
+ damage *= damage_multiplier
+ ..()
+
+/obj/item/projectile/kinetic/on_range()
+ PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, loc)
+ ..()
+
+/obj/item/projectile/kinetic/on_hit(atom/target)
+ var/turf/target_turf= get_turf(target)
+ if(istype(target_turf, /turf/closed/mineral))
+ var/turf/closed/mineral/M = target_turf
+ M.gets_drilled(firer)
+ PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, target_turf)
+ . = ..()
+
+
+//AoE
+
+/obj/item/projectile/kinetic/hyper
+ name = "kinetic explosion"
+ damage = 10
+ range = 3
+
+/obj/item/projectile/kinetic/hyper/proc/aoe_blast(atom/target)
+ var/turf/target_turf = get_turf(target)
+ if(!target_turf)
+ target_turf = get_turf(src)
+ PoolOrNew(/obj/effect/overlay/temp/explosion/fast, target_turf)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(istype(T, /turf/closed/mineral))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(firer)
+
+/obj/item/projectile/kinetic/hyper/on_range()
+ aoe_blast()
+ ..()
+
+/obj/item/projectile/kinetic/hyper/on_hit(atom/target)
+ aoe_blast(target)
+ . = ..()
+
+
+
+
+
+//Modkits
+
+/obj/item/modkit
+ name = "modification kit"
+ desc = "An upgrade for kinetic accelerators.."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "modkit"
+ origin_tech = "programming=2;materials=2;magnets=4"
+ var/cost = 2
+
+/obj/item/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ return
+
+/obj/item/modkit/proc/modify_projectile(/obj/item/projectile/kinetic/K)
+ return
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 7154426dae5..7757df71821 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -82,146 +82,6 @@
ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
ammo_x_offset = 2
-/obj/item/weapon/gun/energy/kinetic_accelerator
- name = "proto-kinetic accelerator"
- desc = "In the year 2544, only a year after the discovery of a potentially \
- world-changing substance, now colloquially referred to as plasma, the \
- Nanotrasen-UEG mining conglomerate introduced a prototype of a gun-like \
- device intended for quick, effective mining of plasma in the low \
- pressures of the solar system. Included in this presentation were \
- demonstrations of the gun being fired at collections of rocks contained \
- in vacuumed environments, obliterating them instantly while maintaining \
- the structure of the ores buried within them. Additionally, volunteers \
- were called from the crowd to have the gun used on them, only proving that \
- the gun caused little harm to objects in standard pressure. \n\
- An official from an unnamed, now long dissipated company observed this \
- presentation and offered to share their self-recharger cells, powered \
- by the user's bioelectrical field, another new and unknown technology. \
- They warned that the cells were incredibly experimental and several times \
- had injured workers, but the scientists as Nanotrasen were unable to resist \
- the money-saving potential of self recharging cells. Upon accepting this \
- offer, it took only a matter of days to prove the volatility of these cells, \
- as they exploded left and right whenever inserted into the prototype devices, \
- only throwing more money in the bin. \n\
- Whenever the Nanotrasen scientists were on the edge of giving up, a \
- breakthrough was made by head researcher Miles Parks McCollum, who \
- demonstrated that the cells could be stabilized when exposed to radium \
- then cooled with cryostylane. After this discovery, the low pressure gun, \
- now named the Kinetic Accelerator, was hastily completed and made compatible \
- with the self-recharging cells. As a result of poor testing, the currently \
- used guns lose their charge when not in use, and when two Kinetic Accelerators \
- come in proximity of one another, they will interfere with each other. Despite \
- this, the shoddy guns still see use in the mining of plasma to this day."
- icon_state = "kineticgun"
- item_state = "kineticgun"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
- cell_type = /obj/item/weapon/stock_parts/cell/emproof
- // Apparently these are safe to carry? I'm sure goliaths would disagree.
- needs_permit = 0
- unique_rename = 1
- origin_tech = "combat=3;powerstorage=3;engineering=3"
- weapon_weight = WEAPON_LIGHT
- can_flashlight = 1
- flight_x_offset = 15
- flight_y_offset = 9
- var/overheat_time = 16
- var/holds_charge = FALSE
- var/unique_frequency = FALSE // modified by KA modkits
- var/overheat = FALSE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/super
- name = "super-kinetic accelerator"
- desc = "An upgraded, superior version of the proto-kinetic accelerator."
- icon_state = "kineticgun_u"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic/super)
- overheat_time = 15
- origin_tech = "materials=5;powerstorage=3;engineering=4;magnets=3;combat=3"
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/hyper
- name = "hyper-kinetic accelerator"
- desc = "An upgraded, even more superior version of the proto-kinetic accelerator."
- icon_state = "kineticgun_h"
- ammo_type = list(/obj/item/ammo_casing/energy/kinetic/hyper)
- overheat_time = 14
- origin_tech = "materials=6;powerstorage=4;engineering=4;magnets=4;combat=4"
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
- holds_charge = TRUE
- unique_frequency = TRUE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
- holds_charge = TRUE
- unique_frequency = TRUE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/New()
- . = ..()
- if(!holds_charge)
- empty()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
- . = ..()
- attempt_reload()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
- . = ..()
- if(!can_shoot())
- attempt_reload()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/dropped()
- . = ..()
- if(!holds_charge)
- // Put it on a delay because moving item from slot to hand
- // calls dropped().
- sleep(1)
- if(!ismob(loc))
- empty()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
- power_supply.use(500)
- update_icon()
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
- if(overheat)
- return
- overheat = TRUE
-
- var/carried = 0
- if(!unique_frequency)
- for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
- loc.GetAllContents())
-
- carried++
-
- carried = max(carried, 1)
- else
- carried = 1
-
- addtimer(src, "reload", overheat_time * carried)
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
- return
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
- power_supply.give(500)
- if(!suppressed)
- playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
- else
- loc << "[src] silently charges up."
- update_icon()
- overheat = FALSE
-
-/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
- cut_overlays()
- if(!can_shoot())
- add_overlay("kineticgun_empty")
-
- if(F && can_flashlight)
- var/iconF = "flight"
- if(F.on)
- iconF = "flight_on"
- add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
-
-
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
name = "mini energy crossbow"
desc = "A weapon favored by syndicate stealth specialists."
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index aabb1fd448e..0dadac9de80 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -121,64 +121,6 @@
M.adjustBrainLoss(20)
M.hallucination += 20
-/obj/item/projectile/kinetic
- name = "kinetic force"
- icon_state = null
- damage = 10
- damage_type = BRUTE
- flag = "bomb"
- range = 3
-
-/obj/item/projectile/kinetic/super
- damage = 11
- range = 4
-
-/obj/item/projectile/kinetic/New()
- var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 50)
- name = "full strength [name]"
- damage *= 4
- ..()
-
-/obj/item/projectile/kinetic/on_range()
- PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, loc)
- ..()
-
-/obj/item/projectile/kinetic/on_hit(atom/target)
- var/turf/target_turf= get_turf(target)
- if(istype(target_turf, /turf/closed/mineral))
- var/turf/closed/mineral/M = target_turf
- M.gets_drilled(firer)
- PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, target_turf)
- . = ..()
-
-/obj/item/projectile/kinetic/hyper
- name = "kinetic explosion"
- damage = 12
- range = 5
-
-/obj/item/projectile/kinetic/hyper/proc/aoe_blast(atom/target)
- var/turf/target_turf = get_turf(target)
- if(!target_turf)
- target_turf = get_turf(src)
- PoolOrNew(/obj/effect/overlay/temp/explosion/fast, target_turf)
- for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
- if(istype(T, /turf/closed/mineral))
- var/turf/closed/mineral/M = T
- M.gets_drilled(firer)
-
-/obj/item/projectile/kinetic/hyper/on_range()
- aoe_blast()
- ..()
-
-/obj/item/projectile/kinetic/hyper/on_hit(atom/target)
- aoe_blast(target)
- . = ..()
-
/obj/item/projectile/beam/wormhole
name = "bluespace beam"
icon_state = "spark"
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index efd4a585fce..51b50bb9397 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -5,12 +5,20 @@
color = "#FFFFFF"
var/complementary_color = "#000000" //a color that's complementary to the normal blob color
var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects
+ var/effectdesc = null //any long, blob-tile specific effects
var/analyzerdescdamage = "Unknown. Report this bug to a coder, or just adminhelp."
var/analyzerdesceffect = "N/A"
var/blobbernaut_message = "slams" //blobbernaut attack verb
var/message = "The blob strikes you" //message sent to any mob hit by the blob
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
+/datum/reagent/blob/proc/send_message(mob/living/M)
+ var/totalmessage = message
+ if(message_living && !issilicon(M))
+ totalmessage += message_living
+ totalmessage += "!"
+ M << "[totalmessage]"
+
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
@@ -34,44 +42,13 @@
/datum/reagent/blob/proc/emp_reaction(obj/effect/blob/B, severity) //when the blob is hit with an emp, do this
return
-//does low toxin damage, but creates fragile spores when expanding or killed by weak attacks
-/datum/reagent/blob/sporing_pods
- name = "Sporing Pods"
- id = "sporing_pods"
- description = "will do very low toxin damage and produce fragile spores when killed or on expanding."
- shortdesc = "will do very low toxin damage."
- analyzerdescdamage = "Does very low toxin damage."
- analyzerdesceffect = "Produces spores when expanding and when killed."
- color = "#E88D5D"
- complementary_color = "#5DB8E8"
- message_living = ", and you feel sick"
-
-/datum/reagent/blob/sporing_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- M.apply_damage(0.2*reac_volume, TOX)
-
-/datum/reagent/blob/sporing_pods/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
- if(!isnull(cause) && damage <= 20 && original_health - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 30% chance of a shitty spore.
- B.visible_message("A spore floats free of the blob!")
- var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
- BS.overmind = B.overmind
- BS.update_icons()
- B.overmind.blob_mobs.Add(BS)
- return ..()
-
-/datum/reagent/blob/sporing_pods/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
- if(prob(12))
- var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
- BS.overmind = B.overmind
- BS.update_icons()
- newB.overmind.blob_mobs.Add(BS)
-
//does brute damage but can replicate when damaged and has a chance of expanding again
/datum/reagent/blob/replicating_foam
name = "Replicating Foam"
id = "replicating_foam"
- description = "will do medium brute damage, take increased brute damage, and expand when burned."
+ description = "will do medium brute damage and occasionally expand again when expanding."
shortdesc = "will do medium brute damage."
+ effectdesc = "will also expand when attacked with burn damage, but takes more brute damage."
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "Expands when attacked with burn damage, will occasionally expand again when expanding, and is fragile to brute damage."
color = "#7B5A57"
@@ -79,13 +56,13 @@
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.5*reac_volume, BRUTE)
+ M.apply_damage(0.7*reac_volume, BRUTE)
/datum/reagent/blob/replicating_foam/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
var/effectivedamage = damage
if(damage_type == BRUTE)
effectivedamage = damage * 2
- if(damage_type == BURN && effectivedamage > 0 && original_health - effectivedamage > 0 && prob(75))
+ if(damage_type == BURN && effectivedamage > 0 && original_health - effectivedamage > 0 && prob(60))
var/obj/effect/blob/newB = B.expand(null, null, 0)
if(newB)
newB.health = original_health - effectivedamage
@@ -95,14 +72,14 @@
/datum/reagent/blob/replicating_foam/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
if(prob(30))
- newB.expand() //do it again!
+ newB.expand(null, null, 0) //do it again!
//does brute damage, shifts away when damaged
/datum/reagent/blob/shifting_fragments
name = "Shifting Fragments"
id = "shifting_fragments"
- description = "will do medium brute damage and shift away from damage."
- shortdesc = "will do medium brute damage."
+ description = "will do medium brute damage."
+ effectdesc = "will also cause blob parts to shift away when attacked."
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "When attacked, may shift away from the attacker."
color = "#C8963C"
@@ -110,18 +87,18 @@
/datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.6*reac_volume, BRUTE)
+ M.apply_damage(0.7*reac_volume, BRUTE)
/datum/reagent/blob/shifting_fragments/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
- if(istype(B, /obj/effect/blob/normal) || (istype(B, /obj/effect/blob/shield) && prob(20)))
+ if(istype(B, /obj/effect/blob/normal) || (istype(B, /obj/effect/blob/shield) && prob(25)))
newB.forceMove(get_turf(B))
B.forceMove(T)
/datum/reagent/blob/shifting_fragments/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
- if(cause && damage > 0 && original_health - damage > 0 && prob(40))
+ if(cause && damage > 0 && original_health - damage > 0 && prob(60-damage))
var/list/blobstopick = list()
for(var/obj/effect/blob/OB in orange(1, B))
- if((istype(OB, /obj/effect/blob/normal) || istype(OB, /obj/effect/blob/shield)) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
+ if((istype(OB, /obj/effect/blob/normal) || (istype(OB, /obj/effect/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
blobstopick += OB //as long as the blob picked is valid; ie, a normal or shield blob that has the same chemical as we do, we can swap with it
if(blobstopick.len)
var/obj/effect/blob/targeted = pick(blobstopick) //randomize the blob chosen, because otherwise it'd tend to the lower left
@@ -130,103 +107,57 @@
B.forceMove(T) //swap the blobs
return ..()
-//does low burn and a lot of stamina damage, immune to tesla bolts, weak to EMP
-/datum/reagent/blob/energized_fibers
- name = "Energized Fibers"
- id = "energized_fibers"
- description = "will do low burn and high stamina damage and conduct electricity, but is weak to EMPs."
- shortdesc = "will do low burn and high stamina damage."
- analyzerdescdamage = "Does low burn damage and massively drains stamina."
- analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
- color = "#EFD65A"
- complementary_color = "#5A73EF"
- blobbernaut_message = "shocks"
- message_living = ", and you feel a strong tingling sensation"
-
-/datum/reagent/blob/energized_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- M.apply_damage(0.6*reac_volume, BURN)
- if(M)
- M.adjustStaminaLoss(0.6*reac_volume)
-
-/datum/reagent/blob/energized_fibers/tesla_reaction(obj/effect/blob/B, power)
- return 0
-
-/datum/reagent/blob/energized_fibers/emp_reaction(obj/effect/blob/B, severity)
- var/damage = rand(30, 50) - severity * rand(10, 15)
- B.take_damage(damage, BURN)
-
-//sets you on fire, does burn damage, weak to water
-/datum/reagent/blob/boiling_oil
- name = "Boiling Oil"
- id = "boiling_oil"
- description = "will do medium burn damage and set targets on fire, but is weak to water."
- shortdesc = "will do medium burn damage and set targets on fire."
+//sets you on fire, does burn damage, explodes into flame when burnt, weak to water
+/datum/reagent/blob/blazing_oil
+ name = "Blazing Oil"
+ id = "blazing_oil"
+ description = "will do medium burn damage and set targets on fire."
+ effectdesc = "will also release bursts of flame when burnt, but takes damage from water."
analyzerdescdamage = "Does medium burn damage and sets targets on fire."
- analyzerdesceffect = "Takes damage from water and other extinguishing liquids."
+ analyzerdesceffect = "Releases fire when burnt, but takes damage from water and other extinguishing liquids."
color = "#B68D00"
- complementary_color = "#0029B6"
+ complementary_color = "#BE5532"
blobbernaut_message = "splashes"
message = "The blob splashes you with burning oil"
message_living = ", and you feel your skin char and melt"
-/datum/reagent/blob/boiling_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+/datum/reagent/blob/blazing_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_fire_stacks(round(reac_volume/10))
M.IgniteMob()
if(M)
- M.apply_damage(0.6*reac_volume, BURN)
+ M.apply_damage(0.8*reac_volume, BURN)
if(iscarbon(M))
M.emote("scream")
-/datum/reagent/blob/boiling_oil/extinguish_reaction(obj/effect/blob/B)
+/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/effect/blob/B)
B.take_damage(rand(1, 3), BURN)
-//does burn and toxin damage, explodes into flame when hit with burn damage
-/datum/reagent/blob/flammable_goo
- name = "Flammable Goo"
- id = "flammable_goo"
- description = "will do medium burn and toxin damage, make targets flammable, and ignite when burned."
- shortdesc = "will do medium burn and toxin damage, and make targets flammable."
- analyzerdescdamage = "Does medium burn damage, medium toxin damage, and makes targets flammable."
- analyzerdesceffect = "Releases bursts of flame when attacked with burn damage, but takes additional burn damage."
- color = "#BE5532"
- complementary_color = "#329BBE"
- blobbernaut_message = "splashes"
- message = "The blob splashes you with a thin goo"
- message_living = ", and you smell a faint, sweet scent"
-
-/datum/reagent/blob/flammable_goo/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- M.adjust_fire_stacks(round(reac_volume/8)) //apply, but don't ignite
- M.apply_damage(0.4*reac_volume, TOX)
- if(M)
- M.apply_damage(0.4*reac_volume, BURN)
-
-/datum/reagent/blob/flammable_goo/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
+/datum/reagent/blob/blazing_oil/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(cause && damage_type == BURN)
for(var/turf/open/T in range(1, B))
var/obj/effect/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) && prob(80))
PoolOrNew(/obj/effect/hotspot, T)
- return damage * 1.5
return ..()
-//does toxin damage, targets think they're not hurt at all
+//does toxin damage, hallucination, targets think they're not hurt at all
/datum/reagent/blob/regenerative_materia
name = "Regenerative Materia"
id = "regenerative_materia"
- description = "will do low toxin damage and cause targets to believe they are fully healed."
- analyzerdescdamage = "Does low toxin damage and injects a toxin that causes the target to believe they are fully healed."
+ description = "will do toxin damage and cause targets to believe they are fully healed."
+ analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
color = "#C8A5DC"
- complementary_color = "#B9DCA5"
+ complementary_color = "#CD7794"
message_living = ", and you feel alive"
/datum/reagent/blob/regenerative_materia/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
+ M.adjust_drugginess(reac_volume)
if(M.reagents)
M.reagents.add_reagent("regenerative_materia", 0.2*reac_volume)
- M.apply_damage(0.5*reac_volume, TOX)
+ M.reagents.add_reagent("spore", 0.2*reac_volume)
+ M.apply_damage(0.7*reac_volume, TOX)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/M)
M.adjustToxLoss(1*REM)
@@ -241,149 +172,110 @@
N.hal_screwyhud = 0
..()
-//toxin, hallucination, and some bonus spore toxin
-/datum/reagent/blob/hallucinogenic_nectar
- name = "Hallucinogenic Nectar"
- id = "hallucinogenic_nectar"
- description = "will do low toxin damage, vivid hallucinations, and inject targets with toxins."
- analyzerdescdamage = "Does low toxin damage and injects a toxin that causes vivid hallucinations and blurried vision."
- color = "#CD7794"
- complementary_color = "#77CDB0"
- blobbernaut_message = "splashes"
- message = "The blob splashes you with sticky nectar"
- message_living = ", and you feel really good"
-
-/datum/reagent/blob/hallucinogenic_nectar/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- M.hallucination += reac_volume
- M.adjust_drugginess(reac_volume)
-
- if(M.reagents)
- M.reagents.add_reagent("spore", 0.2*reac_volume)
- M.apply_damage(0.5*reac_volume, TOX)
-
-//kills sleeping targets and turns them into blob zombies
-/datum/reagent/blob/zombifying_feelers
- name = "Zombifying Feelers"
- id = "zombifying_feelers"
- description = "will do low toxin damage and turn sleeping targets into blob zombies."
- analyzerdescdamage = "Does low toxin damage and kills unconscious humans, turning them into blob zombies."
- color = "#828264"
- complementary_color = "#646482"
+//kills sleeping targets and turns them into blob zombies, produces fragile spores when killed or on expanding
+/datum/reagent/blob/zombifying_pods
+ name = "Zombifying Pods"
+ id = "zombifying_pods"
+ description = "will do very low toxin damage and harvest sleeping targets for additional resources and a blob zombie."
+ effectdesc = "will also produce fragile spores when killed and on expanding."
+ shortdesc = "will do very low toxin damage and harvest sleeping targets for additional resources(for your overmind) and a blob zombie."
+ analyzerdescdamage = "Does very low toxin damage and kills unconscious humans, turning them into blob zombies."
+ analyzerdesceffect = "Produces spores when expanding and when killed."
+ color = "#E88D5D"
+ complementary_color = "#823ABB"
message_living = ", and you feel tired"
-/datum/reagent/blob/zombifying_feelers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+/datum/reagent/blob/zombifying_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
+ M.apply_damage(0.6*reac_volume, TOX)
if(O && ishuman(M) && M.stat == UNCONSCIOUS)
M.death() //sleeping in a fight? bad plan.
+ var/points = rand(5, 10)
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(get_turf(M))
BS.overmind = O
BS.update_icons()
O.blob_mobs.Add(BS)
BS.Zombify(M)
- if(M)
- M.apply_damage(0.4*reac_volume, TOX)
+ O.add_points(points)
+ O << "Gained [points] resources from the zombification of [M]."
-//toxin, stamina, and some bonus spore toxin
-/datum/reagent/blob/envenomed_filaments
- name = "Envenomed Filaments"
- id = "envenomed_filaments"
- description = "will do medium toxin and stamina damage, and inject targets with toxins."
- analyzerdescdamage = "Does medium toxin damage, drains stamina, and injects a weak toxin."
- color = "#9ACD32"
- complementary_color = "#6532CD"
- message_living = ", and you feel sick and nauseated"
+/datum/reagent/blob/zombifying_pods/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
+ if(!isnull(cause) && damage <= 20 && original_health - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
+ B.visible_message("A spore floats free of the blob!")
+ var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
+ BS.overmind = B.overmind
+ BS.update_icons()
+ B.overmind.blob_mobs.Add(BS)
+ return ..()
-/datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- if(M.reagents)
- M.reagents.add_reagent("spore", 0.2*reac_volume)
- M.apply_damage(0.4*reac_volume, TOX)
- if(M)
- M.adjustStaminaLoss(0.4*reac_volume)
+/datum/reagent/blob/zombifying_pods/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
+ if(prob(10))
+ var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
+ BS.overmind = B.overmind
+ BS.update_icons()
+ newB.overmind.blob_mobs.Add(BS)
-//does brute, fire, and toxin over a few seconds
-/datum/reagent/blob/poisonous_strands
- name = "Poisonous Strands"
- id = "poisonous_strands"
- description = "will inject targets with poison."
- analyzerdescdamage = "Injects a highly lethal poison that will gradually liquify the target's internal organs."
- color = "#7D6EB4"
- complementary_color = "#A5B46E"
- blobbernaut_message = "injects"
- message_living = ", and you feel like your insides are melting"
+//does tons of oxygen damage and a little stamina, immune to tesla bolts, weak to EMP
+/datum/reagent/blob/energized_jelly
+ name = "Energized Jelly"
+ id = "energized_jelly"
+ description = "will cause low stamina and high oxygen damage, and cause targets to be unable to breathe."
+ effectdesc = "will also conduct electricity, but takes damage from EMPs."
+ analyzerdescdamage = "Does low stamina damage, high oxygen damage, and prevents targets from breathing."
+ analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
+ color = "#EFD65A"
+ complementary_color = "#00E5B1"
+ message_living = ", and you feel a horrible tingling sensation"
+ var/datum/effect_system/spark_spread/spark_system = new/datum/effect_system/spark_spread()
-/datum/reagent/blob/poisonous_strands/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- if(M.reagents)
- M.reagents.add_reagent("poisonous_strands", 0.12*reac_volume)
-
-/datum/reagent/blob/poisonous_strands/on_mob_life(mob/living/M)
- M.adjustBruteLoss(1.5*REM)
- M.adjustFireLoss(1.5*REM)
- M.adjustToxLoss(1.5*REM)
- ..()
-
-//does oxygen damage, randomly pushes or pulls targets
-/datum/reagent/blob/cyclonic_grid
- name = "Cyclonic Grid"
- id = "cyclonic_grid"
- description = "will cause high oxygen damage and randomly throw targets to or from it."
- analyzerdescdamage = "Does high oxygen damage and randomly throws targets at or away from it."
- color = "#9BCD9B"
- complementary_color = "#CD9BCD"
- message = "The blob blasts you with a gust of air"
- message_living = ", and you can't catch your breath"
-
-/datum/reagent/blob/cyclonic_grid/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- reagent_vortex(M, rand(0, 1), reac_volume)
- M.losebreath += round(0.05*reac_volume)
- M.apply_damage(0.6*reac_volume, OXY)
-
-//does tons of oxygen damage and a little brute
-/datum/reagent/blob/lexorin_jelly
- name = "Lexorin Jelly"
- id = "lexorin_jelly"
- description = "will cause low brute and high oxygen damage, and cause targets to be unable to breathe."
- analyzerdescdamage = "Does low brute damage, high oxygen damage, and prevents targets from breathing."
- color = "#00E5B1"
- complementary_color = "#E50034"
- message_living = ", and your lungs feel heavy and weak"
-
-/datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+/datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.losebreath += round(0.2*reac_volume)
- M.apply_damage(0.2*reac_volume, BRUTE)
+ M.adjustStaminaLoss(0.4*reac_volume)
if(M)
M.apply_damage(0.6*reac_volume, OXY)
+/datum/reagent/blob/energized_jelly/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
+ if(!isnull(cause) && original_health - damage <= 0 && prob(10))
+ spark_system.set_up(rand(2, 4), 0, B)
+ spark_system.start()
+ return ..()
+
+/datum/reagent/blob/energized_jelly/tesla_reaction(obj/effect/blob/B, power)
+ return 0
+
+/datum/reagent/blob/energized_jelly/emp_reaction(obj/effect/blob/B, severity)
+ var/damage = rand(30, 50) - severity * rand(10, 15)
+ B.take_damage(damage, BURN)
+
//does aoe brute damage when hitting targets, is immune to explosions
/datum/reagent/blob/explosive_lattice
name = "Explosive Lattice"
id = "explosive_lattice"
- description = "will do brute damage in an area around targets and is resistant to explosions."
- shortdesc = "will do brute damage in an area around targets."
+ description = "will do brute damage in an area around targets."
+ effectdesc = "will also resist explosions, but takes increased damage from fire and other energy sources."
analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets."
- analyzerdesceffect = "Is highly resistant to explosions."
+ analyzerdesceffect = "Is highly resistant to explosions, but takes increased damage from fire and other energy sources."
color = "#8B2500"
complementary_color = "#00668B"
blobbernaut_message = "blasts"
message = "The blob blasts you"
/datum/reagent/blob/explosive_lattice/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+ var/initial_volume = reac_volume
reac_volume = ..()
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
- var/obj/effect/overlay/temp/explosion/E = PoolOrNew(/obj/effect/overlay/temp/explosion, get_turf(M))
+ var/obj/effect/overlay/temp/explosion/fast/E = PoolOrNew(/obj/effect/overlay/temp/explosion/fast, get_turf(M))
E.alpha = 150
- for(var/mob/living/L in orange(M, 1))
+ for(var/mob/living/L in orange(get_turf(M), 1))
if("blob" in L.faction) //no friendly fire
continue
- L.apply_damage(0.6*reac_volume, BRUTE)
+ var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
+ L.apply_damage(0.4*aoe_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BRUTE)
else
- M.apply_damage(0.8*reac_volume, BRUTE)
+ M.apply_damage(0.6*reac_volume, BRUTE)
/datum/reagent/blob/explosive_lattice/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(isnull(cause))
@@ -393,59 +285,39 @@
return damage * 1.5 //take more from fire, tesla, and flashbangs
return ..()
-//does semi-random brute damage and reacts to brute damage
-/datum/reagent/blob/reactive_gelatin
- name = "Reactive Gelatin"
- id = "reactive_gelatin"
- description = "will do random brute damage and react to brute damage."
- shortdesc = "will do random brute damage."
- analyzerdescdamage = "Does random brute damage."
- analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
- color = "#FFA500"
- complementary_color = "#005AFF"
- blobbernaut_message = "pummels"
- message = "The blob pummels you"
-
-/datum/reagent/blob/reactive_gelatin/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- var/damage = rand(5, 35)/25
- M.apply_damage(damage*reac_volume, BRUTE)
-
-/datum/reagent/blob/reactive_gelatin/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
- if(damage && damage_type == BRUTE && original_health - damage > 0) //is there any damage, is it brute, and will we be alive
- if(isliving(cause))
- B.visible_message("The blob retaliates, lashing out!")
- for(var/atom/A in range(1, B))
- A.blob_act(B)
- return ..()
-
-//does low burn damage and stamina damage and cools targets down
-/datum/reagent/blob/cryogenic_liquid
- name = "Cryogenic Liquid"
- id = "cryogenic_liquid"
- description = "will do low burn and stamina damage, and cause targets to freeze."
- analyzerdescdamage = "Does low burn damage, drains stamina, and injects targets with a freezing liquid."
+//does brute, burn, and toxin damage, and cools targets down
+/datum/reagent/blob/cryogenic_poison
+ name = "Cryogenic Poison"
+ id = "cryogenic_poison"
+ description = "will inject targets with a freezing poison that does high damage over time."
+ analyzerdescdamage = "Injects targets with a freezing poison that will gradually solidify the target's internal organs."
color = "#8BA6E9"
- complementary_color = "#E9CE8B"
- blobbernaut_message = "splashes"
- message = "The blob splashes you with an icy liquid"
- message_living = ", and you feel cold and tired"
+ complementary_color = "#7D6EB4"
+ blobbernaut_message = "injects"
+ message = "The blob stabs you"
+ message_living = ", and you feel like your insides are solidifying"
-/datum/reagent/blob/cryogenic_liquid/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+/datum/reagent/blob/cryogenic_poison/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(M.reagents)
M.reagents.add_reagent("frostoil", 0.3*reac_volume)
M.reagents.add_reagent("ice", 0.3*reac_volume)
- M.apply_damage(0.4*reac_volume, BURN)
- if(M)
- M.adjustStaminaLoss(0.3*reac_volume)
+ M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume)
+ M.apply_damage(0.2*reac_volume, BRUTE)
+
+/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/M)
+ M.adjustBruteLoss(0.3*REM, 0)
+ M.adjustFireLoss(0.3*REM, 0)
+ M.adjustToxLoss(0.3*REM, 0)
+ . = 1
+ ..()
//does burn damage and EMPs, slightly fragile
/datum/reagent/blob/electromagnetic_web
name = "Electromagnetic Web"
id = "electromagnetic_web"
- description = "will do low burn damage and EMP targets, but is very fragile."
- shortdesc = "will do low burn damage and EMP targets."
+ description = "will do high burn damage and EMP targets."
+ effectdesc = "will also take massively increased damage and release an EMP when killed."
analyzerdescdamage = "Does low burn damage and EMPs targets."
analyzerdesceffect = "Is fragile to all types of damage, but takes massive damage from brute. In addition, releases a small EMP when killed."
color = "#83ECEC"
@@ -459,7 +331,7 @@
if(prob(reac_volume*2))
M.emp_act(2)
if(M)
- M.apply_damage(0.6*reac_volume, BURN)
+ M.apply_damage(reac_volume, BURN)
/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(damage_type == BRUTE) //take full brute
@@ -480,8 +352,8 @@
/datum/reagent/blob/synchronous_mesh
name = "Synchronous Mesh"
id = "synchronous_mesh"
- description = "will do brute damage for each nearby blob and spread damage between nearby blobs."
- shortdesc = "will do brute damage for each nearby blob."
+ description = "will do massively increased brute damage for each blob near the target."
+ effectdesc = "will also spread damage between each blob near the attacked blob."
analyzerdescdamage = "Does brute damage, increasing for each blob near the target."
analyzerdesceffect = "When attacked, spreads damage between all blobs near the attacked blob."
color = "#65ADA2"
@@ -491,9 +363,9 @@
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
- M.apply_damage(0.1*reac_volume, BRUTE)
+ M.apply_damage(0.2*reac_volume, BRUTE)
if(M && reac_volume)
- for(var/obj/effect/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.5*reac_volume
+ for(var/obj/effect/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
if(M)
B.blob_attack_animation(M) //show them they're getting a bad time
M.apply_damage(0.3*reac_volume, BRUTE)
@@ -512,47 +384,37 @@
return damage * 1.25
//does brute damage through armor and bio resistance
-/datum/reagent/blob/penetrating_spines
- name = "Penetrating Spines"
- id = "penetrating_spines"
+/datum/reagent/blob/reactive_spines
+ name = "Reactive Spines"
+ id = "reactive_spines"
description = "will do medium brute damage through armor and bio resistance."
+ effectdesc = "will also react when attacked with brute damage, attacking all near the attacked blob."
analyzerdescdamage = "Does medium brute damage, ignoring armor and bio resistance."
- color = "#6E4664"
- complementary_color = "#466E50"
+ analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
+ color = "#9ACD32"
+ complementary_color = "#FFA500"
blobbernaut_message = "stabs"
message = "The blob stabs you"
-/datum/reagent/blob/penetrating_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
+/datum/reagent/blob/reactive_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
- M.adjustBruteLoss(0.7*reac_volume)
+ M.adjustBruteLoss(0.8*reac_volume)
-/datum/reagent/blob/adaptive_nexuses
- name = "Adaptive Nexuses"
- id = "adaptive_nexuses"
- description = "will do medium brute damage and kill unconscious targets, giving you bonus resources."
- shortdesc = "will do medium brute damage and kill unconscious targets, giving your overmind bonus resources."
- analyzerdescdamage = "Does medium brute damage and kills unconscious humans, reaping resources from them."
- color = "#4A64C0"
- complementary_color = "#823ABB"
-
-/datum/reagent/blob/adaptive_nexuses/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- if(O && ishuman(M) && M.stat == UNCONSCIOUS)
- PoolOrNew(/obj/effect/overlay/temp/revenant, get_turf(M))
- var/points = rand(5, 10)
- O.add_points(points)
- O << "Gained [points] resources from the death of [M]."
- M.death()
- if(M)
- M.apply_damage(0.5*reac_volume, BRUTE)
+/datum/reagent/blob/reactive_spines/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
+ if(damage && damage_type == BRUTE && original_health - damage > 0) //is there any damage, is it brute, and will we be alive
+ if(isliving(cause))
+ B.visible_message("The blob retaliates, lashing out!")
+ for(var/atom/A in range(1, B))
+ A.blob_act(B)
+ return ..()
//does low brute damage, oxygen damage, and stamina damage and wets tiles when damaged
/datum/reagent/blob/pressurized_slime
name = "Pressurized Slime"
id = "pressurized_slime"
- description = "will do low brute, oxygen, and stamina damage, and wet tiles when damaged or killed."
- shortdesc = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
+ description = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
+ effectdesc = "will also wet tiles near blobs that are attacked or killed."
analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them."
analyzerdesceffect = "When attacked or killed, wets nearby tiles, extinguishing anything on them."
color = "#AAAABB"
@@ -568,20 +430,21 @@
T.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
- M.apply_damage(0.1*reac_volume, BRUTE)
+ M.apply_damage(0.4*reac_volume, BRUTE)
if(M)
- M.apply_damage(0.3*reac_volume, OXY)
+ M.apply_damage(0.4*reac_volume, OXY)
if(M)
- M.adjustStaminaLoss(0.3*reac_volume)
+ M.adjustStaminaLoss(0.2*reac_volume)
/datum/reagent/blob/pressurized_slime/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
- extinguisharea(B, damage)
+ if(cause || damage_type != BURN)
+ extinguisharea(B, damage)
return ..()
/datum/reagent/blob/pressurized_slime/death_reaction(obj/effect/blob/B, cause)
if(!isnull(cause))
- B.visible_message("The blob ruptures, spraying the area with liquid!")
- extinguisharea(B, 50)
+ B.visible_message("The blob ruptures, spraying the area with liquid!")
+ extinguisharea(B, 50)
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance)
for(var/turf/open/T in range(1, B))
@@ -592,75 +455,3 @@
for(var/mob/living/L in T)
L.adjust_fire_stacks(-2.5)
L.ExtinguishMob()
-
-//does brute damage and throws or pulls nearby objects at the target
-/datum/reagent/blob/dark_matter
- name = "Dark Matter"
- id = "dark_matter"
- description = "will do medium brute damage and pull nearby objects and enemies at the target."
- analyzerdescdamage = "Does medium brute damage and pulls nearby objects and creatures at the target."
- color = "#61407E"
- complementary_color = "#5D7E40"
- message = "You feel a thrum as the blob strikes you, and everything flies at you"
-
-/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- reagent_vortex(M, 0, reac_volume)
- M.apply_damage(0.3*reac_volume, BRUTE)
-
-//does brute damage and throws or pushes nearby objects away from the target
-/datum/reagent/blob/b_sorium
- name = "Sorium"
- id = "b_sorium"
- description = "will do medium brute damage and throw nearby objects and enemies away from the target."
- analyzerdescdamage = "Does medium brute damage and pushes nearby objects and creatures away from the target."
- color = "#808000"
- complementary_color = "#000080"
- message = "The blob slams into you and sends you flying"
-
-/datum/reagent/blob/b_sorium/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
- reac_volume = ..()
- reagent_vortex(M, 1, reac_volume)
- M.apply_damage(0.3*reac_volume, BRUTE)
-
-/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type, reac_volume)
- if(M && reac_volume)
- var/turf/pull = get_turf(M)
- var/range_power = Clamp(round(reac_volume/5, 1), 1, 5)
- for(var/atom/movable/X in range(range_power,pull))
- if(istype(X, /obj/effect))
- continue
- if(isliving(X))
- var/mob/living/L = X
- if("blob" in L.faction) //no friendly throwpulling
- continue
- if(!X.anchored)
- var/distance = get_dist(X, pull)
- var/moving_power = max(range_power - distance, 1)
- if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
- if(setting_type)
- var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
- var/throw_range = 5 - distance
- X.throw_at_fast(throw_target, throw_range, 1)
- else
- X.throw_at_fast(pull, distance, 1)
- else
- spawn(0)
- if(setting_type)
- for(var/i in 0 to moving_power-1)
- sleep(2)
- if(!step_away(X, pull))
- break
- else
- for(var/i in 0 to moving_power-1)
- sleep(2)
- if(!step_towards(X, pull))
- break
-
-
-/datum/reagent/blob/proc/send_message(mob/living/M)
- var/totalmessage = message
- if(message_living && !issilicon(M))
- totalmessage += message_living
- totalmessage += "!"
- M << "[totalmessage]"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 41b58622d1b..010a4105883 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -23,12 +23,13 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
"Hydroponics Machinery",
"Subspace Telecomms",
"Research Machinery",
- "Misc. Machinery"
+ "Misc. Machinery",
+ "Computer Parts"
)
/obj/machinery/r_n_d/circuit_imprinter/New()
..()
- materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND))
+ materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL))
create_reagents(0)
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null)
B.apply_default_parts(src)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 8d2f17106e7..3f20d597265 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -159,7 +159,7 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
category = list("Mining Designs")
-/datum/design/modkit
+/*/datum/design/modkit
name = "Modification Kit"
desc = "A device which allows kinetic accelerators to be wielded with one hand, and by any organism."
id = "modkit"
@@ -188,7 +188,7 @@ other types of metals and chemistry for reagents).
materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/hyper
category = list("Mining Designs")
-
+*/
/datum/design/superresonator
name = "Upgraded Resonator"
desc = "An upgraded version of the resonator that allows more fields to be active at once."
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 8e5bfa55e6d..565ec192dfb 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -728,3 +728,18 @@
build_path = /obj/item/conveyor_switch_construct
category = list("initial", "Construction")
+/datum/design/laptop
+ name = "Laptop Frame"
+ id = "laptop"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1200, MAT_GLASS = 200)
+ build_path = /obj/machinery/modular_computer/laptop/buildable
+ category = list("initial","Misc")
+
+/datum/design/tablet
+ name = "Tablet Frame"
+ id = "tablet"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 1000)
+ build_path = /obj/item/modular_computer/tablet
+ category = list("initial","Misc")
\ No newline at end of file
diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm
new file mode 100644
index 00000000000..ae91050960e
--- /dev/null
+++ b/code/modules/research/designs/computer_part_designs.dm
@@ -0,0 +1,245 @@
+////////////////////////////////////////
+///////////Computer Parts///////////////
+////////////////////////////////////////
+
+/datum/design/disk/normal
+ name = "basic hard drive"
+ id = "hdd_basic"
+ req_tech = list("programming" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 100)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/
+ category = list("Computer Parts")
+
+/datum/design/disk/advanced
+ name = "advanced hard drive"
+ id = "hdd_advanced"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced
+ category = list("Computer Parts")
+
+/datum/design/disk/super
+ name = "super hard drive"
+ id = "hdd_super"
+ req_tech = list("programming" = 3, "engineering" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1600, MAT_GLASS = 400)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/super
+ category = list("Computer Parts")
+
+/datum/design/disk/cluster
+ name = "cluster hard drive"
+ id = "hdd_cluster"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3200, MAT_GLASS = 800)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster
+ category = list("Computer Parts")
+
+/datum/design/disk/small
+ name = "small hard drive"
+ id = "hdd_small"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/small
+ category = list("Computer Parts")
+
+/datum/design/disk/micro
+ name = "micro hard drive"
+ id = "hdd_micro"
+ req_tech = list("programming" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400, MAT_GLASS = 100)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/micro
+ category = list("Computer Parts")
+
+// Network cards
+/datum/design/netcard/basic
+ name = "basic network card"
+ id = "netcard_basic"
+ req_tech = list("programming" = 2, "engineering" = 1)
+ build_type = IMPRINTER
+ materials = list(MAT_METAL = 250, MAT_GLASS = 100)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card
+ category = list("Computer Parts")
+
+/datum/design/netcard/advanced
+ name = "advanced network card"
+ id = "netcard_advanced"
+ req_tech = list("programming" = 4, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_METAL = 500, MAT_GLASS = 200)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card/advanced
+ category = list("Computer Parts")
+
+/datum/design/netcard/wired
+ name = "wired network card"
+ id = "netcard_wired"
+ req_tech = list("programming" = 5, "engineering" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 400)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/network_card/wired
+ category = list("Computer Parts")
+
+// Data crystals (USB flash drives)
+/datum/design/portabledrive/basic
+ name = "basic data crystal"
+ id = "portadrive_basic"
+ req_tech = list("programming" = 1)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 800)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable
+ category = list("Computer Parts")
+
+/datum/design/portabledrive/advanced
+ name = "advanced data crystal"
+ id = "portadrive_advanced"
+ req_tech = list("programming" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1600)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced
+ category = list("Computer Parts")
+
+/datum/design/portabledrive/super
+ name = "super data crystal"
+ id = "portadrive_super"
+ req_tech = list("programming" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 3200)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super
+ category = list("Computer Parts")
+
+// Card slot
+/datum/design/cardslot
+ name = "RFID card slot"
+ id = "cardslot"
+ req_tech = list("programming" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600)
+ build_path = /obj/item/weapon/computer_hardware/card_slot
+ category = list("Computer Parts")
+
+// Nano printer
+/datum/design/nanoprinter
+ name = "nano printer"
+ id = "nanoprinter"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 600)
+ build_path = /obj/item/weapon/computer_hardware/nano_printer
+ category = list("Computer Parts")
+
+// Tesla Link
+/datum/design/teslalink
+ name = "tesla link"
+ id = "teslalink"
+ req_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000)
+ build_path = /obj/item/weapon/computer_hardware/tesla_link
+ category = list("Computer Parts")
+
+// Batteries
+/datum/design/battery/normal
+ name = "standard battery module"
+ id = "bat_normal"
+ req_tech = list("powerstorage" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400)
+ build_path = /obj/item/weapon/computer_hardware/battery_module
+ category = list("Computer Parts")
+
+/datum/design/battery/advanced
+ name = "advanced battery module"
+ id = "bat_advanced"
+ req_tech = list("powerstorage" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 800)
+ build_path = /obj/item/weapon/computer_hardware/battery_module/advanced
+ category = list("Computer Parts")
+
+/datum/design/battery/super
+ name = "super battery module"
+ id = "bat_super"
+ req_tech = list("powerstorage" = 3, "engineering" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1600)
+ build_path = /obj/item/weapon/computer_hardware/battery_module/super
+ category = list("Computer Parts")
+
+/datum/design/battery/ultra
+ name = "ultra battery module"
+ id = "bat_ultra"
+ req_tech = list("powerstorage" = 5, "engineering" = 4)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3200)
+ build_path = /obj/item/weapon/computer_hardware/battery_module/ultra
+ category = list("Computer Parts")
+
+/datum/design/battery/nano
+ name = "nano battery module"
+ id = "bat_nano"
+ req_tech = list("powerstorage" = 1, "engineering" = 1)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 200)
+ build_path = /obj/item/weapon/computer_hardware/battery_module/nano
+ category = list("Computer Parts")
+
+/datum/design/battery/micro
+ name = "micro battery module"
+ id = "bat_micro"
+ req_tech = list("powerstorage" = 2, "engineering" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 400)
+ build_path = /obj/item/weapon/computer_hardware/battery_module/micro
+ category = list("Computer Parts")
+
+// Processor unit
+/datum/design/cpu
+ name = "computer processor unit"
+ id = "cpu_normal"
+ req_tech = list("programming" = 3, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1600)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit
+ category = list("Computer Parts")
+
+/datum/design/cpu/small
+ name = "computer microprocessor unit"
+ id = "cpu_small"
+ req_tech = list("programming" = 2, "engineering" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 800)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/small
+ category = list("Computer Parts")
+
+/datum/design/cpu/photonic
+ name = "computer photonic processor unit"
+ id = "pcpu_normal"
+ req_tech = list("programming" = 5, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS= 6400, MAT_GOLD = 2000)
+ reagents = list("sacid" = 40)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic
+ category = list("Computer Parts")
+
+/datum/design/cpu/photonic/small
+ name = "computer photonic microprocessor unit"
+ id = "pcpu_small"
+ req_tech = list("programming" = 4, "engineering" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 3200, MAT_GOLD = 1000)
+ reagents = list("sacid" = 20)
+ build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small
+ category = list("Computer Parts")
\ No newline at end of file
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 3ed57ca5fea..3b510ae40ba 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -386,3 +386,11 @@
req_tech = list("programming" = 4, "biotech" = 3)
build_path = /obj/item/weapon/circuitboard/machine/plantgenes
category = list ("Misc. Machinery")
+
+/datum/design/board/ntnet_relay
+ name = "Machine Design (NTNet Relay Board)"
+ desc = "The circuit board for a wireless network relay."
+ id = "ntnet_relay"
+ req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2)
+ build_path = /obj/item/weapon/circuitboard/machine/ntnet_relay
+ category = list("Subspace Telecomms")
\ No newline at end of file
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 6a02b6b0f3b..1b526830d0c 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -26,7 +26,8 @@ Note: Must be placed west/left of and R&D console to function.
"Electronics",
"Weapons",
"Ammo",
- "Firing Pins"
+ "Firing Pins",
+ "Computer Parts"
)
diff --git a/code/modules/stock_market/events.dm b/code/modules/stock_market/events.dm
index 1e34fddf03d..72f9858ea3d 100644
--- a/code/modules/stock_market/events.dm
+++ b/code/modules/stock_market/events.dm
@@ -165,7 +165,7 @@
"public indecency", "public intoxication", "trespassing", "loitering", "littering", "vigilantism", "squatting", "panhandling", "arson", "spacepodjacking", "shuttlejacking", "carjacking", "singularityjacking",
"dereliction of duty", "spacecraft piracy", "music piracy", "tabletop game piracy", "software piracy", "escaping from space prison", "seniornapping", "clownnapping", "corginapping", "catnapping",
"sleeping on the job", "terrorism", "counterterrorism", "drug distribution", "insubordination", "jaywalking", "owning a computer", "owning a cellphone", "owning a PDA", "owning a pAI", "adultery",
- "committing an unnatural act with another person", "corrupting public morals", "skateboarding without a license", "shitcurity", "bestiality", "erotic roleplay")
+ "committing an unnatural act with another person", "corrupting public morals", "skateboarding without a license", "shitcurity", "bestiality", "erotic roleplay", "accidentally strangling a prostitute")
while (prob(60) && O.len > 2)
var/offense = pick(O)
O -= offense
@@ -225,4 +225,4 @@
else
article += "[tname] has a prior history of similar misdeeds and we're confident the charges will stand. For investors, now would be an ideal time to %sell%"
A.article = A.detokenize(article, company.industry.tokens)
- return A
\ No newline at end of file
+ return A
diff --git a/config/tips.txt b/config/tips.txt
index 4985387309a..917443afefa 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -130,15 +130,15 @@ As an Alien, you take double damage from all burn attacks, such as lasers, weldi
As an Alien, resin floors not only regenerate your plasma supply, but also passively heal you. Fight on resin floors to gain a home turf advantage!
As an Alien, the facehugger is by far your most powerful weapon because of its ability to instantly win a fight. Remember however that certain helmets, such as biohoods or space helmets will completely block facehugger attacks.
As an Alien, you are unable to pick up or use any human items or machinery. Instead, you should focus on sabotaging APCs, computers, cameras and either stowing, spacing, or melting any weapons you find.
-When fighting the Blob, you can hit it with an analyzer to check its chemical effects and the type of blob analyzed. Examining it with a research scanner active will also reveal this information.
+When fighting the Blob, you can hit it with an analyzer to check its chemical effects and the type of blob analyzed. Examining it with a research scanner or medical hud active will also reveal this information.
As the Blob, you can place your core at any clear, unobserved, spot you can move to after 3 minutes have passed. If you wait too long, you will be automatically placed at a random location. Use this wait time to coordinate with any other overminds.
As the Blob, keep your core some distance from space, as it is both expensive to expand onto space, easy to be attacked from, and does not count towards your win condition. Emitter platforms built in space are especially dangerous.
As the Blob, you can randomly repick your reagent type if the crew has adapted and protected themselves against your current one.
As the Blob, you fight a war of attrition: Take out medbay and fight in chokepoints to prevent continued assaults and coordinated burst damage attacks!
-As the Blob, remember that you can only expand onto tiles from cardinal directions, while the crew can attack you diagonally. Fight in narrow corridors or expand and widen across the width of the hallway to force confrontations where you can hit them!
+As the Blob, you can attack anything next to a blob, but can only expand in cardinal directions, and diagonal attacks are slightly weaker.
As the Blob, don't neglect the creation of factories. These create spores that carry your reagent and can chase crewmembers far further than you. Spores can also be rallied to swarm the crew and cause panic, and can even take over corpses to create much more dangerous blob zombies!
As the Blob, you can produce a Blobbernaut from a factory for 40 resources. Blobbernauts are smart, gradually regenerate near nodes, and apply your chemical when attacking, but die when too far from the blob or if their factory is killed. However, the factory used becomes fragile and stops spawning spores.
-As the Blob, you can expand by clicking, create strong blobs with ctrl-click, rally spores with middle-click, and remove blobs with alt-click.
+As the Blob, you can expand by clicking, create strong blobs with ctrl-click, rally spores with middle-click, and remove blobs with alt-click. You do not need to have your camera over the tile to do this.
As the Blob, removing strong blobs, resource nodes, factories, and nodes will give you 4, 15, 25, and 25 resources back, respectively.
As the Blob, talking will send a message to all other overminds and all Blobbernauts, allowing you to direct attacks and coordinate.
As a Blobbernaut, you can communicate with overminds and other Blobbernauts via :b.
diff --git a/html/changelog.html b/html/changelog.html
index dd9d02f6e96..84fd2470d95 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,75 @@
-->
+ 17 August 2016
+ Basilman updated:
+
+ - Added an admin-spawnable only "Cosmohonk" hardsuit that has the same protection values of an engineering hardsuit. Comes with built-in lights and requires clown roundstart role to be equipped.
+
+ Ergovisavi updated:
+
+ - Adds the "Proto-Kinetic Crusher", a new melee mining weapon. Available at a mining vendor near you!
+
+ Gun Hog updated:
+
+ - Nanotrasen has improved the coolant system in the stations automated robots. They will no longer violently explode in hot rooms.
+
+ Joan updated:
+
+ - Once the blob alert message is sent in the blob game mode, all mobs get to see how many tiles the blob has until it wins, via the Status tab.
+ - Removed/merged a bunch of blob chems, you probably don't care about the specifics.
+ - The remaining blob chems should, overall, be more powerful.
+ - Shield blobs soak brute damage less well.
+ - Flashbangs do higher damage to blobs up close, but their damage falls off faster.
+ - Shield blobs now cost 15 resources to make instead of 10. Node blobs now cost 50 resources to make instead of 60.
+ - Expanding/attacking now costs 4 resources instead of 5, and blobs can now ATTACK DIAGONALLY. Diagonal attacks are weaker than normal attacks, especially against cyborgs(which may be entirely immune, depending), and they remain unable to expand diagonally.
+ - Shield blobs no longer block atmos while under half health. Shield blobs are still immune to fire, even if they can't block atmos.
+ - Blobs should block explosions less well.
+ - Blob cores and nodes are no longer immune to fire and no longer block atmos.
+ - Blobs can only auto-expand one tile at a time per expanding thing, and should be easier to beat back in general.
+ - Blobbernauts now attack faster.
+ - Blob Overminds attack mobs slower but can attack non-mobs much faster.
+ - Blob Overminds start with some amount of resources; in the gamemode, it's 80 divided by the number of overminds, in the event, it's 20 plus the number of active players, and otherwise, it's 60.
+ - You can no longer move blob cores into space, onto the mining shuttle, white ship, gulag shuttle, or solars.
+ - Blob rounds might be less laggy, if they were laggy?
+ - Blobs don't heal as fast, excluding the core.
+ - Blobs are marginally less destructive to their environment.
+
+ MrStonedOne updated:
+
+ - The server will no longer wait until the next tick to process movement key presses. Movements should now be ~25-50ms more responsive.
+
+ Shadowlight213 updated:
+
+ - Adds modular computers
+
+
+ 16 August 2016
+ MrStonedOne updated:
+
+ - Automated the granting of profiler access to admins
+
+ oranges updated:
+
+ - Nanotrasen is an all right kind of company
+
+
+ 15 August 2016
+ Joan updated:
+
+ - The Ark of the Clockwork Justicar can now be constructed even if Ratvar's rise is not the objective.
+ - Accordingly, its behavior is different; instead of summoning Ratvar, it will convert a massive amount of the station, and should effectively instantly complete the clockwork cult's objectives.
+
+ MrStonedOne updated:
+
+ - Tweaked the lag stop numbers to hopefully reduce lag during 80+ population
+ - Fixed the blackbox not blackboxing.
+
+ OSCAR MIKE updated:
+
+ - CONTACT ON THE LEFT SIDE!
+
+
14 August 2016
Cheridan updated:
@@ -1146,40 +1215,6 @@
- Polymorphed mobs now have the same name, and where possible, the same equipment as their previous form.
-
- 14 June 2016
- Joan updated:
-
- - The Gateway to the Celestial Derelict now takes exactly 5 minutes to successfully summon Ratvar and has 500 health, from 1000.
- - You can now actually hit people adjacent to the Gateway; only the center of the Gateway can be attacked. The Gateway is also now dense, allowing you to more easily shoot at it.
- - All Scripture in the Clockwork Slab's recital has a simple description.
-
- Razharas updated:
-
- - Wiki now has the method of cultivating kudzu vines that was in game for over a year. https://tgstation13.org/wiki/Guide_to_hydroponics#Kudzu
-
- kevinz000 updated:
-
- - Gravity Guns should no longer destroy local reality when set to attract and shot in an east cardinal direction. Added safety checks has slightly increased the cost of the gun's fabrication. Nanotrasen apologizes for the inconvenience.
- - Gravity guns now have an inhand sprite.
-
-
- 13 June 2016
- Joan updated:
-
- - Sigils of Transgression will now only stun for about 5 seconds, from around 10 seconds.
- - Sigils of Submission take about 5 seconds to convert a target, from around 3 seconds, and will glow faintly.
- - Sigils of any type can be attacked with an open hand to destroy them, instead of requiring harm intent. Servants still require harm intent to do so.
-
- Lati updated:
-
- - Nanotrasen has added one of their rare machine prototypes to cargo's selection. It might be valuable to research.
-
- Xhuis updated:
-
- - You can now create living cake/cat hybrids through a slightly expensive crafting recipe. These "caks" are remarkably resilient, quickly regenerating any brute damage dealt, and can be attacked on harm intent to take a bite to be fed by a small amount. They serve as mobile sources of food and make great pets.
- - If a brain occupied by a player is used in the crafting recipe for caks, that player then takes control of the cak!
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 39da5c1bb70..fec90c2c882 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6615,3 +6615,68 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
gun, and the DRAGnet capture and recovery system.
optional name here:
- bugfix: The syndicate uplink ui has been refactored to majorly reduce lag
+2016-08-15:
+ Joan:
+ - rscadd: The Ark of the Clockwork Justicar can now be constructed even if Ratvar's
+ rise is not the objective.
+ - experiment: Accordingly, its behavior is different; instead of summoning Ratvar,
+ it will convert a massive amount of the station, and should effectively instantly
+ complete the clockwork cult's objectives.
+ MrStonedOne:
+ - tweak: Tweaked the lag stop numbers to hopefully reduce lag during 80+ population
+ - tweak: Fixed the blackbox not blackboxing.
+ OSCAR MIKE:
+ - rscadd: CONTACT ON THE LEFT SIDE!
+2016-08-16:
+ MrStonedOne:
+ - rscadd: Automated the granting of profiler access to admins
+ oranges:
+ - rscadd: Nanotrasen is an all right kind of company
+2016-08-17:
+ Basilman:
+ - rscadd: Added an admin-spawnable only "Cosmohonk" hardsuit that has the same protection
+ values of an engineering hardsuit. Comes with built-in lights and requires clown
+ roundstart role to be equipped.
+ Ergovisavi:
+ - rscadd: Adds the "Proto-Kinetic Crusher", a new melee mining weapon. Available
+ at a mining vendor near you!
+ Gun Hog:
+ - tweak: Nanotrasen has improved the coolant system in the stations automated robots.
+ They will no longer violently explode in hot rooms.
+ Joan:
+ - rscadd: Once the blob alert message is sent in the blob game mode, all mobs get
+ to see how many tiles the blob has until it wins, via the Status tab.
+ - rscdel: Removed/merged a bunch of blob chems, you probably don't care about the
+ specifics.
+ - tweak: The remaining blob chems should, overall, be more powerful.
+ - tweak: Shield blobs soak brute damage less well.
+ - tweak: Flashbangs do higher damage to blobs up close, but their damage falls off
+ faster.
+ - experiment: Shield blobs now cost 15 resources to make instead of 10. Node blobs
+ now cost 50 resources to make instead of 60.
+ - experiment: Expanding/attacking now costs 4 resources instead of 5, and blobs
+ can now ATTACK DIAGONALLY. Diagonal attacks are weaker than normal attacks,
+ especially against cyborgs(which may be entirely immune, depending), and they
+ remain unable to expand diagonally.
+ - rscadd: Shield blobs no longer block atmos while under half health. Shield blobs
+ are still immune to fire, even if they can't block atmos.
+ - tweak: Blobs should block explosions less well.
+ - rscadd: Blob cores and nodes are no longer immune to fire and no longer block
+ atmos.
+ - rscadd: Blobs can only auto-expand one tile at a time per expanding thing, and
+ should be easier to beat back in general.
+ - tweak: Blobbernauts now attack faster.
+ - tweak: Blob Overminds attack mobs slower but can attack non-mobs much faster.
+ - rscadd: Blob Overminds start with some amount of resources; in the gamemode, it's
+ 80 divided by the number of overminds, in the event, it's 20 plus the number
+ of active players, and otherwise, it's 60.
+ - bugfix: You can no longer move blob cores into space, onto the mining shuttle,
+ white ship, gulag shuttle, or solars.
+ - bugfix: Blob rounds might be less laggy, if they were laggy?
+ - tweak: Blobs don't heal as fast, excluding the core.
+ - experiment: Blobs are marginally less destructive to their environment.
+ MrStonedOne:
+ - rscdel: The server will no longer wait until the next tick to process movement
+ key presses. Movements should now be ~25-50ms more responsive.
+ Shadowlight213:
+ - rscadd: Adds modular computers
diff --git a/html/changelogs/AutoChangeLog-pr-19866.yml b/html/changelogs/AutoChangeLog-pr-19866.yml
deleted file mode 100644
index 0c7a151a562..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19866.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "OSCAR MIKE"
-delete-after: True
-changes:
- - rscadd: "CONTACT ON THE LEFT SIDE!"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 52e8dad7371..a0c21d4f6b5 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 8c7a8365e7e..0c494d78020 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index f4bee86ddc6..c9e23c00f74 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi
index f91ed38dff3..115629dd479 100644
Binary files a/icons/mob/blob.dmi and b/icons/mob/blob.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index ef46ca2181d..2b50ed5e98b 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index aa11f4e5279..3c8c1767724 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index edd47e107f3..1d9bd454129 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index b09c66643c3..ad7dffd2fe0 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 6c762beacff..142b7a058ca 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index f26aa3f1b01..faef55f663d 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 4efdf2e78f6..e79c447f95c 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index ac79ab23659..1180a8957ac 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 585db394acf..2e4d4dd2730 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi
new file mode 100644
index 00000000000..3594a12c17f
Binary files /dev/null and b/icons/obj/modular_components.dmi differ
diff --git a/icons/obj/modular_console.dmi b/icons/obj/modular_console.dmi
new file mode 100644
index 00000000000..a157462f57a
Binary files /dev/null and b/icons/obj/modular_console.dmi differ
diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi
new file mode 100644
index 00000000000..b3e0cb53648
Binary files /dev/null and b/icons/obj/modular_laptop.dmi differ
diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi
new file mode 100644
index 00000000000..1872315f49f
Binary files /dev/null and b/icons/obj/modular_tablet.dmi differ
diff --git a/icons/program_icons/alarm_green.gif b/icons/program_icons/alarm_green.gif
new file mode 100644
index 00000000000..7c2570c8ce3
Binary files /dev/null and b/icons/program_icons/alarm_green.gif differ
diff --git a/icons/program_icons/alarm_red.gif b/icons/program_icons/alarm_red.gif
new file mode 100644
index 00000000000..327d58e4db8
Binary files /dev/null and b/icons/program_icons/alarm_red.gif differ
diff --git a/icons/program_icons/batt_100.gif b/icons/program_icons/batt_100.gif
new file mode 100644
index 00000000000..ccdbd4333e9
Binary files /dev/null and b/icons/program_icons/batt_100.gif differ
diff --git a/icons/program_icons/batt_20.gif b/icons/program_icons/batt_20.gif
new file mode 100644
index 00000000000..1d5e38fc888
Binary files /dev/null and b/icons/program_icons/batt_20.gif differ
diff --git a/icons/program_icons/batt_40.gif b/icons/program_icons/batt_40.gif
new file mode 100644
index 00000000000..d5cedb99675
Binary files /dev/null and b/icons/program_icons/batt_40.gif differ
diff --git a/icons/program_icons/batt_5.gif b/icons/program_icons/batt_5.gif
new file mode 100644
index 00000000000..ceac8f3a945
Binary files /dev/null and b/icons/program_icons/batt_5.gif differ
diff --git a/icons/program_icons/batt_60.gif b/icons/program_icons/batt_60.gif
new file mode 100644
index 00000000000..d39534c8cb0
Binary files /dev/null and b/icons/program_icons/batt_60.gif differ
diff --git a/icons/program_icons/batt_80.gif b/icons/program_icons/batt_80.gif
new file mode 100644
index 00000000000..9c299773f01
Binary files /dev/null and b/icons/program_icons/batt_80.gif differ
diff --git a/icons/program_icons/charging.gif b/icons/program_icons/charging.gif
new file mode 100644
index 00000000000..cf19ca72876
Binary files /dev/null and b/icons/program_icons/charging.gif differ
diff --git a/icons/program_icons/downloader_finished.gif b/icons/program_icons/downloader_finished.gif
new file mode 100644
index 00000000000..f01b7c42af8
Binary files /dev/null and b/icons/program_icons/downloader_finished.gif differ
diff --git a/icons/program_icons/downloader_running.gif b/icons/program_icons/downloader_running.gif
new file mode 100644
index 00000000000..68fb977c86d
Binary files /dev/null and b/icons/program_icons/downloader_running.gif differ
diff --git a/icons/program_icons/ntnrc_idle.gif b/icons/program_icons/ntnrc_idle.gif
new file mode 100644
index 00000000000..d47c01d5800
Binary files /dev/null and b/icons/program_icons/ntnrc_idle.gif differ
diff --git a/icons/program_icons/ntnrc_new.gif b/icons/program_icons/ntnrc_new.gif
new file mode 100644
index 00000000000..af72a8b332f
Binary files /dev/null and b/icons/program_icons/ntnrc_new.gif differ
diff --git a/icons/program_icons/power_norm.gif b/icons/program_icons/power_norm.gif
new file mode 100644
index 00000000000..2b8d60edfa5
Binary files /dev/null and b/icons/program_icons/power_norm.gif differ
diff --git a/icons/program_icons/power_warn.gif b/icons/program_icons/power_warn.gif
new file mode 100644
index 00000000000..0c85b3a85a1
Binary files /dev/null and b/icons/program_icons/power_warn.gif differ
diff --git a/icons/program_icons/sig_high.gif b/icons/program_icons/sig_high.gif
new file mode 100644
index 00000000000..efb20f67306
Binary files /dev/null and b/icons/program_icons/sig_high.gif differ
diff --git a/icons/program_icons/sig_lan.gif b/icons/program_icons/sig_lan.gif
new file mode 100644
index 00000000000..07ba929f7f3
Binary files /dev/null and b/icons/program_icons/sig_lan.gif differ
diff --git a/icons/program_icons/sig_low.gif b/icons/program_icons/sig_low.gif
new file mode 100644
index 00000000000..08f98baea8e
Binary files /dev/null and b/icons/program_icons/sig_low.gif differ
diff --git a/icons/program_icons/sig_none.gif b/icons/program_icons/sig_none.gif
new file mode 100644
index 00000000000..79840d8a2bd
Binary files /dev/null and b/icons/program_icons/sig_none.gif differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 8fa4df97371..f9fa3f4a69a 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -22,25 +22,25 @@ macro "default"
command = "westface"
elem
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+NORTH"
command = "northface"
elem
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+EAST"
command = "eastface"
elem
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+SOUTH"
command = "southface"
elem
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "INSERT"
command = "a-intent right"
@@ -61,13 +61,13 @@ macro "default"
command = "a-intent harm"
elem
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+B"
command = "resist"
elem
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+E"
command = "quick-equip"
@@ -85,10 +85,10 @@ macro "default"
command = ".southwest"
elem
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+X"
command = ".northeast"
@@ -153,25 +153,25 @@ macro "hotkeys"
command = "westface"
elem
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+NORTH"
command = "northface"
elem
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+EAST"
command = "eastface"
elem
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+SOUTH"
command = "southface"
elem
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "INSERT"
command = "a-intent right"
@@ -204,10 +204,10 @@ macro "hotkeys"
command = "a-intent harm"
elem
name = "A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "B"
command = "resist"
@@ -216,10 +216,10 @@ macro "hotkeys"
command = "resist"
elem
name = "D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "E"
command = "quick-equip"
@@ -261,19 +261,19 @@ macro "hotkeys"
command = ".southwest"
elem "s_key"
name = "S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "T"
command = "say"
elem "w_key"
name = "W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "X"
command = ".northeast"
@@ -342,25 +342,25 @@ macro "robot-default"
command = "westface"
elem
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+NORTH"
command = "northface"
elem
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+EAST"
command = "eastface"
elem
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+SOUTH"
command = "southface"
elem
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "INSERT"
command = "a-intent right"
@@ -381,7 +381,7 @@ macro "robot-default"
command = "a-intent left"
elem
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+B"
command = "resist"
@@ -390,7 +390,7 @@ macro "robot-default"
command = "ooc"
elem
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+F"
command = "a-intent left"
@@ -402,10 +402,10 @@ macro "robot-default"
command = "unequip-module"
elem
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+X"
command = ".northeast"
@@ -464,25 +464,25 @@ macro "robot-hotkeys"
command = "westface"
elem
name = "WEST+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+NORTH"
command = "northface"
elem
name = "NORTH+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+EAST"
command = "eastface"
elem
name = "EAST+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+SOUTH"
command = "southface"
elem
name = "SOUTH+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "INSERT"
command = "a-intent right"
@@ -515,10 +515,10 @@ macro "robot-hotkeys"
command = "a-intent left"
elem
name = "A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "CTRL+A+REP"
- command = ".west"
+ command = ".moveleft"
elem
name = "B"
command = "resist"
@@ -533,10 +533,10 @@ macro "robot-hotkeys"
command = "ooc"
elem
name = "D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "CTRL+D+REP"
- command = ".east"
+ command = ".moveright"
elem
name = "F"
command = "a-intent left"
@@ -557,19 +557,19 @@ macro "robot-hotkeys"
command = "unequip-module"
elem "s_key"
name = "S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "CTRL+S+REP"
- command = ".south"
+ command = ".movedown"
elem
name = "T"
command = "say"
elem "w_key"
name = "W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "CTRL+W+REP"
- command = ".north"
+ command = ".moveup"
elem
name = "X"
command = ".northeast"
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index b99addac573..cd5f268c7d4 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -91,6 +91,7 @@ h1.alert, h2.alert {color: #000000;}
.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
.large_brass {color: #BE8700; font-size: 3;}
.big_brass {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic;}
+.ratvar {color: #BE8700; font-size: 6; font-weight: bold; font-style: italic;}
.alloy {color: #42474D;}
.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;}
.large_alloy {color: #42474D; font-size: 3;}
diff --git a/tgstation.dme b/tgstation.dme
index 8012abce338..27f90292ede 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -612,7 +612,6 @@
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\machineprototype.dm"
#include "code\game\objects\items\devices\megaphone.dm"
-#include "code\game\objects\items\devices\modificationkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
@@ -1520,6 +1519,41 @@
#include "code\modules\mob\new_player\poll.dm"
#include "code\modules\mob\new_player\preferences_setup.dm"
#include "code\modules\mob\new_player\sprite_accessories.dm"
+#include "code\modules\modular_computers\computers\item\modular_computer.dm"
+#include "code\modules\modular_computers\computers\item\processor.dm"
+#include "code\modules\modular_computers\computers\item\tablet.dm"
+#include "code\modules\modular_computers\computers\item\tablet_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\console_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_computer.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_console.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_laptop.dm"
+#include "code\modules\modular_computers\file_system\computer_file.dm"
+#include "code\modules\modular_computers\file_system\data.dm"
+#include "code\modules\modular_computers\file_system\program.dm"
+#include "code\modules\modular_computers\file_system\program_events.dm"
+#include "code\modules\modular_computers\file_system\programs\alarm.dm"
+#include "code\modules\modular_computers\file_system\programs\card.dm"
+#include "code\modules\modular_computers\file_system\programs\configurator.dm"
+#include "code\modules\modular_computers\file_system\programs\file_browser.dm"
+#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm"
+#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm"
+#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm"
+#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
+#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm"
+#include "code\modules\modular_computers\hardware\battery_module.dm"
+#include "code\modules\modular_computers\hardware\card_slot.dm"
+#include "code\modules\modular_computers\hardware\hard_drive.dm"
+#include "code\modules\modular_computers\hardware\hardware.dm"
+#include "code\modules\modular_computers\hardware\nano_printer.dm"
+#include "code\modules\modular_computers\hardware\network_card.dm"
+#include "code\modules\modular_computers\hardware\portable_hard_drive.dm"
+#include "code\modules\modular_computers\hardware\processor_unit.dm"
+#include "code\modules\modular_computers\hardware\tesla_link.dm"
+#include "code\modules\modular_computers\NTNet\NTNet.dm"
+#include "code\modules\modular_computers\NTNet\NTNet_relay.dm"
+#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\ninja\__ninjaDefines.dm"
#include "code\modules\ninja\admin_ninja_verbs.dm"
#include "code\modules\ninja\energy_katana.dm"
@@ -1625,6 +1659,7 @@
#include "code\modules\projectiles\guns\mounted.dm"
#include "code\modules\projectiles\guns\projectile.dm"
#include "code\modules\projectiles\guns\syringe_gun.dm"
+#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
@@ -1704,6 +1739,7 @@
#include "code\modules\research\designs\autolathe_designs.dm"
#include "code\modules\research\designs\biogenerator_designs.dm"
#include "code\modules\research\designs\comp_board_designs.dm"
+#include "code\modules\research\designs\computer_part_designs.dm"
#include "code\modules\research\designs\machine_designs.dm"
#include "code\modules\research\designs\mecha_designs.dm"
#include "code\modules\research\designs\mechfabricator_designs.dm"
diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css
index 6156a956a45..38c1495d003 100644
--- a/tgui/assets/tgui.css
+++ b/tgui/assets/tgui.css
@@ -1 +1 @@
-@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
+@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"}
\ No newline at end of file
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index cb9ce9a5be8..cf1467ea3e4 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,13 +1,15 @@
-require=function t(e,n,r){function a(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};e[o][0].call(p.exports,function(t){var n=e[o][1][t];return a(n?n:t)},p,p.exports,t,e,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=p(function(){k.has(1)}),O=l(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=y==v,C=!1,A=t.prototype,P=A[f]||A[h]||y&&A[y],T=P||E(y);if(P){var j=l(T.call(new t));p(j,S,!0),!r&&s(A,h)&&o(j,f,g),O&&P.name!==v&&(C=!0,T=function(){return P.call(this)})}if(r&&!_||!d&&!C&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:O?T:E(v),keys:x?T:E(m),entries:O?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else a(a.P+a.F*(d||C),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){return{done:n=!0}},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r \u2028\u2029\ufeff",s="["+o+"]",u="
",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,C=Array.prototype,A=C.slice,P=C.join,T=a.setDesc,j=a.getDesc,M=a.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return p(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=M=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("i;)p(a,r=t[i++])&&(~S(o,r)||o.push(r));return o}},q=function(){};i(i.S,"Object",{getPrototypeOf:a.getProto=a.getProto||function(t){return t=g(t),p(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?O:null},getOwnPropertyNames:a.getNames=a.getNames||I(N,N.length,!0),create:a.create=a.create||function(t,e){var n;return null!==t?(q.prototype=h(t),n=new q,q.prototype=null,n[k]=t):n=D(),void 0===e?n:M(n,e)},keys:a.getKeys=a.getKeys||I(F,R,!1)});var B=function(t,e,n){if(!(e in L)){for(var r=[],a=0;e>a;a++)r[a]="a["+a+"]";L[e]=Function("F,a","return new F("+r.join(",")+")")}return L[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=A.call(arguments,1),r=function(){var a=n.concat(A.call(arguments));return this instanceof r?B(e,a.length,a):f(e,a,t)};return v(e.prototype)&&(r.prototype=e.prototype),r}}),i(i.P+i.F*d(function(){u&&A.call(u)}),"Array",{slice:function(t,e){var n=_(this.length),r=l(this);if(e=void 0===e?n:e,"Array"==r)return A.call(this,t,e);for(var a=x(t,n),i=x(e,n),o=_(i-a),s=Array(o),u=0;o>u;u++)s[u]="String"==r?this.charAt(a+u):this[a+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return P.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var V=function(t){return function(e,n){m(e);var r=w(this),a=_(r.length),i=t?a-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in r){n=r[i],i+=o;break}if(i+=o,t?0>i:i>=a)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:a>i;i+=o)i in r&&(n=e(n,r[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:a.each=a.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:V(!1),reduceRight:V(!0),indexOf:U(S),lastIndexOf:function(t,e){var n=b(this),r=_(n.length),a=r-1;for(arguments.length>1&&(a=Math.min(a,y(e))),0>a&&(a=_(r+a));a>=0;a--)if(a in n&&n[a]===t)return a;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var z=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),r=0>e?"-":e>9999?"+":"";return r+("00000"+Math.abs(e)).slice(r?-6:-4)+"-"+z(t.getUTCMonth()+1)+"-"+z(t.getUTCDate())+"T"+z(t.getUTCHours())+":"+z(t.getUTCMinutes())+":"+z(t.getUTCSeconds())+"."+(n>99?n:"0"+z(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var r=t(22);r(r.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var r=t(22);r(r.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var r=t(22),a=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),r(r.P+r.F*o,"Array",{findIndex:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var r=t(22),a=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var r=t(17),a=t(22),i=t(80),o=t(40),s=t(35),u=t(79),c=t(84);a(a.S+a.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,a,p,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=c(l);if(v&&(m=r(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(p=b.call(l),n=new f;!(a=p.next()).done;g++)n[g]=v?o(p,m,[a.value,g],!0):a.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var r=t(3),a=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,a(1)):"keys"==e?a(0,n):"values"==e?a(0,t[n]):a(0,[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var r=t(22);r(r.S+r.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,r=new("function"==typeof this?this:Array)(n);n>t;)r[t]=e[t++];return r.length=n,r}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var r=t(46),a=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||r.setDesc(o,i,{value:function(t){if("function"!=typeof this||!a(t))return!1;if(!a(this.prototype))return t instanceof this;for(;t=r.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var r=t(46).setDesc,a=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&r(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||r(this,u,a(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var r=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=r.getEntry(this,t);return e&&e.v},set:function(t,e){return r.def(this,0===t?0:t,e)}},r,!0)},{12:12,15:15}],97:[function(t,e,n){var r=t(22),a=t(50),i=Math.sqrt,o=Math.acosh;r(r.S+r.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:a(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function r(t){return isFinite(t=+t)&&0!=t?0>t?-r(-t):Math.log(t+Math.sqrt(t*t+1)):t}var a=t(22);a(a.S,"Math",{asinh:r})},{22:22}],99:[function(t,e,n){var r=t(22);r(r.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var r=t(22),a=t(51);r(r.S,"Math",{cbrt:function(t){return a(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var r=t(22);r(r.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var r=t(22),a=Math.exp;r(r.S,"Math",{cosh:function(t){return(a(t=+t)+a(-t))/2}})},{22:22}],103:[function(t,e,n){var r=t(22);r(r.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var r=t(22),a=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),c=i(2,-126),p=function(t){return t+1/o-1/o};r(r.S,"Math",{fround:function(t){var e,n,r=Math.abs(t),i=a(t);return c>r?i*p(r/c/s)*c*s:(e=(1+s/o)*r,n=e-(e-r),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var r=t(22),a=Math.abs;r(r.S,"Math",{hypot:function(t,e){for(var n,r,i=0,o=0,s=arguments,u=s.length,c=0;u>o;)n=a(s[o++]),n>c?(r=c/n,i=i*r*r+1,c=n):n>0?(r=n/c,i+=r*r):i+=n;return c===1/0?1/0:c*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var r=t(22),a=Math.imul;r(r.S+r.F*t(24)(function(){return-5!=a(4294967295,5)||2!=a.length}),"Math",{imul:function(t,e){var n=65535,r=+t,a=+e,i=n&r,o=n&a;return 0|i*o+((n&r>>>16)*o+i*(n&a>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var r=t(22);r(r.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var r=t(22);r(r.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var r=t(22);r(r.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var r=t(22);r(r.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var r=t(22),a=t(49),i=Math.exp;r(r.S+r.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(a(t)-a(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var r=t(22),a=t(49),i=Math.exp;r(r.S,"Math",{tanh:function(t){var e=a(t=+t),n=a(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var r=t(22);r(r.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var r=t(46),a=t(29),i=t(30),o=t(11),s=t(81),u=t(24),c=t(74).trim,p="Number",l=a[p],f=l,d=l.prototype,h=o(r.create(d))==p,m="trim"in String.prototype,v=function(t){
-var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():c(e,3);var n,r,a,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:r=2,a=49;break;case 79:case 111:r=8,a=55;break;default:return+e}for(var o,u=e.slice(2),p=0,l=u.length;l>p;p++)if(o=u.charCodeAt(p),48>o||o>a)return NaN;return parseInt(u,r)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=p)?new f(v(e)):v(e)},r.each.call(t(19)?r.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&r.setDesc(l,t,r.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(a,p,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var r=t(22);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var r=t(22),a=t(29).isFinite;r(r.S,"Number",{isFinite:function(t){return"number"==typeof t&&a(t)}})},{22:22,29:29}],117:[function(t,e,n){var r=t(22);r(r.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var r=t(22);r(r.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var r=t(22),a=t(37),i=Math.abs;r(r.S,"Number",{isSafeInteger:function(t){return a(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var r=t(22);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var r=t(22);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var r=t(22);r(r.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var r=t(22);r(r.S+r.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var r=t(38);t(54)("freeze",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var r=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(r(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var r=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],129:[function(t,e,n){var r=t(38);t(54)("isExtensible",function(t){return function(e){return r(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var r=t(38);t(54)("isFrozen",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var r=t(38);t(54)("isSealed",function(t){return function(e){return r(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var r=t(22);r(r.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var r=t(80);t(54)("keys",function(t){return function(e){return t(r(e))}})},{54:54,80:80}],134:[function(t,e,n){var r=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var r=t(38);t(54)("seal",function(t){return function(e){return t&&r(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var r=t(22);r(r.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var r=t(10),a={};a[t(83)("toStringTag")]="z",a+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var r,a=t(46),i=t(48),o=t(29),s=t(17),u=t(10),c=t(22),p=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),x="Promise",_=o.process,w="process"==u(_),k=o[x],E=function(){},S=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},O=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&S(),m(e,k),e.prototype=a.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var r=!1;k.resolve(a.setDesc({},"then",{get:function(){r=!0}})),n=r}}catch(i){n=!1}return n}(),C=function(t,e){return i&&t===k&&e===r?!0:v(t,e)},A=function(t){var e=l(t)[g];return void 0!=e?e:t},P=function(t){var e;return p(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=f(e),this.reject=f(n)},j=function(t){try{t()}catch(e){return{error:e}}},M=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var r=t.v,a=1==t.s,i=0,s=function(e){var n,i,o=a?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(a||(t.h=!0),n=o===!0?r:o(r),n===e.promise?u(TypeError("Promise-chain cycle")):(i=P(n))?i.call(n,s,u):s(n)):u(r)}catch(c){u(c)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,a=t.p;L(a)&&(w?_.emit("unhandledRejection",r,a):(e=o.onunhandledrejection)?e({promise:a,reason:r}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",r)),t.a=void 0},1)})}},L=function(t){var e,n=t._d,r=n.a||n.c,a=0;if(n.h)return!1;for(;r.length>a;)if(e=r[a++],e.fail||!L(e.promise))return!1;return!0},F=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),M(e,!0))},N=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=P(t))?y(function(){var r={r:n,d:!1};try{e.call(t,s(N,r,1),s(F,r,1))}catch(a){F.call(r,a)}}):(n.v=t,n.s=1,M(n,!1))}catch(r){F.call({r:n,d:!1},r)}}};O||(k=function(t){f(t);var e=this._d={p:d(this,k,x),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(F,e,1))}catch(n){F.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),r=n.promise,a=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,a.c.push(n),a.a&&a.a.push(n),a.s&&M(a,!1),r},"catch":function(t){return this.then(void 0,t)}})),c(c.G+c.W+c.F*!O,{Promise:k}),t(66)(k,x),t(65)(x),r=t(16)[x],c(c.S+c.F*!O,x,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),c(c.S+c.F*(!O||S(!0)),x,{resolve:function(t){if(t instanceof k&&C(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),c(c.S+c.F*!(O&&t(43)(function(t){k.all(t)["catch"](function(){})})),x,{all:function(t){var e=A(this),n=new T(e),r=n.resolve,i=n.reject,o=[],s=j(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?a.each.call(o,function(t,a){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[a]=t,--n||r(s))},i)}):r(s)});return s&&i(s.error),n.promise},race:function(t){var e=A(this),n=new T(e),r=n.reject,a=j(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return a&&r(a.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var r=t(22),a=Function.apply,i=t(4);r(r.S,"Reflect",{apply:function(t,e,n){return a.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var r=t(46),a=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;a(a.S+a.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var a=[null];return a.push.apply(a,e),new(u.apply(t,a))}var c=n.prototype,p=r.create(s(c)?c:Object.prototype),l=Function.apply.call(t,p,e);return s(l)?l:p}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var r=t(46),a=t(22),i=t(4);a(a.S+a.F*t(24)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return r.setDesc(t,e,n),!0}catch(a){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var r=t(22),a=t(46).getDesc,i=t(4);r(r.S,"Reflect",{deleteProperty:function(t,e){var n=a(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var r=t(22),a=t(4),i=function(t){this._t=a(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),r(r.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var r=t(46),a=t(22),i=t(4);a(a.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return r.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var r=t(22),a=t(46).getProto,i=t(4);r(r.S,"Reflect",{getPrototypeOf:function(t){return a(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function r(t,e){var n,o,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=a.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:s(o=a.getProto(t))?r(o,e,c):void 0}var a=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:r})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var r=t(22),a=t(4),i=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(t){return a(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var r=t(22);r(r.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var r=t(22),a=t(4),i=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(t){a(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var r=t(22),a=t(64);a&&r(r.S,"Reflect",{setPrototypeOf:function(t,e){a.check(t,e);try{return a.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function r(t,e,n){var o,p,l=arguments.length<4?t:arguments[3],f=a.getDesc(u(t),e);if(!f){if(c(p=a.getProto(t)))return r(p,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&c(l)?(o=a.getDesc(l,e)||s(0),o.value=n,a.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var a=t(46),i=t(30),o=t(22),s=t(59),u=t(4),c=t(38);o(o.S,"Reflect",{set:r})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var r=t(46),a=t(29),i=t(39),o=t(26),s=a.RegExp,u=s,c=s.prototype,p=/a/g,l=/a/g,f=new s(p)!==p;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(p)!=p||s(l)==l||"/a/i"!=s(p,"i")})||(s=function(t,e){var n=i(t),r=void 0===e;return this instanceof s||!n||t.constructor!==s||!r?f?new u(n&&!r?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&r?o.call(t):e):t},r.each.call(r.getNames(u),function(t){t in s||r.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),c.constructor=s,s.prototype=c,t(61)(a,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var r=t(46);t(19)&&"g"!=/./g.flags&&r.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var r=t(this),a=void 0==n?void 0:n[e];return void 0!==a?a.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(r,a){"use strict";var i=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,i,a):n.call(i+"",r,a)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var r=t(this),a=void 0==n?void 0:n[e];return void 0!==a?a.call(n,r):RegExp(n)[e](r+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(r,a){"use strict";var i=t(this),o=void 0==r?void 0:r[e];return void 0!==o?o.call(r,i,a):n.call(i+"",r,a)}})},{25:25}],159:[function(t,e,n){"use strict";var r=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t=0===t?0:t,t)}},r)},{12:12,15:15}],160:[function(t,e,n){"use strict";var r=t(22),a=t(70)(!1);r(r.P,"String",{codePointAt:function(t){return a(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var r=t(22),a=t(79),i=t(71),o="endsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,r=n.length>1?n[1]:void 0,u=a(e.length),c=void 0===r?u:Math.min(a(r),u),p=t+"";return s?s.call(e,p,c):e.slice(c-p.length,c)===p}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var r=t(22),a=t(76),i=String.fromCharCode,o=String.fromCodePoint;r(r.S+r.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],r=arguments,o=r.length,s=0;o>s;){if(e=+r[s++],a(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var r=t(22),a=t(71),i="includes";r(r.P+r.F*t(23)(i),"String",{includes:function(t){return!!~a(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var r=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var r=t(22),a=t(78),i=t(79);r(r.S,"String",{raw:function(t){for(var e=a(t.raw),n=i(e.length),r=arguments,o=r.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(r[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var r=t(22);r(r.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var r=t(22),a=t(79),i=t(71),o="startsWith",s=""[o];r(r.P+r.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,r=a(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,r):e.slice(r,r+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var r=t(46),a=t(29),i=t(30),o=t(19),s=t(22),u=t(61),c=t(24),p=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),x=t(59),_=r.getDesc,w=r.setDesc,k=r.create,E=m.get,S=a.Symbol,O=a.JSON,C=O&&O.stringify,A=!1,P=d("_hidden"),T=r.isEnum,j=p("symbol-registry"),M=p("symbols"),L="function"==typeof S,F=Object.prototype,N=o&&c(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=_(F,e);r&&delete F[e],w(t,e,n),r&&t!==F&&w(F,e,r)}:w,R=function(t){var e=M[t]=k(S.prototype);return e._k=t,o&&A&&N(F,t,{configurable:!0,set:function(e){i(this,P)&&i(this[P],t)&&(this[P][t]=!1),N(this,t,x(1,e))}}),e},D=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(M,e)?(n.enumerable?(i(t,P)&&t[P][e]&&(t[P][e]=!1),n=k(n,{enumerable:x(0,!1)})):(i(t,P)||w(t,P,x(1,{})),t[P][e]=!0),N(t,e,n)):w(t,e,n)},q=function(t,e){b(t);for(var n,r=v(e=y(e)),a=0,i=r.length;i>a;)I(t,n=r[a++],e[n]);return t},B=function(t,e){return void 0===e?k(t):q(k(t),e)},V=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(M,t)||i(this,P)&&this[P][t]?e:!0},U=function(t,e){var n=_(t=y(t),e);return!n||!i(M,e)||i(t,P)&&t[P][e]||(n.enumerable=!0),n},z=function(t){for(var e,n=E(y(t)),r=[],a=0;n.length>a;)i(M,e=n[a++])||e==P||r.push(e);return r},W=function(t){for(var e,n=E(y(t)),r=[],a=0;n.length>a;)i(M,e=n[a++])&&r.push(M[e]);return r},H=function(t){if(void 0!==t&&!D(t)){for(var e,n,r=[t],a=1,i=arguments;i.length>a;)r.push(i[a++]);return e=r[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),D(e)?void 0:e}),r[1]=e,C.apply(O,r)}},G=c(function(){var t=S();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))});L||(S=function(){if(D(this))throw TypeError("Symbol is not a constructor");return R(f(arguments.length>0?arguments[0]:void 0))},u(S.prototype,"toString",function(){return this._k}),D=function(t){return t instanceof S},r.create=B,r.isEnum=V,r.getDesc=U,r.setDesc=I,r.setDescs=q,r.getNames=m.get=z,r.getSymbols=W,o&&!t(48)&&u(F,"propertyIsEnumerable",V,!0));var K={"for":function(t){return i(j,t+="")?j[t]:j[t]=S(t)},keyFor:function(t){return h(j,t)},useSetter:function(){A=!0},useSimple:function(){A=!1}};r.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);K[t]=L?e:R(e)}),A=!0,s(s.G+s.W,{Symbol:S}),s(s.S,"Symbol",K),s(s.S+s.F*!L,"Object",{create:B,defineProperty:I,defineProperties:q,getOwnPropertyDescriptor:U,getOwnPropertyNames:z,getOwnPropertySymbols:W}),O&&s(s.S+s.F*(!L||G),"JSON",{stringify:H}),l(S,"Symbol"),l(Math,"Math",!0),l(a.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var r=t(46),a=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,c=i.WEAK,p=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!p(t))return u(this).get(t);if(s(t,c))return t[c][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&r.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];a(e,t,function(e,r){if(o(e)&&!p(e)){var a=u(this)[t](e,r);return"set"==t?this:a}return n.call(this,e,r)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var r=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return r.def(this,t,!0)}},r,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var r=t(22),a=t(7)(!0);r(r.P,"Array",{includes:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var r=t(22);r(r.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var r=t(22),a=t(55)(!0);r(r.S,"Object",{entries:function(t){return a(t)}})},{22:22,55:55}],175:[function(t,e,n){var r=t(46),a=t(22),i=t(56),o=t(78),s=t(59);a(a.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,a=o(t),u=r.setDesc,c=r.getDesc,p=i(a),l={},f=0;p.length>f;)n=c(a,e=p[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var r=t(22),a=t(55)(!1);r(r.S,"Object",{values:function(t){return a(t)}})},{22:22,55:55}],177:[function(t,e,n){var r=t(22),a=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");r(r.S,"RegExp",{escape:function(t){return a(t)}})},{22:22,62:62}],178:[function(t,e,n){var r=t(22);r(r.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var r=t(22),a=t(70)(!0);r(r.P,"String",{at:function(t){return a(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var r=t(22),a=t(72);r(r.P,"String",{padLeft:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var r=t(22),a=t(72);r(r.P,"String",{padRight:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var r=t(46),a=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){r.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),a(a.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var r=t(29),a=t(31),i=t(45),o=t(83)("iterator"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,p=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;c&&!c[o]&&a(c,o,l),p&&!p[o]&&a(p,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var r=t(22),a=t(75);r(r.G+r.B,{setImmediate:a.set,clearImmediate:a.clear})},{22:22,75:75}],187:[function(t,e,n){var r=t(29),a=t(22),i=t(33),o=t(57),s=r.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),c=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};a(a.G+a.B+a.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function r(t,e,n,r){var a=Object.create((e||i).prototype),o=new h(r||[]);return a._invoke=l(t,n,o),a}function a(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(r){return{type:"throw",arg:r}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function c(t){this.arg=t}function p(e){function n(t,n){var r=e[t](n),a=r.value;return a instanceof c?Promise.resolve(a.arg).then(i,o):Promise.resolve(a).then(function(t){return r.value=t,r})}function r(t,e){function r(){return n(t,e)}return a=a?a.then(r,r):new Promise(function(t){t(r())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var a,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=r}function l(t,e,n){var r=w;return function(i,o){if(r===E)throw Error("Generator is already running");if(r===S){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var c=a(u,s.iterator,o);if("throw"===c.type){i="throw",o=c.arg;continue}}if("return"===i)continue}var c=a(s.iterator[i],s.iterator,o);if("throw"===c.type){n.delegate=null,i="throw",o=c.arg;continue}i="next",o=g;var p=c.arg;if(!p.done)return r=k,p;n[s.resultName]=p.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,r===k?n.sent=o:n.sent=g;else if("throw"===i){if(r===w)throw r=S,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);r=E;var c=a(t,e,n);if("normal"===c.type){r=n.done?S:k;var p={value:c.arg,done:n.done};if(c.arg!==O)return p;n.delegate&&"next"===i&&(o=g)}else"throw"===c.type&&(r=S,i="throw",o=c.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function a(){for(;++n=0;--r){var a=this.tryEntries[r],i=a.completion;if("root"===a.tryLoc)return e("end");if(a.tryLoc<=this.prev){var o=b.call(a,"catchLoc"),s=b.call(a,"finallyLoc");if(o&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&b.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var a=r.arg;d(n)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},O}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return p.createDocumentFragment()}function n(t){return p.createElement(t)}function r(t){if(1===t.length)return a(t[0]);for(var n=e(),r=q.call(t),i=0;i-1}}([].indexOf||function(t){for(B=this.length;B--&&this[B]!==t;);return B}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(c(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==x&&g==x&&b==x||v==_&&g==_&&b==_)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-p>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new r(s),h=new r(s),m=new r(s),v=-1,g=-1,b=-1,y=-1,x=-1,_=-1,w=document.createElement("div"),k=0;w.dir="ltr",a(d,c(i,"sans-serif")),a(h,c(i,"serif")),a(m,c(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,x=h.a.offsetWidth,_=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),a(d,c(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),a(h,c(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),a(m,c(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function r(t,e){var n=t.createElement("p"),r=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function a(){var t=x.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=x.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),x.elements=n+" "+t,p(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,r){if(e||(e=n),f)return e.createElement(t);r||(r=o(e));var a;return a=r.cache[t]?r.cache[t].cloneNode():v.test(t)?(r.cache[t]=r.createElem(t)).cloneNode():r.createElem(t),!a.canHaveChildren||m.test(t)||a.tagUrn?a:r.frag.appendChild(a)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var r=e.frag.cloneNode(),i=0,s=a(),u=s.length;u>i;i++)r.createElement(s[i]);return r}function c(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return x.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+a().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(x,e.frag)}function p(t){t||(t=n);var e=o(t);return!x.shivCSS||l||e.hasCSS||(e.hasCSS=!!r(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||c(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var x={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:p,createElement:s,createDocumentFragment:u,addElements:i};t.html5=x,p(n),"object"==typeof e&&e.exports&&(e.exports=x)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,r){for(var i,o=n.slice(),s=a(e,t),u=0,c=o.length;c>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,r&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function r(t,e,r){var a=b(e||t,r);v(t,"textContent",n(function(){return a.get.call(this)},function(t){a.set.call(this,t)}))}function a(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function p(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var r in n)if(y.call(n,r))try{v(e,r,n[r])}catch(a){t.console&&console.log(r+" failed on object:",e,a.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,x=t.Element.prototype,_=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},S=document.createElement("div"),O=document.documentElement,C=O.removeAttribute,A=O.setAttribute;r(t.HTMLCommentElement.prototype,x,"nodeValue"),r(t.HTMLScriptElement.prototype,null,"text"),r(_,null,"nodeValue"),r(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,r){if("function"==typeof n||"object"==typeof n){var a,o,u=this,c="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[c]||(l[c]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,p(u,t),d,!1)},!y.call(E,c))if(w.test(t)){try{a=document.createEventObject(),a[m]=!0,9!=u.nodeType&&(null==u.parentNode&&S.appendChild(u),(o=u.getAttribute(c))&&C.call(u,c)),u.fireEvent(c,a),E[c]=!0}catch(a){for(E[c]=!1;S.hasChildNodes();)S.removeChild(S.firstChild)}null!=o&&A.call(u,c,o)}else E[c]=!1;(f.n=E[c])&&u.attachEvent(c,f.w)}i(d,n)<0&&d[r?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,r=this,a="on"+t.type,i=r[m],o=i&&i[a],s=!!o;return t.target||(t.target=r),s?o.n?r.fireEvent(a,t):e(r,t,o.h,!0):(n=r.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var r=this,a="on"+t,o=r[m],s=o&&o[a],u=s&&s.h,c=u?i(u,e):-1;c>-1&&u.splice(c,1)}}}}),g(_,{addEventListener:{value:x.addEventListener},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var r=this,a="on"+t,o=r[m]||v(r,m,{value:{}})[m],s=o[a]||(o[a]={}),u=s.h||(s.h=[]);i(u,e)<0&&(r[a]||(r[a]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),r.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,r="on"+t.type,a=n[m],i=a&&a[r],o=!!i;return o&&(i.n?n.fireEvent(r,t):e(n,t,i.h,!0))}},removeEventListener:{value:x.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:{value:function(e,n,r){var a=this;x.addEventListener.call(a,e,n,r),l&&e===h&&!k.test(a.readyState)&&(l=!1,a.attachEvent(d,u),t==top&&!function i(t){try{a.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:x.dispatchEvent},removeEventListener:{value:x.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,r=/^(top|right|bottom|left)$/,a=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,c=u.style,p=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(a,i),e=p?p[t]:c[t],n.test(e)&&!r.test(t)&&(o=c.left,s=l&&l.left,s&&(l.left=p.left),c.left="fontSize"===t?"1em":e,e=c.pixelLeft+"px",c.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,r){return r?new e(n):new t(n)}}()},addEventListener:{value:function(n,r,a){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,p(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,r)<0&&o[a?"unshift":"push"](r)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,r){var a="on"+e,o=(t[a]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,c.times)(r,(0,c.minus)(n[l],n[l-1])));for(var f=[(0,c.plus)(n[0],p(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,c.minus)(n[l],(0,c.average)([i[l],i[l-1]])));f.push((0,c.minus)(n[s-1],p(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,a(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,c.range)(2,s).reduce(function(t,e){var r=f[e],a=n[e];return t.smoothcurveto(r[0],r[1],a[0],a[1])},g),centroid:(0,c.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=r(i),s=t(198),u=1e-5,c=function(t,e){var n=t.map(e),r=n.sort(function(t,e){var n=a(t,2),r=n[0],i=(n[1],a(e,2)),o=i[0];i[1];return r-o}),i=r.length,o=r[0][0],c=r[i-1][0],p=(0,s.minBy)(r,function(t){return t[1]}),l=(0,s.maxBy)(r,function(t){return t[1]});return o==c&&(c+=u),p==l&&(l+=u),{points:r,xmin:o,xmax:c,ymin:p,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,r=t.yaccessor,i=t.width,u=t.height,p=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=a(t,2),n=e[0];e[1];return n}),r||(r=function(t){var e=a(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),r(t)]},h=e.map(function(t){return c(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;p&&(g=Math.min(g,0),b=Math.max(b,0));var y=p?0:g,x=(0,o["default"])([m,v],[0,i]),_=(0,o["default"])([g,b],[u,0]),w=function(t){var e=a(t,2),n=e[0],r=e[1];return[x(n),_(r)]};return{arranged:h,scale:w,xscale:x,yscale:_,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=function i(t,e){var n=r(t,2),a=n[0],o=n[1],s=r(e,2),u=s[0],c=s[1],p=function(t){return u+(c-u)*(t-a)/(o-a)};return p.inverse=function(){return i([u,c],[a,o])},p};n["default"]=a,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},c=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},p=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return[a+s,i+u]},l=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return[a-s,i-u]},f=function(t,e){var n=r(e,2),a=n[0],i=n[1];return[t*a,t*i]},d=function(t){var e=r(t,2),n=e[0],a=e[1];return Math.sqrt(n*n+a*a)},h=function(t){return t.reduce(p,[0,0])},m=function(t){return f(1/t.length,t.reduce(p))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var r in n){var a=n[r];e[r]=a(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var r=[],a=t;e>a;a++)r.push(a);return n&&r.push(e),r},y=function(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,c=t[u];n.push(e(u,c))}}catch(p){a=!0,i=p}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n},x=function(t){return y(t,function(t,e){return[t,e]})},_=function(t){return t};n.sum=a,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=c,n.plus=p,n.minus=l,n.times=f,n.id=_,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=x,n["default"]={sum:a,min:i,max:o,sumBy:s,minBy:u,maxBy:c,plus:p,minus:l,times:f,id:_,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:x}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],r=!0,a=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){a=!0,i=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),a=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},a=function(t,e){var n=r(t,2),a=n[0],i=n[1],o=r(e,2),s=o[0],u=o[1];return a===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,r=n.map(function(t){return s(t,6)});return e+" "+r.join(" ")},c=function(t,e){var n=t.command,a=t.params,i=r(e,2),o=i[0],s=i[1];switch(n){case"M":return[a[0],a[1]];case"L":return[a[0],a[1]];case"H":return[a[0],s];case"V":return[o,a[0]];case"Z":return null;case"C":return[a[4],a[5]];case"S":return[a[2],a[3]];case"Q":return[a[2],a[3]];case"T":return[a[0],a[1]];case"A":return[a[5],a[6]]}},p=function(t,e){return function(n){var r="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,r)}},l=function(t){return i(n(e,t))};return{moveto:p(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:p(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:p(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:p(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:p(["x1","y1","x2","y2","x","y"],function(t,e,n,r,a,i){return l({command:"C",params:[t,e,n,r,a,i]})}),smoothcurveto:p(["x2","y2","x","y"],function(t,e,n,r){return l({command:"S",params:[t,e,n,r]})}),qcurveto:p(["x1","y1","x","y"],function(t,e,n,r){return l({command:"Q",params:[t,e,n,r]})}),smoothqcurveto:p(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:p(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,r,a,i,o){return l({command:"A",params:[t,e,n,r,a,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],r=!0,a=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var u=o.value,p=c(u,n);n=p,p&&t.push(p)}}catch(l){a=!0,i=l}finally{try{!r&&s["return"]&&s["return"]()}finally{if(a)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],r=t.points()[0],o=t.instructions().slice(1);return a(n,r)||o.unshift({command:"L",params:r}),i(this.instructions().concat(o))}}};n["default"]=function(){return a()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function a(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];for(var a,i;i=n.shift();)for(a in i)Mo.call(i,a)&&(t[a]=i[a]);return t}function a(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return Fo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function c(t){return t&&"[object Object]"===Lo.call(t)}function p(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];throw t=p(t,n),Error(t)}function f(){Mv.DEBUG&&Po.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=p(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];t=p(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Mv.DEBUG&&d.apply(null,arguments)}function v(){Mv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var r=b(t,e,n);return r?r[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function x(t){var e,n,r,a,i,o;for(e=t.split("."),(n=Wo[e.length])||(n=_(e.length)),i=[],r=function(t,n){return t?"*":e[n]},a=n.length;a--;)o=n[a].map(r).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function _(t){var e,n,r,a,i,o,s,u,c="";if(!Wo[t]){for(r=[];c.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(a(n[o]));r[i]=u}Wo[t]=r}return Wo[t]}function w(t,e,n,r){var a=t[e];if(!a||!a.equalsOrStartsWith(r)&&a.equalsOrStartsWith(n))return t[e]=a?a.replace(n,r):r,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new $o(t)),Ko[t])}function S(t,e){function n(e,n){var r,a,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(r=t.viewmodel.wrapped[n.str],a=r?r.get():t.viewmodel.get(n),o=a?Object.keys(a):null),o&&o.forEach(function(t){"_ractive"===t&&i(a)||e.push(n.join(t))}),e}var r,a,o;for(r=e.str.split("."),o=[Yo];a=r.shift();)"*"===a?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(a):o=o.map(O(a));return o}function O(t){return function(e){return e.join(t)}}function C(t){return t?t.replace(Ho,".$1"):""}function A(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var r=void 0,a=void 0;if(/\*/.test(e))return a={},S(t,E(C(e))).forEach(function(e){var r=t.viewmodel.get(e);if(!u(r))throw Error(Zo);a[e.str]=r+n}),t.set(a);if(r=t.get(e),!u(r))throw Error(Zo);return t.set(e,+r+n)}function P(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=rs[t]}function j(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,r=t.length;r>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function F(t){return"string"==typeof t?[t]:void 0===t?[]:t;
-}function N(t){return t[t.length-1]}function R(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function D(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function q(t,e){return function(){for(var n;n=t.shift();)n(e)}}function B(t,e,n,r){var a;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof as)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{a=e.then}catch(i){return void r(i)}if("function"==typeof a){var o,s,u;s=function(e){o||(o=!0,B(t,e,n,r))},u=function(t){o||(o=!0,r(t))};try{a.call(e,s,u)}catch(i){if(!o)return r(i),void(o=!0)}}else n(e)}}function V(t,e,n){var r;return e=C(e),"~/"===e.substr(0,2)?(r=E(e.substring(2)),W(t,r.firstKey,n)):"."===e[0]?(r=U(ps(n),e),r&&W(t,r.firstKey,n)):r=z(t,E(e),n),r}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function z(t,e,n,r){var a,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(a=n.context,n=n.parent,a&&(s=!0,o=t.viewmodel.get(a),o&&("object"==typeof o||"function"==typeof o)&&i in o))return a.join(e.str);return H(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=z(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):r||s?void 0:(t.viewmodel.set(e,void 0),e)}function W(t,e){var n;!t.parent||t.isolated||H(t.viewmodel,e)||(e=E(e),(n=z(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function H(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function G(t){t.teardown()}function K(t){t.unbind()}function $(t){t.unrender()}function Q(t){t.cancel()}function Y(t){t.detach()}function J(t){t.detachNodes()}function Z(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function X(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)a=t._subs[e[i]],a&&(s=gt(t,a,n,r)&&s);if(zs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,r)}}function gt(t,e,n,r){var a=null,i=!1;n&&!n._noArg&&(r=[n].concat(r)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,r)===!1&&(i=!0);return n&&!n._noArg&&i&&(a=n.original)&&(a.preventDefault&&a.preventDefault(),a.stopPropagation&&a.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};Ws(this,t,e)}function yt(t){var e;return t=E(C(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function xt(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,_t(this)}function _t(t){Qs.fire(t),t.findAllComponents("*").forEach(function(t){_t(t.instance)})}function wt(t,e,n){var r,a;return t=E(C(t)),r=this.viewmodel.get(t),i(r)&&i(e)?(a=bs.start(this,!0),this.viewmodel.merge(t,r,e,n),bs.end(),a):this.set(t,e,n&&n.complete)}function kt(t,e){var n,r;return n=S(t,e),r={},n.forEach(function(e){r[e.str]=t.get(e.str)}),r}function Et(t,e,n,r){var a,i,o;e=E(C(e)),r=r||pu,e.isPattern?(a=new uu(t,e,n,r),t.viewmodel.patternObservers.push(a),i=!0):a=new Xs(t,e,n,r),a.init(r.init),t.viewmodel.register(e,a,i?"patternObservers":"observers"),a.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(a),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,a,"patternObservers")):t.viewmodel.unregister(e,a,"observers"),o=!0)}};return t._observers.push(s),s}function St(t,e,n){var r,a,i,o;if(c(t)){n=e,a=t,r=[];for(t in a)a.hasOwnProperty(t)&&(e=a[t],r.push(this.observe(t,e,n)));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",cu(this,t,e,n);if(i=t.split(" "),1===i.length)return cu(this,t,e,n);for(r=[],o=i.length;o--;)t=i[o],t&&r.push(cu(this,t,e,n));return{cancel:function(){for(;r.length;)r.pop().cancel()}}}function Ot(t,e,n){var r=this.observe(t,function(){e.apply(this,arguments),r.cancel()},{init:!1,defer:n&&n.defer});return r}function Ct(t,e){var n,r=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,a;(n=r._subs[t])&&(e?(a=n.indexOf(e),-1!==a&&n.splice(a,1)):r._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,r,a,i=this;if("object"==typeof t){n=[];for(r in t)t.hasOwnProperty(r)&&n.push(this.on(r,t[r]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return a=t.split(" ").map(du).filter(hu),a.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Pt(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var r,a,i,o,s,u,c=[];if(r=jt(t,e,n),!r)return null;for(a=t.length,s=r.length-2-r[1],i=Math.min(a,r[0]),o=i+r[1],u=0;i>u;u+=1)c.push(u);for(;o>u;u+=1)c.push(-1);for(;a>u;u+=1)c.push(u+s);return 0!==s?c.touchedFrom=r[0]:c.touchedFrom=t.length,c}function jt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var r,a,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),r=bs.start(this,!0),bs.scheduleTask(function(){return ju.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Pu.apply(),e&&((a=e.__ractive_instances__)?a.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,r.then(function(){return Mu.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(G)}function Ft(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function Nt(t,e){var n,r,a;return r='[data-ractive-css~="{'+e+'}"]',a=function(t){var e,n,a,i,o,s,u,c=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Dt),u=e.length;u--;)s=i.slice(),a=e[u],s[u]=a.base+r+a.modifiers||"",o=i.slice(),o[u]=r+" "+o[u],c.push(s.join(" "),o.join(" "));return c.join(", ")},n=Bu.test(t)?t.replace(Bu,r):t.replace(Du,"").replace(Ru,function(t,e){var n,r;return qu.test(e)?t:(n=e.split(",").map(Rt),r=n.map(a).join(", ")+" ",t.replace(e,r))})}function Rt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Dt(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function qt(t,e){It(e);var n="function"==typeof t,r="function"==typeof e;return e||n||(e={}),n||r?function(){var a=r?Bt(e,this):e,i=n?Bt(t,this):t;return Vt(a,i)}:Vt(e,t)}function Bt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Vt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Eo($u);return e.parse=function(e,n){return zt(e,n||t)},e}function zt(t,e){if(!Gu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Gu(t,e||this.options)}function Wt(t,e){var n;if(!Zi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Ht(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a i;)c(r,a=t[i++])&&(~P(o,a)||o.push(a));return o}},B=function(){};i(i.S,"Object",{getPrototypeOf:r.getProto=r.getProto||function(t){return t=g(t),c(t,k)?t[k]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?C:null},getOwnPropertyNames:r.getNames=r.getNames||I(N,N.length,!0),create:r.create=r.create||function(t,e){var n;return null!==t?(B.prototype=h(t),n=new B,B.prototype=null,n[k]=t):n=F(),void 0===e?n:R(n,e)},keys:r.getKeys=r.getKeys||I(L,D,!1)});var q=function(t,e,n){if(!(e in j)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";j[e]=Function("F,a","return new F("+a.join(",")+")")}return j[e](t,n)};i(i.P,"Function",{bind:function(t){var e=m(this),n=O.call(arguments,1),a=function(){var r=n.concat(O.call(arguments));return this instanceof a?q(e,r.length,r):f(e,r,t)};return v(e.prototype)&&(a.prototype=e.prototype),a}}),i(i.P+i.F*d(function(){u&&O.call(u)}),"Array",{slice:function(t,e){var n=x(this.length),a=l(this);if(e=void 0===e?n:e,"Array"==a)return O.call(this,t,e);for(var r=_(t,n),i=_(e,n),o=x(i-r),s=Array(o),u=0;o>u;u++)s[u]="String"==a?this.charAt(r+u):this[r+u];return s}}),i(i.P+i.F*(w!=Object),"Array",{join:function(t){return A.call(w(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var G=function(t){return function(e,n){m(e);var a=w(this),r=x(a.length),i=t?r-1:0,o=t?-1:1;if(arguments.length<2)for(;;){if(i in a){n=a[i],i+=o;break}if(i+=o,t?0>i:i>=r)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:r>i;i+=o)i in a&&(n=e(n,a[i],i,this));return n}},U=function(t){return function(e){return t(this,e,arguments[1])}};i(i.P,"Array",{forEach:r.each=r.each||U(E(0)),map:U(E(1)),filter:U(E(2)),some:U(E(3)),every:U(E(4)),reduce:G(!1),reduceRight:G(!0),indexOf:U(P),lastIndexOf:function(t,e){var n=b(this),a=x(n.length),r=a-1;for(arguments.length>1&&(r=Math.min(r,y(e))),0>r&&(r=x(a+r));r>=0;r--)if(r in n&&n[r]===t)return r;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var V=function(t){return t>9?t:"0"+t};i(i.P+i.F*(d(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+V(t.getUTCMonth()+1)+"-"+V(t.getUTCDate())+"T"+V(t.getUTCHours())+":"+V(t.getUTCMinutes())+":"+V(t.getUTCSeconds())+"."+(n>99?n:"0"+V(n))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,e,n){var a=t(22);a(a.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,e,n){var a=t(22);a(a.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,e,n){"use strict";var a=t(22),r=t(8)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,e,n){"use strict";var a=t(22),r=t(8)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,e,n){"use strict";var a=t(17),r=t(22),i=t(80),o=t(40),s=t(35),u=t(79),p=t(84);r(r.S+r.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,c,l=i(t),f="function"==typeof this?this:Array,d=arguments,h=d.length,m=h>1?d[1]:void 0,v=void 0!==m,g=0,b=p(l);if(v&&(m=a(m,h>2?d[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=u(l.length),n=new f(e);e>g;g++)n[g]=v?m(l[g],g):l[g];else for(c=b.call(l),n=new f;!(r=c.next()).done;g++)n[g]=v?o(c,m,[r.value,g],!0):r.value;return n.length=g,n}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,e,n){"use strict";var a=t(3),r=t(44),i=t(45),o=t(78);e.exports=t(42)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,e,n){"use strict";var a=t(22);a(a.S+a.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments,n=e.length,a=new("function"==typeof this?this:Array)(n);n>t;)a[t]=e[t++];return a.length=n,a}})},{22:22,24:24}],93:[function(t,e,n){t(65)("Array")},{65:65}],94:[function(t,e,n){"use strict";var a=t(46),r=t(38),i=t(83)("hasInstance"),o=Function.prototype;i in o||a.setDesc(o,i,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=a.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,e,n){var a=t(46).setDesc,r=t(59),i=t(30),o=Function.prototype,s=/^\s*function ([^ (]*)/,u="name";u in o||t(19)&&a(o,u,{configurable:!0,get:function(){var t=(""+this).match(s),e=t?t[1]:"";return i(this,u)||a(this,u,r(5,e)),e}})},{19:19,30:30,46:46,59:59}],96:[function(t,e,n){"use strict";var a=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(this,t);return e&&e.v},set:function(t,e){return a.def(this,0===t?0:t,e)}},a,!0)},{12:12,15:15}],97:[function(t,e,n){var a=t(22),r=t(50),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(22);r(r.S,"Math",{asinh:a})},{22:22}],99:[function(t,e,n){var a=t(22);a(a.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,e,n){var a=t(22),r=t(51);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,e,n){var a=t(22);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,e,n){var a=t(22),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{22:22}],103:[function(t,e,n){var a=t(22);a(a.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,e,n){var a=t(22),r=t(51),i=Math.pow,o=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),p=i(2,-126),c=function(t){return t+1/o-1/o};a(a.S,"Math",{fround:function(t){var e,n,a=Math.abs(t),i=r(t);return p>a?i*c(a/p/s)*p*s:(e=(1+s/o)*a,n=e-(e-a),n>u||n!=n?i*(1/0):i*n)}})},{22:22,51:51}],105:[function(t,e,n){var a=t(22),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments,u=s.length,p=0;u>o;)n=r(s[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{22:22}],106:[function(t,e,n){var a=t(22),r=Math.imul;a(a.S+a.F*t(24)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,e,n){var a=t(22);a(a.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,e,n){var a=t(22);a(a.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,e,n){var a=t(22);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,e,n){var a=t(22);a(a.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S+a.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,e,n){var a=t(22),r=t(49),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,e,n){var a=t(22);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(11),s=t(81),u=t(24),p=t(74).trim,c="Number",l=r[c],f=l,d=l.prototype,h=o(a.create(d))==c,m="trim"in String.prototype,v=function(t){
+var e=s(t,!1);if("string"==typeof e&&e.length>2){e=m?e.trim():p(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,u=e.slice(2),c=0,l=u.length;l>c;c++)if(o=u.charCodeAt(c),48>o||o>r)return NaN;return parseInt(u,a)}}return+e};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof l&&(h?u(function(){d.valueOf.call(n)}):o(n)!=c)?new f(v(e)):v(e)},a.each.call(t(19)?a.getNames(f):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(f,t)&&!i(l,t)&&a.setDesc(l,t,a.getDesc(f,t))}),l.prototype=d,d.constructor=l,t(61)(r,c,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,e,n){var a=t(22);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,e,n){var a=t(22),r=t(29).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{22:22,29:29}],117:[function(t,e,n){var a=t(22);a(a.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,e,n){var a=t(22);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,e,n){var a=t(22),r=t(37),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,e,n){var a=t(22);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,e,n){var a=t(22);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,e,n){var a=t(22);a(a.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,e,n){var a=t(22);a(a.S+a.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,e,n){var a=t(38);t(54)("freeze",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],126:[function(t,e,n){var a=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(e,n){return t(a(e),n)}})},{54:54,78:78}],127:[function(t,e,n){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,e,n){var a=t(80);t(54)("getPrototypeOf",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],129:[function(t,e,n){var a=t(38);t(54)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}})},{38:38,54:54}],130:[function(t,e,n){var a=t(38);t(54)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],131:[function(t,e,n){var a=t(38);t(54)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{38:38,54:54}],132:[function(t,e,n){var a=t(22);a(a.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,e,n){var a=t(80);t(54)("keys",function(t){return function(e){return t(a(e))}})},{54:54,80:80}],134:[function(t,e,n){var a=t(38);t(54)("preventExtensions",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],135:[function(t,e,n){var a=t(38);t(54)("seal",function(t){return function(e){return t&&a(e)?t(e):e}})},{38:38,54:54}],136:[function(t,e,n){var a=t(22);a(a.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,e,n){"use strict";var a=t(10),r={};r[t(83)("toStringTag")]="z",r+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,e,n){"use strict";var a,r=t(46),i=t(48),o=t(29),s=t(17),u=t(10),p=t(22),c=t(38),l=t(4),f=t(2),d=t(69),h=t(27),m=t(64).set,v=t(63),g=t(83)("species"),b=t(68),y=t(52),_="Promise",x=o.process,w="process"==u(x),k=o[_],E=function(){},P=function(t){var e,n=new k(E);return t&&(n.constructor=function(t){t(E,E)}),(e=k.resolve(n))["catch"](E),e===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var n=!1;try{if(n=k&&k.resolve&&P(),m(e,k),e.prototype=r.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(n=!1),n&&t(19)){var a=!1;k.resolve(r.setDesc({},"then",{get:function(){a=!0}})),n=a}}catch(i){n=!1}return n}(),S=function(t,e){return i&&t===k&&e===a?!0:v(t,e)},O=function(t){var e=l(t)[g];return void 0!=e?e:t},A=function(t){var e;return c(t)&&"function"==typeof(e=t.then)?e:!1},T=function(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=f(e),this.reject=f(n)},M=function(t){try{t()}catch(e){return{error:e}}},R=function(t,e){if(!t.n){t.n=!0;var n=t.c;y(function(){for(var a=t.v,r=1==t.s,i=0,s=function(e){var n,i,o=r?e.ok:e.fail,s=e.resolve,u=e.reject;try{o?(r||(t.h=!0),n=o===!0?a:o(a),n===e.promise?u(TypeError("Promise-chain cycle")):(i=A(n))?i.call(n,s,u):s(n)):u(a)}catch(p){u(p)}};n.length>i;)s(n[i++]);n.length=0,t.n=!1,e&&setTimeout(function(){var e,n,r=t.p;j(r)&&(w?x.emit("unhandledRejection",a,r):(e=o.onunhandledrejection)?e({promise:r,reason:a}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",a)),t.a=void 0},1)})}},j=function(t){var e,n=t._d,a=n.a||n.c,r=0;if(n.h)return!1;for(;a.length>r;)if(e=a[r++],e.fail||!j(e.promise))return!1;return!0},L=function(t){var e=this;e.d||(e.d=!0,e=e.r||e,e.v=t,e.s=2,e.a=e.c.slice(),R(e,!0))},N=function(t){var e,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===t)throw TypeError("Promise can't be resolved itself");(e=A(t))?y(function(){var a={r:n,d:!1};try{e.call(t,s(N,a,1),s(L,a,1))}catch(r){L.call(a,r)}}):(n.v=t,n.s=1,R(n,!1))}catch(a){L.call({r:n,d:!1},a)}}};C||(k=function(t){f(t);var e=this._d={p:d(this,k,_),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(s(N,e,1),s(L,e,1))}catch(n){L.call(e,n)}},t(60)(k.prototype,{then:function(t,e){var n=new T(b(this,k)),a=n.promise,r=this._d;return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,r.c.push(n),r.a&&r.a.push(n),r.s&&R(r,!1),a},"catch":function(t){return this.then(void 0,t)}})),p(p.G+p.W+p.F*!C,{Promise:k}),t(66)(k,_),t(65)(_),a=t(16)[_],p(p.S+p.F*!C,_,{reject:function(t){var e=new T(this),n=e.reject;return n(t),e.promise}}),p(p.S+p.F*(!C||P(!0)),_,{resolve:function(t){if(t instanceof k&&S(t.constructor,this))return t;var e=new T(this),n=e.resolve;return n(t),e.promise}}),p(p.S+p.F*!(C&&t(43)(function(t){k.all(t)["catch"](function(){})})),_,{all:function(t){var e=O(this),n=new T(e),a=n.resolve,i=n.reject,o=[],s=M(function(){h(t,!1,o.push,o);var n=o.length,s=Array(n);n?r.each.call(o,function(t,r){var o=!1;e.resolve(t).then(function(t){o||(o=!0,s[r]=t,--n||a(s))},i)}):a(s)});return s&&i(s.error),n.promise},race:function(t){var e=O(this),n=new T(e),a=n.reject,r=M(function(){h(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r&&a(r.error),n.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,e,n){var a=t(22),r=Function.apply,i=t(4);a(a.S,"Reflect",{apply:function(t,e,n){return r.call(t,e,i(n))}})},{22:22,4:4}],140:[function(t,e,n){var a=t(46),r=t(22),i=t(2),o=t(4),s=t(38),u=Function.bind||t(16).Function.prototype.bind;r(r.S+r.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var r=[null];return r.push.apply(r,e),new(u.apply(t,r))}var p=n.prototype,c=a.create(s(p)?p:Object.prototype),l=Function.apply.call(t,c,e);return s(l)?l:c}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S+r.F*t(24)(function(){Reflect.defineProperty(a.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t);try{return a.setDesc(t,e,n),!0}catch(r){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t,e,n){var a=t(22),r=t(46).getDesc,i=t(4);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{22:22,4:4,46:46}],143:[function(t,e,n){"use strict";var a=t(22),r=t(4),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(41)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,e,n){var a=t(46),r=t(22),i=t(4);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.getDesc(i(t),e)}})},{22:22,4:4,46:46}],145:[function(t,e,n){var a=t(22),r=t(46).getProto,i=t(4);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{22:22,4:4,46:46}],146:[function(t,e,n){function a(t,e){var n,o,p=arguments.length<3?t:arguments[2];return u(t)===p?t[e]:(n=r.getDesc(t,e))?i(n,"value")?n.value:void 0!==n.get?n.get.call(p):void 0:s(o=r.getProto(t))?a(o,e,p):void 0}var r=t(46),i=t(30),o=t(22),s=t(38),u=t(4);o(o.S,"Reflect",{get:a})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{22:22}],148:[function(t,e,n){var a=t(22),r=t(4),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,e,n){var a=t(22);a(a.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,e,n){var a=t(22),r=t(4),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{22:22,4:4}],151:[function(t,e,n){var a=t(22),r=t(64);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{22:22,64:64}],152:[function(t,e,n){function a(t,e,n){var o,c,l=arguments.length<4?t:arguments[3],f=r.getDesc(u(t),e);if(!f){if(p(c=r.getProto(t)))return a(c,e,n,l);f=s(0)}return i(f,"value")?f.writable!==!1&&p(l)?(o=r.getDesc(l,e)||s(0),o.value=n,r.setDesc(l,e,o),!0):!1:void 0===f.set?!1:(f.set.call(l,n),!0)}var r=t(46),i=t(30),o=t(22),s=t(59),u=t(4),p=t(38);o(o.S,"Reflect",{set:a})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,e,n){var a=t(46),r=t(29),i=t(39),o=t(26),s=r.RegExp,u=s,p=s.prototype,c=/a/g,l=/a/g,f=new s(c)!==c;!t(19)||f&&!t(24)(function(){return l[t(83)("match")]=!1,s(c)!=c||s(l)==l||"/a/i"!=s(c,"i")})||(s=function(t,e){var n=i(t),a=void 0===e;return this instanceof s||!n||t.constructor!==s||!a?f?new u(n&&!a?t.source:t,e):u((n=t instanceof s)?t.source:t,n&&a?o.call(t):e):t},a.each.call(a.getNames(u),function(t){t in s||a.setDesc(s,t,{configurable:!0,get:function(){return u[t]},set:function(e){u[t]=e}})}),p.constructor=s,s.prototype=p,t(61)(r,"RegExp",s)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,e,n){var a=t(46);t(19)&&"g"!=/./g.flags&&a.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}],155:[function(t,e,n){t(25)("match",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],156:[function(t,e,n){t(25)("replace",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],157:[function(t,e,n){t(25)("search",1,function(t,e){return function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")}})},{25:25}],158:[function(t,e,n){t(25)("split",2,function(t,e,n){return function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)}})},{25:25}],159:[function(t,e,n){"use strict";var a=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t=0===t?0:t,t)}},a)},{12:12,15:15}],160:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{22:22,70:70}],161:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="endsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments,a=n.length>1?n[1]:void 0,u=r(e.length),p=void 0===a?u:Math.min(r(a),u),c=t+"";return s?s.call(e,c,p):e.slice(p-c.length,p)===c}})},{22:22,23:23,71:71,79:79}],162:[function(t,e,n){var a=t(22),r=t(76),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments,o=a.length,s=0;o>s;){if(e=+a[s++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{22:22,76:76}],163:[function(t,e,n){"use strict";var a=t(22),r=t(71),i="includes";a(a.P+a.F*t(23)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,e,n){"use strict";var a=t(70)(!0);t(42)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,e,n){var a=t(22),r=t(78),i=t(79);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments,o=a.length,s=[],u=0;n>u;)s.push(e[u++]+""),o>u&&s.push(a[u]+"");return s.join("")}})},{22:22,78:78,79:79}],166:[function(t,e,n){var a=t(22);a(a.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,e,n){"use strict";var a=t(22),r=t(79),i=t(71),o="startsWith",s=""[o];a(a.P+a.F*t(23)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=arguments,a=r(Math.min(n.length>1?n[1]:void 0,e.length)),u=t+"";return s?s.call(e,u,a):e.slice(a,a+u.length)===u}})},{22:22,23:23,71:71,79:79}],168:[function(t,e,n){"use strict";t(74)("trim",function(t){return function(){return t(this,3)}})},{74:74}],169:[function(t,e,n){"use strict";var a=t(46),r=t(29),i=t(30),o=t(19),s=t(22),u=t(61),p=t(24),c=t(67),l=t(66),f=t(82),d=t(83),h=t(47),m=t(28),v=t(21),g=t(36),b=t(4),y=t(78),_=t(59),x=a.getDesc,w=a.setDesc,k=a.create,E=m.get,P=r.Symbol,C=r.JSON,S=C&&C.stringify,O=!1,A=d("_hidden"),T=a.isEnum,M=c("symbol-registry"),R=c("symbols"),j="function"==typeof P,L=Object.prototype,N=o&&p(function(){return 7!=k(w({},"a",{get:function(){return w(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=x(L,e);a&&delete L[e],w(t,e,n),a&&t!==L&&w(L,e,a)}:w,D=function(t){var e=R[t]=k(P.prototype);return e._k=t,o&&O&&N(L,t,{configurable:!0,set:function(e){i(this,A)&&i(this[A],t)&&(this[A][t]=!1),N(this,t,_(1,e))}}),e},F=function(t){return"symbol"==typeof t},I=function(t,e,n){return n&&i(R,e)?(n.enumerable?(i(t,A)&&t[A][e]&&(t[A][e]=!1),n=k(n,{enumerable:_(0,!1)})):(i(t,A)||w(t,A,_(1,{})),t[A][e]=!0),N(t,e,n)):w(t,e,n)},B=function(t,e){b(t);for(var n,a=v(e=y(e)),r=0,i=a.length;i>r;)I(t,n=a[r++],e[n]);return t},q=function(t,e){return void 0===e?k(t):B(k(t),e)},G=function(t){var e=T.call(this,t);return e||!i(this,t)||!i(R,t)||i(this,A)&&this[A][t]?e:!0},U=function(t,e){var n=x(t=y(t),e);return!n||!i(R,e)||i(t,A)&&t[A][e]||(n.enumerable=!0),n},V=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])||e==A||a.push(e);return a},z=function(t){for(var e,n=E(y(t)),a=[],r=0;n.length>r;)i(R,e=n[r++])&&a.push(R[e]);return a},W=function(t){if(void 0!==t&&!F(t)){for(var e,n,a=[t],r=1,i=arguments;i.length>r;)a.push(i[r++]);return e=a[1],"function"==typeof e&&(n=e),(n||!g(e))&&(e=function(t,e){return n&&(e=n.call(this,t,e)),F(e)?void 0:e}),a[1]=e,S.apply(C,a)}},H=p(function(){var t=P();return"[null]"!=S([t])||"{}"!=S({a:t})||"{}"!=S(Object(t))});j||(P=function(){if(F(this))throw TypeError("Symbol is not a constructor");return D(f(arguments.length>0?arguments[0]:void 0))},u(P.prototype,"toString",function(){return this._k}),F=function(t){return t instanceof P},a.create=q,a.isEnum=G,a.getDesc=U,a.setDesc=I,a.setDescs=B,a.getNames=m.get=V,a.getSymbols=z,o&&!t(48)&&u(L,"propertyIsEnumerable",G,!0));var Q={"for":function(t){return i(M,t+="")?M[t]:M[t]=P(t)},keyFor:function(t){return h(M,t)},useSetter:function(){O=!0},useSimple:function(){O=!1}};a.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var e=d(t);Q[t]=j?e:D(e)}),O=!0,s(s.G+s.W,{Symbol:P}),s(s.S,"Symbol",Q),s(s.S+s.F*!j,"Object",{create:q,defineProperty:I,defineProperties:B,getOwnPropertyDescriptor:U,getOwnPropertyNames:V,getOwnPropertySymbols:z}),C&&s(s.S+s.F*(!j||H),"JSON",{stringify:W}),l(P,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,e,n){"use strict";var a=t(46),r=t(61),i=t(14),o=t(38),s=t(30),u=i.frozenStore,p=i.WEAK,c=Object.isExtensible||o,l={},f=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(o(t)){if(!c(t))return u(this).get(t);if(s(t,p))return t[p][this._i]}},set:function(t,e){return i.def(this,t,e)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(l),7).get(l)&&a.each.call(["delete","has","get","set"],function(t){var e=f.prototype,n=e[t];r(e,t,function(e,a){if(o(e)&&!c(e)){var r=u(this)[t](e,a);return"set"==t?this:r}return n.call(this,e,a)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,e,n){"use strict";var a=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(this,t,!0)}},a,!1,!0)},{14:14,15:15}],172:[function(t,e,n){"use strict";var a=t(22),r=t(7)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,e,n){var a=t(22);a(a.P,"Map",{toJSON:t(13)("Map")})},{13:13,22:22}],174:[function(t,e,n){var a=t(22),r=t(55)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{22:22,55:55}],175:[function(t,e,n){var a=t(46),r=t(22),i=t(56),o=t(78),s=t(59);r(r.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,r=o(t),u=a.setDesc,p=a.getDesc,c=i(r),l={},f=0;c.length>f;)n=p(r,e=c[f++]),e in l?u(l,e,s(0,n)):l[e]=n;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,e,n){var a=t(22),r=t(55)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{22:22,55:55}],177:[function(t,e,n){var a=t(22),r=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{22:22,62:62}],178:[function(t,e,n){var a=t(22);a(a.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,e,n){"use strict";var a=t(22),r=t(70)(!0);a(a.P,"String",{at:function(t){return r(this,t)}})},{22:22,70:70}],180:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padLeft:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,e,n){"use strict";var a=t(22),r=t(72);a(a.P,"String",{padRight:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,e,n){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,e,n){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,e,n){var a=t(46),r=t(22),i=t(17),o=t(16).Array||Array,s={},u=function(t,e){a.each.call(t.split(","),function(t){void 0==e&&t in o?s[t]=o[t]:t in[]&&(s[t]=i(Function.call,[][t],e))})};u("pop,reverse,shift,keys,values,entries",1),u("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),u("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),r(r.S,"Array",s)},{16:16,17:17,22:22,46:46}],185:[function(t,e,n){t(91);var a=t(29),r=t(31),i=t(45),o=t(83)("iterator"),s=a.NodeList,u=a.HTMLCollection,p=s&&s.prototype,c=u&&u.prototype,l=i.NodeList=i.HTMLCollection=i.Array;p&&!p[o]&&r(p,o,l),c&&!c[o]&&r(c,o,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,e,n){var a=t(22),r=t(75);a(a.G+a.B,{setImmediate:r.set,clearImmediate:r.clear})},{22:22,75:75}],187:[function(t,e,n){var a=t(29),r=t(22),i=t(33),o=t(57),s=a.navigator,u=!!s&&/MSIE .\./.test(s.userAgent),p=function(t){return u?function(e,n){return t(i(o,[].slice.call(arguments,2),"function"==typeof e?e:Function(e)),n)}:t};r(r.G+r.B+r.F*u,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,e,n){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),e.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,e,n){(function(n){(function(t,n){!function(n){"use strict";function a(t,e,n,a){var r=Object.create((e||i).prototype),o=new h(a||[]);return r._invoke=l(t,n,o),r}function r(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(a){return{type:"throw",arg:a}}}function i(){}function o(){}function s(){}function u(t){["next","throw","return"].forEach(function(e){t[e]=function(t){return this._invoke(e,t)}})}function p(t){this.arg=t}function c(e){function n(t,n){var a=e[t](n),r=a.value;return r instanceof p?Promise.resolve(r.arg).then(i,o):Promise.resolve(r).then(function(t){return a.value=t,a})}function a(t,e){function a(){return n(t,e)}return r=r?r.then(a,a):new Promise(function(t){t(a())})}"object"==typeof t&&t.domain&&(n=t.domain.bind(n));var r,i=n.bind(e,"next"),o=n.bind(e,"throw");n.bind(e,"return");this._invoke=a}function l(t,e,n){var a=w;return function(i,o){if(a===E)throw Error("Generator is already running");if(a===P){if("throw"===i)throw o;return v()}for(;;){var s=n.delegate;if(s){if("return"===i||"throw"===i&&s.iterator[i]===g){n.delegate=null;var u=s.iterator["return"];if(u){var p=r(u,s.iterator,o);if("throw"===p.type){i="throw",o=p.arg;continue}}if("return"===i)continue}var p=r(s.iterator[i],s.iterator,o);if("throw"===p.type){n.delegate=null,i="throw",o=p.arg;continue}i="next",o=g;var c=p.arg;if(!c.done)return a=k,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if("next"===i)n._sent=o,a===k?n.sent=o:n.sent=g;else if("throw"===i){if(a===w)throw a=P,o;n.dispatchException(o)&&(i="next",o=g)}else"return"===i&&n.abrupt("return",o);a=E;var p=r(t,e,n);if("normal"===p.type){a=n.done?P:k;var c={value:p.arg,done:n.done};if(p.arg!==C)return c;n.delegate&&"next"===i&&(o=g)}else"throw"===p.type&&(a=P,i="throw",o=p.arg)}}}function f(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function d(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function h(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(f,this),this.reset(!0)}function m(t){if(t){var e=t[y];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,a=function r(){for(;++n=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),C}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:m(t),resultName:e,nextLoc:n},C}}}("object"==typeof n?n:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,t(202),void 0!==n?n:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{202:202}],190:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=u?e(i):document.fonts.load(p(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(f,25)},function(){e(i)})};f()}else n(function(){function n(){var e;(e=-1!=v&&-1!=g||-1!=v&&-1!=b||-1!=g&&-1!=b)&&((e=v!=g&&v!=b&&g!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(v==y&&g==y&&b==y||v==_&&g==_&&b==_||v==x&&g==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function f(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(v=d.a.offsetWidth,g=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(f,50)}}var d=new a(s),h=new a(s),m=new a(s),v=-1,g=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(d,p(i,"sans-serif")),r(h,p(i,"serif")),r(m,p(i,"monospace")),w.appendChild(d.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=d.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,f(),o(d,function(t){v=t,n()}),r(d,p(i,'"'+i.family+'",sans-serif')),o(h,function(t){g=t,n()}),r(h,p(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,p(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],193:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[g]];return e||(e={},b++,t[g]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),f)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():v.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function u(t,e){if(t||(t=n),f)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),u=s.length;u>i;i++)a.createElement(s[i]);return a}function p(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),f||p(t,e),t}var l,f,d="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,v=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,f=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,f=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:d,shivCSS:h.shivCSS!==!1,supportsUnknownElements:f,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:u,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],194:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o=n.slice(),s=r(e,t),u=0,p=o.length;p>u&&(handler=o[u],"object"==typeof handler?"function"==typeof handler.handleEvent&&handler.handleEvent(s):handler.call(t,s),!s.stoppedImmediatePropagation);u++);return i=!s.stoppedPropagation,a&&i&&t.parentNode?t.parentNode.dispatchEvent(s):!s.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=b(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function u(t){!f&&k.test(document.readyState)&&(f=!f,document.detachEvent(d,u),t=document.createEvent("Event"),t.initEvent(h,!0,!0),document.dispatchEvent(t))}function p(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function c(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var l=!0,f=!1,d="onreadystatechange",h="DOMContentLoaded",m="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},g=Object.defineProperties||function(e,n){for(var a in n)if(y.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},b=Object.getOwnPropertyDescriptor,y=Object.prototype.hasOwnProperty,_=t.Element.prototype,x=t.Text.prototype,w=/^[a-z]+$/,k=/loaded|complete/,E={},P=document.createElement("div"),C=document.documentElement,S=C.removeAttribute,O=C.setAttribute;a(t.HTMLCommentElement.prototype,_,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(x,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(b(t.CSSStyleSheet.prototype,"cssText"))),g(_,{textContent:{get:o,set:p},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:{value:function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,u=this,p="on"+t,l=u[m]||v(u,m,{value:{}})[m],f=l[p]||(l[p]={}),d=f.h||(f.h=[]);if(!y.call(f,"w")){if(f.w=function(t){return t[m]||e(u,c(u,t),d,!1)},!y.call(E,p))if(w.test(t)){try{r=document.createEventObject(),r[m]=!0,9!=u.nodeType&&(null==u.parentNode&&P.appendChild(u),(o=u.getAttribute(p))&&S.call(u,p)),u.fireEvent(p,r),E[p]=!0}catch(r){for(E[p]=!1;P.hasChildNodes();)P.removeChild(P.firstChild)}null!=o&&O.call(u,p,o)}else E[p]=!1;(f.n=E[p])&&u.attachEvent(p,f.w)}i(d,n)<0&&d[a?"unshift":"push"](n),"input"===t&&u.attachEvent("onkeyup",s)}}},dispatchEvent:{value:function(t){var n,a=this,r="on"+t.type,i=a[m],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}},removeEventListener:{value:function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[m],s=o&&o[r],u=s&&s.h,p=u?i(u,e):-1;p>-1&&u.splice(p,1)}}}}),g(x,{addEventListener:{value:_.addEventListener},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener}}),g(t.XMLHttpRequest.prototype,{addEventListener:{value:function(t,e,n){var a=this,r="on"+t,o=a[m]||v(a,m,{value:{}})[m],s=o[r]||(o[r]={}),u=s.h||(s.h=[]);i(u,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),u[n?"unshift":"push"](e))}},dispatchEvent:{value:function(t){var n=this,a="on"+t.type,r=n[m],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}},removeEventListener:{value:_.removeEventListener}}),g(t.Event.prototype,{bubbles:{value:!0,writable:!0},cancelable:{value:!0,writable:!0},preventDefault:{value:function(){this.cancelable&&(this.defaultPrevented=!0,this.returnValue=!1)}},stopPropagation:{value:function(){this.stoppedPropagation=!0,this.cancelBubble=!0}},stopImmediatePropagation:{value:function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}},initEvent:{value:function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}}}),g(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&p.call(this,t)}},addEventListener:{value:function(e,n,a){var r=this;_.addEventListener.call(r,e,n,a),l&&e===h&&!k.test(r.readyState)&&(l=!1,r.attachEvent(d,u),t==top&&!function i(t){try{r.documentElement.doScroll("left"),u()}catch(e){setTimeout(i,50)}}())}},dispatchEvent:{value:_.dispatchEvent},removeEventListener:{value:_.removeEventListener},createEvent:{value:function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e}}}),g(t.Window.prototype,{getComputedStyle:{value:function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,u=this._,p=u.style,c=u.currentStyle,l=u.runtimeStyle;return t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:p[t],n.test(e)&&!a.test(t)&&(o=p.left,s=l&&l.left,s&&(l.left=c.left),p.left="fontSize"===t?"1em":e,e=p.pixelLeft+"px",p.left=o,s&&(l.left=s)),null==e?e:e+""||"auto"},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()},addEventListener:{value:function(n,a,r){var o,s=t,u="on"+n;s[u]||(s[u]=function(t){return e(s,c(s,t),o,!1)}),o=s[u][m]||(s[u][m]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}},dispatchEvent:{value:function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}},removeEventListener:{value:function(e,n,a){var r="on"+e,o=(t[r]||Object)[m],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}}}),function(t,e,n){for(n=0;n=s)return(0,u["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,p.times)(a,(0,p.minus)(n[l],n[l-1])));for(var f=[(0,p.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)f.push((0,p.minus)(n[l],(0,p.average)([i[l],i[l-1]])));f.push((0,p.minus)(n[s-1],c(i[s-2],i[s-3])));var d=f[0],h=f[1],m=n[0],v=n[1],g=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(d[0],d[1],h[0],h[1],v[0],v[1]);return{path:(0,p.range)(2,s).reduce(function(t,e){var a=f[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},g),centroid:(0,p.average)(n)}},e.exports=n["default"]},{198:198,199:199,200:200}],196:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(197),o=a(i),s=t(198),u=1e-5,p=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],p=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==p&&(p+=u),c==l&&(l+=u),{points:a,xmin:o,xmax:p,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,u=t.height,c=t.closed,l=t.min,f=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var d=function(t){return[n(t),a(t)]},h=e.map(function(t){return p(t,d)}),m=(0,s.minBy)(h,function(t){return t.xmin}),v=(0,s.maxBy)(h,function(t){return t.xmax}),g=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==f?(0,s.maxBy)(h,function(t){return t.ymax}):f;c&&(g=Math.min(g,0),b=Math.max(b,0));var y=c?0:g,_=(0,o["default"])([m,v],[0,i]),x=(0,o["default"])([g,b],[u,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{197:197,198:198}],197:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),u=s[0],p=s[1],c=function(t){return u+(p-u)*(t-r)/(o-r)};return c.inverse=function(){return i([u,p],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],198:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},u=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},p=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r+s,i+u]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return[r-s,i-u]},f=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},d=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return f(1/t.length,t.reduce(c))},v=function(t,e){return f(t,[Math.sin(e),-Math.cos(e)])},g=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,p=t[u];n.push(e(u,p))}}catch(c){r=!0,i=c}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=u,n.maxBy=p,n.plus=c,n.minus=l,n.times=f,n.id=x,n.length=d,n.sumVectors=h,n.average=m,n.onCircle=v,n.enhance=g,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:u,maxBy:p,plus:c,minus:l,times:f,id:x,length:d,sumVectors:h,average:m,onCircle:v,enhance:g,range:b,mapObject:y,pairs:_}},{}],199:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],u=o[1];return r===s&&i===u},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},u=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},p=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(u).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var u=o.value,c=p(u,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],200:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1)for(var n=1;n1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Ro.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===jo.call(t)}function o(t){return Lo.test(jo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function u(t){return!isNaN(parseFloat(t))&&isFinite(t)}function p(t){return t&&"[object Object]"===jo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function f(){Rv.DEBUG&&Ao.apply(null,arguments)}function d(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),No[t]||(No[t]=!0,To(t,n))}function m(){Rv.DEBUG&&d.apply(null,arguments)}function v(){Rv.DEBUG&&h.apply(null,arguments)}function g(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,u,p="";if(!zo[t]){for(a=[];p.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)u.push(r(n[o]));a[i]=u}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&u(e)?+e:e}function E(t){return null==t?t:(Qo.hasOwnProperty(t)||(Qo[t]=new Ko(t)),Qo[t])}function P(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[Yo];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===Yo?o[0]=E(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function S(t){return t?t.replace(Wo,".$1"):""}function O(t,e,n){if("string"!=typeof e||!u(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},P(t,E(S(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!u(a))throw Error(Jo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!u(a))throw Error(Jo);return t.set(e,+a+n)}function A(t,e){return Xo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function M(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function R(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function j(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function L(t){return"string"==typeof t?[t]:void 0===t?[]:t;
+}function N(t){return t[t.length-1]}function D(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,u;s=function(e){o||(o=!0,q(t,e,n,a))},u=function(t){o||(o=!0,a(t))};try{r.call(e,s,u)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function G(t,e,n){var a;return e=S(e),"~/"===e.substr(0,2)?(a=E(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=U(cs(n),e),a&&z(t,a.firstKey,n)):a=V(t,E(e),n),a}function U(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return E(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),E(n.join("."))}return E(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function V(t,e,n,a){var r,i,o,s,u;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=E(i),u=V(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:u}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=E(e),(n=V(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function Q(t){t.unbind()}function K(t){t.unrender()}function $(t){t.cancel()}function Y(t){t.detach()}function X(t){t.detachNodes()}function J(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;ds.ractives.length;)e=ds.ractives.pop(),n=e.viewmodel.applyChanges(),n&&gs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=gt(t,r,n,a)&&s);if(Vs.dequeue(t),t.parent&&s){if(o&&t.component){var u=t.component.name+"."+e[e.length-1];e=E(u).wildcardMatches(),n&&(n.component=t)}vt(t.parent,e,n,a)}}function gt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=E(S(t)),e=this.viewmodel.get(t,Qs),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){$s.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=E(S(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=P(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function Et(t,e,n,a){var r,i,o;e=E(S(e)),a=a||cu,e.isPattern?(r=new uu(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Pt(t,e,n){var a,r,i,o;if(p(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",pu(this,t,e,n);if(i=t.split(" "),1===i.length)return pu(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(pu(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function St(t,e){var n,a=this;if(t)n=t.split(" ").map(du).filter(hu),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function Ot(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(du).filter(hu),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function At(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,u,p=[];if(a=Mt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],u=0;i>u;u+=1)p.push(u);for(;o>u;u+=1)p.push(-1);for(;r>u;u+=1)p.push(u+s);return 0!==s?p.touchedFrom=a[0]:p.touchedFrom=t.length,p}function Mt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Rt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Mu.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&jt(s),e.innerHTML=""}return this.cssId&&Au.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Ru.fire(o)})}function jt(t){t.splice(0,t.length).forEach(H)}function Lt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Nt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,u,p=[];for(e=[];n=Iu.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),u=e.length;u--;)s=i.slice(),r=e[u],s[u]=r.base+a+r.modifiers||"",o=i.slice(),o[u]=a+" "+o[u],p.push(s.join(" "),o.join(" "));return p.join(", ")},n=qu.test(t)?t.replace(qu,a):t.replace(Fu,"").replace(Du,function(t,e){var n,a;return Bu.test(e)?t:(n=e.split(",").map(Dt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Dt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Gt(r,i)}:Gt(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&v("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Gt(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Ut(t){var e=Eo(Ku);return e.parse=function(e,n){return Vt(e,n||t)},e}function Vt(t,e){if(!Hu)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hu(t,e||this.options)}function zt(t,e){var n;if(!Ji){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+ Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device.
+
+ {{#if data.battery}}
+
+ Active
+
+
+ {{data.battery.max}}
+
+
+ {{Math.round(adata.battery.charge)}}/{{adata.battery.max}}
+
+ {{else}}
+
+ Not Available
+
+ {{/if}}
+
+
+ {{data.power_usage}}W
+
+
+
+
+
+ {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ
+
+
+
+
+
+ {{#each data.hardware}}
+
+
+ {{desc}}
+
+
+
+ {{enabled ? "Enabled" : "Disabled"}}
+
+
+
+ {{powerusage}}W
+
+ {{#if !critical}}
+
+
+ {{enabled ? "On" : "Off"}}
+
+
+ {{/if}}
+
+ {{/each}}
+
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/ntnet_chat.ract b/tgui/src/interfaces/ntnet_chat.ract
new file mode 100644
index 00000000000..03be35d39de
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_chat.ract
@@ -0,0 +1,103 @@
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+ {{#if data.adminmode}}
+ ADMINISTRATIVE MODE
+ {{/if}}
+
+ {{#if data.title}}
+
+ Current channel:
+
+
+ {{data.title}}
+
+
+ Operator access:
+
+
+ {{#if data.is_operator}}
+ Enabled
+ {{else}}
+ Disabled
+ {{/if}}
+
+
+ Controls:
+
+
+
+ | Send message
+ | | Change nickname
+ | | Toggle administration mode
+ | | Leave channel
+ | | Save log to local drive
+ {{#if data.is_operator}}
+ | | Rename channel
+ | | Set password
+ | | Delete channel
+ {{/if}}
+ |
+
+ Chat Window
+
+
+
+ {{#each data.messages}}
+ {{msg}}
+ {{/each}}
+
+
+
+ Connected Users
+ {{#each data.clients}}
+ {{name}}
+ {{/each}}
+ {{else}}
+ Controls:
+
+ | Change nickname
+ | | New Channel
+ | | Toggle administration mode
+ |
+ Available channels:
+
+ {{#each data.all_channels}}
+ {{chan}}
+ {{/each}}
+ |
+ {{/if}}
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/ntnet_dos.ract b/tgui/src/interfaces/ntnet_dos.ract
new file mode 100644
index 00000000000..afff153814d
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_dos.ract
@@ -0,0 +1,58 @@
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+ {{#if data.error}}
+ ##SYSTEM ERROR: {{data.error}}RESET
+ {{elseif data.target}}
+ ##DoS traffic generator active. Tx: {{data.speed}}GQ/s
+ {{#each data.dos_strings}}
+ {{nums}}
+ {{/each}}
+ ABORT
+ {{else}}
+ ##DoS traffic generator ready. Select target device.
+ {{#if data.focus}}
+ Targeted device ID: {{data.focus}}
+ {{else}}
+ Targeted device ID: None
+ {{/if}}
+ EXECUTE
+ Detected devices on network:
+ {{#each data.relays}}
+ {{id}}
+ {{/each}}
+ {{/if}}
+
diff --git a/tgui/src/interfaces/ntnet_downloader.ract b/tgui/src/interfaces/ntnet_downloader.ract
new file mode 100644
index 00000000000..da100b50e5a
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_downloader.ract
@@ -0,0 +1,119 @@
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+
+ Welcome to software download utility. Please select which software you wish to download.
+ {{#if data.error}}
+
+
+ {{data.error}}
+
+
+
+ RESET
+
+
+
+ {{else}}
+ {{#if data.downloadname}}
+
+ Please wait...
+
+ {{data.downloadname}}
+
+
+ {{data.downloaddesc}}
+
+
+ {{data.downloadcompletion}}GQ / {{data.downloadsize}}GQ
+
+
+ {{data.downloadspeed}} GQ/s
+
+
+ {{Math.round(adata.downloadcompletion)}}/{{adata.downloadsize}}
+
+
+ {{/if}}
+ {{/if}}
+ {{#if !data.downloadname}}
+ {{#if !data.error}}
+
+
+ {{Math.round(adata.disk_used)}}GQ/{{adata.disk_size}}GQ
+
+ {{#each data.downloadable_programs}}
+
+ {{filename}} ({{size}} GQ)
+
+
+ {{filedesc}}
+
+
+ {{fileinfo}}
+
+
+
+ DOWNLOAD
+
+
+ {{/each}}
+
+ {{#if data.hackedavailable}}
+
+ Please note that NanoTrasen does not recommend download of software from non-official servers.
+ {{#each data.hacked_programs}}
+
+ {{filename}} ({{size}} GQ)
+
+
+ {{filedesc}}
+
+
+ {{fileinfo}}
+
+
+
+ DOWNLOAD
+
+
+ {{/each}}
+
+ {{/if}}
+ {{/if}}
+ {{/if}}
+
NTOS v2.0.4b Copyright NanoTrasen 2557 - 2559
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/ntnet_monitor.ract b/tgui/src/interfaces/ntnet_monitor.ract
new file mode 100644
index 00000000000..67943650afe
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_monitor.ract
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+
+
+
+ {{data.ntnetrelays}}
+
+ {{#if data.ntnetrelays}}
+
+ {{data.ntnetstatus ? "ENABLED" : "DISABLED"}}
+
+
+
+
+ TOGGLE
+
+
+
+ Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!
+ {{else}}
+
Wireless coverage unavailable, no relays are connected.
+ {{/if}}
+
+
+
+
+
+
+
+ | PROTOCOL
+ | STATUS
+ | CONTROL
+ |
+ | Software Downloads
+ | {{data.config_softwaredownload ? 'ENABLED' : 'DISABLED'}}
+ | TOGGLE
+ |
+ | Peer to Peer Traffic
+ | {{data.config_peertopeer ? 'ENABLED' : 'DISABLED'}}
+ | TOGGLE
+ |
+ | Communication Systems
+ | {{data.config_communication ? 'ENABLED' : 'DISABLED'}}
+ | TOGGLE
+ |
+ | Remote System Control
+ | {{data.config_systemcontrol ? 'ENABLED' : 'DISABLED'}}
+ | TOGGLE
+ |
+
+
+
+
+ {{#if data.idsalarm}}
+
+ NETWORK INCURSION DETECTED
+
+ An abnormal activity has been detected in the network. Please verify system logs for more information
+
+ {{/if}}
+
+ {{data.idsstatus ? 'ENABLED' : 'DISABLED'}}
+
+
+
+ {{data.ntnetmaxlogs}}
+
+
+
+
+
+ | RESET IDS
+ | | TOGGLE IDS
+ | | SET LOG LIMIT
+ | | PURGE LOGS
+ |
+
+
+
+
+
+ {{#each data.ntnetlogs}}
+ {{entry}}
+ {{/each}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/ntnet_relay.ract b/tgui/src/interfaces/ntnet_relay.ract
new file mode 100644
index 00000000000..592d235164e
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_relay.ract
@@ -0,0 +1,22 @@
+
+ {{#if data.dos_crashed}}
+ NETWORK BUFFERS OVERLOADED
+ Overload Recovery Mode
+ This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue.
+ ADMINISTRATIVE OVERRIDE
+ CAUTION - Data loss may occur
+
+ Purge buffered traffic
+
+ {{else}}
+
+
+ {{data.enabled ? "ENABLED" : "DISABLED"}}
+
+
+
+
+ {{data.dos_overload}} / {{data.dos_capacity}} GQ
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/ntnet_transfer.ract b/tgui/src/interfaces/ntnet_transfer.ract
new file mode 100644
index 00000000000..f0c499f8de0
--- /dev/null
+++ b/tgui/src/interfaces/ntnet_transfer.ract
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+ {{#if data.error}}
+
+ An error has occured during operation...
+ Additional information: {{data.error}}
+ Clear
+
+ {{elseif data.downloading}}
+ Download in progress...
+
+ Downloaded file:
+
+
+ {{data.download_name}}
+
+
+ Download progress:
+
+
+ {{data.download_progress}} / {{data.download_size}} GQ
+
+
+ Transfer speed:
+
+
+ {{data.download_netspeed}}GQ/s
+
+
+ Controls:
+
+
+ Abort download
+
+ {{elseif data.uploading}}
+ Server enabled
+
+ Connected clients:
+
+
+ {{data.upload_clients}}
+
+
+ Provided file:
+
+
+ {{data.upload_filename}}
+
+
+ Server password:
+
+
+ {{#if data.haspassword}}
+ ENABLED
+ {{else}}
+ DISABLED
+ {{/if}}
+
+
+ Commands:
+
+
+ Set password
+ Exit server
+
+ {{elseif data.upload_filelist}}
+ File transfer server ready. Select file to upload:
+
+ | File name | File size | Controls
+ {{#each data.upload_filelist}}
+ |
|---|
| {{filename}}
+ | {{size}}GQ
+ | Select
+ {{/each}}
+ |
+
+ Set password
+ Return
+ {{else}}
+ Available files:
+ | Server UID | File Name | File Size | Password Protection | Operations
+ {{#each data.servers}}
+ |
|---|
| {{uid}}
+ | {{filename}}
+ | {{size}}GQ
+ {{#if haspassword}}
+ | Enabled
+ {{/if}}
+ {{#if !haspassword}}
+ | Disabled
+ {{/if}}
+
+ | Download
+ {{/each}}
+ |
+
+ Send file
+ {{/if}}
+
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/power_monitor_prog.ract b/tgui/src/interfaces/power_monitor_prog.ract
new file mode 100644
index 00000000000..ba40f27ec07
--- /dev/null
+++ b/tgui/src/interfaces/power_monitor_prog.ract
@@ -0,0 +1,112 @@
+
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+
+ {{#if config.fancy}}
+
+ {{else}}
+
+ {{data.supply}} W
+
+
+ {{data.demand}} W
+
+ {{/if}}
+
+
+
+ Area
+ Charge
+ Load
+ Status
+ Equipment
+ Lighting
+ Environment
+
+ {{#each data.areas}}
+
+ {{Math.round(adata.areas[@index].charge)}} %
+ {{Math.round(adata.areas[@index].load)}} W
+ {{chargingMode(charging)}}
+ {{channelPower(eqp)}} [{{channelMode(eqp)}}]
+ {{channelPower(lgt)}} [{{channelMode(lgt)}}]
+ {{channelPower(env)}} [{{channelMode(env)}}]
+
+ {{/each}}
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/revelation.ract b/tgui/src/interfaces/revelation.ract
new file mode 100644
index 00000000000..d4bbd89b403
--- /dev/null
+++ b/tgui/src/interfaces/revelation.ract
@@ -0,0 +1,60 @@
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+
+
+
+ Payload status:
+
+
+ {{#if data.armed}}
+ ARMED
+ {{else}}
+ DISARMED
+ {{/if}}
+
+
+ Controls:
+
+
+
+ | OBFUSCATE PROGRAM NAME
+ | | {{data.armed ? "DISARM" : "ARM"}}
+ ACTIVATE
+ |
+
+
+
\ No newline at end of file
diff --git a/tgui/src/interfaces/station_alert_prog.ract b/tgui/src/interfaces/station_alert_prog.ract
new file mode 100644
index 00000000000..5ba78cdb91e
--- /dev/null
+++ b/tgui/src/interfaces/station_alert_prog.ract
@@ -0,0 +1,47 @@
+
+
+
+
+ | Shutdown
+ {{#if data.PC_showexitprogram}}
+ | EXIT PROGRAM
+ | Minimize Program
+ {{/if}}
+ |
+
+
+
+{{#each data.alarms:class}}
+
+
+ {{#each .}}
+ - {{.}}
+ {{else}}
+ - System Nominal
+ {{/each}}
+
+
+{{/each}}
\ No newline at end of file
|