LyoqCiAqIENvcHlyaWdodCAoYykgMjAxNyBDRUEgTElTVC4KICogCiAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgIFPpYmFzdGllbiBHZXJhcmQgKENFQSBMSVNUKSA8c2ViYXN0aWVuLmdlcmFyZEBjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSA8eXVwYW5xdWkubXVub3pqdWxob0BjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIAogKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5pbXBsOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucHJpb3JpdHlhbmRpbXBvcnRhbmNlY29uY2VybnMuUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnByaW9yaXR5YW5kaW1wb3J0YW5jZWNvbmNlcm5zLmltcGwuUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlSW1wbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5BZ3JlZW1lbnRTdGF0dXNLaW5kOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUXVhbGlmaWNhdGlvblN0YXR1c0tpbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc0ZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXZpZXdTdGF0dXNLaW5kOwppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuU2F0aXNmYWN0aW9uU3RhdHVzS2luZDsKCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGNsYXNzaWZpY2F0aW9uY29uY2VybnMuUmVxdWlyZW1lbnRDbGFzc2lmaWNhdGlvbkNvbmNlcm5zUGFja2FnZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGNsYXNzaWZpY2F0aW9uY29uY2VybnMuaW1wbC5SZXF1aXJlbWVudENsYXNzaWZpY2F0aW9uQ29uY2VybnNQYWNrYWdlSW1wbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudHNjaGFyYWN0ZXJpc3RpY3Njb25jZXJucy5SZXF1aXJlbWVudHNDaGFyYWN0ZXJpc3RpY3NDb25jZXJuc1BhY2thZ2U7CgppbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRzY2hhcmFjdGVyaXN0aWNzY29uY2VybnMuaW1wbC5SZXF1aXJlbWVudHNDaGFyYWN0ZXJpc3RpY3NDb25jZXJuc1BhY2thZ2VJbXBsOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnZlcmlmaWNhdGlvbmFuZHZhbGlkYXRpb25jb25jZXJucy5WZXJpZmljYXRpb25BbmRWYWxpZGF0aW9uQ29uY2VybnNQYWNrYWdlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnZlcmlmaWNhdGlvbmFuZHZhbGlkYXRpb25jb25jZXJucy5pbXBsLlZlcmlmaWNhdGlvbkFuZFZhbGlkYXRpb25Db25jZXJuc1BhY2thZ2VJbXBsOwoKLyoqCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBjbGFzcyBSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlIHsKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglwcml2YXRlIEVFbnVtIGFncmVlbWVudFN0YXR1c0tpbmRFRW51bSA9IG51bGw7CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByaXZhdGUgRUVudW0gcXVhbGlmaWNhdGlvblN0YXR1c0tpbmRFRW51bSA9IG51bGw7CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByaXZhdGUgRUVudW0gc2F0aXNmYWN0aW9uU3RhdHVzS2luZEVFbnVtID0gbnVsbDsKCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBFRW51bSByZXZpZXdTdGF0dXNLaW5kRUVudW0gPSBudWxsOwoKCS8qKgoJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAoJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgoJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwoJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCgkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQoJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2UjZU5TX1VSSQoJICogQHNlZSAjaW5pdCgpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByaXZhdGUgUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlSW1wbCgpIHsKCQlzdXBlcihlTlNfVVJJLCBSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc0ZhY3RvcnkuZUlOU1RBTkNFKTsKCX0KCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwoKCS8qKgoJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgoJICogCgkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAc2VlICNlTlNfVVJJCgkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQoJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlIGluaXQoKSB7CgkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2UuZU5TX1VSSSk7CgoJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKCQlSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsIHRoZVJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZSA9IChSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZUltcGwoKSk7CgoJCWlzSW5pdGVkID0gdHJ1ZTsKCgkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKCQlSZXF1aXJlbWVudENsYXNzaWZpY2F0aW9uQ29uY2VybnNQYWNrYWdlSW1wbCB0aGVSZXF1aXJlbWVudENsYXNzaWZpY2F0aW9uQ29uY2VybnNQYWNrYWdlID0gKFJlcXVpcmVtZW50Q2xhc3NpZmljYXRpb25Db25jZXJuc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXF1aXJlbWVudENsYXNzaWZpY2F0aW9uQ29uY2VybnNQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUmVxdWlyZW1lbnRDbGFzc2lmaWNhdGlvbkNvbmNlcm5zUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXF1aXJlbWVudENsYXNzaWZpY2F0aW9uQ29uY2VybnNQYWNrYWdlLmVOU19VUkkpIDogUmVxdWlyZW1lbnRDbGFzc2lmaWNhdGlvbkNvbmNlcm5zUGFja2FnZS5lSU5TVEFOQ0UpOwoJCVJlcXVpcmVtZW50c0NoYXJhY3RlcmlzdGljc0NvbmNlcm5zUGFja2FnZUltcGwgdGhlUmVxdWlyZW1lbnRzQ2hhcmFjdGVyaXN0aWNzQ29uY2VybnNQYWNrYWdlID0gKFJlcXVpcmVtZW50c0NoYXJhY3RlcmlzdGljc0NvbmNlcm5zUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFJlcXVpcmVtZW50c0NoYXJhY3RlcmlzdGljc0NvbmNlcm5zUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFJlcXVpcmVtZW50c0NoYXJhY3RlcmlzdGljc0NvbmNlcm5zUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXF1aXJlbWVudHNDaGFyYWN0ZXJpc3RpY3NDb25jZXJuc1BhY2thZ2UuZU5TX1VSSSkgOiBSZXF1aXJlbWVudHNDaGFyYWN0ZXJpc3RpY3NDb25jZXJuc1BhY2thZ2UuZUlOU1RBTkNFKTsKCQlQcmlvcml0eUFuZEltcG9ydGFuY2VDb25jZXJuc1BhY2thZ2VJbXBsIHRoZVByaW9yaXR5QW5kSW1wb3J0YW5jZUNvbmNlcm5zUGFja2FnZSA9IChQcmlvcml0eUFuZEltcG9ydGFuY2VDb25jZXJuc1BhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQcmlvcml0eUFuZEltcG9ydGFuY2VDb25jZXJuc1BhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQcmlvcml0eUFuZEltcG9ydGFuY2VDb25jZXJuc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlLmVOU19VUkkpIDogUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlLmVJTlNUQU5DRSk7CgkJVmVyaWZpY2F0aW9uQW5kVmFsaWRhdGlvbkNvbmNlcm5zUGFja2FnZUltcGwgdGhlVmVyaWZpY2F0aW9uQW5kVmFsaWRhdGlvbkNvbmNlcm5zUGFja2FnZSA9IChWZXJpZmljYXRpb25BbmRWYWxpZGF0aW9uQ29uY2VybnNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVmVyaWZpY2F0aW9uQW5kVmFsaWRhdGlvbkNvbmNlcm5zUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFZlcmlmaWNhdGlvbkFuZFZhbGlkYXRpb25Db25jZXJuc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVmVyaWZpY2F0aW9uQW5kVmFsaWRhdGlvbkNvbmNlcm5zUGFja2FnZS5lTlNfVVJJKSA6IFZlcmlmaWNhdGlvbkFuZFZhbGlkYXRpb25Db25jZXJuc1BhY2thZ2UuZUlOU1RBTkNFKTsKCgkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKCQl0aGVSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CgkJdGhlUmVxdWlyZW1lbnRDbGFzc2lmaWNhdGlvbkNvbmNlcm5zUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKCQl0aGVSZXF1aXJlbWVudHNDaGFyYWN0ZXJpc3RpY3NDb25jZXJuc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CgkJdGhlUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwoJCXRoZVZlcmlmaWNhdGlvbkFuZFZhbGlkYXRpb25Db25jZXJuc1BhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CgoJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKCQl0aGVSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwoJCXRoZVJlcXVpcmVtZW50Q2xhc3NpZmljYXRpb25Db25jZXJuc1BhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwoJCXRoZVJlcXVpcmVtZW50c0NoYXJhY3RlcmlzdGljc0NvbmNlcm5zUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CgkJdGhlUHJpb3JpdHlBbmRJbXBvcnRhbmNlQ29uY2VybnNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKCQl0aGVWZXJpZmljYXRpb25BbmRWYWxpZGF0aW9uQ29uY2VybnNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKCgkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAoJCXRoZVJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZS5mcmVlemUoKTsKCiAgCgkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCgkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZS5lTlNfVVJJLCB0aGVSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2UpOwoJCXJldHVybiB0aGVSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2U7Cgl9CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBFRW51bSBnZXRBZ3JlZW1lbnRTdGF0dXNLaW5kKCkgewoJCXJldHVybiBhZ3JlZW1lbnRTdGF0dXNLaW5kRUVudW07Cgl9CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBFRW51bSBnZXRRdWFsaWZpY2F0aW9uU3RhdHVzS2luZCgpIHsKCQlyZXR1cm4gcXVhbGlmaWNhdGlvblN0YXR1c0tpbmRFRW51bTsKCX0KCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIEVFbnVtIGdldFNhdGlzZmFjdGlvblN0YXR1c0tpbmQoKSB7CgkJcmV0dXJuIHNhdGlzZmFjdGlvblN0YXR1c0tpbmRFRW51bTsKCX0KCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIEVFbnVtIGdldFJldmlld1N0YXR1c0tpbmQoKSB7CgkJcmV0dXJuIHJldmlld1N0YXR1c0tpbmRFRW51bTsKCX0KCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIFJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zRmFjdG9yeSBnZXRSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc0ZhY3RvcnkoKSB7CgkJcmV0dXJuIChSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc0ZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwoJfQoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewoJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKCQlpc0NyZWF0ZWQgPSB0cnVlOwoKCQkvLyBDcmVhdGUgZW51bXMKCQlhZ3JlZW1lbnRTdGF0dXNLaW5kRUVudW0gPSBjcmVhdGVFRW51bShBR1JFRU1FTlRfU1RBVFVTX0tJTkQpOwoJCXF1YWxpZmljYXRpb25TdGF0dXNLaW5kRUVudW0gPSBjcmVhdGVFRW51bShRVUFMSUZJQ0FUSU9OX1NUQVRVU19LSU5EKTsKCQlzYXRpc2ZhY3Rpb25TdGF0dXNLaW5kRUVudW0gPSBjcmVhdGVFRW51bShTQVRJU0ZBQ1RJT05fU1RBVFVTX0tJTkQpOwoJCXJldmlld1N0YXR1c0tpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFJFVklFV19TVEFUVVNfS0lORCk7Cgl9CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CgoJLyoqCgkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwoJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwoJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwoKCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKCQlzZXROYW1lKGVOQU1FKTsKCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKCQlzZXROc1VSSShlTlNfVVJJKTsKCgkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKCQlpbml0RUVudW0oYWdyZWVtZW50U3RhdHVzS2luZEVFbnVtLCBBZ3JlZW1lbnRTdGF0dXNLaW5kLmNsYXNzLCAiQWdyZWVtZW50U3RhdHVzS2luZCIpOyAvLyROT04tTkxTLTEkCgkJYWRkRUVudW1MaXRlcmFsKGFncmVlbWVudFN0YXR1c0tpbmRFRW51bSwgQWdyZWVtZW50U3RhdHVzS2luZC5TVUJNSVRURUQpOwoJCWFkZEVFbnVtTGl0ZXJhbChhZ3JlZW1lbnRTdGF0dXNLaW5kRUVudW0sIEFncmVlbWVudFN0YXR1c0tpbmQuVE9fQkVfUkVGSU5FRCk7CgkJYWRkRUVudW1MaXRlcmFsKGFncmVlbWVudFN0YXR1c0tpbmRFRW51bSwgQWdyZWVtZW50U3RhdHVzS2luZC5BQ0NFUFRFRCk7CgkJYWRkRUVudW1MaXRlcmFsKGFncmVlbWVudFN0YXR1c0tpbmRFRW51bSwgQWdyZWVtZW50U3RhdHVzS2luZC5EUkFGVCk7CgkJYWRkRUVudW1MaXRlcmFsKGFncmVlbWVudFN0YXR1c0tpbmRFRW51bSwgQWdyZWVtZW50U3RhdHVzS2luZC5SRUpFQ1RFRCk7CgoJCWluaXRFRW51bShxdWFsaWZpY2F0aW9uU3RhdHVzS2luZEVFbnVtLCBRdWFsaWZpY2F0aW9uU3RhdHVzS2luZC5jbGFzcywgIlF1YWxpZmljYXRpb25TdGF0dXNLaW5kIik7IC8vJE5PTi1OTFMtMSQKCQlhZGRFRW51bUxpdGVyYWwocXVhbGlmaWNhdGlvblN0YXR1c0tpbmRFRW51bSwgUXVhbGlmaWNhdGlvblN0YXR1c0tpbmQuTk9UX1FVQUxJRklFRCk7CgkJYWRkRUVudW1MaXRlcmFsKHF1YWxpZmljYXRpb25TdGF0dXNLaW5kRUVudW0sIFF1YWxpZmljYXRpb25TdGF0dXNLaW5kLlFVQUxJRklFRCk7CgkJYWRkRUVudW1MaXRlcmFsKHF1YWxpZmljYXRpb25TdGF0dXNLaW5kRUVudW0sIFF1YWxpZmljYXRpb25TdGF0dXNLaW5kLlNVU1BFQ1QpOwoKCQlpbml0RUVudW0oc2F0aXNmYWN0aW9uU3RhdHVzS2luZEVFbnVtLCBTYXRpc2ZhY3Rpb25TdGF0dXNLaW5kLmNsYXNzLCAiU2F0aXNmYWN0aW9uU3RhdHVzS2luZCIpOyAvLyROT04tTkxTLTEkCgkJYWRkRUVudW1MaXRlcmFsKHNhdGlzZmFjdGlvblN0YXR1c0tpbmRFRW51bSwgU2F0aXNmYWN0aW9uU3RhdHVzS2luZC5OT1RfU0FUSVNGSUVEKTsKCQlhZGRFRW51bUxpdGVyYWwoc2F0aXNmYWN0aW9uU3RhdHVzS2luZEVFbnVtLCBTYXRpc2ZhY3Rpb25TdGF0dXNLaW5kLlNBVElTRklFRCk7CgkJYWRkRUVudW1MaXRlcmFsKHNhdGlzZmFjdGlvblN0YXR1c0tpbmRFRW51bSwgU2F0aXNmYWN0aW9uU3RhdHVzS2luZC5TVVNQRUNUKTsKCgkJaW5pdEVFbnVtKHJldmlld1N0YXR1c0tpbmRFRW51bSwgUmV2aWV3U3RhdHVzS2luZC5jbGFzcywgIlJldmlld1N0YXR1c0tpbmQiKTsgLy8kTk9OLU5MUy0xJAoJCWFkZEVFbnVtTGl0ZXJhbChyZXZpZXdTdGF0dXNLaW5kRUVudW0sIFJldmlld1N0YXR1c0tpbmQuVE9fQkVfUkVWSUVXRUQpOwoJCWFkZEVFbnVtTGl0ZXJhbChyZXZpZXdTdGF0dXNLaW5kRUVudW0sIFJldmlld1N0YXR1c0tpbmQuQUNDRVBURUQpOwoJCWFkZEVFbnVtTGl0ZXJhbChyZXZpZXdTdGF0dXNLaW5kRUVudW0sIFJldmlld1N0YXR1c0tpbmQuUkVKRUNURUQpOwoKCQkvLyBDcmVhdGUgcmVzb3VyY2UKCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKCgkJLy8gQ3JlYXRlIGFubm90YXRpb25zCgkJLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTAoJCWNyZWF0ZVVNTEFubm90YXRpb25zKCk7Cgl9CgoJLyoqCgkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUw8L2I+LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVTUxBbm5vdGF0aW9ucygpIHsKCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiOyAvLyROT04tTkxTLTEkCQoJCWFkZEFubm90YXRpb24KCQkgICh0aGlzLCAKCQkgICBzb3VyY2UsIAoJCSAgIG5ldyBTdHJpbmdbXSB7CgkJCSAib3JpZ2luYWxOYW1lIiwgIlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKCQkgICB9KTsKCX0KCn0gLy9SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsCg==