LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gCiAqIAogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCiAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCiAqIAogKiBUaGUgQVBJIGZvciB0aGlzIGNsYXNzIGFuZCBpdHMgY29tbWVudHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgSlBBIDIuMCBzcGVjaWZpY2F0aW9uIAogKiB3aGljaCBpcyBkZXZlbG9wZWQgdW5kZXIgdGhlIEphdmEgQ29tbXVuaXR5IFByb2Nlc3MgKEpTUiAzMTcpIGFuZCBpcyBjb3B5cmlnaHQgCiAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIGRjbGFya2UgLSBKYXZhIFBlcnNpc3RlbmNlIDIuMCAtIFByb3Bvc2VkIEZpbmFsIERyYWZ0IChNYXJjaCAxMywgMjAwOSkKICogICAgICAgICAgICAgICBTcGVjaWZpY2F0aW9uIGFuZCBsaWNlbnNpbmcgdGVybXMgYXZhaWxhYmxlIGZyb20KICogICAgICAgICAgICAgICBodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMxNwogKgogKiBFQVJMWSBBQ0NFU1MgLSBQVUJMSUMgRFJBRlQKICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlYXJseS1kcmFmdCBzcGVjaWZpY2F0aW9uIGRldmVsb3BlZCB1bmRlciB0aGUgCiAqIEphdmEgQ29tbXVuaXR5IFByb2Nlc3MgKEpDUCkgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIGFuZCBldmFsdWF0aW9uIAogKiBwdXJwb3NlcyBvbmx5LiBUaGUgY29kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGFueSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBKQ1AuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIGphdmF4LnBlcnNpc3RlbmNlOwoKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLmNyaXRlcmlhLkNyaXRlcmlhUXVlcnk7CmltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5jcml0ZXJpYS5RdWVyeUJ1aWxkZXI7CmltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5tZXRhbW9kZWwuTWV0YW1vZGVsOwoKLyoqCiAqIEludGVyZmFjZSB1c2VkIHRvIGludGVyYWN0IHdpdGggdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQuCiAqIAogKiBAc2luY2UgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgMS4wCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEVudGl0eU1hbmFnZXIgewogICAgLyoqCiAgICAgKiBNYWtlIGFuIGluc3RhbmNlIG1hbmFnZWQgYW5kIHBlcnNpc3RlbnQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBlbnRpdHkKICAgICAqIEB0aHJvd3MgRW50aXR5RXhpc3RzRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50aXR5IGFscmVhZHkgZXhpc3RzLiAoSWYgdGhlIGVudGl0eSBhbHJlYWR5IGV4aXN0cywKICAgICAqICAgICAgICAgICAgIHRoZSBFbnRpdHlFeGlzdHNFeGNlcHRpb24gbWF5IGJlIHRocm93biB3aGVuIHRoZSBwZXJzaXN0CiAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24gaXMgaW52b2tlZCwgb3IgdGhlIEVudGl0eUV4aXN0c0V4Y2VwdGlvbiBvciBhbm90aGVyCiAgICAgKiAgICAgICAgICAgICBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0IGZsdXNoIG9yIGNvbW1pdCB0aW1lLikKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuIGVudGl0eQogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBpbnZva2VkIG9uIGEgY29udGFpbmVyLW1hbmFnZWQgZW50aXR5IG1hbmFnZXIgb2YgdHlwZQogICAgICogICAgICAgICAgICAgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTiBhbmQgdGhlcmUgaXMgbm8KICAgICAqICAgICAgICAgICAgIHRyYW5zYWN0aW9uLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBwZXJzaXN0KE9iamVjdCBlbnRpdHkpOwoKICAgIC8qKgogICAgICogTWVyZ2UgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBlbnRpdHkgaW50byB0aGUgY3VycmVudCBwZXJzaXN0ZW5jZSBjb250ZXh0LgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAcmV0dXJuIHRoZSBtYW5hZ2VkIGluc3RhbmNlIHRoYXQgdGhlIHN0YXRlIHdhcyBtZXJnZWQgdG8KICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBpbnN0YW5jZSBpcyBub3QgYW4gZW50aXR5IG9yIGlzIGEgcmVtb3ZlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgaW52b2tlZCBvbiBhIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUKICAgICAqICAgICAgICAgICAgIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT04gYW5kIHRoZXJlIGlzIG5vCiAgICAgKiAgICAgICAgICAgICB0cmFuc2FjdGlvbi4KICAgICAqLwogICAgcHVibGljIDxUPiBUIG1lcmdlKFQgZW50aXR5KTsKCiAgICAvKioKICAgICAqIFJlbW92ZSB0aGUgZW50aXR5IGluc3RhbmNlLgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBlbnRpdHkgb3IgaXMgYSBkZXRhY2hlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgaW52b2tlZCBvbiBhIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUKICAgICAqICAgICAgICAgICAgIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT04gYW5kIHRoZXJlIGlzIG5vCiAgICAgKiAgICAgICAgICAgICB0cmFuc2FjdGlvbi4KICAgICAqLwogICAgcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbnRpdHkpOwoKICAgIC8qKgogICAgICogRmluZCBieSBwcmltYXJ5IGtleS4gU2VhcmNoIGZvciBhbiBlbnRpdHkgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQKICAgICAqIHByaW1hcnkga2V5LiBJZiB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UKICAgICAqIGNvbnRleHQgaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGVyZS4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eUNsYXNzCiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleQogICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBleGlzdAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlCiAgICAgKiAgICAgICAgICAgICBzZWNvbmQgYXJndW1lbnQgaXMgaXMgbm90IGEgdmFsaWQgdHlwZSBmb3IgdGhhdCBlbnRpdHmScwogICAgICogICAgICAgICAgICAgcHJpbWFyeSBrZXkgb3IgaXMgbnVsbAogICAgICovCiAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBlbnRpdHlDbGFzcywgT2JqZWN0IHByaW1hcnlLZXkpOwoKICAgIC8qKgogICAgICogRmluZCBieSBwcmltYXJ5IGtleSwgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLiBTZWFyY2ggZm9yIGFuIGVudGl0eQogICAgICogb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgcHJpbWFyeSBrZXkuIElmIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMKICAgICAqIGNvbnRhaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZXJlLiBJZiBhCiAgICAgKiB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgb3IgaGludCBpcyBub3QgcmVjb2duaXplZCwgaXQgaXMgc2lsZW50bHkKICAgICAqIGlnbm9yZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcwogICAgICogQHBhcmFtIHByaW1hcnlLZXkKICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCiAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIGFuZCB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcwogICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBleGlzdAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlCiAgICAgKiAgICAgICAgICAgICBzZWNvbmQgYXJndW1lbnQgaXMgaXMgbm90IGEgdmFsaWQgdHlwZSBmb3IgdGhhdCBlbnRpdHmScwogICAgICogICAgICAgICAgICAgcHJpbWFyeSBrZXkgb3IgaXMgbnVsbAogICAgICovCiAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBlbnRpdHlDbGFzcywgT2JqZWN0IHByaW1hcnlLZXksIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7CgogICAgLyoqCiAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5IGFuZCBsb2NrLiBTZWFyY2ggZm9yIGFuIGVudGl0eSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzCiAgICAgKiBhbmQgcHJpbWFyeSBrZXkgYW5kIGxvY2sgaXQgd2l0aCByZXNwZWN0IHRvIHRoZSBzcGVjaWZpZWQgbG9jayB0eXBlLiBJZgogICAgICogdGhlIGVudGl0eSBpbnN0YW5jZSBpcyBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgaXQgaXMKICAgICAqIHJldHVybmVkIGZyb20gdGhlcmUsIGFuZCB0aGUgZWZmZWN0IG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIGlmIHRoZQogICAgICogbG9jayBtZXRob2QgaGFkIGJlZW4gY2FsbGVkIG9uIHRoZSBlbnRpdHkuIElmIHRoZSBlbnRpdHkgaXMgZm91bmQgd2l0aGluCiAgICAgKiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCBhbmQgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUKICAgICAqIGVudGl0eSBoYXMgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QgcGVyZm9ybQogICAgICogb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcyB3aGVuIG9idGFpbmluZyB0aGUgZGF0YWJhc2UgbG9jay4gSWYgdGhlc2UKICAgICAqIGNoZWNrcyBmYWlsLCB0aGUgT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIElmIHRoZSBsb2NrIG1vZGUKICAgICAqIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMgZm91bmQgYnV0IGNhbm5vdCBiZQogICAgICogbG9ja2VkOiAtIHRoZSBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCiAgICAgKiBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIHRyYW5zYWN0aW9uLWxldmVsIHJvbGxiYWNrLiAtIHRoZQogICAgICogTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlIGxvY2tpbmcgZmFpbHVyZQogICAgICogY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsIHJvbGxiYWNrCiAgICAgKiAKICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcwogICAgICogQHBhcmFtIHByaW1hcnlLZXkKICAgICAqIEBwYXJhbSBsb2NrTW9kZQogICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBleGlzdAogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlCiAgICAgKiAgICAgICAgICAgICBzZWNvbmQgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgdHlwZSBmb3IgdGhhdCBlbnRpdHkncyBwcmltYXJ5CiAgICAgKiAgICAgICAgICAgICBrZXkgb3IgaXMgbnVsbAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbiBhbmQgYSBsb2NrIG1vZGUgb3RoZXIgdGhhbiBOT05FIGlzCiAgICAgKiAgICAgICAgICAgICBzZXQKICAgICAqIEB0aHJvd3MgT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2sgZmFpbHMKICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkCiAgICAgKiAgICAgICAgICAgICBiYWNrCiAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZCBvbmx5IHRoZSBzdGF0ZW1lbnQgaXMgcm9sbGVkCiAgICAgKiAgICAgICAgICAgICBiYWNrCiAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwgaXMgbWFkZQogICAgICovCiAgICBwdWJsaWMgPFQ+IFQgZmluZChDbGFzczxUPiBlbnRpdHlDbGFzcywgT2JqZWN0IHByaW1hcnlLZXksIExvY2tNb2RlVHlwZSBsb2NrTW9kZSk7CgogICAgLyoqCiAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5IGFuZCBsb2NrLCB1c2luZyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMuIFNlYXJjaCBmb3IKICAgICAqIGFuIGVudGl0eSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBwcmltYXJ5IGtleSBhbmQgbG9jayBpdCB3aXRoIHJlc3BlY3QKICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgbG9jayB0eXBlLiBJZiB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGNvbnRhaW5lZCBpbiB0aGUKICAgICAqIHBlcnNpc3RlbmNlIGNvbnRleHQgaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGVyZS4gSWYgdGhlIGVudGl0eSBpcyBmb3VuZAogICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IGFuZCB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kCiAgICAgKiB0aGUgZW50aXR5IGhhcyBhIHZlcnNpb24gYXR0cmlidXRlLCB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgbXVzdCBwZXJmb3JtCiAgICAgKiBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzIHdoZW4gb2J0YWluaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiBJZiB0aGVzZQogICAgICogY2hlY2tzIGZhaWwsIHRoZSBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gSWYgdGhlIGxvY2sgbW9kZQogICAgICogdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZSBpcyBmb3VuZCBidXQgY2Fubm90IGJlCiAgICAgKiBsb2NrZWQ6IC0gdGhlIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UKICAgICAqIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suIC0gdGhlCiAgICAgKiBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UgbG9ja2luZyBmYWlsdXJlCiAgICAgKiBjYXVzZXMgb25seSBzdGF0ZW1lbnQtbGV2ZWwgcm9sbGJhY2sgSWYgYSB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgb3IKICAgICAqIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIGl0IGlzIHNpbGVudGx5IGlnbm9yZWQuIFBvcnRhYmxlIGFwcGxpY2F0aW9ucwogICAgICogc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBzdGFuZGFyZCB0aW1lb3V0IGhpbnQuIERlcGVuZGluZyBvbiB0aGUgZGF0YWJhc2UKICAgICAqIGluIHVzZSBhbmQgdGhlIGxvY2tpbmcgbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSBwcm92aWRlciwgdGhlIGhpbnQgbWF5IG9yCiAgICAgKiBtYXkgbm90IGJlIG9ic2VydmVkLgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MKICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5CiAgICAgKiBAcGFyYW0gbG9ja01vZGUKICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCiAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIGFuZCB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBhbmQgaGludHMKICAgICAqIEByZXR1cm4gdGhlIGZvdW5kIGVudGl0eSBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgZXhpc3QKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlyc3QgYXJndW1lbnQgZG9lcyBub3QgZGVub3RlIGFuIGVudGl0eSB0eXBlIG9yIHRoZQogICAgICogICAgICAgICAgICAgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIHR5cGUgZm9yIHRoYXQgZW50aXR5J3MgcHJpbWFyeQogICAgICogICAgICAgICAgICAga2V5IG9yIGlzIG51bGwKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24gYW5kIGEgbG9jayBtb2RlIG90aGVyIHRoYW4gTk9ORSBpcwogICAgICogICAgICAgICAgICAgc2V0CiAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrIGZhaWxzCiAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsIGlzIG1hZGUKICAgICAqLwogICAgcHVibGljIDxUPiBUIGZpbmQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIE9iamVjdCBwcmltYXJ5S2V5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7CgogICAgLyoqCiAgICAgKiBHZXQgYW4gaW5zdGFuY2UsIHdob3NlIHN0YXRlIG1heSBiZSBsYXppbHkgZmV0Y2hlZC4gSWYgdGhlIHJlcXVlc3RlZAogICAgICogaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCB0aGUgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gaXMKICAgICAqIHRocm93biB3aGVuIHRoZSBpbnN0YW5jZSBzdGF0ZSBpcyBmaXJzdCBhY2Nlc3NlZC4gKFRoZSBwZXJzaXN0ZW5jZQogICAgICogcHJvdmlkZXIgcnVudGltZSBpcyBwZXJtaXR0ZWQgdG8gdGhyb3cgdGhlIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIHdoZW4KICAgICAqIGdldFJlZmVyZW5jZSBpcyBjYWxsZWQuKSBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBleHBlY3QgdGhhdCB0aGUKICAgICAqIGluc3RhbmNlIHN0YXRlIHdpbGwgYmUgYXZhaWxhYmxlIHVwb24gZGV0YWNobWVudCwgdW5sZXNzIGl0IHdhcyBhY2Nlc3NlZAogICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHdoaWxlIHRoZSBlbnRpdHkgbWFuYWdlciB3YXMgb3Blbi4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eUNsYXNzCiAgICAgKiBAcGFyYW0gcHJpbWFyeUtleQogICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGRvZXMgbm90IGRlbm90ZSBhbiBlbnRpdHkgdHlwZSBvciB0aGUKICAgICAqICAgICAgICAgICAgIHNlY29uZCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eZJzIHByaW1hcnkKICAgICAqICAgICAgICAgICAgIGtleSBvciBpcyBudWxsCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50aXR5IHN0YXRlIGNhbm5vdCBiZSBhY2Nlc3NlZAogICAgICovCiAgICBwdWJsaWMgPFQ+IFQgZ2V0UmVmZXJlbmNlKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBPYmplY3QgcHJpbWFyeUtleSk7CgogICAgLyoqCiAgICAgKiBTeW5jaHJvbml6ZSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4KICAgICAqIAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbgogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGZsdXNoIGZhaWxzCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGZsdXNoKCk7CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGZsdXNoIG1vZGUgdGhhdCBhcHBsaWVzIHRvIGFsbCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUKICAgICAqIHBlcnNpc3RlbmNlIGNvbnRleHQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBmbHVzaE1vZGUKICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUgZmx1c2hNb2RlKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgZmx1c2ggbW9kZSB0aGF0IGFwcGxpZXMgdG8gYWxsIG9iamVjdHMgY29udGFpbmVkIGluIHRoZQogICAgICogcGVyc2lzdGVuY2UgY29udGV4dC4KICAgICAqIAogICAgICogQHJldHVybiBmbHVzaE1vZGUKICAgICAqLwogICAgcHVibGljIEZsdXNoTW9kZVR5cGUgZ2V0Rmx1c2hNb2RlKCk7CgogICAgLyoqCiAgICAgKiBMb2NrIGFuIGVudGl0eSBpbnN0YW5jZSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB3aXRoCiAgICAgKiB0aGUgc3BlY2lmaWVkIGxvY2sgbW9kZSB0eXBlLiBJZiBhIHBlc3NpbWlzdGljIGxvY2sgbW9kZSB0eXBlIGlzCiAgICAgKiBzcGVjaWZpZWQgYW5kIHRoZSBlbnRpdHkgY29udGFpbnMgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlCiAgICAgKiBwcm92aWRlciBtdXN0IGFsc28gcGVyZm9ybSBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzIHdoZW4gb2J0YWluaW5nIHRoZQogICAgICogZGF0YWJhc2UgbG9jay4gSWYgdGhlc2UgY2hlY2tzIGZhaWwsIHRoZSBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlCiAgICAgKiB0aHJvd24uIElmIHRoZSBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZSBpcwogICAgICogZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6IC0gdGhlIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgogICAgICogaWYgdGhlIGRhdGFiYXNlIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suIC0gdGhlCiAgICAgKiBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UgbG9ja2luZyBmYWlsdXJlCiAgICAgKiBjYXVzZXMgb25seSBzdGF0ZW1lbnQtbGV2ZWwgcm9sbGJhY2sKICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHBhcmFtIGxvY2tNb2RlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBlbnRpdHkgb3IgaXMgYSBkZXRhY2hlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24KICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHdoZW4gcGVzc2ltaXN0aWMKICAgICAqICAgICAgICAgICAgIGxvY2tpbmcgaXMgcGVyZm9ybWVkCiAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrIGZhaWxzCiAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsIGlzIG1hZGUKICAgICAqLwogICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUpOwoKICAgIC8qKgogICAgICogTG9jayBhbiBlbnRpdHkgaW5zdGFuY2UgdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgd2l0aAogICAgICogdGhlIHNwZWNpZmllZCBsb2NrIG1vZGUgdHlwZSBhbmQgd2l0aCBzcGVjaWZpZWQgcHJvcGVydGllcy4gSWYgYQogICAgICogcGVzc2ltaXN0aWMgbG9jayBtb2RlIHR5cGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgZW50aXR5IGNvbnRhaW5zIGEgdmVyc2lvbgogICAgICogYXR0cmlidXRlLCB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgbXVzdCBhbHNvIHBlcmZvcm0gb3B0aW1pc3RpYyB2ZXJzaW9uCiAgICAgKiBjaGVja3Mgd2hlbiBvYnRhaW5pbmcgdGhlIGRhdGFiYXNlIGxvY2suIElmIHRoZXNlIGNoZWNrcyBmYWlsLCB0aGUKICAgICAqIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBJZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMKICAgICAqIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGZvdW5kIGJ1dCBjYW5ub3QgYmUgbG9ja2VkOiAtIHRoZQogICAgICogUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZSBsb2NraW5nIGZhaWx1cmUKICAgICAqIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjay4gLSB0aGUgTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZQogICAgICogdGhyb3duIGlmIHRoZSBkYXRhYmFzZSBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsCiAgICAgKiByb2xsYmFjayBJZiBhIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0eSBvciBoaW50IGlzIG5vdCByZWNvZ25pemVkLCBpdCBpcwogICAgICogc2lsZW50bHkgaWdub3JlZC4gUG9ydGFibGUgYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmVseSBvbiB0aGUgc3RhbmRhcmQKICAgICAqIHRpbWVvdXQgaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nIG1lY2hhbmlzbXMKICAgICAqIHVzZWQgYnkgdGhlIHByb3ZpZGVyLCB0aGUgaGludCBtYXkgb3IgbWF5IG5vdCBiZSBvYnNlcnZlZC4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHBhcmFtIGxvY2tNb2RlCiAgICAgKiBAcGFyYW0gcHJvcGVydGllcwogICAgICogICAgICAgICAgICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgYW5kIGhpbnRzCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBlbnRpdHkgb3IgaXMgYSBkZXRhY2hlZCBlbnRpdHkKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24KICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHdoZW4gcGVzc2ltaXN0aWMKICAgICAqICAgICAgICAgICAgIGxvY2tpbmcgaXMgcGVyZm9ybWVkCiAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrIGZhaWxzCiAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZAogICAgICogICAgICAgICAgICAgYmFjawogICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsIGlzIG1hZGUKICAgICAqLwogICAgcHVibGljIHZvaWQgbG9jayhPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7CgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIG92ZXJ3cml0aW5nIGNoYW5nZXMKICAgICAqIG1hZGUgdG8gdGhlIGVudGl0eSwgaWYgYW55LgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBlbnRpdHkgb3IgdGhlIGVudGl0eSBpcyBub3QgbWFuYWdlZAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBpbnZva2VkIG9uIGEgY29udGFpbmVyLW1hbmFnZWQgZW50aXR5IG1hbmFnZXIgb2YgdHlwZQogICAgICogICAgICAgICAgICAgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTiBhbmQgdGhlcmUgaXMgbm8KICAgICAqICAgICAgICAgICAgIHRyYW5zYWN0aW9uLgogICAgICogQHRocm93cyBFbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGVudGl0eSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBkYXRhYmFzZQogICAgICovCiAgICBwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbnRpdHkpOwoKICAgIC8qKgogICAgICogUmVmcmVzaCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlLCB1c2luZyB0aGUgc3BlY2lmaWVkCiAgICAgKiBwcm9wZXJ0aWVzLCBhbmQgb3ZlcndyaXRpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBlbnRpdHksIGlmIGFueS4gSWYgYQogICAgICogdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIGl0IGlzIHNpbGVudGx5CiAgICAgKiBpZ25vcmVkLgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAcGFyYW0gcHJvcGVydGllcwogICAgICogICAgICAgICAgICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuIGVudGl0eSBvciB0aGUgZW50aXR5IGlzIG5vdCBtYW5hZ2VkCiAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIGludm9rZWQgb24gYSBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgbWFuYWdlciBvZiB0eXBlCiAgICAgKiAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLlRSQU5TQUNUSU9OIGFuZCB0aGVyZSBpcyBubwogICAgICogICAgICAgICAgICAgdHJhbnNhY3Rpb24uCiAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50aXR5IG5vIGxvbmdlciBleGlzdHMgaW4gdGhlIGRhdGFiYXNlCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVudGl0eSwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKCiAgICAvKioKICAgICAqIFJlZnJlc2ggdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSwgb3ZlcndyaXRpbmcgY2hhbmdlcwogICAgICogbWFkZSB0byB0aGUgZW50aXR5LCBpZiBhbnksIGFuZCBsb2NrIGl0IHdpdGggcmVzcGVjdCB0byBnaXZlbiBsb2NrIG1vZGUKICAgICAqIHR5cGUuIElmIHRoZSBsb2NrIG1vZGUgdHlwZSBpcyBwZXNzaW1pc3RpYyBhbmQgdGhlIGVudGl0eSBpbnN0YW5jZSBpcwogICAgICogZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6IC0gdGhlIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgogICAgICogaWYgdGhlIGRhdGFiYXNlIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suIC0gdGhlCiAgICAgKiBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UgbG9ja2luZyBmYWlsdXJlCiAgICAgKiBjYXVzZXMgb25seSBzdGF0ZW1lbnQtbGV2ZWwgcm9sbGJhY2suCiAgICAgKiAKICAgICAqIEBwYXJhbSBlbnRpdHkKICAgICAqIEBwYXJhbSBsb2NrTW9kZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gZW50aXR5IG9yIHRoZSBlbnRpdHkgaXMgbm90IG1hbmFnZWQKICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24KICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRpdHkgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UKICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkCiAgICAgKiAgICAgICAgICAgICBiYWNrCiAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZCBvbmx5IHRoZSBzdGF0ZW1lbnQgaXMgcm9sbGVkCiAgICAgKiAgICAgICAgICAgICBiYWNrCiAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwgaXMgbWFkZQogICAgICovCiAgICBwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbnRpdHksIExvY2tNb2RlVHlwZSBsb2NrTW9kZSk7CgogICAgLyoqCiAgICAgKiBSZWZyZXNoIHRoZSBzdGF0ZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UsIG92ZXJ3cml0aW5nIGNoYW5nZXMKICAgICAqIG1hZGUgdG8gdGhlIGVudGl0eSwgaWYgYW55LCBhbmQgbG9jayBpdCB3aXRoIHJlc3BlY3QgdG8gZ2l2ZW4gbG9jayBtb2RlCiAgICAgKiB0eXBlIGFuZCB3aXRoIHNwZWNpZmllZCBwcm9wZXJ0aWVzLiBJZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMKICAgICAqIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGZvdW5kIGJ1dCBjYW5ub3QgYmUgbG9ja2VkOiAtIHRoZQogICAgICogUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZSBsb2NraW5nIGZhaWx1cmUKICAgICAqIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjay4gLSB0aGUgTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZQogICAgICogdGhyb3duIGlmIHRoZSBkYXRhYmFzZSBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsCiAgICAgKiByb2xsYmFjayBJZiBhIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0eSBvciBoaW50IGlzIG5vdCByZWNvZ25pemVkLCBpdCBpcwogICAgICogc2lsZW50bHkgaWdub3JlZC4gUG9ydGFibGUgYXBwbGljYXRpb25zIHNob3VsZCBub3QgcmVseSBvbiB0aGUgc3RhbmRhcmQKICAgICAqIHRpbWVvdXQgaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nIG1lY2hhbmlzbXMKICAgICAqIHVzZWQgYnkgdGhlIHByb3ZpZGVyLCB0aGUgaGludCBtYXkgb3IgbWF5IG5vdCBiZSBvYnNlcnZlZC4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHBhcmFtIGxvY2tNb2RlCiAgICAgKiBAcGFyYW0gcHJvcGVydGllcwogICAgICogICAgICAgICAgICBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgYW5kIGhpbnRzCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBlbnRpdHkgb3IgdGhlIGVudGl0eSBpcyBub3QgbWFuYWdlZAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbgogICAgICogQHRocm93cyBFbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGVudGl0eSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBkYXRhYmFzZQogICAgICogQHRocm93cyBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQKICAgICAqICAgICAgICAgICAgIGJhY2sKICAgICAqIEB0aHJvd3MgTG9ja1RpbWVvdXRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQKICAgICAqICAgICAgICAgICAgIGJhY2sKICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIGFuIHVuc3VwcG9ydGVkIGxvY2sgY2FsbCBpcyBtYWRlCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVudGl0eSwgTG9ja01vZGVUeXBlIGxvY2tNb2RlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpOwoKICAgIC8qKgogICAgICogQ2xlYXIgdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQsIGNhdXNpbmcgYWxsIG1hbmFnZWQgZW50aXRpZXMgdG8gYmVjb21lCiAgICAgKiBkZXRhY2hlZC4gQ2hhbmdlcyBtYWRlIHRvIGVudGl0aWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBmbHVzaGVkIHRvIHRoZQogICAgICogZGF0YWJhc2Ugd2lsbCBub3QgYmUgcGVyc2lzdGVkLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBjbGVhcigpOwoKICAgIC8qKgogICAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRpdHkgZnJvbSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCwgY2F1c2luZyBhIG1hbmFnZWQKICAgICAqIGVudGl0eSB0byBiZWNvbWUgZGV0YWNoZWQuIFVuZmx1c2hlZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGVudGl0eSBpZiBhbnkKICAgICAqIChpbmNsdWRpbmcgcmVtb3ZhbCBvZiB0aGUgZW50aXR5KSwgd2lsbCBub3QgYmUgc3luY2hyb25pemVkIHRvIHRoZQogICAgICogZGF0YWJhc2UuIEVudGl0aWVzIHdoaWNoIHByZXZpb3VzbHkgcmVmZXJlbmNlZCB0aGUgZGV0YWNoZWQgZW50aXR5IHdpbGwKICAgICAqIGNvbnRpbnVlIHRvIHJlZmVyZW5jZSBpdC4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gZW50aXR5CiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGRldGFjaChPYmplY3QgZW50aXR5KTsKCiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZSBpbnN0YW5jZSBpcyBhIG1hbmFnZWQgZW50aXR5IGluc3RhbmNlIGJlbG9uZ2luZyB0byB0aGUKICAgICAqIGN1cnJlbnQgcGVyc2lzdGVuY2UgY29udGV4dC4KICAgICAqIAogICAgICogQHBhcmFtIGVudGl0eQogICAgICogQHJldHVybgogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIG5vdCBhbiBlbnRpdHkKICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IGVudGl0eSk7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9jayBtb2RlIGZvciB0aGUgZW50aXR5IGluc3RhbmNlLgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5CiAgICAgKiBAcmV0dXJuIGxvY2sgbW9kZQogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbgogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QgYSBtYW5hZ2VkIGVudGl0eSBhbmQgYSB0cmFuc2FjdGlvbiBpcwogICAgICogICAgICAgICAgICAgYWN0aXZlCiAgICAgKi8KICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0TG9ja01vZGUoT2JqZWN0IGVudGl0eSk7CgogICAgLyoqCiAgICAgKiBTZXQgYW4gZW50aXR5IG1hbmFnZXIgcHJvcGVydHkuIElmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IGlzIG5vdAogICAgICogcmVjb2duaXplZCwgaXQgaXMgc2lsZW50bHkgaWdub3JlZC4KICAgICAqIAogICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQogICAgICogQHBhcmFtIHZhbHVlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgdmFsaWQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBwcm9wZXJ0aWVzIGFuZCBhc3NvY2lhdGVkIHZhbHVlcyB0aGF0IGFyZSBpbiBlZmZlY3QgZm9yIHRoZQogICAgICogZW50aXR5IG1hbmFnZXIuIENoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgbWFwIGRvZXMgbm90IGNoYW5nZSB0aGUKICAgICAqIGNvbmZpZ3VyYXRpb24gaW4gZWZmZWN0LgogICAgICovCiAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCk7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBmb3IgdXNlIHdpdGggdGhlCiAgICAgKiBlbnRpdHkgbWFuYWdlci4gVGhlc2UgY29ycmVzcG9uZCB0byBwcm9wZXJ0aWVzIGFuZCBoaW50cyB0aGF0IG1heSBiZQogICAgICogcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoZSBFbnRpdHlNYW5hZ2VyIGludGVyZmFjZSB0aGF0IHRha2UgYQogICAgICogcHJvcGVydGllcyBhcmd1bWVudCBvciB1c2VkIHdpdGggdGhlIFBlcnNpc3RlbmNlQ29udGV4dCBhbm5vdGF0aW9uLiBUaGVzZQogICAgICogcHJvcGVydGllcyBpbmNsdWRlIGFsbCBzdGFuZGFyZCBlbnRpdHkgbWFuYWdlciBoaW50cyBhbmQgcHJvcGVydGllcyBhcwogICAgICogd2VsbCBhcyB2ZW5kb3Itc3BlY2lmaWMgb25lcyBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGVzZSBwcm9wZXJ0aWVzCiAgICAgKiBtYXkgb3IgbWF5IG5vdCBjdXJyZW50bHkgYmUgaW4gZWZmZWN0LgogICAgICogCiAgICAgKiBAcmV0dXJuIHByb3BlcnR5IG5hbWVzCiAgICAgKi8KICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdXBwb3J0ZWRQcm9wZXJ0aWVzKCk7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUXVlcnkgZm9yIGV4ZWN1dGluZyBhIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkKICAgICAqIGxhbmd1YWdlIHN0YXRlbWVudC4KICAgICAqIAogICAgICogQHBhcmFtIHFsU3RyaW5nCiAgICAgKiAgICAgICAgICAgIGEgSmF2YSBQZXJzaXN0ZW5jZSBxdWVyeSBzdHJpbmcKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMgZm91bmQgdG8gYmUgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgUXVlcnkgY3JlYXRlUXVlcnkoU3RyaW5nIHFsU3RyaW5nKTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBRdWVyeSBmb3IgZXhlY3V0aW5nIGEgY3JpdGVyaWEgcXVlcnkuCiAgICAgKiAKICAgICAqIEBwYXJhbSBjcml0ZXJpYVF1ZXJ5CiAgICAgKiAgICAgICAgICAgIGEgQ3JpdGVyaWEgcXVlcnkgb2JqZWN0CiAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcXVlcnkgaW5zdGFuY2UKICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcXVlcnkgZGVmaW5pdGlvbiBpcyBmb3VuZCB0byBiZSBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeShDcml0ZXJpYVF1ZXJ5IGNyaXRlcmlhUXVlcnkpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcgYSBuYW1lZCBxdWVyeSAoaW4gdGhlIEphdmEKICAgICAqIFBlcnNpc3RlbmNlIHF1ZXJ5IGxhbmd1YWdlIG9yIGluIG5hdGl2ZSBTUUwpLgogICAgICogCiAgICAgKiBAcGFyYW0gbmFtZQogICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhIHF1ZXJ5IGRlZmluZWQgaW4gbWV0YWRhdGEKICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIGEgcXVlcnkgaGFzIG5vdCBiZWVuIGRlZmluZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciBpZiB0aGUKICAgICAqICAgICAgICAgICAgIHF1ZXJ5IHN0cmluZyBpcyBmb3VuZCB0byBiZSBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVOYW1lZFF1ZXJ5KFN0cmluZyBuYW1lKTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBRdWVyeSBmb3IgZXhlY3V0aW5nIGEgbmF0aXZlIFNRTCBzdGF0ZW1lbnQsIGUuZy4sCiAgICAgKiBmb3IgdXBkYXRlIG9yIGRlbGV0ZS4KICAgICAqIAogICAgICogQHBhcmFtIHNxbFN0cmluZwogICAgICogICAgICAgICAgICBhIG5hdGl2ZSBTUUwgcXVlcnkgc3RyaW5nCiAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcXVlcnkgaW5zdGFuY2UKICAgICAqLwogICAgcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWxTdHJpbmcpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcgYSBuYXRpdmUgU1FMIHF1ZXJ5LgogICAgICogCiAgICAgKiBAcGFyYW0gc3FsU3RyaW5nCiAgICAgKiAgICAgICAgICAgIGEgbmF0aXZlIFNRTCBxdWVyeSBzdHJpbmcKICAgICAqIEBwYXJhbSByZXN1bHRDbGFzcwogICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdGluZyBpbnN0YW5jZShzKQogICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsU3RyaW5nLCBDbGFzcyByZXN1bHRDbGFzcyk7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUXVlcnkgZm9yIGV4ZWN1dGluZyBhIG5hdGl2ZSBTUUwgcXVlcnkuCiAgICAgKiAKICAgICAqIEBwYXJhbSBzcWxTdHJpbmcKICAgICAqICAgICAgICAgICAgYSBuYXRpdmUgU1FMIHF1ZXJ5IHN0cmluZwogICAgICogQHBhcmFtIHJlc3VsdFNldE1hcHBpbmcKICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlc3VsdCBzZXQgbWFwcGluZwogICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCiAgICAgKi8KICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsU3RyaW5nLCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyk7CgogICAgLyoqCiAgICAgKiBJbmRpY2F0ZSB0byB0aGUgRW50aXR5TWFuYWdlciB0aGF0IGEgSlRBIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZS4gVGhpcwogICAgICogbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb24gYSBKVEEgYXBwbGljYXRpb24gbWFuYWdlZCBFbnRpdHlNYW5hZ2VyIHRoYXQKICAgICAqIHdhcyBjcmVhdGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb24gdG8gYXNzb2NpYXRlIGl0CiAgICAgKiB3aXRoIHRoZSBjdXJyZW50IEpUQSB0cmFuc2FjdGlvbi4KICAgICAqIAogICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbi4KICAgICAqLwogICAgcHVibGljIHZvaWQgam9pblRyYW5zYWN0aW9uKCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlCiAgICAgKiBwcm92aWRlci1zcGVjaWZpYyBBUEkuIElmIHRoZSBwcm92aWRlcidzIEVudGl0eU1hbmFnZXIgaW1wbGVtZW50YXRpb24KICAgICAqIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBjbGFzcywgdGhlIFBlcnNpc3RlbmNlRXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAqIAogICAgICogQHBhcmFtIGNscwogICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byBiZSByZXR1cm5lZC4gVGhpcyBpcyBub3JtYWxseQogICAgICogICAgICAgICAgICBlaXRoZXIgdGhlIHVuZGVybHlpbmcgRW50aXR5TWFuYWdlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvciBhbgogICAgICogICAgICAgICAgICBpbnRlcmZhY2UgdGhhdCBpdCBpbXBsZW1lbnRzLgogICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzCiAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FsbC4KICAgICAqLwogICAgcHVibGljIDxUPiBUIHVud3JhcChDbGFzczxUPiBjbHMpOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHByb3ZpZGVyIG9iamVjdCBmb3IgdGhlIEVudGl0eU1hbmFnZXIsIGlmCiAgICAgKiBhdmFpbGFibGUuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuIFRoZQogICAgICogdW53cmFwIG1ldGhvZCBpcyB0byBiZSBwcmVmZXJyZWQgZm9yIG5ldyBhcHBsaWNhdGlvbnMuCiAgICAgKi8KICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGUoKTsKCiAgICAvKioKICAgICAqIENsb3NlIGFuIGFwcGxpY2F0aW9uLW1hbmFnZWQgRW50aXR5TWFuYWdlci4gQWZ0ZXIgdGhlIGNsb3NlIG1ldGhvZCBoYXMKICAgICAqIGJlZW4gaW52b2tlZCwgYWxsIG1ldGhvZHMgb24gdGhlIEVudGl0eU1hbmFnZXIgaW5zdGFuY2UgYW5kIGFueSBRdWVyeQogICAgICogb2JqZWN0cyBvYnRhaW5lZCBmcm9tIGl0IHdpbGwgdGhyb3cgdGhlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleGNlcHQgZm9yCiAgICAgKiBnZXRQcm9wZXJ0aWVzLCBnZXRTdXBwb3J0ZWRQcm9wZXJ0aWVzLCBnZXRUcmFuc2FjdGlvbiwgYW5kIGlzT3BlbiAod2hpY2gKICAgICAqIHdpbGwgcmV0dXJuIGZhbHNlKS4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIEVudGl0eU1hbmFnZXIgaXMKICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhbiBhY3RpdmUgdHJhbnNhY3Rpb24sIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlbWFpbnMKICAgICAqIG1hbmFnZWQgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy4KICAgICAqIAogICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBFbnRpdHlNYW5hZ2VyIGlzIGNvbnRhaW5lci1tYW5hZ2VkLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOwoKICAgIC8qKgogICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEVudGl0eU1hbmFnZXIgaXMgb3Blbi4KICAgICAqIAogICAgICogQHJldHVybiB0cnVlIHVudGlsIHRoZSBFbnRpdHlNYW5hZ2VyIGhhcyBiZWVuIGNsb3NlZC4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlLWxldmVsIHRyYW5zYWN0aW9uIG9iamVjdC4gVGhlIEVudGl0eVRyYW5zYWN0aW9uCiAgICAgKiBpbnN0YW5jZSBtYXkgYmUgdXNlZCBzZXJpYWxseSB0byBiZWdpbiBhbmQgY29tbWl0IG11bHRpcGxlIHRyYW5zYWN0aW9ucy4KICAgICAqIAogICAgICogQHJldHVybiBFbnRpdHlUcmFuc2FjdGlvbiBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIGludm9rZWQgb24gYSBKVEEgRW50aXR5TWFuYWdlci4KICAgICAqLwogICAgcHVibGljIEVudGl0eVRyYW5zYWN0aW9uIGdldFRyYW5zYWN0aW9uKCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkgZm9yIHRoZSBlbnRpdHkgbWFuYWdlci4KICAgICAqIAogICAgICogQHJldHVybiBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBpbnN0YW5jZQogICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRpdHkgbWFuYWdlciBoYXMgYmVlbiBjbG9zZWQuCiAgICAgKi8KICAgIHB1YmxpYyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBnZXRFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIFF1ZXJ5QnVpbGRlciBmb3IgdGhlIGNyZWF0aW9uIG9mIENyaXRlcmlhUXVlcnkKICAgICAqIG9iamVjdHMuCiAgICAgKiAKICAgICAqIEByZXR1cm4gUXVlcnlCdWlsZGVyIGluc3RhbmNlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGVudGl0eSBtYW5hZ2VyIGhhcyBiZWVuIGNsb3NlZC4KICAgICAqLwogICAgcHVibGljIFF1ZXJ5QnVpbGRlciBnZXRRdWVyeUJ1aWxkZXIoKTsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBNZXRhbW9kZWwgaW50ZXJmYWNlIGZvciBhY2Nlc3MgdG8gdGhlIG1ldGFtb2RlbCBvZgogICAgICogdGhlIHBlcnNpc3RlbmNlIHVuaXQuCiAgICAgKiAKICAgICAqIEByZXR1cm4gTWV0YW1vZGVsIGluc3RhbmNlCiAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgaWYgdGhlIGVudGl0eSBtYW5hZ2VyIGhhcyBiZWVuIGNsb3NlZC4KICAgICAqLwogICAgcHVibGljIE1ldGFtb2RlbCBnZXRNZXRhbW9kZWwoKTsKfQ==