//# 1 errors, 395 messages
//#
/*
    //#LagDisplayPlugin.java:1:1: class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#LagDisplayPlugin.java:1:1: method: com.dmdirc.addons.lagdisplay.LagDisplayPlugin.com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.addons.lagdisplay;

import com.dmdirc.FrameContainer;
import com.dmdirc.Main;
import com.dmdirc.Server;
import com.dmdirc.ServerState;
import com.dmdirc.actions.ActionManager;
import com.dmdirc.actions.interfaces.ActionType;
import com.dmdirc.actions.CoreActionType;
import com.dmdirc.config.ConfigManager;
import com.dmdirc.config.IdentityManager;
import com.dmdirc.config.prefs.PreferencesCategory;
import com.dmdirc.config.prefs.PreferencesManager;
import com.dmdirc.config.prefs.PreferencesSetting;
import com.dmdirc.config.prefs.PreferencesType;
import com.dmdirc.interfaces.ActionListener;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.plugins.Plugin;
import com.dmdirc.ui.interfaces.Window;
import com.dmdirc.util.RollingList;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * Displays the current server's lag in the status bar.
 * @author chris
 */
public final class LagDisplayPlugin extends Plugin implements ActionListener, ConfigChangeListener {
    
    /** The panel we use in the status bar. */
    private final LagDisplayPanel panel = new LagDisplayPanel(this);
    
    /** A cache of ping times. */
    private final Map<Server, String> pings = new WeakHashMap<Server, String>();

    /** Ping history. */
    private final Map<Server, RollingList<Long>> history
            = new HashMap<Server, RollingList<Long>>();

    /** Whether or not to show a graph in the info popup. */
    private boolean showGraph = true;

    /** Whether or not to show labels on that graph. */
    private boolean showLabels = true;

    /** The length of history to keep per-server. */
    private int historySize = 100;
    
