[Engine/Engine-Tests] Implemented TextColorTools.GetNearestColor()
Merge branch 'stable'
Merge branch 'stable'
Merge branch 'stable'
[Engine-IRC] Fallback to network chat if the group chat can't be found
[Engine-IRC] Made GetPerson() tolerant for nonexistent chats
Merge branch 'stable'
[Engine-IRC] Moved nickname fallback code to ApplyConfig()
Merge branch 'stable'
[Engine-XMPP] added a very basic roster command. (closes: #740)

use /roster or /roster full
[Engine-XMPP] Refactored OnAuthenticate() to use message builder API
[Engine-XMPP] Refactored _Say() to use message builder API
[Engine-XMPP] Refactored CommandHelp() to use message builder API
[Engine-XMPP] Implemented CreatePerson(JID) and refactored OnMessage()
[Engine] Session.AddPersonToGroupChat() is responsible for GroupChatModel.UnsafePersons
[Engine-XMPP] Remove person from GroupChat in OnParticipantLeave() once as Session.RemovePersonFromGroupChat() already does
[Engine-XMPP] Lock on GroupChatModel object for GetPerson() vs AddPersonToGroupChat() race
[Engine-XMPP] bugfix: query caption is nickname even when query opened with jid

/query bla@xyc.com used to open a new query which is titled bla@xyc.com
when the query was initiated from the contact it was titled by the nickname.

now both methods title the query window by nickname
[Engine] Added Session.CreatePersonChat(PersonModel, IProtocolManager) convenience overload
[Engine-XMPP] added contacts list

a new chat window with a contact list is created.
The nicklist shows all online contacts.
Status changes are logged in the chat window itself