This software is distributed under a permissive open source
license to allow it to be used in any projects, whether open
source or proprietary. Contributions to the project are welcome
and it is important to maintain clear record of contributions 
and terms under which they are licensed.

To indicate your acceptance of Developer's Certificate of Origin 1.1
terms, please add the following line to the end of the commit message
for each contribution you make to the project:

Signed-off-by : Your Name <your@email.com>

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or inpart by me and I
have the right to submit it under the open source license indicated
in the file: or

(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source license
and I have the right under that license to submit that work with 
modifications, whether created in whole or part by me, under the same
open source license (unless I am permitted to submit under a different 
license), as indicated in the file; or

(c) The contribution was provided directly to me by some other person
who certified (a), (b) or (c) I have not modified it.

(d) I understand and agree that this project and the contribution are
public and that a record of the contribution (including all personal
information I submit with it, including my sign-off)is maintained 
indefinitely and may be redistributed consistent with this project or
the open source license(s) involved.