    /** Creates a new instance of LagDisplayPlugin. */
    public LagDisplayPlugin() {
        super();
    //#LagDisplayPlugin.java:76: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.com.dmdirc.addons.lagdisplay.LagDisplayPlugin()
    //#LagDisplayPlugin.java:76: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.plugins.Plugin()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()
    //#    unanalyzed callee: void com.dmdirc.plugins.Plugin()
    //#input(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new HashMap(LagDisplayPlugin#3) num objects
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new LagDisplayPanel(LagDisplayPlugin#1) num objects
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel.__Tag
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel.plugin
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new WeakHashMap(LagDisplayPlugin#2) num objects
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.history
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.historySize
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.pings
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.showGraph
    //#output(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.showLabels
    //#new obj(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new HashMap(LagDisplayPlugin#3)
    //#new obj(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new LagDisplayPanel(LagDisplayPlugin#1)
    //#new obj(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new WeakHashMap(LagDisplayPlugin#2)
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.history == &new HashMap(LagDisplayPlugin#3)
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.historySize == 100
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel == &new LagDisplayPanel(LagDisplayPlugin#1)
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.pings == &new WeakHashMap(LagDisplayPlugin#2)
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.showGraph == 1
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.showLabels == 1
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new HashMap(LagDisplayPlugin#3) num objects == 1
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new LagDisplayPanel(LagDisplayPlugin#1) num objects == 1
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): new WeakHashMap(LagDisplayPlugin#2) num objects == 1
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel.__Tag == com/dmdirc/addons/lagdisplay/LagDisplayPanel
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel.plugin == this
    //#post(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): this.panel.plugin != null
    //#unanalyzed(void com.dmdirc.addons.lagdisplay.LagDisplayPlugin()): Effects-of-calling:com.dmdirc.addons.ui_swing.components.statusbar.StatusbarPopupPanel
    }
    //#LagDisplayPlugin.java:77: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.com.dmdirc.addons.lagdisplay.LagDisplayPlugin()
    
    /** {@inheritDoc} */
    @Override
    public void onLoad() {
        Main.getUI().getStatusBar().addComponent(panel);
    //#LagDisplayPlugin.java:82: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.onLoad()
    //#LagDisplayPlugin.java:82: Warning: method not available - call not analyzed
    //#    call on StatusBar com.dmdirc.ui.interfaces.UIController:getStatusBar()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    unanalyzed callee: StatusBar com.dmdirc.ui.interfaces.UIController:getStatusBar()
    //#LagDisplayPlugin.java:82: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.StatusBar:addComponent(StatusBarComponent)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.StatusBar:addComponent(StatusBarComponent)
    //#input(void onLoad()): com/dmdirc/Main.controller
    //#input(void onLoad()): com/dmdirc/actions/ActionManager.listeners
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.CLIENT_FRAME_CHANGED
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.SERVER_DISCONNECTED
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.SERVER_GOTPING
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.SERVER_NOPING
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.SERVER_NUMERIC
    //#input(void onLoad()): com/dmdirc/actions/CoreActionType.SERVER_PINGSENT
    //#input(void onLoad()): this
    //#input(void onLoad()): this.panel
    //#output(void onLoad()): this.historySize
    //#output(void onLoad()): this.showGraph
    //#output(void onLoad()): this.showLabels
    //#pre[1] (void onLoad()): com/dmdirc/Main.controller != null
    //#presumption(void onLoad()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@83 != null
    //#presumption(void onLoad()): com.dmdirc.ui.interfaces.UIController:getStatusBar(...)@82 != null
    //#post(void onLoad()): init'ed(this.historySize)
    //#post(void onLoad()): init'ed(this.showGraph)
    //#post(void onLoad()): init'ed(this.showLabels)
    //#unanalyzed(void onLoad()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void onLoad()): Effects-of-calling:com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain
    //#unanalyzed(void onLoad()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void onLoad()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionInt
    //#unanalyzed(void onLoad()): Effects-of-calling:com.dmdirc.util.MapList:add
        IdentityManager.getGlobalConfig().addChangeListener(getDomain(), this);
    //#LagDisplayPlugin.java:83: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#LagDisplayPlugin.java:83: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:83: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, ConfigChangeListener)

        readConfig();
        
        ActionManager.addListener(this, CoreActionType.SERVER_GOTPING,
    //#LagDisplayPlugin.java:87: ?precondition failure
    //#    com/dmdirc/actions/ActionManager.addListener: (soft) init'ed(types[0..4_294_967_295])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onLoad()
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(addListener.Param_1[0..4_294_967_295])
    //#    callee: void com/dmdirc/actions/ActionManager.addListener(ActionListener, ActionType[])
    //#    callee assertion: (soft) init'ed(types[0..4_294_967_295])
    //#    callee file: ActionManager.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 676
    //#    VN: addListener.Param_1[0..4_294_967_295]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
                CoreActionType.SERVER_NOPING, CoreActionType.CLIENT_FRAME_CHANGED,
                CoreActionType.SERVER_DISCONNECTED, CoreActionType.SERVER_PINGSENT,
                CoreActionType.SERVER_NUMERIC);
    }
    //#LagDisplayPlugin.java:91: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.onLoad()

    /**
     * Reads the plugin's global configuration settings.
     */
    protected void readConfig() {
        final ConfigManager manager = IdentityManager.getGlobalConfig();
    //#LagDisplayPlugin.java:97: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.readConfig()
    //#LagDisplayPlugin.java:97: Warning: method not available - call not analyzed
    //#    call on ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: ConfigManager com.dmdirc.config.IdentityManager:getGlobalConfig()
    //#input(void readConfig()): this
    //#output(void readConfig()): this.historySize
    //#output(void readConfig()): this.showGraph
    //#output(void readConfig()): this.showLabels
    //#presumption(void readConfig()): com.dmdirc.config.IdentityManager:getGlobalConfig(...)@97 != null
    //#post(void readConfig()): init'ed(this.historySize)
    //#post(void readConfig()): init'ed(this.showGraph)
    //#post(void readConfig()): init'ed(this.showLabels)
        showGraph = manager.getOptionBool(getDomain(), "graph");
    //#LagDisplayPlugin.java:98: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:98: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        showLabels = manager.getOptionBool(getDomain(), "labels");
    //#LagDisplayPlugin.java:99: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:99: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        historySize = manager.getOptionInt(getDomain(), "history");
    //#LagDisplayPlugin.java:100: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:100: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void readConfig()
    //#    unanalyzed callee: int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    }
    //#LagDisplayPlugin.java:101: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.readConfig()

    /**
     * Retrieves the history of the specified server. If there is no history,
     * a new list is added to the history map and returned.
     * 
     * @param server The server whose history is being requested
     * @return The history for the specified server
     */
    protected RollingList<Long> getHistory(final Server server) {
        if (!history.containsKey(server)) {
    //#LagDisplayPlugin.java:111: method: RollingList com.dmdirc.addons.lagdisplay.LagDisplayPlugin.getHistory(Server)
    //#input(RollingList getHistory(Server)): server
    //#input(RollingList getHistory(Server)): this
    //#input(RollingList getHistory(Server)): this.history
    //#input(RollingList getHistory(Server)): this.historySize
    //#output(RollingList getHistory(Server)): return_value
    //#pre[3] (RollingList getHistory(Server)): this.history != null
    //#pre[4] (RollingList getHistory(Server)): (soft) init'ed(this.historySize)
    //#post(RollingList getHistory(Server)): init'ed(return_value)
    //#test_vector(RollingList getHistory(Server)): java.util.Map:containsKey(...)@111: {1}, {0}
            history.put(server, new RollingList<Long>(historySize));
    //#LagDisplayPlugin.java:112: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: RollingList getHistory(Server)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList(int)
        }

        return history.get(server);
    //#LagDisplayPlugin.java:115: end of method: RollingList com.dmdirc.addons.lagdisplay.LagDisplayPlugin.getHistory(Server)
    }

    /**
     * Determines if the {@link ServerInfoDialog} should show a graph of the
     * ping time for the current server.
     * 
     * @return True if a graph should be shown, false otherwise
     */
    public boolean shouldShowGraph() {
        return showGraph;
    //#LagDisplayPlugin.java:125: method: bool com.dmdirc.addons.lagdisplay.LagDisplayPlugin.shouldShowGraph()
    //#input(bool shouldShowGraph()): this
    //#input(bool shouldShowGraph()): this.showGraph
    //#output(bool shouldShowGraph()): return_value
    //#pre[2] (bool shouldShowGraph()): init'ed(this.showGraph)
    //#post(bool shouldShowGraph()): return_value == this.showGraph
    //#post(bool shouldShowGraph()): init'ed(return_value)
    //#LagDisplayPlugin.java:125: end of method: bool com.dmdirc.addons.lagdisplay.LagDisplayPlugin.shouldShowGraph()
    }

    /**
     * Determines if the {@link PingHistoryPanel} should show labels on selected
     * points.
     *
     * @return True if labels should be shown, false otherwise
     */
    public boolean shouldShowLabels() {
        return showLabels;
    //#LagDisplayPlugin.java:135: method: bool com.dmdirc.addons.lagdisplay.LagDisplayPlugin.shouldShowLabels()
    //#input(bool shouldShowLabels()): this
    //#input(bool shouldShowLabels()): this.showLabels
    //#output(bool shouldShowLabels()): return_value
    //#pre[2] (bool shouldShowLabels()): init'ed(this.showLabels)
    //#post(bool shouldShowLabels()): return_value == this.showLabels
    //#post(bool shouldShowLabels()): init'ed(return_value)
    //#LagDisplayPlugin.java:135: end of method: bool com.dmdirc.addons.lagdisplay.LagDisplayPlugin.shouldShowLabels()
    }
    
    /** {@inheritDoc} */
    @Override
    public void onUnload() {
        Main.getUI().getStatusBar().removeComponent(panel);
    //#LagDisplayPlugin.java:141: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.onUnload()
    //#LagDisplayPlugin.java:141: Warning: method not available - call not analyzed
    //#    call on StatusBar com.dmdirc.ui.interfaces.UIController:getStatusBar()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onUnload()
    //#    unanalyzed callee: StatusBar com.dmdirc.ui.interfaces.UIController:getStatusBar()
    //#LagDisplayPlugin.java:141: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.StatusBar:removeComponent(StatusBarComponent)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onUnload()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.StatusBar:removeComponent(StatusBarComponent)
    //#input(void onUnload()): com/dmdirc/Main.controller
    //#input(void onUnload()): com/dmdirc/actions/ActionManager.listeners
    //#input(void onUnload()): this
    //#input(void onUnload()): this.panel
    //#pre[1] (void onUnload()): com/dmdirc/Main.controller != null
    //#presumption(void onUnload()): com.dmdirc.config.IdentityManager:getConfigIdentity(...)@142 != null
    //#presumption(void onUnload()): com.dmdirc.ui.interfaces.UIController:getStatusBar(...)@141 != null
    //#unanalyzed(void onUnload()): Effects-of-calling:com.dmdirc.util.MapList:removeFromAll
        IdentityManager.getConfigIdentity().removeListener(this);
    //#LagDisplayPlugin.java:142: Warning: method not available - call not analyzed
    //#    call on Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onUnload()
    //#    unanalyzed callee: Identity com.dmdirc.config.IdentityManager:getConfigIdentity()
    //#LagDisplayPlugin.java:142: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.Identity:removeListener(ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void onUnload()
    //#    unanalyzed callee: void com.dmdirc.config.Identity:removeListener(ConfigChangeListener)
        
        ActionManager.removeListener(this);
    }
    //#LagDisplayPlugin.java:145: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.onUnload()
    
    /** {@inheritDoc} */
    @Override
    public void processEvent(final ActionType type, final StringBuffer format,
            final Object... arguments) {
        boolean useAlternate = false;
    //#LagDisplayPlugin.java:151: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.processEvent(ActionType, StringBuffer, Object[])
    //#input(void processEvent(ActionType, StringBuffer, Object[])): "+"._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): "LAGCHECK_"._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): "ms"._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): "s"._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments.length
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].__Tag
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].channels
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].parser
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].queries
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].raw
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].raw.__Tag
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[0].window
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[1]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[1]._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[2]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[2].length
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[2][3]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[2][3]._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].__Tag
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295]._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].channels
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].config
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].length
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].queries
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].raw.__Tag
    //#input(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295][3]._tainted
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Descendant_Table[com/dmdirc/Channel]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Channel.__Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/CustomWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/FrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/GlobalWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Main.controller
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/MessageTarget.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Descendant_Table[com/dmdirc/Query]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Query.__Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Descendant_Table[com/dmdirc/Raw]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Raw.__Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/Server.__Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerState.CONNECTED
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.CLIENT_FRAME_CHANGED
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.SERVER_DISCONNECTED
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.SERVER_GOTPING
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.SERVER_NOPING
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.SERVER_NUMERIC
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/actions/CoreActionType.SERVER_PINGSENT
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void processEvent(ActionType, StringBuffer, Object[])): format
    //#input(void processEvent(ActionType, StringBuffer, Object[])): this
    //#input(void processEvent(ActionType, StringBuffer, Object[])): this.history
    //#input(void processEvent(ActionType, StringBuffer, Object[])): this.historySize
    //#input(void processEvent(ActionType, StringBuffer, Object[])): this.panel
    //#input(void processEvent(ActionType, StringBuffer, Object[])): this.pings
    //#input(void processEvent(ActionType, StringBuffer, Object[])): type
    //#pre[1] (void processEvent(ActionType, StringBuffer, Object[])): arguments != null
    //#pre[42] (void processEvent(ActionType, StringBuffer, Object[])): type != null
    //#pre[2] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments.length in {3..4_294_967_295}
    //#pre[3] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0] != null
    //#pre[4] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0].__Tag == com/dmdirc/Server
    //#pre[5] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0].channels != null
    //#pre[6] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0].parser != null
    //#pre[7] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0].queries != null
    //#pre[8] (void processEvent(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[0].raw)
    //#pre[10] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[0].raw.__Tag == com/dmdirc/Raw
    //#pre[11] (void processEvent(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[0].window)
    //#pre[12] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[1] != null
    //#pre[14] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[2] != null
    //#pre[15] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[2].length >= 4
    //#pre[16] (void processEvent(ActionType, StringBuffer, Object[])): (soft) arguments[2][3] != null
    //#pre[19] (void processEvent(ActionType, StringBuffer, Object[])): (soft) init'ed(arguments[3..4_294_967_295])
    //#pre[35] (void processEvent(ActionType, StringBuffer, Object[])): (soft) com/dmdirc/Main.controller != null
    //#pre[38] (void processEvent(ActionType, StringBuffer, Object[])): (soft) this.history != null
    //#pre[39] (void processEvent(ActionType, StringBuffer, Object[])): (soft) init'ed(this.historySize)
    //#pre[40] (void processEvent(ActionType, StringBuffer, Object[])): (soft) this.panel != null
    //#pre[41] (void processEvent(ActionType, StringBuffer, Object[])): (soft) this.pings != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): getServer(...).__Tag@198 == com/dmdirc/Server
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): getServer(...).myState.__Tag@198 == com/dmdirc/ServerStatus
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): getServer(...).myState@198 != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): getServer(...)@198 != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Long:valueOf(...)@212 != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.util.Date:getTime(...)@212 - java.lang.Long:parseLong(...)@211 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.util.Map:get(...)@115 != null
    //#presumption(void processEvent(ActionType, StringBuffer, Object[])): java.util.Map:get(...)@115 != null
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:com.dmdirc.util.RollingList
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Long:longValue
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Math:round
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.lang.Object:equals
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:ownsFrame
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void processEvent(ActionType, StringBuffer, Object[])): Effects-of-calling:getFrame
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): arguments[3..4_294_967_295].config: Addr_Set{null}, Inverse{null}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): format: Addr_Set{null}, Inverse{null}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): getServer(...).myState.state@198: Addr_Set{&com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#3)}, Inverse{&com.dmdirc.ServerState__static_init.new ServerState(ServerState__static_init#3)}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): getServer(...)@196: Inverse{null}, Addr_Set{null}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Integer:intValue(...)@207: {-2_147_483_648..420, 422..4_294_967_295}, {421}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@162: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@174: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@185: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@194: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@205: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.Object:equals(...)@207: {0}, {1}
    //#test_vector(void processEvent(ActionType, StringBuffer, Object[])): java.lang.String:startsWith(...)@207: {0}, {1}

        for (Object obj : arguments) {
            if (obj instanceof FrameContainer
                    && ((FrameContainer) obj).getConfigManager() != null) {
                useAlternate = ((FrameContainer) obj).getConfigManager()
    //#LagDisplayPlugin.java:156: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:156: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
                        .getOptionBool(getDomain(), "usealternate");
                break;
            }
        }

        if (!useAlternate && type.equals(CoreActionType.SERVER_GOTPING)) {
            final Window active = Main.getUI().getActiveWindow();
    //#LagDisplayPlugin.java:163: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
            final String value = formatTime(arguments[1]);

            getHistory(((Server) arguments[0])).add((Long) arguments[1]);
    //#LagDisplayPlugin.java:166: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)
            pings.put(((Server) arguments[0]), value);

            if (((Server) arguments[0]).ownsFrame(active)) {
                panel.setText(value);
    //#LagDisplayPlugin.java:170: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
            }

            panel.refreshDialog();
    //#LagDisplayPlugin.java:173: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
        } else if (!useAlternate && type.equals(CoreActionType.SERVER_NOPING)) {
            final Window active = Main.getUI().getActiveWindow();
    //#LagDisplayPlugin.java:175: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
            final String value = formatTime(arguments[1]) + "+";

            pings.put(((Server) arguments[0]), value);

            if (((Server) arguments[0]).ownsFrame(active)) {
                panel.setText(value);
    //#LagDisplayPlugin.java:181: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
            }

            panel.refreshDialog();
    //#LagDisplayPlugin.java:184: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
        } else if (type.equals(CoreActionType.SERVER_DISCONNECTED)) {
            final Window active = Main.getUI().getActiveWindow();
    //#LagDisplayPlugin.java:186: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()

            if (((Server) arguments[0]).ownsFrame(active)) {
                panel.setText("Not connected");
    //#LagDisplayPlugin.java:189: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
                pings.remove(arguments[0]);
            }

            panel.refreshDialog();
    //#LagDisplayPlugin.java:193: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
        } else if (type.equals(CoreActionType.CLIENT_FRAME_CHANGED)) {
            final FrameContainer source = (FrameContainer) arguments[0];
            if (source.getServer() == null) {
    //#LagDisplayPlugin.java:196: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Server getServer()
                panel.setText("Unknown");
    //#LagDisplayPlugin.java:197: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
            } else if (source.getServer().getState() != ServerState.CONNECTED) {
    //#LagDisplayPlugin.java:198: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Server getServer()
                panel.setText("Not connected");
    //#LagDisplayPlugin.java:199: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
            } else {
                panel.setText(getTime(source.getServer()));
    //#LagDisplayPlugin.java:201: Warning: call too complex - analysis skipped
    //#    call on Server getServer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Server getServer()
    //#LagDisplayPlugin.java:201: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
            }

            panel.refreshDialog();
    //#LagDisplayPlugin.java:204: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
        } else if (useAlternate && type.equals(CoreActionType.SERVER_PINGSENT)) {
            ((Server) arguments[0]).getParser().sendLine("LAGCHECK_" + new Date().getTime());
    //#LagDisplayPlugin.java:206: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.IRCParser:sendLine(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser:sendLine(String)
        } else if (useAlternate && type.equals(CoreActionType.SERVER_NUMERIC)
                && ((Integer) arguments[1]).intValue() == 421
                && ((String[]) arguments[2])[3].startsWith("LAGCHECK_")) {
            try {
                final long sent = Long.parseLong(((String[]) arguments[2])[3].substring(9));
                final Long duration = Long.valueOf(new Date().getTime() - sent);
                final String value = formatTime(duration);
                final Window active = Main.getUI().getActiveWindow();
    //#LagDisplayPlugin.java:214: Warning: method not available - call not analyzed
    //#    call on Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: Window com.dmdirc.ui.interfaces.UIController:getActiveWindow()

                pings.put((Server) arguments[0], value);
                getHistory(((Server) arguments[0])).add(duration);
    //#LagDisplayPlugin.java:217: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)

                if (((Server) arguments[0]).ownsFrame(active)) {
                    panel.setText(value);
    //#LagDisplayPlugin.java:220: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:setText(String)
                }
            } catch (NumberFormatException ex) {
                pings.remove((Server) arguments[0]);
            }

            if (format != null) {
                format.delete(0, format.length());
            }

            panel.refreshDialog();
    //#LagDisplayPlugin.java:230: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void processEvent(ActionType, StringBuffer, Object[])
    //#    unanalyzed callee: void com.dmdirc.addons.lagdisplay.LagDisplayPanel:refreshDialog()
        }
    }
    //#LagDisplayPlugin.java:232: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.processEvent(ActionType, StringBuffer, Object[])

    /**
     * Retrieves the ping time for the specified server.
     *
     * @param server The server whose ping time is being requested
     * @return A String representation of the current lag, or "Unknown"
     */
    public String getTime(final Server server) {
        return pings.get(server) == null ? "Unknown" : pings.get(server);
    //#LagDisplayPlugin.java:241: method: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin.getTime(Server)
    //#input(String getTime(Server)): server
    //#input(String getTime(Server)): this
    //#input(String getTime(Server)): this.pings
    //#output(String getTime(Server)): return_value
    //#pre[3] (String getTime(Server)): this.pings != null
    //#post(String getTime(Server)): init'ed(return_value)
    //#LagDisplayPlugin.java:241: end of method: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin.getTime(Server)
    }
    
    /**
     * Formats the specified time so it's a nice size to display in the label.
     * @param object An uncast Long representing the time to be formatted
     * @return Formatted time string
     */
    protected String formatTime(final Object object) {
        final Long time = (Long) object;
    //#LagDisplayPlugin.java:250: method: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin.formatTime(Object)
    //#input(String formatTime(Object)): "ms"._tainted
    //#input(String formatTime(Object)): "s"._tainted
    //#input(String formatTime(Object)): object
    //#input(String formatTime(Object)): object._tainted
    //#output(String formatTime(Object)): java.lang.StringBuilder:toString(...)._tainted
    //#output(String formatTime(Object)): return_value
    //#new obj(String formatTime(Object)): java.lang.StringBuilder:toString(...)
    //#pre[1] (String formatTime(Object)): object != null
    //#post(String formatTime(Object)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(String formatTime(Object)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String formatTime(Object)): return_value in Addr_Set{&java.lang.StringBuilder:toString(...),&java.lang.StringBuilder:toString(...)}
    //#test_vector(String formatTime(Object)): java.lang.Long:longValue(...)@252: {-9_223_372_036_854_775_808..9_999}, {10_000..18_446_744_073_709_551_615}
        
        if (time >= 10000) {
            return Math.round(time / 1000.0) + "s";
        } else {
            return time + "ms";
    //#LagDisplayPlugin.java:255: end of method: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin.formatTime(Object)
        }
    }

    /** {@inheritDoc} */
    @Override
    public void showConfig(final PreferencesManager manager) {
        final PreferencesCategory cat = new PreferencesCategory("Lag display plugin",
    //#LagDisplayPlugin.java:262: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.showConfig(PreferencesManager)
    //#LagDisplayPlugin.java:262: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory(String, String)
    //#input(void showConfig(PreferencesManager)): com.dmdirc.config.prefs.PreferencesType.BOOLEAN
    //#input(void showConfig(PreferencesManager)): com.dmdirc.config.prefs.PreferencesType.INTEGER
    //#input(void showConfig(PreferencesManager)): manager
    //#input(void showConfig(PreferencesManager)): this
    //#pre[1] (void showConfig(PreferencesManager)): manager != null
    //#presumption(void showConfig(PreferencesManager)): com.dmdirc.config.prefs.PreferencesManager:getCategory(...)@277 != null
    //#presumption(void showConfig(PreferencesManager)): init'ed(com.dmdirc.config.prefs.PreferencesType.BOOLEAN)
    //#presumption(void showConfig(PreferencesManager)): init'ed(com.dmdirc.config.prefs.PreferencesType.INTEGER)
                                                                "");
        cat.addSetting(new PreferencesSetting(PreferencesType.BOOLEAN,
    //#LagDisplayPlugin.java:264: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:264: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#LagDisplayPlugin.java:264: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
                getDomain(), "usealternate",
                "Alternate method", "Use an alternate method of determining "
                + "lag which bypasses bouncers or proxies that may reply?"));
        cat.addSetting(new PreferencesSetting(PreferencesType.BOOLEAN,
    //#LagDisplayPlugin.java:268: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:268: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#LagDisplayPlugin.java:268: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
                getDomain(), "graph", "Show graph", "Show a graph of ping times " +
                "for the current server in the information popup?"));
        cat.addSetting(new PreferencesSetting(PreferencesType.BOOLEAN,
    //#LagDisplayPlugin.java:271: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:271: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#LagDisplayPlugin.java:271: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
                getDomain(), "labels", "Show labels", "Show labels on selected " +
                "points on the ping graph?"));
        cat.addSetting(new PreferencesSetting(PreferencesType.INTEGER,
    //#LagDisplayPlugin.java:274: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: String com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain()
    //#LagDisplayPlugin.java:274: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesSetting(PreferencesType, String, String, String, String)
    //#LagDisplayPlugin.java:274: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory:addSetting(PreferencesSetting)
                getDomain(), "history", "Graph points", "Number of data points " +
                "to plot on the graph, if enabled."));
        manager.getCategory("Plugins").addSubCategory(cat);
    //#LagDisplayPlugin.java:277: Warning: method not available - call not analyzed
    //#    call on PreferencesCategory com.dmdirc.config.prefs.PreferencesManager:getCategory(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: PreferencesCategory com.dmdirc.config.prefs.PreferencesManager:getCategory(String)
    //#LagDisplayPlugin.java:277: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.prefs.PreferencesCategory:addSubCategory(PreferencesCategory)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
    //#    method: void showConfig(PreferencesManager)
    //#    unanalyzed callee: void com.dmdirc.config.prefs.PreferencesCategory:addSubCategory(PreferencesCategory)
    }
    //#LagDisplayPlugin.java:278: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.showConfig(PreferencesManager)

    /** {@inheritDoc} */
    @Override
    public void configChanged(final String domain, final String key) {
        readConfig();
    //#LagDisplayPlugin.java:283: method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.configChanged(String, String)
    //#input(void configChanged(String, String)): this
    //#output(void configChanged(String, String)): this.historySize
    //#output(void configChanged(String, String)): this.showGraph
    //#output(void configChanged(String, String)): this.showLabels
    //#post(void configChanged(String, String)): init'ed(this.historySize)
    //#post(void configChanged(String, String)): init'ed(this.showGraph)
    //#post(void configChanged(String, String)): init'ed(this.showLabels)
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.addons.lagdisplay.LagDisplayPlugin:getDomain
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionBool
    //#unanalyzed(void configChanged(String, String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptionInt
    }
    //#LagDisplayPlugin.java:284: end of method: void com.dmdirc.addons.lagdisplay.LagDisplayPlugin.configChanged(String, String)
}
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Descendant_Table[com/dmdirc/addons/lagdisplay/LagDisplayPlugin]
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.formatTime(Ljava/lang/Object;)Ljava/lang/String;
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.getHistory(Lcom/dmdirc/Server;)Lcom/dmdirc/util/RollingList;
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.getTime(Lcom/dmdirc/Server;)Ljava/lang/String;
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.onLoad()V
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.onUnload()V
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.processEvent(Lcom/dmdirc/actions/interfaces/ActionType;Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.readConfig()V
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.shouldShowGraph()Z
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.shouldShowLabels()Z
    //#output(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.showConfig(Lcom/dmdirc/config/prefs/PreferencesManager;)V
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Descendant_Table[com/dmdirc/addons/lagdisplay/LagDisplayPlugin] == &__Dispatch_Table
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.formatTime(Ljava/lang/Object;)Ljava/lang/String; == &formatTime
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.getHistory(Lcom/dmdirc/Server;)Lcom/dmdirc/util/RollingList; == &getHistory
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.getTime(Lcom/dmdirc/Server;)Ljava/lang/String; == &getTime
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.onLoad()V == &onLoad
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.onUnload()V == &onUnload
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.processEvent(Lcom/dmdirc/actions/interfaces/ActionType;Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &processEvent
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.readConfig()V == &readConfig
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.shouldShowGraph()Z == &shouldShowGraph
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.shouldShowLabels()Z == &shouldShowLabels
    //#post(com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init): __Dispatch_Table.showConfig(Lcom/dmdirc/config/prefs/PreferencesManager;)V == &showConfig
    //#LagDisplayPlugin.java:: end of method: com.dmdirc.addons.lagdisplay.LagDisplayPlugin.com.dmdirc.addons.lagdisplay.LagDisplayPlugin__static_init
    //#LagDisplayPlugin.java:: end of class: com.dmdirc.addons.lagdisplay.LagDisplayPlugin
