Apache Bloodhound
Copyright 2012 The Apache Software Foundation

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

JQuery - licensed under the MIT License
This product includes software developed by
JQuery (http://jquery.org/)
