Apache UIMA TextMarker
Copyright 2006, 2013 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Portions of TextMarker were originally developed by
the Universität Würzburg.
Copyright (c) 2006, 2011 Universität Würzburg.

This product contains icons developed by the Mark James 
(http://www.famfamfam.com/lab/icons/silk/), licensed under the 
Creative Commons Attribution 3.0 License.
