protected boolean parseMcpStart(final String s, boolean[] exec, Map<String,String> keyValuePairs)
	{
		McpParseStartState state = McpParseStartState.START;
		String lastKey = "";
		int startIndex = 0;
		for(int i=0;i<s.length();i++)
		{
			char c=s.charAt(i);
			switch(state)
			{
			case FINISH_COMMAND:
				if(!Character.isWhitespace(c))
				{
					startIndex=i;
					state=McpParseStartState.IN_MCPKEY;
				}
				else
				{
					Log.errOut("Invalid MCP "+state.toString()+": "+c+": "+s);
					return false;
				}
				break;
			case FINISH_KEY:
				if(Character.isWhitespace(c))
				{
					keyValuePairs.put(lastKey, "");
					state = McpParseStartState.FINISH_VAL;
				}
				else
				{
					if(c=='\"')
					{
						startIndex = i+1;
						state = McpParseStartState.IN_QUOTEVAL;
					}
					else
					{
						startIndex = i;
						state = McpParseStartState.IN_VAL;
					}
				}
				break;
			case FINISH_MCPKEY:
				if(!Character.isWhitespace(c))
				{
					startIndex = i;
					state = McpParseStartState.IN_KEY;
				}
				exec[0]=true;
				break;
			case FINISH_VAL:
				if(!Character.isWhitespace(c))
				{
					startIndex = i;
					state = McpParseStartState.IN_KEY;
				}
				break;
			case IN_COMMAND:
				if(Character.isWhitespace(c))
				{
					keyValuePairs.put(MCP_COMMAND_KEY(), s.substring(startIndex,i));
					if(s.substring(startIndex,i).equalsIgnoreCase("mcp"))
						state = McpParseStartState.FINISH_MCPKEY;
					else
						state = McpParseStartState.FINISH_COMMAND;
				}
				break;
			case FINISH_IN_KEY:
				if(!Character.isWhitespace(c))
				{
					Log.errOut("Invalid MCP "+state.toString()+": "+c+": "+s);
					return false;
				}
				else
				{
					state = McpParseStartState.FINISH_KEY;
				}
				break;
			case IN_KEY:
				if(Character.isWhitespace(c))
				{
					Log.errOut("Invalid MCP "+state.toString()+": "+c+": "+s);
					return false;
				}
				else
				if(c==':')
				{
					lastKey = s.substring(startIndex,i);
					if(lastKey.trim().endsWith("*"))
					{
						exec[0]=false;
					}
					state = McpParseStartState.FINISH_IN_KEY;
				}
				break;
			case IN_MCPKEY:
				if(Character.isWhitespace(c))
				{
					keyValuePairs.put(MCP_KEYSENT_KEY(), s.substring(startIndex,i));
					state = McpParseStartState.FINISH_MCPKEY;
				}
				break;
			case IN_QUOTEVAL:
				if((c=='\"')&&(s.charAt(i-1)!='\\'))
				{
					keyValuePairs.put(lastKey, s.substring(startIndex,i));
					state = McpParseStartState.FINISH_VAL;
				}
				break;
			case IN_VAL:
				if(Character.isWhitespace(c))
				{
					keyValuePairs.put(lastKey, s.substring(startIndex,i));
					state = McpParseStartState.FINISH_VAL;
				}
				break;
			case START:
				if(!Character.isWhitespace(c))
				{
					startIndex=i;
					state=McpParseStartState.IN_COMMAND;
				}
				else
				{
					Log.errOut("Invalid MCP "+state.toString()+": "+c+": "+s);
					return false;
				}
				break;
			}
		}
		switch(state)
		{
		case IN_VAL:
			keyValuePairs.put(lastKey, s.substring(startIndex));
			break;
		case FINISH_KEY:
			keyValuePairs.put(lastKey, "");
			break;
		case IN_MCPKEY:
			keyValuePairs.put(MCP_KEYSENT_KEY(), s.substring(startIndex));
			exec[0]=true;
			break;
		default:
			Log.errOut("Invalid MCP END "+state.toString()+": " + s);
			return false;
		}
		if((!keyValuePairs.containsKey(MCP_COMMAND_KEY()))
		||((!keyValuePairs.get(MCP_COMMAND_KEY()).equalsIgnoreCase("mcp"))
			&&(!keyValuePairs.containsKey(MCP_KEYSENT_KEY()))))
		{
			Log.errOut("Invalid MCP -- missing Command or Key: " + s);
			return false;
		}
		if((!exec[0]) && (!keyValuePairs.containsKey(MCP_DATA_TAG())))
		{
			Log.errOut("Missing MCP Data Tag: " + s);
			return false;
		}
		if((!exec[0]) && (!containsMcpStarTag(keyValuePairs)))
		{
			Log.errOut("Missing MCP Star Tag: " + s);
			return false;
		}
		return true;
	}