# Notices for Eclipse Trace Compass

This content is produced and maintained by the Eclipse Trace Compass project.

* Project home: https://projects.eclipse.org/projects/tools.tracecompass

## Trademarks

Eclipse Trace Compass, and Trace Compass are trademarks of the Eclipse
Foundation.

## Copyright

All content is the property of the respective authors or their employers. For
more information regarding authorship of content, please consult the listed
source code repository logs.

## Declared Project Licenses

This program and the accompanying materials are made available under the terms
of the Eclipse Public License v. 2.0 which is available at
https://www.eclipse.org/legal/epl-2.0.

SPDX-License-Identifier: EPL-2.0

## Source Code

The project maintains the following source code repositories:

* https://git.eclipse.org/r/plugins/gitiles/tracecompass/org.eclipse.tracecompass

## Third-party Content

This project leverages the following third party content.

ANTLR Runtime only: (3.2)

* License: New BSD license

Apache Commons Compress (1.6)

* License: Apache License 2.0

Apache Commons IO (2.2)

* License: Apache License, 2.0

Apache Commons Lang (3.1.0)

* License: Apache License, 2.0

Apache Derby (10.8.2.2)

* License: Apache License, 2.0

Derby (10.11.1.1)

* License: Apache License, 2.0

Google Gson (2.2.4)

* License: Apache License 2.0

Google Guava (15.0.0)

* License: Apache License, 2.0

Google Guava (21.0)

* License: Apache License, 2.0

guava (27.1)

* License: Apache-2.0 AND LicenseRef-Public-Domain

json.org java impl of json parser Version: 2008-09-18 (n/a)

* License: MIT License

lttng-tools mi-lttng.xsd (3.0)

* License: MIT License
* Project: http://lttng.org/
* Source:
   http://git.lttng.org/?p=lttng-tools.git;a=blob_plain;f=src/common/mi-lttng-3.0.xsd;h=436a9893b3698cafeb8a87eeb2da97a8d26ec6ed;hb=refs/heads/stable-2.8

lttng-tools mi_lttng.xsd (2.6)

* License: MIT License

lttng-tools mi_lttng.xsd (2.7)

* License: MIT License

lttng-tools session.xsd (2.5.0)

* License: MIT License

mockito (1.9.5)

* License: Apache License, 2.0, New BSD license, MIT license

org.apache.commons.lang (2.6.0)

* License: Apache License, 2.0

SWTChart (0.7.0)

* License: Eclipse Public License

SWTChart (0.10.0)

* License: Eclipse Public License
* Project: https://sourceforge.net/projects/swt-chart/

Tux image (n/a)

* License: Custom Permissive License

X.org rgb.txt (n/a)

* License: MIT License (MIT)

## Cryptography

Content may contain encryption software. The country in which you are currently
may have restrictions on the import, possession, and use, and/or re-export to
another country, of encryption software. BEFORE using any encryption software,
please check the country's laws, regulations and policies concerning the import,
possession, or use, and re-export of encryption software, to see if this is
permitted.

