LyoqCiAqIENvcHlyaWdodCAoYykgMjAxNyBDRUEgTElTVC4KICogCiAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgIFPpYmFzdGllbiBHZXJhcmQgKENFQSBMSVNUKSA8c2ViYXN0aWVuLmdlcmFyZEBjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSA8eXVwYW5xdWkubXVub3pqdWxob0BjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIAogKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5wcmlvcml0eWFuZGltcG9ydGFuY2Vjb25jZXJuczsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CgovKioKICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCiAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKICogPHVsPgogKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CiAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CiAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CiAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CiAqIDwvdWw+CiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLlByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zRmFjdG9yeQogKiBAbW9kZWwga2luZD0icGFja2FnZSIKICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwgb3JpZ2luYWxOYW1lPSdQcmlvcml0eUFuZEltcG9ydGFuY2VDb25jZXJucyciCiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBpbnRlcmZhY2UgUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewoJLyoqCgkgKiBUaGUgcGFja2FnZSBuYW1lLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgZU5BTUUgPSAicHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMiOyAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhcHlydXMvcmVxdWlyZW1lbnRzL3N5c21sMTQvMC43LjAvUGFweXJ1c1JFL01vZGVsTGlicmFyeS9QYXB5cnVzUkVTdGFuZGFyZFV0aWxzL1ByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zIjsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCVN0cmluZyBlTlNfUFJFRklYID0gIlByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zIjsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLmltcGwuUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlSW1wbC5pbml0KCk7CgoJLyoqCgkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLlByaW9yaXR5S2luZCA8ZW0+UHJpb3JpdHkgS2luZDwvZW0+fScgZW51bS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMuUHJpb3JpdHlLaW5kCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLmltcGwuUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlSW1wbCNnZXRQcmlvcml0eUtpbmQoKQoJICogQGdlbmVyYXRlZAoJICovCglpbnQgUFJJT1JJVFlfS0lORCA9IDA7CgoJLyoqCgkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLkltcG9ydGFuY2VLaW5kIDxlbT5JbXBvcnRhbmNlIEtpbmQ8L2VtPn0nIGVudW0uCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLkltcG9ydGFuY2VLaW5kCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLmltcGwuUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlSW1wbCNnZXRJbXBvcnRhbmNlS2luZCgpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCWludCBJTVBPUlRBTkNFX0tJTkQgPSAxOwoKCgkvKioKCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMuUHJpb3JpdHlLaW5kIDxlbT5Qcmlvcml0eSBLaW5kPC9lbT59Jy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UHJpb3JpdHkgS2luZDwvZW0+Jy4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMuUHJpb3JpdHlLaW5kCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUVFbnVtIGdldFByaW9yaXR5S2luZCgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5wcmlvcml0eWFuZGltcG9ydGFuY2Vjb25jZXJucy5JbXBvcnRhbmNlS2luZCA8ZW0+SW1wb3J0YW5jZSBLaW5kPC9lbT59Jy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SW1wb3J0YW5jZSBLaW5kPC9lbT4nLgoJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5wcmlvcml0eWFuZGltcG9ydGFuY2Vjb25jZXJucy5JbXBvcnRhbmNlS2luZAoJICogQGdlbmVyYXRlZAoJICovCglFRW51bSBnZXRJbXBvcnRhbmNlS2luZCgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNGYWN0b3J5IGdldFByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zRmFjdG9yeSgpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKCSAqIDx1bD4KCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CgkgKiAgIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CgkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CgkgKiA8L3VsPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCWludGVyZmFjZSBMaXRlcmFscyB7CgkJLyoqCgkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLlByaW9yaXR5S2luZCA8ZW0+UHJpb3JpdHkgS2luZDwvZW0+fScgZW51bS4KCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMuUHJpb3JpdHlLaW5kCgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5wcmlvcml0eWFuZGltcG9ydGFuY2Vjb25jZXJucy5pbXBsLlByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zUGFja2FnZUltcGwjZ2V0UHJpb3JpdHlLaW5kKCkKCQkgKiBAZ2VuZXJhdGVkCgkJICovCgkJRUVudW0gUFJJT1JJVFlfS0lORCA9IGVJTlNUQU5DRS5nZXRQcmlvcml0eUtpbmQoKTsKCgkJLyoqCgkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLkltcG9ydGFuY2VLaW5kIDxlbT5JbXBvcnRhbmNlIEtpbmQ8L2VtPn0nIGVudW0uCgkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLkltcG9ydGFuY2VLaW5kCgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5wcmlvcml0eWFuZGltcG9ydGFuY2Vjb25jZXJucy5pbXBsLlByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zUGFja2FnZUltcGwjZ2V0SW1wb3J0YW5jZUtpbmQoKQoJCSAqIEBnZW5lcmF0ZWQKCQkgKi8KCQlFRW51bSBJTVBPUlRBTkNFX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SW1wb3J0YW5jZUtpbmQoKTsKCgl9Cgp9IC8vUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlCg==