Apache Shindig
Copyright 2010 The Apache Software Foundation

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

-----------------------------------------------------------

This product includes software (Gadget Server, Gadget Container)
originally developed by Google Inc. (http://code.google.com/) and licensed
to the ASF as initial contribution for Shindig.

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

This product includes software (JSUnit) developed by
Joerg Schaible (http://jsunit.berlios.de/).

This product includes software (swfobject) developed by
Geoff Stearns, Michael Williams, and Bobby van der Sluis (http://code.google.com/p/swfobject/)

This product includes software (opensocial-resources) developed by
The OpenSocial Foundation (http://opensocial-resources.googlecode.com/svn/spec/0.8/)

