This file contains the PGP keys of various Apache developers.
Please don't use them for email unless you have to. Their main
purpose is code signing.

Apache users: pgp < KEYS
Apache developers:
        (pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
      or
        (gpg --fingerprint --list-sigs <your name>
             && gpg --armor --export <your name>) >> this file.

Apache developers: please ensure that your key is also available via the
PGP keyservers (such as pgpkeys.mit.edu).


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

pub   4096R/3592721E 2011-01-21
      Key fingerprint = A0BF C76E F6A5 6F2C DC3D  0E2C EDF4 C958 3592 721E
uid                  Henry Saputra (CODE SIGNING KEY) <hsaputra@apache.org>
sig 3        3592721E 2011-01-21  Henry Saputra (CODE SIGNING KEY) <hsaputra@apache.org>
sub   4096R/C318E93E 2011-01-21
sig          3592721E 2011-01-21  Henry Saputra (CODE SIGNING KEY) <hsaputra@apache.org>

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG/MacGPG2 v2.0.16 (Darwin)

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
PsjMuqud3oNyQDFEI+qH9ZUbnPI=
=W5eW
-----END PGP PUBLIC KEY BLOCK-----
