# Notices for OCL

This content is produced and maintained by the Eclipse OCL project.

* Project home: https://projects.eclipse.org/projects/modeling.mdt.ocl

## Trademarks

Eclipse OCL, and OCL 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
http://www.eclipse.org/legal/epl-2.0.

SPDX-License-Identifier: EPL-2.0

## Source Code

The project maintains the following source code repositories:

* http://git.eclipse.org/c/ocl/org.eclipse.ocl.git

## Third-party Content

ANTLR (3.0)

* License: New BSD license

asm (3.3.1)

* License: New BSD license

asm (4.0)

* License: New BSD License

ASM (5.0.1)

* License: New BSD license

DocBook Eclipse XSL StyleSheeet Version March 18, 2010 (n/a)

* License: Customized MIT license with "no endorsement" clause 

Google Guava (14.0.1)

* License: Apache License, 2.0

Google Guava (15.0.0)

* License: Apache License, 2.0

Google Guava (17.0)

* License: Apache License, 2.0

Google Guava (18.0)

* License: Apache License, 2.0

Google Guava (19.0)

* License: Apache License, 2.0

Guava (10.0.1)

* License: Apache License, 2.0

Guava (11.0.2)

* License: Apache License, 2.0

Guava (12.0)

* License: Apache License, 2.0

Guava (13.0.1)

* License: Apache License, 2.0

guava (16.0)

* License: Apache License, 2.0

LALR Parser Generator (LPG) Java Runtime (1.1)

* License: Eclipse Public License

LPG (2.0.17)

* License: Eclipse Public License

LPG Java Runtime (lpgjavaruntime.jar) (1.1)

* License: Eclipse Public License

LPG Runtime and Generated OCL Parser Version: 1 (n/a)

* License: Eclipse Public License

OMG UML (2.4)

* License: Object Management Group License

OMG UML (2.5)

* License: Object Management Group License

## 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.
