Apache Tajo
Copyright 2013 The Apache Software Foundation

This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).

This product includes/uses Jetty (http://jetty.mortbay.org/),
Copyright (c) Mort Bay Consulting Pty. Ltd. (Australia)

This product includes/uses Netty (http://netty.io)
Copyright 2011 The Netty Project.

This product includes/uses ANTLR (http://www.antlr.org/),
Copyright (c) 2010 Terence Parr.

This product includes/uses Mockito (http://code.google.com/p/mockito/)
Copyright (c) 2007 Mockito contributors.

This product includes/uses JLine2 (https://github.com/jline/jline2/),
Copyright (c) 2002-2012, the original author or authors.

This product includes/uses Guava (http://code.google.com/p/guava-libraries/)
Copyright (c) 2006-2012 Google Inc.

This product includes/uses Protocol Buffers (http://code.google.com/p/protobuf/)
Copyright (c) 2008, Google Inc.

This product includes/uses Protobuf-java-format (http://code.google.com/p/protobuf-java-format/)
Copyright 2000-2011 NeuStar, Inc. All rights reserved.
Copyright (c) 2009, Orbitz World Wide All rights reserved.

This product includes/uses jQuery (http://jquery.com)
Copyright 2013 jQuery Foundation and other contributors

This product includes/uses jsPlumb (http://jsplumb.org)
Copyright (c) 2013 Simon Porritt, http://jsplumb.org/
