Apache Portable Runtime
Copyright (c) 2011 The Apache Software Foundation.

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

Portions of this software were developed at the National Center
for Supercomputing Applications (NCSA) at the University of
Illinois at Urbana-Champaign.

This software contains code derived from the RSA Data Security
Inc. MD5 Message-Digest Algorithm.

This software contains code derived from UNIX V7, Copyright(C)
Caldera International Inc.

=================================================
Apache Portable Runtime Iconv

This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).

=================================================

