//# 52 errors, 872 messages
//#
/*
    //#ProcessMode.java:1:1: class: com.dmdirc.parser.irc.ProcessMode
    //#ProcessMode.java:1:1: method: com.dmdirc.parser.irc.ProcessMode.com.dmdirc.parser.irc.ProcessMode__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.parser.irc;

import com.dmdirc.parser.irc.callbacks.CallbackObject;
import java.util.Calendar;

/**
 * Process a Mode line.
 */
public class ProcessMode extends IRCProcessor {
	/**
	 * Process a Mode Line.
	 *
	 * @param sParam Type of line to process ("MODE", "324")
	 * @param token IRCTokenised line to process
	 */
	@Override
	public void process(String sParam, String[] token) {
		String[] sModestr;
		String sChannelName;
		if (sParam.equals("324")) {
    //#ProcessMode.java:42: method: void com.dmdirc.parser.irc.ProcessMode.process(String, String[])
    //#input(void process(String, String[])): " - Added"._tainted
    //#input(void process(String, String[])): "Callback not found: "._tainted
    //#input(void process(String, String[])): "Got unknown user mode "._tainted
    //#input(void process(String, String[])): "OnDebugInfo"._tainted
    //#input(void process(String, String[])): "OnErrorInfo"._tainted
    //#input(void process(String, String[])): "OnUserModeChanged"._tainted
    //#input(void process(String, String[])): "OnUserModeDiscovered"._tainted
    //#input(void process(String, String[])): __Descendant_Table[com/dmdirc/parser/irc/ProcessMode]
    //#input(void process(String, String[])): __Descendant_Table[others]
    //#input(void process(String, String[])): __Dispatch_Table.callUserModeChanged(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void process(String, String[])): __Dispatch_Table.callUserModeDiscovered(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;)Z
    //#input(void process(String, String[])): __Dispatch_Table.processChanMode(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
    //#input(void process(String, String[])): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getMyNickname()Ljava/lang/String;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void process(String, String[])): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void process(String, String[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void process(String, String[])): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void process(String, String[])): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void process(String, String[])): sParam
    //#input(void process(String, String[])): this
    //#input(void process(String, String[])): this.__Tag
    //#input(void process(String, String[])): this.myParser
    //#input(void process(String, String[])): this.myParser.__Tag
    //#input(void process(String, String[])): this.myParser.cMyself
    //#input(void process(String, String[])): this.myParser.cMyself.bIsFake
    //#input(void process(String, String[])): this.myParser.cMyself.sNickname
    //#input(void process(String, String[])): this.myParser.hChanPrefix
    //#input(void process(String, String[])): this.myParser.hChannelList
    //#input(void process(String, String[])): this.myParser.hClientList
    //#input(void process(String, String[])): this.myParser.hUserModes
    //#input(void process(String, String[])): this.myParser.lastLine
    //#input(void process(String, String[])): this.myParser.myCallbackManager
    //#input(void process(String, String[])): this.myParser.myCallbackManager.callbackHash
    //#input(void process(String, String[])): this.myParser.nNextKeyUser
    //#input(void process(String, String[])): this.myParser.sThinkNickname
    //#input(void process(String, String[])): this.myParser.stringConverter
    //#input(void process(String, String[])): this.myParser.stringConverter.__Tag
    //#input(void process(String, String[])): this.myParser.stringConverter.lowercase
    //#input(void process(String, String[])): this.myParser.stringConverter.lowercase.length
    //#input(void process(String, String[])): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void process(String, String[])): token
    //#input(void process(String, String[])): token.length
    //#input(void process(String, String[])): token[0]
    //#input(void process(String, String[])): token[1, 4..4_294_967_298]
    //#input(void process(String, String[])): token[1, 4..4_294_967_298]._tainted
    //#input(void process(String, String[])): token[2]
    //#input(void process(String, String[])): token[2]._tainted
    //#input(void process(String, String[])): token[3]
    //#output(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void process(String, String[])): new char[](IRCStringConverter#1) num objects
    //#output(void process(String, String[])): new char[](IRCStringConverter#1).length
    //#output(void process(String, String[])): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void process(String, String[])): new char[](IRCStringConverter#2) num objects
    //#output(void process(String, String[])): new char[](IRCStringConverter#2).length
    //#output(void process(String, String[])): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void process(String, String[])): this.myParser.nNextKeyCMBool
    //#output(void process(String, String[])): this.myParser.nNextKeyUser
    //#output(void process(String, String[])): this.myParser.stringConverter
    //#new obj(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void process(String, String[])): new char[](IRCStringConverter#1)
    //#new obj(void process(String, String[])): new char[](IRCStringConverter#2)
    //#pre[4] (void process(String, String[])): sParam != null
    //#pre[28] (void process(String, String[])): token != null
    //#pre[2] (void process(String, String[])): (soft) this.myParser.nNextKeyUser in {-4_611_686_018_427_387_904..9_223_372_036_854_775_807}
    //#pre[3] (void process(String, String[])): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void process(String, String[])): (soft) this.__Tag == com/dmdirc/parser/irc/ProcessMode
    //#pre[7] (void process(String, String[])): (soft) this.myParser != null
    //#pre[8] (void process(String, String[])): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (void process(String, String[])): (soft) this.myParser.cMyself != null
    //#pre[10] (void process(String, String[])): (soft) init'ed(this.myParser.cMyself.bIsFake)
    //#pre[11] (void process(String, String[])): (soft) init'ed(this.myParser.cMyself.sNickname)
    //#pre[14] (void process(String, String[])): (soft) this.myParser.hChanPrefix != null
    //#pre[15] (void process(String, String[])): (soft) this.myParser.hChannelList != null
    //#pre[17] (void process(String, String[])): (soft) this.myParser.hClientList != null
    //#pre[19] (void process(String, String[])): (soft) this.myParser.hUserModes != null
    //#pre[20] (void process(String, String[])): (soft) init'ed(this.myParser.lastLine)
    //#pre[21] (void process(String, String[])): (soft) this.myParser.myCallbackManager != null
    //#pre[22] (void process(String, String[])): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[23] (void process(String, String[])): (soft) init'ed(this.myParser.sThinkNickname)
    //#pre[24] (void process(String, String[])): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[25] (void process(String, String[])): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[27] (void process(String, String[])): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#pre[29] (void process(String, String[])): (soft) token.length in {5..4_294_967_296}
    //#pre[30] (void process(String, String[])): (soft) init'ed(token[0])
    //#pre[32] (void process(String, String[])): (soft) token[1, 4..4_294_967_298] != null
    //#pre[34] (void process(String, String[])): (soft) token[2] != null
    //#pre[37] (void process(String, String[])): (soft) token[3] != null
    //#presumption(void process(String, String[])): this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void process(String, String[])): this.myParser.stringConverter.lowercase != null
    //#post(void process(String, String[])): this.myParser.nNextKeyCMBool == old this.myParser.nNextKeyCMBool
    //#post(void process(String, String[])): this.myParser.nNextKeyUser <= 18_446_744_073_709_551_614
    //#post(void process(String, String[])): init'ed(this.myParser.stringConverter)
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1) num objects == undefined
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1) num objects == 0, if init'ed
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).limit == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#1).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#1)[0..65_535] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#2).length == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new char[](IRCStringConverter#2)[0..65_567] == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(void process(String, String[])): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void process(String, String[])): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).lowercase == undefined
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).lowercase == null
    //#post(void process(String, String[])): new IRCStringConverter(getIRCStringConverter#1).uppercase == new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#post(void process(String, String[])): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void process(String, String[])): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void process(String, String[])): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void process(String, String[])): new char[](IRCStringConverter#1) num objects == 0
    //#post(void process(String, String[])): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void process(String, String[])): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void process(String, String[])): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void process(String, String[])): new char[](IRCStringConverter#2) num objects == 0
    //#post(void process(String, String[])): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void process(String, String[])): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getCallbackManager
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getCallbackType
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Character:equals
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Long:longValue
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getLastLine
    //#unanalyzed(void process(String, String[])): Effects-of-calling:callErrorInfo
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Long:valueOf
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void process(String, String[])): Effects-of-calling:callDebugInfo
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getClientInfo
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void process(String, String[])): Effects-of-calling:call
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getUserMode
    //#unanalyzed(void process(String, String[])): Effects-of-calling:setUserMode
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void process(String, String[])): Effects-of-calling:parseHost
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void process(String, String[])): Effects-of-calling:getNickname
    //#unanalyzed(void process(String, String[])): Effects-of-calling:isValidChannelName
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void process(String, String[])): Effects-of-calling:isFake
    //#unanalyzed(void process(String, String[])): Effects-of-calling:java.util.Map:isEmpty
    //#test_vector(void process(String, String[])): java.lang.String:equals(...)@42: {0}, {1}
    //#test_vector(void process(String, String[])): java.lang.String:equals(...)@46: {0}, {1}
			sChannelName = token[3];
			sModestr = new String[token.length-4];
			System.arraycopy(token, 4, sModestr, 0, token.length-4);
		} else if (sParam.equals("221")) {
			processUserMode(sParam, token, new String[]{token[token.length-1]}, true);
			return;
		} else {
			sChannelName = token[2];
			sModestr = new String[token.length-3];
			System.arraycopy(token, 3, sModestr, 0, token.length-3);
		}

		if (!isValidChannelName(sChannelName)) { processUserMode(sParam, token, sModestr, false); }
    //#ProcessMode.java:55: ?precondition failure
    //#    com/dmdirc/parser/irc/ProcessMode.processUserMode: (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void process(String, String[])
    //#    basic block: bb_7
    //#    assertion: (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    callee: void com/dmdirc/parser/irc/ProcessMode.processUserMode(String, String[], String[], bool)
    //#    callee assertion: (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    callee file: ProcessMode.java
    //#    callee precondition index: [17]
    //#    callee srcpos: 222
    //#    VN: this.myParser.stringConverter.__Tag
    //#    Expected: {434_432}
    //#    Bad: {0..434_431, 434_433..+Inf}
    //#    Attribs:  Int  Exp singleton  Bad overlaps +/-1000  Soft  Bad < Exp  Bad > Exp
    //#ProcessMode.java:55: ?precondition failure
    //#    com/dmdirc/parser/irc/ProcessMode.processUserMode: (soft) this.myParser.stringConverter.lowercase != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void process(String, String[])
    //#    basic block: bb_7
    //#    assertion: (soft) this.myParser.stringConverter.lowercase != null
    //#    callee: void com/dmdirc/parser/irc/ProcessMode.processUserMode(String, String[], String[], bool)
    //#    callee assertion: (soft) this.myParser.stringConverter.lowercase != null
    //#    callee file: ProcessMode.java
    //#    callee precondition index: [18]
    //#    callee srcpos: 222
    //#    VN: this.myParser.stringConverter.lowercase
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#ProcessMode.java:55: ?precondition failure
    //#    com/dmdirc/parser/irc/ProcessMode.processUserMode: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void process(String, String[])
    //#    basic block: bb_7
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: void com/dmdirc/parser/irc/ProcessMode.processUserMode(String, String[], String[], bool)
    //#    callee assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee file: ProcessMode.java
    //#    callee precondition index: [20]
    //#    callee srcpos: 222
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		else { processChanMode(sParam, token, sModestr, sChannelName); }
    //#ProcessMode.java:56: Warning: call too complex - analysis skipped
    //#    call on void processChanMode(String, String[], String[], String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void process(String, String[])
    //#    unanalyzed callee: void processChanMode(String, String[], String[], String)
	}
    //#ProcessMode.java:57: end of method: void com.dmdirc.parser.irc.ProcessMode.process(String, String[])
	
	/**
	 * Method to trim spaces from strings
	 *
	 * @param str String to trim
	 * @return String without spaces on the ends
	 */
	private String trim(String str) { return str.trim(); }
    //#ProcessMode.java:65: method: String com.dmdirc.parser.irc.ProcessMode.trim(String)
    //#input(String trim(String)): str
    //#output(String trim(String)): return_value
    //#pre[1] (String trim(String)): str != null
    //#post(String trim(String)): return_value != null
    //#ProcessMode.java:65: end of method: String com.dmdirc.parser.irc.ProcessMode.trim(String)
	
	/**
	 * Process Chan modes.
	 *
	 * @param sParam String representation of parameter to parse
	 * @param token IRCTokenised Array of the incomming line
	 * @param sModestr The modes and params
	 * @param sChannelName Channel these modes are for
	 */	
	public void processChanMode(String sParam, String token[], String sModestr[], String sChannelName) {
		StringBuilder sFullModeStr = new StringBuilder();
    //#ProcessMode.java:76: method: void com.dmdirc.parser.irc.ProcessMode.processChanMode(String, String[], String[], String)
    //#input(void processChanMode(String, String[], String[], String)): " "._tainted
    //#input(void processChanMode(String, String[], String[], String)): ""._tainted
    //#input(void processChanMode(String, String[], String[], String)): "+"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "-"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "Callback not found: "._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnChannelModeChanged"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnChannelNonUserModeChanged"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnChannelSingleModeChanged"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnChannelUserModeChanged"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnDebugInfo"._tainted
    //#input(void processChanMode(String, String[], String[], String)): "OnErrorInfo"._tainted
    //#input(void processChanMode(String, String[], String[], String)): __Descendant_Table[com/dmdirc/parser/irc/ProcessMode]
    //#input(void processChanMode(String, String[], String[], String)): __Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): __Dispatch_Table.callChannelModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void processChanMode(String, String[], String[], String)): __Dispatch_Table.callChannelUserModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChanMode()J
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getNickname()Ljava/lang/String;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.setChanMode(J)V
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getMode()J
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getUser(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.getUser(Ljava/lang/String;Z)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.setListModeParam(Ljava/lang/Character;Lcom/dmdirc/parser/irc/ChannelListModeItem;Z)V
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.setMode(J)V
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelInfo.__Dispatch_Table.setModeParam(Ljava/lang/Character;Ljava/lang/String;)V
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelListModeItem.__Descendant_Table[com/dmdirc/parser/irc/ChannelListModeItem]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ChannelListModeItem.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processChanMode(String, String[], String[], String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processChanMode(String, String[], String[], String)): sChannelName
    //#input(void processChanMode(String, String[], String[], String)): sModestr
    //#input(void processChanMode(String, String[], String[], String)): sModestr.length
    //#input(void processChanMode(String, String[], String[], String)): sModestr[0]
    //#input(void processChanMode(String, String[], String[], String)): sModestr[0]._tainted
    //#input(void processChanMode(String, String[], String[], String)): sModestr[1..4_294_967_295]
    //#input(void processChanMode(String, String[], String[], String)): sModestr[1..4_294_967_295]._tainted
    //#input(void processChanMode(String, String[], String[], String)): sParam
    //#input(void processChanMode(String, String[], String[], String)): this
    //#input(void processChanMode(String, String[], String[], String)): this.__Tag
    //#input(void processChanMode(String, String[], String[], String)): this.myParser
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.__Tag
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.hChanModesBool
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.hChanModesOther
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.hChannelList
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.hClientList
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.hPrefixModes
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.lastLine
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.myCallbackManager
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.myCallbackManager.callbackHash
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.nNextKeyCMBool
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.__Tag
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase.length
    //#input(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void processChanMode(String, String[], String[], String)): token
    //#input(void processChanMode(String, String[], String[], String)): token.length
    //#input(void processChanMode(String, String[], String[], String)): token[0]
    //#input(void processChanMode(String, String[], String[], String)): token[0]._tainted
    //#output(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1) num objects
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1).length
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2) num objects
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2).length
    //#output(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void processChanMode(String, String[], String[], String)): this.myParser.nNextKeyCMBool
    //#output(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter
    //#new obj(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1)
    //#new obj(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2)
    //#pre[3] (void processChanMode(String, String[], String[], String)): sChannelName != null
    //#pre[10] (void processChanMode(String, String[], String[], String)): sParam != null
    //#pre[17] (void processChanMode(String, String[], String[], String)): this.myParser.hChannelList != null
    //#pre[1] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.nNextKeyCMBool in {-4_611_686_018_427_387_904..9_223_372_036_854_775_807}
    //#pre[2] (void processChanMode(String, String[], String[], String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[4] (void processChanMode(String, String[], String[], String)): (soft) sModestr != null
    //#pre[5] (void processChanMode(String, String[], String[], String)): (soft) sModestr.length in {1..4_294_967_295}
    //#pre[6] (void processChanMode(String, String[], String[], String)): (soft) sModestr[0] != null
    //#pre[8] (void processChanMode(String, String[], String[], String)): (soft) sModestr[1..4_294_967_295] != null
    //#pre[12] (void processChanMode(String, String[], String[], String)): (soft) this.__Tag == com/dmdirc/parser/irc/ProcessMode
    //#pre[13] (void processChanMode(String, String[], String[], String)): (soft) this.myParser != null
    //#pre[14] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[15] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.hChanModesBool != null
    //#pre[16] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.hChanModesOther != null
    //#pre[19] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.hClientList != null
    //#pre[20] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.hPrefixModes != null
    //#pre[21] (void processChanMode(String, String[], String[], String)): (soft) init'ed(this.myParser.lastLine)
    //#pre[22] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.myCallbackManager != null
    //#pre[23] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[24] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[25] (void processChanMode(String, String[], String[], String)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[27] (void processChanMode(String, String[], String[], String)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#pre[28] (void processChanMode(String, String[], String[], String)): (soft) token != null
    //#pre[29] (void processChanMode(String, String[], String[], String)): (soft) token.length >= 1
    //#pre[30] (void processChanMode(String, String[], String[], String)): (soft) token[0] != null
    //#presumption(void processChanMode(String, String[], String[], String)): cbSingle.__Tag in {com/dmdirc/parser/irc/callbacks/CallbackObject, com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific}
    //#presumption(void processChanMode(String, String[], String[], String)): getClient(...).sHost@108 != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.hChannelUserList != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.hListModes != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.hParamModes != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.h005Info != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.hChanModesOther != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.sNetworkName@108 != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.__Tag@108 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.lowercase != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.lowercase != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.lowercase.length@108 >= 1
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.myParser.stringConverter.lowercase@108 != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannel.sName != null
    //#presumption(void processChanMode(String, String[], String[], String)): iChannelClientInfo.__Tag@133 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iChannelClientInfo.__Tag@143 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(void processChanMode(String, String[], String[], String)): iClient.myChannelClientInfos != null
    //#presumption(void processChanMode(String, String[], String[], String)): iClient.myParser != null
    //#presumption(void processChanMode(String, String[], String[], String)): iClient.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#presumption(void processChanMode(String, String[], String[], String)): java.lang.Character:valueOf(...)@116 != null
    //#presumption(void processChanMode(String, String[], String[], String)): java.lang.String:length(...)@115 <= 4_294_967_294
    //#presumption(void processChanMode(String, String[], String[], String)): java.lang.String:length(...)@115 - sModestr.length in {-4_294_967_295..-1, 4_294_967_293}
    //#presumption(void processChanMode(String, String[], String[], String)): java.util.Calendar:getInstance(...)@175 != null
    //#presumption(void processChanMode(String, String[], String[], String)): java.util.Map:get(...)@123 != null
    //#presumption(void processChanMode(String, String[], String[], String)): java.util.Map:get(...)@124 != null
    //#presumption(void processChanMode(String, String[], String[], String)): java.util.Map:get(...)@131 != null
    //#presumption(void processChanMode(String, String[], String[], String)): setterCCI.__Tag@108 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(void processChanMode(String, String[], String[], String)): setterCCI.cClient@108 != null
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.__Tag@133 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase != null
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase != null
    //#presumption(void processChanMode(String, String[], String[], String)): this.myParser.stringConverter.lowercase@133 != null
    //#post(void processChanMode(String, String[], String[], String)): this.myParser.nNextKeyCMBool <= 18_446_744_073_709_551_614
    //#post(void processChanMode(String, String[], String[], String)): init'ed(this.myParser.stringConverter)
    //#post(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new IRCStringConverter(getIRCStringConverter#1) num objects)
    //#post(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void processChanMode(String, String[], String[], String)): possibly_updated(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void processChanMode(String, String[], String[], String)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#1) num objects)
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#1).length == 127
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2).length == 127
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void processChanMode(String, String[], String[], String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void processChanMode(String, String[], String[], String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#2) num objects)
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void processChanMode(String, String[], String[], String)): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#post(void processChanMode(String, String[], String[], String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getCallbackType
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getClient
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:call
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getChannelInfo
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getUser
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:parseHost
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:callDebugInfo
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getClientInfo
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getNickname
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.ArrayList:size
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.ArrayList:get
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.ArrayList:remove
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getChannel
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:getName
    //#unanalyzed(void processChanMode(String, String[], String[], String)): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void processChanMode(String, String[], String[], String)): sModestr.length: {2..4_294_967_295}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.Byte:byteValue(...)@124: {1}, {-128..-1, 4..255}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.Character:equals(...)@120: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.Character:equals(...)@121: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:equals(...)@106: {1}, {0}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:equals(...)@209: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:equals(...)@93: {1}, {0}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:isEmpty(...)@111: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:length(...)@115: {4_294_967_294}, {0}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.lang.String:length(...)@115 - sModestr.length: {-4_294_967_294..-1}, {4_294_967_293}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.util.Map:containsKey(...)@123: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.util.Map:containsKey(...)@124: {0}, {1}
    //#test_vector(void processChanMode(String, String[], String[], String)): java.util.Map:containsKey(...)@125: {0}, {1}
		String sNonUserModeStr = "";
		String sNonUserModeStrParams = "";
		String sModeParam;
		String sTemp;
		int nParam = 1;
		long nTemp = 0, nValue = 0, nCurrent = 0;
    //#ProcessMode.java:82: Warning: unused assignment
    //#    Unused assignment into nTemp
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    Attribs:  Uncertain
    //#ProcessMode.java:82: Warning: unused assignment
    //#    Unused assignment into nValue
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    Attribs:  Uncertain
		boolean bPositive = true, bBooleanMode = true;
    //#ProcessMode.java:83: Warning: unused assignment
    //#    Unused assignment into bBooleanMode
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
		char cPositive = '+';
		ChannelInfo iChannel;
		ChannelClientInfo iChannelClientInfo;
		ClientInfo iClient;
		ChannelClientInfo setterCCI;
		
		CallbackObject cbSingle = null;
		CallbackObject cbNonUser = null;

		if (!sParam.equals("324")) {
			cbSingle = getCallbackManager().getCallbackType("OnChannelSingleModeChanged");
			cbNonUser = getCallbackManager().getCallbackType("OnChannelNonUserModeChanged");
		}
		
		iChannel = getChannelInfo(sChannelName);
    //#ProcessMode.java:98: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCProcessor.getChannelInfo: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_3
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: ChannelInfo com/dmdirc/parser/irc/IRCProcessor.getChannelInfo(String)
    //#    callee assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCProcessor.java
    //#    callee precondition index: [11]
    //#    callee srcpos: 116
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid  Uncertain
		if (iChannel == null) { 
			// callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got modes for channel ("+sChannelName+") that I am not on.", myParser.getLastLine()));
			// iChannel = new ChannelInfo(myParser, sChannelName);
			// myParser.addChannel(iChannel);
			return;
		}
		// Get the current channel modes
		if (!sParam.equals("324")) { nCurrent = iChannel.getMode(); }
    //#ProcessMode.java:106: ?use of default init
    //#    init'ed(iChannel.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_6
    //#    assertion: init'ed(iChannel.__Tag)
    //#    VN: iChannel.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:106: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
		
		setterCCI = iChannel.getUser(token[0]);
    //#ProcessMode.java:108: ?use of default init
    //#    init'ed(iChannel.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_7
    //#    assertion: init'ed(iChannel.__Tag)
    //#    VN: iChannel.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:108: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_7
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
		if (IRCParser.ALWAYS_UPDATECLIENT && setterCCI != null) {
			// Facilitate dmdirc formatter
			if (setterCCI.getClient().getHost().isEmpty()) {setterCCI.getClient().setUserBits(token[0],false); }
    //#ProcessMode.java:111: ?use of default init
    //#    init'ed(setterCCI.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_8
    //#    assertion: init'ed(setterCCI.__Tag)
    //#    VN: setterCCI.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:111: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[setterCCI.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_8
    //#    assertion: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[setterCCI.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[setterCCI.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:111: ?use of default init
    //#    init'ed(Obj_Id#716:getClient(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_8
    //#    assertion: init'ed(Obj_Id#716:getClient(...))
    //#    VN: setterCCI.cClient
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ProcessMode.java:111: ?precondition failure
    //#    com/dmdirc/parser/irc/ClientInfo.getHost: init'ed(this.sHost)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_8
    //#    assertion: init'ed(getClient(...).sHost)
    //#    callee: String com/dmdirc/parser/irc/ClientInfo.getHost()
    //#    callee assertion: init'ed(this.sHost)
    //#    callee file: ClientInfo.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 201
    //#    VN: getClient(...).sHost
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
		}
		
		// Loop through the mode string, and add/remove modes/params where they are needed
		for (int i = 0; i < sModestr[0].length(); ++i) {
			Character cMode = sModestr[0].charAt(i);
			if (cMode.equals(":".charAt(0))) { continue; }
			
			sNonUserModeStr = sNonUserModeStr+cMode;
			if (cMode.equals("+".charAt(0))) { cPositive = '+'; bPositive = true; }
			else if (cMode.equals("-".charAt(0))) { cPositive = '-'; bPositive = false; }
			else {
				if (myParser.hChanModesBool.containsKey(cMode)) { nValue = myParser.hChanModesBool.get(cMode); bBooleanMode = true; }
				else if (myParser.hChanModesOther.containsKey(cMode)) { nValue = myParser.hChanModesOther.get(cMode); bBooleanMode = false; }
				else if (myParser.hPrefixModes.containsKey(cMode)) { 
					// (de) OP/Voice someone
					if (sModestr.length <= nParam) {
						myParser.callErrorInfo(new ParserError(ParserError.ERROR_FATAL + ParserError.ERROR_USER, "Broken Modes. Parameter required but not given.", myParser.getLastLine()));
					}
					sModeParam = sModestr[nParam++];
    //#ProcessMode.java:130: ?array index out of bounds
    //#    nParam < sModestr.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_25
    //#    assertion: nParam < sModestr.length
    //#    VN: -(nParam - sModestr.length)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
					nValue = myParser.hPrefixModes.get(cMode);
					callDebugInfo(IRCParser.DEBUG_INFO, "User Mode: %c / %d [%s] {Positive: %b}",cMode, nValue, sModeParam, bPositive);
					iChannelClientInfo = iChannel.getUser(sModeParam);
					if (iChannelClientInfo == null) {
						// Client not known?
//						callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got mode for client not known on channel - Added", myParser.getLastLine()));
						iClient = getClientInfo(sModeParam);
						if (iClient == null) { 
//							callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got mode for client not known at all - Added", myParser.getLastLine()));
							iClient = new ClientInfo(myParser, sModeParam);
							myParser.addClient(iClient);
    //#ProcessMode.java:141: ?use of default init
    //#    init'ed(this.myParser.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_27
    //#    assertion: init'ed(this.myParser.__Tag)
    //#    VN: this.myParser.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:141: ?null dereference
    //#    com/dmdirc/parser/irc/IRCParser.__Descendant_Table[this.myParser.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_27
    //#    assertion: com/dmdirc/parser/irc/IRCParser.__Descendant_Table[this.myParser.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/IRCParser.__Descendant_Table[this.myParser.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:141: ?!precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.addClient: client.sNickname != null
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_27
    //#    assertion: undefined != null
    //#    callee: void com/dmdirc/parser/irc/IRCParser.addClient(ClientInfo)
    //#    callee assertion: client.sNickname != null
    //#    callee file: IRCParser.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 1976
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
						}
						iChannelClientInfo = iChannel.addClient(iClient);
    //#ProcessMode.java:143: ?use of default init
    //#    init'ed(iChannel.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_28
    //#    assertion: init'ed(iChannel.__Tag)
    //#    VN: iChannel.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:143: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_28
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:143: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.addClient: (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_28
    //#    assertion: (soft) iChannel.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee: ChannelClientInfo com/dmdirc/parser/irc/ChannelInfo.addClient(ClientInfo)
    //#    callee assertion: (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [16]
    //#    callee srcpos: 335
    //#    VN: iChannel.myParser.__Tag
    //#    Expected: {433_152}
    //#    Bad: {0..433_151, 433_153..+Inf}
    //#    Attribs:  Int  Exp singleton  Bad overlaps +/-1000  Soft  Bad < Exp  Bad > Exp
					}
					callDebugInfo(IRCParser.DEBUG_INFO, "\tOld Mode Value: %d",iChannelClientInfo.getChanMode());
    //#ProcessMode.java:145: ?use of default init
    //#    init'ed(iChannelClientInfo.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_29
    //#    assertion: init'ed(iChannelClientInfo.__Tag)
    //#    VN: iChannelClientInfo.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:145: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[iChannelClientInfo.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_29
    //#    assertion: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[iChannelClientInfo.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[iChannelClientInfo.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:145: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCProcessor.callDebugInfo: this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_29
    //#    assertion: this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee: bool com/dmdirc/parser/irc/IRCProcessor.callDebugInfo(int, String, Object[])
    //#    callee assertion: this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee file: IRCProcessor.java
    //#    callee precondition index: [6]
    //#    callee srcpos: 74
    //#    VN: this.myParser.__Tag
    //#    Expected: {433_152}
    //#    Bad: {0..433_151, 433_153..+Inf}
    //#    Attribs:  Int  Exp singleton  Bad overlaps +/-1000  Bad < Exp  Bad > Exp
					if (bPositive) { iChannelClientInfo.setChanMode(iChannelClientInfo.getChanMode() | nValue); sTemp = "+"; }
					else { iChannelClientInfo.setChanMode(iChannelClientInfo.getChanMode() ^ (iChannelClientInfo.getChanMode() & nValue)); sTemp = "-"; }
					sTemp = sTemp+cMode;
					callChannelUserModeChanged(iChannel, iChannelClientInfo, setterCCI, token[0], sTemp);
    //#ProcessMode.java:149: ?null dereference
    //#    __Descendant_Table[this.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_32
    //#    assertion: __Descendant_Table[this.__Tag] != null
    //#    VN: __Descendant_Table[this.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
					continue;
				} else {
					// unknown mode - add as boolean
//					callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got unknown mode "+cMode+" - Added as boolean mode", myParser.getLastLine()));
					myParser.hChanModesBool.put(cMode,myParser.nNextKeyCMBool);
					nValue = myParser.nNextKeyCMBool;
					bBooleanMode = true;
					myParser.nNextKeyCMBool = myParser.nNextKeyCMBool*2;
    //#ProcessMode.java:157: ?overflow
    //#    this.myParser.nNextKeyCMBool*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_33
    //#    assertion: this.myParser.nNextKeyCMBool*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    VN: this.myParser.nNextKeyCMBool*2
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_228}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
				}
				
				if (bBooleanMode) {
					callDebugInfo(IRCParser.DEBUG_INFO, "Boolean Mode: %c [%d] {Positive: %b}",cMode, nValue, bPositive);
					
					if (bPositive) { nCurrent = nCurrent | nValue; }
					else { nCurrent = nCurrent ^ (nCurrent & nValue); }
				} else {
					
					if ((bPositive || nValue == IRCParser.MODE_LIST || ((nValue & IRCParser.MODE_UNSET) == IRCParser.MODE_UNSET)) && (sModestr.length <= nParam)) {
						myParser.callErrorInfo(new ParserError(ParserError.ERROR_FATAL + ParserError.ERROR_USER, "Broken Modes. Parameter required but not given.", myParser.getLastLine()));
					}
					
					if (nValue == IRCParser.MODE_LIST) {
						// List Mode
						sModeParam = sModestr[nParam++];
    //#ProcessMode.java:173: ?array index out of bounds
    //#    nParam < sModestr.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: nParam < sModestr.length
    //#    VN: -(nParam - sModestr.length)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
						sNonUserModeStrParams = sNonUserModeStrParams+" "+sModeParam;
						nTemp = (Calendar.getInstance().getTimeInMillis() / 1000);
						iChannel.setListModeParam(cMode, new ChannelListModeItem(sModeParam, token[0], nTemp ), bPositive);
    //#ProcessMode.java:176: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:176: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.setListModeParam: (soft) this.myParser.stringConverter != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: (soft) iChannel.myParser.stringConverter != null
    //#    callee: void com/dmdirc/parser/irc/ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#    callee assertion: (soft) this.myParser.stringConverter != null
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [9]
    //#    callee srcpos: 508
    //#    VN: iChannel.myParser.stringConverter
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#ProcessMode.java:176: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.setListModeParam: (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: (soft) iChannel.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee: void com/dmdirc/parser/irc/ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#    callee assertion: (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [13]
    //#    callee srcpos: 508
    //#    VN: iChannel.myParser.__Tag
    //#    Expected: {433_152}
    //#    Bad: {0..433_151, 433_153..+Inf}
    //#    Attribs:  Int  Exp singleton  Bad overlaps +/-1000  Soft  Bad < Exp  Bad > Exp  Uncertain
    //#ProcessMode.java:176: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.setListModeParam: (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: (soft) iChannel.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    callee: void com/dmdirc/parser/irc/ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#    callee assertion: (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [17]
    //#    callee srcpos: 508
    //#    VN: iChannel.myParser.stringConverter.__Tag
    //#    Expected: {434_432}
    //#    Bad: {0..434_431, 434_433..+Inf}
    //#    Attribs:  Int  Exp singleton  Bad overlaps +/-1000  Soft  Bad < Exp  Bad > Exp  Uncertain
    //#ProcessMode.java:176: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.setListModeParam: (soft) this.myParser.stringConverter.lowercase != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: (soft) iChannel.myParser.stringConverter.lowercase != null
    //#    callee: void com/dmdirc/parser/irc/ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#    callee assertion: (soft) this.myParser.stringConverter.lowercase != null
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [18]
    //#    callee srcpos: 508
    //#    VN: iChannel.myParser.stringConverter.lowercase
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft  Uncertain
    //#ProcessMode.java:176: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.setListModeParam: (soft) this.myParser.stringConverter.lowercase.length >= 1
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_44
    //#    assertion: (soft) iChannel.myParser.stringConverter.lowercase.length >= 1
    //#    callee: void com/dmdirc/parser/irc/ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#    callee assertion: (soft) this.myParser.stringConverter.lowercase.length >= 1
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [19]
    //#    callee srcpos: 508
    //#    VN: iChannel.myParser.stringConverter.lowercase.length
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp  Uncertain
						callDebugInfo(IRCParser.DEBUG_INFO, "List Mode: %c [%s] {Positive: %b}",cMode, sModeParam, bPositive);
						if (cbSingle != null) { cbSingle.call(iChannel, setterCCI, token[0], cPositive+cMode+" "+sModeParam ); }
    //#ProcessMode.java:178: ?use of default init
    //#    init'ed(cbSingle.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_45
    //#    assertion: init'ed(cbSingle.__Tag)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:178: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    unanalyzed callee: bool call(Object[])
					} else {
						// Mode with a parameter
						if (bPositive) { 
							// +Mode - always needs a parameter to set
							sModeParam = sModestr[nParam++];
    //#ProcessMode.java:183: ?array index out of bounds
    //#    nParam < sModestr.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_47
    //#    assertion: nParam < sModestr.length
    //#    VN: -(nParam - sModestr.length)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
							sNonUserModeStrParams = sNonUserModeStrParams+" "+sModeParam;
							callDebugInfo(IRCParser.DEBUG_INFO, "Set Mode: %c [%s] {Positive: %b}",cMode, sModeParam, bPositive);
							iChannel.setModeParam(cMode,sModeParam);
							if (cbSingle != null) { cbSingle.call(iChannel, setterCCI, token[0], cPositive+cMode+" "+sModeParam ); }
    //#ProcessMode.java:187: ?use of default init
    //#    init'ed(cbSingle.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_48
    //#    assertion: init'ed(cbSingle.__Tag)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:187: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    unanalyzed callee: bool call(Object[])
						} else {
							// -Mode - parameter isn't always needed, we need to check
							if ((nValue & IRCParser.MODE_UNSET) == IRCParser.MODE_UNSET) {
								sModeParam = sModestr[nParam++];
    //#ProcessMode.java:191: ?array index out of bounds
    //#    nParam < sModestr.length
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_50
    //#    assertion: nParam < sModestr.length
    //#    VN: -(nParam - sModestr.length)
    //#    Expected: {1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad < Exp
								sNonUserModeStrParams = sNonUserModeStrParams+" "+sModeParam;
							} else {
								sModeParam = "";
							}
							callDebugInfo(IRCParser.DEBUG_INFO, "Unset Mode: %c [%s] {Positive: %b}",cMode, sModeParam, bPositive);
							iChannel.setModeParam(cMode,"");
							if (cbSingle != null) { cbSingle.call(iChannel, setterCCI, token[0], trim(cPositive+cMode+" "+sModeParam) ); }
    //#ProcessMode.java:198: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    unanalyzed callee: bool call(Object[])
						}
					}
				}
			}
		}
		
		// Call Callbacks
		for (int i = 0; i < sModestr.length; ++i) { sFullModeStr.append(sModestr[i]).append(" "); }
		
		iChannel.setMode(nCurrent);
    //#ProcessMode.java:208: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_58
    //#    assertion: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelInfo.__Descendant_Table[iChannel.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
		if (sParam.equals("324")) { callChannelModeChanged(iChannel, null, "", sFullModeStr.toString().trim()); }
		else { callChannelModeChanged(iChannel, setterCCI, token[0], sFullModeStr.toString().trim()); }
		if (cbNonUser != null) { cbNonUser.call(iChannel, setterCCI, token[0], trim(sNonUserModeStr+sNonUserModeStrParams)); }
    //#ProcessMode.java:211: ?use of default init
    //#    init'ed(cbNonUser.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_62
    //#    assertion: init'ed(cbNonUser.__Tag)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:211: ?!null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[cbNonUser.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    basic block: bb_62
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[cbNonUser.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[cbNonUser.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:211: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processChanMode(String, String[], String[], String)
    //#    unanalyzed callee: bool call(Object[])
	}
    //#ProcessMode.java:212: end of method: void com.dmdirc.parser.irc.ProcessMode.processChanMode(String, String[], String[], String)
	
	/**
	 * Process user modes.
	 *
	 * @param sParam String representation of parameter to parse
	 * @param token IRCTokenised Array of the incomming line
	 * @param clearOldModes Clear old modes before applying these modes (used by 221)
	 */	
	private void processUserMode(String sParam, String token[], String sModestr[], boolean clearOldModes) {
		long nCurrent = 0, nValue = 0;
    //#ProcessMode.java:222: method: void com.dmdirc.parser.irc.ProcessMode.processUserMode(String, String[], String[], bool)
    //#ProcessMode.java:222: Warning: unused assignment
    //#    Unused assignment into nCurrent
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processUserMode(String, String[], String[], bool)
    //#    Attribs:  Uncertain
    //#ProcessMode.java:222: Warning: unused assignment
    //#    Unused assignment into nValue
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processUserMode(String, String[], String[], bool)
    //#    Attribs:  Uncertain
    //#input(void processUserMode(String, String[], String[], bool)): " - Added"._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "Callback not found: "._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "Got unknown user mode "._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "OnDebugInfo"._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "OnErrorInfo"._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "OnUserModeChanged"._tainted
    //#input(void processUserMode(String, String[], String[], bool)): "OnUserModeDiscovered"._tainted
    //#input(void processUserMode(String, String[], String[], bool)): __Descendant_Table[com/dmdirc/parser/irc/ProcessMode]
    //#input(void processUserMode(String, String[], String[], bool)): __Descendant_Table[others]
    //#input(void processUserMode(String, String[], String[], bool)): __Dispatch_Table.callUserModeChanged(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void processUserMode(String, String[], String[], bool)): __Dispatch_Table.callUserModeDiscovered(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;)Z
    //#input(void processUserMode(String, String[], String[], bool)): clearOldModes
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ClientInfo]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/ClientInfo.__Descendant_Table[others]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getLastLine()Ljava/lang/String;
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processUserMode(String, String[], String[], bool)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void processUserMode(String, String[], String[], bool)): sModestr
    //#input(void processUserMode(String, String[], String[], bool)): sModestr.length
    //#input(void processUserMode(String, String[], String[], bool)): sModestr[0]
    //#input(void processUserMode(String, String[], String[], bool)): sParam
    //#input(void processUserMode(String, String[], String[], bool)): this
    //#input(void processUserMode(String, String[], String[], bool)): this.__Tag
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.__Tag
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.hClientList
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.hUserModes
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.lastLine
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.myCallbackManager
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.myCallbackManager.callbackHash
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.nNextKeyUser
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter.__Tag
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter.lowercase
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter.lowercase.length
    //#input(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void processUserMode(String, String[], String[], bool)): token
    //#input(void processUserMode(String, String[], String[], bool)): token.length
    //#input(void processUserMode(String, String[], String[], bool)): token[0]
    //#input(void processUserMode(String, String[], String[], bool)): token[2]
    //#input(void processUserMode(String, String[], String[], bool)): token[2]._tainted
    //#output(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1) num objects
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1).length
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2) num objects
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2).length
    //#output(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void processUserMode(String, String[], String[], bool)): this.myParser.nNextKeyUser
    //#output(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter
    //#new obj(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1)
    //#new obj(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2)
    //#pre[3] (void processUserMode(String, String[], String[], bool)): init'ed(this.myParser.stringConverter)
    //#pre[12] (void processUserMode(String, String[], String[], bool)): this.myParser.hClientList != null
    //#pre[21] (void processUserMode(String, String[], String[], bool)): token != null
    //#pre[22] (void processUserMode(String, String[], String[], bool)): token.length >= 3
    //#pre[24] (void processUserMode(String, String[], String[], bool)): token[2] != null
    //#pre[2] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.nNextKeyUser in {-4_611_686_018_427_387_904..9_223_372_036_854_775_807}
    //#pre[4] (void processUserMode(String, String[], String[], bool)): (soft) sModestr != null
    //#pre[5] (void processUserMode(String, String[], String[], bool)): (soft) sModestr.length >= 1
    //#pre[6] (void processUserMode(String, String[], String[], bool)): (soft) sModestr[0] != null
    //#pre[7] (void processUserMode(String, String[], String[], bool)): (soft) sParam != null
    //#pre[9] (void processUserMode(String, String[], String[], bool)): (soft) this.__Tag == com/dmdirc/parser/irc/ProcessMode
    //#pre[10] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser != null
    //#pre[11] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[13] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.hUserModes != null
    //#pre[14] (void processUserMode(String, String[], String[], bool)): (soft) init'ed(this.myParser.lastLine)
    //#pre[15] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.myCallbackManager != null
    //#pre[16] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[17] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[18] (void processUserMode(String, String[], String[], bool)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[20] (void processUserMode(String, String[], String[], bool)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#pre[23] (void processUserMode(String, String[], String[], bool)): (soft) init'ed(token[0])
    //#presumption(void processUserMode(String, String[], String[], bool)): java.lang.Character:valueOf(...)@237 != null
    //#presumption(void processUserMode(String, String[], String[], bool)): java.util.Map:get(...)@242 != null
    //#post(void processUserMode(String, String[], String[], bool)): this.myParser.nNextKeyUser <= 18_446_744_073_709_551_614
    //#post(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void processUserMode(String, String[], String[], bool)): this.myParser.stringConverter != null
    //#post(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void processUserMode(String, String[], String[], bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#1).length == 127
    //#post(void processUserMode(String, String[], String[], bool)): new char[](IRCStringConverter#2).length == 127
    //#post(void processUserMode(String, String[], String[], bool)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void processUserMode(String, String[], String[], bool)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:getCallbackManager
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:getCallbackType
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:callErrorInfo
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:call
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:parseHost
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:callDebugInfo
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:getClientInfo
    //#unanalyzed(void processUserMode(String, String[], String[], bool)): Effects-of-calling:java.lang.Integer:valueOf
    //#test_vector(void processUserMode(String, String[], String[], bool)): clearOldModes: {0}, {1}
    //#test_vector(void processUserMode(String, String[], String[], bool)): java.lang.Character:equals(...)@238: {0}, {1}
    //#test_vector(void processUserMode(String, String[], String[], bool)): java.lang.Character:equals(...)@239: {0}, {1}
    //#test_vector(void processUserMode(String, String[], String[], bool)): java.lang.String:equals(...)@258: {0}, {1}
    //#test_vector(void processUserMode(String, String[], String[], bool)): java.util.Map:containsKey(...)@242: {0}, {1}
		boolean bPositive = true;
		
		ClientInfo iClient;
		
		iClient = getClientInfo(token[2]);
    //#ProcessMode.java:227: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCProcessor.getClientInfo: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processUserMode(String, String[], String[], bool)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: ClientInfo com/dmdirc/parser/irc/IRCProcessor.getClientInfo(String)
    //#    callee assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCProcessor.java
    //#    callee precondition index: [11]
    //#    callee srcpos: 106
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		if (iClient == null) { return; }
		
		if (clearOldModes) {
			nCurrent = 0;
		} else {
			nCurrent = iClient.getUserMode();
		}
		
		for (int i = 0; i < sModestr[0].length(); ++i) {
			Character cMode = sModestr[0].charAt(i);
			if (cMode.equals("+".charAt(0))) { bPositive = true; }
			else if (cMode.equals("-".charAt(0))) { bPositive = false; }
			else if (cMode.equals(":".charAt(0))) { continue; }
			else {
				if (myParser.hUserModes.containsKey(cMode)) { nValue = myParser.hUserModes.get(cMode); }
				else {
					// Unknown mode
					callErrorInfo(new ParserError(ParserError.ERROR_WARNING, "Got unknown user mode "+cMode+" - Added", myParser.getLastLine()));
					myParser.hUserModes.put(cMode,myParser.nNextKeyUser);
					nValue = myParser.nNextKeyUser;
					myParser.nNextKeyUser = myParser.nNextKeyUser*2;
    //#ProcessMode.java:248: ?overflow
    //#    this.myParser.nNextKeyUser*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: void processUserMode(String, String[], String[], bool)
    //#    basic block: bb_16
    //#    assertion: this.myParser.nNextKeyUser*2 in {-9_223_372_036_854_775_808..18_446_744_073_709_551_615}
    //#    VN: this.myParser.nNextKeyUser*2
    //#    Expected: {-9_223_372_036_854_775_808..18_446_744_073_709_551_615, Invalid}
    //#    Bad: {-18_446_744_073_709_551_616..-9_223_372_036_854_775_809, 18_446_744_073_709_551_616..36_893_488_147_419_103_228}
    //#    Attribs:  Int  Bad < Exp  Bad > Exp
				}
				// Usermodes are always boolean
				callDebugInfo(IRCParser.DEBUG_INFO, "User Mode: %c [%d] {Positive: %b}",cMode, nValue, bPositive);
				if (bPositive) { nCurrent = nCurrent | nValue; }
				else { nCurrent = nCurrent ^ (nCurrent & nValue); }
			}
		}
		
		iClient.setUserMode(nCurrent);
		if (sParam.equals("221")) {
			callUserModeDiscovered(iClient, sModestr[0]);
		} else {
			callUserModeChanged(iClient, token[0], sModestr[0]);
		}
	}
    //#ProcessMode.java:263: end of method: void com.dmdirc.parser.irc.ProcessMode.processUserMode(String, String[], String[], bool)
	
	/**
	 * Callback to all objects implementing the ChannelModeChanged Callback.
	 *
	 * @see IChannelModeChanged
	 * @param cChannel Channel where modes were changed
	 * @param cChannelClient Client chaning the modes (null if server)
	 * @param sHost Host doing the mode changing (User host or server name)
	 * @param sModes Exact String parsed
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callChannelModeChanged(ChannelInfo cChannel, ChannelClientInfo cChannelClient, String sHost, String sModes) {
		return getCallbackManager().getCallbackType("OnChannelModeChanged").call(cChannel, cChannelClient, sHost, sModes);
    //#ProcessMode.java:276: method: bool com.dmdirc.parser.irc.ProcessMode.callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
    //#ProcessMode.java:276: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:276: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:276: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:276: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): "Callback not found: "._tainted
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): "OnChannelModeChanged"._tainted
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): cChannel
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): cChannelClient
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): sHost
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): sModes
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.__Tag
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager
    //#input(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): return_value
    //#pre[6] (bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser != null
    //#pre[7] (bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager != null
    //#pre[9] (bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash != null
    //#presumption(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): getCallbackManager(...)@276 init'ed
    //#post(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): init'ed(return_value)
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.util.Map:get
    //#ProcessMode.java:276: end of method: bool com.dmdirc.parser.irc.ProcessMode.callChannelModeChanged(ChannelInfo, ChannelClientInfo, String, String)
	}
	
	/**
	 * Callback to all objects implementing the ChannelUserModeChanged Callback.
	 *
	 * @see IChannelUserModeChanged
	 * @param cChannel Channel where modes were changed
	 * @param cChangedClient Client being changed
	 * @param cSetByClient Client chaning the modes (null if server)
	 * @param sMode String representing mode change (ie +o)
	 * @param sHost Host doing the mode changing (User host or server name)
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callChannelUserModeChanged(ChannelInfo cChannel, ChannelClientInfo cChangedClient, ChannelClientInfo cSetByClient, String sHost, String sMode) {
		return getCallbackManager().getCallbackType("OnChannelUserModeChanged").call(cChannel, cChangedClient, cSetByClient, sHost, sMode);
    //#ProcessMode.java:291: method: bool com.dmdirc.parser.irc.ProcessMode.callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
    //#ProcessMode.java:291: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:291: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:291: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:291: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): "Callback not found: "._tainted
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): "OnChannelUserModeChanged"._tainted
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): cChangedClient
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): cChannel
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): cSetByClient
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): sHost
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): sMode
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.__Tag
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager
    //#input(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): return_value
    //#pre[7] (bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser != null
    //#pre[8] (bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager != null
    //#pre[10] (bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash != null
    //#presumption(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): getCallbackManager(...)@291 init'ed
    //#post(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): init'ed(return_value)
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)): Effects-of-calling:java.util.Map:get
    //#ProcessMode.java:291: end of method: bool com.dmdirc.parser.irc.ProcessMode.callChannelUserModeChanged(ChannelInfo, ChannelClientInfo, ChannelClientInfo, String, String)
	}
	
	/**
	 * Callback to all objects implementing the UserModeChanged Callback.
	 *
	 * @see IUserModeChanged
	 * @param cClient Client that had the mode changed (almost always us)
	 * @param sSetby Host that set the mode (us or servername)
	 * @param sModes The modes set.
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callUserModeChanged(ClientInfo cClient, String sSetby, String sModes) {
		return getCallbackManager().getCallbackType("OnUserModeChanged").call(cClient, sSetby, sModes);
    //#ProcessMode.java:304: method: bool com.dmdirc.parser.irc.ProcessMode.callUserModeChanged(ClientInfo, String, String)
    //#ProcessMode.java:304: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeChanged(ClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:304: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeChanged(ClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:304: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeChanged(ClientInfo, String, String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:304: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeChanged(ClientInfo, String, String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callUserModeChanged(ClientInfo, String, String)): "Callback not found: "._tainted
    //#input(bool callUserModeChanged(ClientInfo, String, String)): "OnUserModeChanged"._tainted
    //#input(bool callUserModeChanged(ClientInfo, String, String)): cClient
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callUserModeChanged(ClientInfo, String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callUserModeChanged(ClientInfo, String, String)): sModes
    //#input(bool callUserModeChanged(ClientInfo, String, String)): sSetby
    //#input(bool callUserModeChanged(ClientInfo, String, String)): this
    //#input(bool callUserModeChanged(ClientInfo, String, String)): this.myParser
    //#input(bool callUserModeChanged(ClientInfo, String, String)): this.myParser.__Tag
    //#input(bool callUserModeChanged(ClientInfo, String, String)): this.myParser.myCallbackManager
    //#input(bool callUserModeChanged(ClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callUserModeChanged(ClientInfo, String, String)): return_value
    //#pre[5] (bool callUserModeChanged(ClientInfo, String, String)): this.myParser != null
    //#pre[6] (bool callUserModeChanged(ClientInfo, String, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[7] (bool callUserModeChanged(ClientInfo, String, String)): this.myParser.myCallbackManager != null
    //#pre[8] (bool callUserModeChanged(ClientInfo, String, String)): this.myParser.myCallbackManager.callbackHash != null
    //#presumption(bool callUserModeChanged(ClientInfo, String, String)): getCallbackManager(...)@304 init'ed
    //#post(bool callUserModeChanged(ClientInfo, String, String)): init'ed(return_value)
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callUserModeChanged(ClientInfo, String, String)): Effects-of-calling:java.util.Map:get
    //#ProcessMode.java:304: end of method: bool com.dmdirc.parser.irc.ProcessMode.callUserModeChanged(ClientInfo, String, String)
	}
	
	/**
	 * Callback to all objects implementing the UserModeDiscovered Callback.
	 *
	 * @see IUserModeDiscovered
	 * @param cClient Client that had the mode changed (almost always us)
	 * @param sModes The modes set.
	 * @return true if a method was called, false otherwise
	 */
	protected boolean callUserModeDiscovered(ClientInfo cClient, String sModes) {
		return getCallbackManager().getCallbackType("OnUserModeDiscovered").call(cClient, sModes);
    //#ProcessMode.java:316: method: bool com.dmdirc.parser.irc.ProcessMode.callUserModeDiscovered(ClientInfo, String)
    //#ProcessMode.java:316: ?null dereference
    //#    getCallbackType(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeDiscovered(ClientInfo, String)
    //#    basic block: Entry_BB_1
    //#    assertion: getCallbackType(...) != null
    //#    VN: getCallbackType(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:316: ?use of default init
    //#    init'ed(getCallbackType(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeDiscovered(ClientInfo, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(getCallbackType(...).__Tag)
    //#    VN: getCallbackType(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ProcessMode.java:316: ?null dereference
    //#    com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeDiscovered(ClientInfo, String)
    //#    basic block: Entry_BB_1
    //#    assertion: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag] != null
    //#    VN: com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[getCallbackType(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ProcessMode.java:316: Warning: call too complex - analysis skipped
    //#    call on bool call(Object[])
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.parser.irc.ProcessMode
    //#    method: bool callUserModeDiscovered(ClientInfo, String)
    //#    unanalyzed callee: bool call(Object[])
    //#input(bool callUserModeDiscovered(ClientInfo, String)): "Callback not found: "._tainted
    //#input(bool callUserModeDiscovered(ClientInfo, String)): "OnUserModeDiscovered"._tainted
    //#input(bool callUserModeDiscovered(ClientInfo, String)): cClient
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callUserModeDiscovered(ClientInfo, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(bool callUserModeDiscovered(ClientInfo, String)): sModes
    //#input(bool callUserModeDiscovered(ClientInfo, String)): this
    //#input(bool callUserModeDiscovered(ClientInfo, String)): this.myParser
    //#input(bool callUserModeDiscovered(ClientInfo, String)): this.myParser.__Tag
    //#input(bool callUserModeDiscovered(ClientInfo, String)): this.myParser.myCallbackManager
    //#input(bool callUserModeDiscovered(ClientInfo, String)): this.myParser.myCallbackManager.callbackHash
    //#output(bool callUserModeDiscovered(ClientInfo, String)): return_value
    //#pre[4] (bool callUserModeDiscovered(ClientInfo, String)): this.myParser != null
    //#pre[5] (bool callUserModeDiscovered(ClientInfo, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (bool callUserModeDiscovered(ClientInfo, String)): this.myParser.myCallbackManager != null
    //#pre[7] (bool callUserModeDiscovered(ClientInfo, String)): this.myParser.myCallbackManager.callbackHash != null
    //#presumption(bool callUserModeDiscovered(ClientInfo, String)): getCallbackManager(...)@316 init'ed
    //#post(bool callUserModeDiscovered(ClientInfo, String)): init'ed(return_value)
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:getCallbackManager
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(bool callUserModeDiscovered(ClientInfo, String)): Effects-of-calling:java.util.Map:get
    //#ProcessMode.java:316: end of method: bool com.dmdirc.parser.irc.ProcessMode.callUserModeDiscovered(ClientInfo, String)
	}	
	
	/**
	 * What does this IRCProcessor handle.
	 *
	 * @return String[] with the names of the tokens we handle.
	 */
	@Override
	public String[] handles() {
		return new String[]{"MODE", "324", "221"};
    //#ProcessMode.java:326: method: String[] com.dmdirc.parser.irc.ProcessMode.handles()
    //#output(String[] handles()): new String[](handles#1) num objects
    //#output(String[] handles()): return_value.length
    //#output(String[] handles()): return_value[0]
    //#output(String[] handles()): return_value[1]
    //#output(String[] handles()): return_value[2]
    //#output(String[] handles()): return_value
    //#new obj(String[] handles()): new String[](handles#1)
    //#post(String[] handles()): return_value == &new String[](handles#1)
    //#post(String[] handles()): new String[](handles#1) num objects == 1
    //#post(String[] handles()): return_value.length == 3
    //#post(String[] handles()): return_value[0] == &"MODE"
    //#post(String[] handles()): return_value[1] == &"324"
    //#post(String[] handles()): return_value[2] == &"221"
    //#ProcessMode.java:326: end of method: String[] com.dmdirc.parser.irc.ProcessMode.handles()
	} 
	
	/**
	 * Create a new instance of the IRCProcessor Object.
	 *
	 * @param parser IRCParser That owns this IRCProcessor
	 * @param manager ProcessingManager that is in charge of this IRCProcessor
	 */
	protected ProcessMode (IRCParser parser, ProcessingManager manager) { super(parser, manager); }
    //#ProcessMode.java:335: method: void com.dmdirc.parser.irc.ProcessMode.com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)
    //#input(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): manager
    //#input(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): parser
    //#input(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): this
    //#output(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): this.myManager
    //#output(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): this.myParser
    //#post(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): this.myManager == manager
    //#post(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): init'ed(this.myManager)
    //#post(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): this.myParser == parser
    //#post(void com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)): init'ed(this.myParser)
    //#ProcessMode.java:335: end of method: void com.dmdirc.parser.irc.ProcessMode.com.dmdirc.parser.irc.ProcessMode(IRCParser, ProcessingManager)

}
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Descendant_Table[com/dmdirc/parser/irc/ProcessMode]
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callChannelModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callChannelUserModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callUserModeChanged(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callUserModeDiscovered(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getLowerName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.handles()[Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.processChanMode(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.processUserMode(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Z)V
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.trim(Ljava/lang/String;)Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ProcessMode__static_init): com/dmdirc/parser/irc/IRCProcessor.__Descendant_Table[com/dmdirc/parser/irc/ProcessMode]
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Descendant_Table[com/dmdirc/parser/irc/ProcessMode] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): com/dmdirc/parser/irc/IRCProcessor.__Descendant_Table[com/dmdirc/parser/irc/ProcessMode] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callChannelModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z == &callChannelModeChanged
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callChannelUserModeChanged(Lcom/dmdirc/parser/irc/ChannelInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Lcom/dmdirc/parser/irc/ChannelClientInfo;Ljava/lang/String;Ljava/lang/String;)Z == &callChannelUserModeChanged
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z == &com/dmdirc/parser/irc/IRCProcessor.callDebugInfo
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z == &com/dmdirc/parser/irc/IRCProcessor.callDebugInfo
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callErrorInfo(Lcom/dmdirc/parser/irc/ParserError;)Z == &com/dmdirc/parser/irc/IRCProcessor.callErrorInfo
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callUserModeChanged(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;Ljava/lang/String;)Z == &callUserModeChanged
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.callUserModeDiscovered(Lcom/dmdirc/parser/irc/ClientInfo;Ljava/lang/String;)Z == &callUserModeDiscovered
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getCallbackManager()Lcom/dmdirc/parser/irc/callbacks/CallbackManager; == &com/dmdirc/parser/irc/IRCProcessor.getCallbackManager
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo; == &com/dmdirc/parser/irc/IRCProcessor.getChannelInfo
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getClientInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ClientInfo; == &com/dmdirc/parser/irc/IRCProcessor.getClientInfo
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getLowerName()Ljava/lang/String; == &com/dmdirc/parser/irc/IRCProcessor.getLowerName
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &com/dmdirc/parser/irc/IRCProcessor.getName
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.handles()[Ljava/lang/String; == &handles
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.isValidChannelName(Ljava/lang/String;)Z == &com/dmdirc/parser/irc/IRCProcessor.isValidChannelName
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.process(Ljava/lang/String;[Ljava/lang/String;)V == &process
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.processChanMode(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V == &processChanMode
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.processUserMode(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Z)V == &processUserMode
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.sendString(Ljava/lang/String;)V == &com/dmdirc/parser/irc/IRCProcessor.sendString
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &com/dmdirc/parser/irc/IRCProcessor.toString
    //#post(com.dmdirc.parser.irc.ProcessMode__static_init): __Dispatch_Table.trim(Ljava/lang/String;)Ljava/lang/String; == &trim
    //#ProcessMode.java:: end of method: com.dmdirc.parser.irc.ProcessMode.com.dmdirc.parser.irc.ProcessMode__static_init
    //#ProcessMode.java:: end of class: com.dmdirc.parser.irc.ProcessMode
