Apache Tajo
Copyright 2014 The Apache Software Foundation

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

This product includes 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.
Copyright 2012 Cloudera Inc.
