LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai53aXphcmRzLnVpLndpemFyZHM7DQoNCmltcG9ydCBqYXZhLmlvLkZpbGU7DQppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5jb21tb24uc2VjdXJpdHkuQ0RPUGVybWlzc2lvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udXRpbC5jb25uZWN0aW9uLkNET0Nvbm5lY3Rpb25VdGlsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZXJlc291cmNlLkNET1Jlc291cmNlRm9sZGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZXJlc291cmNlLkNET1Jlc291cmNlTm9kZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnNlc3Npb24uQ0RPU2Vzc2lvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnRyYW5zYWN0aW9uLkNET1RyYW5zYWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udmlldy5DRE9WaWV3Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2oudXRpbHMud2lkZ2V0LkNoZWNrYm94VHJlZVZpZXdlckV4dDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07DQoNCi8vaW1wb3J0IGVzLmVzaS5nZW1kZS5jZXJ0aWZpY2F0aW9uLnFyZWZlcmVuY2UucmVmZXJlbmNlLlF1YWxpZmljYXRpb25SZXF1aXJlbWVudDsNCi8vaW1wb3J0IGVzLmVzaS5nZW1kZS5jZXJ0aWZpY2F0aW9uLnV0aWxzLndpZGdldC5DaGVja2JveFRyZWVWaWV3ZXJFeHQ7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQoNCg0KDQppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLndpemFyZHMuQWN0aXZhdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBrbS5yZWZmcmFtZXdvcmsucmVmZnJhbWV3b3JrLio7DQoNCnB1YmxpYyBjbGFzcyBBc3N1clByb2pSZWZGcmFtZXdvcmtTZWxlY3Rpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQoJDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5DRVJUX1JFRkZSQU1FV09SS19ESVJfS0VZID0gIk9QRU5DRVJUX1JFRkZSQU1FV09SS19ESVJfS0VZIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRlJBTUVXT1JLID0gIi5yZWZmcmFtZXdvcmsiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUlMT1JFRF9SRUZGUkFNRVdPUksgPSAidGFpbG9yZWRSZWZGcmFtZXdvcmsiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0ZPUl9CQVNFTElORSA9ICJOYW1lIGZvciBCYXNlbGluZToiOw0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFTElORV9TRUxFQ1RJT04gPSAiQmFzZWxpbmUgU2VsZWN0aW9uIjsNCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfRlJBTUVXT1JLX1NFTEVDVElPTiA9ICJSZWZlcmVuY2UgRnJhbWV3b3JrIFNlbGVjdGlvbiI7DQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRV9BU1NPQ0lBVEVEX1JFRkVSRU5DRV9GUkFNRVdPUksgPSAiQ2hvb3NlIGFzc29jaWF0ZWQgUmVmZXJlbmNlIEZyYW1ld29yayI7DQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5DRVJUX1JFRkVSRU5DRV9GUkFNRVdPUktfU0VMRUNUSU9OID0gIk9QRU5DRVJUIFJlZmVyZW5jZSBGcmFtZXdvcmsgU2VsZWN0aW9uIjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JJVElDQUxJVFlfU0VMRUNUSU9OID0gIlNlbGVjdCB0aGUgQ3JpdGljYWxpdHkgbGV2ZWw6IjsNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQUJJTElUWV9TRUxFQ1RJT04gPSAiU2VsZWN0IHRoZSBBcHBsaWNhYmlsaXR5IGxldmVsOiI7DQoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0VWRU5UID0gNzUwMDsNCglwcm90ZWN0ZWQgTGlzdCByZWZMaXN0Ow0KCXByb3RlY3RlZCBBcnJheUxpc3Q8U3RyaW5nPiByZWZMaXN0RGlyOw0KCXByb3RlY3RlZCBTdHJpbmcgcXJlZjsNCglwcm90ZWN0ZWQgSUZpbGUgbW9kZWxGaWxlOw0KCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5Ow0KCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyaXRBZGFwdGVyRmFjdG9yeTsNCglwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhcHBsaUFkYXB0ZXJGYWN0b3J5Ow0KCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsNCglwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7DQoJLy9wcm90ZWN0ZWQgVHJlZSB0cmVlOw0KCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXJFeHQgbW9kZWxWaWV3ZXI7DQoJcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlckV4dCBjcml0aWNhbGl0eVZpZXdlcjsNCglwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGFwbGljYWJpbGl0eVZpZXdlcjsNCglwcml2YXRlIE9iamVjdCBbXSByZXN1bHRzOw0KICAgIHByaXZhdGUgVGV4dCBiYXNlbGluZU5hbWU7DQoNCiAgICBwcml2YXRlIENET1ZpZXcgdmlld0NETz1udWxsOw0KDQoNCglwdWJsaWMgQXNzdXJQcm9qUmVmRnJhbWV3b3JrU2VsZWN0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsNCgkJc3VwZXIocGFnZU5hbWUpOw0KCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWINCgkJdGhpcy5zZXRUaXRsZShPUEVOQ0VSVF9SRUZFUkVOQ0VfRlJBTUVXT1JLX1NFTEVDVElPTik7DQoJCXRoaXMuc2V0TWVzc2FnZShDSE9PU0VfQVNTT0NJQVRFRF9SRUZFUkVOQ0VfRlJBTUVXT1JLKTsNCgl9DQoNCglwdWJsaWMgQXNzdXJQcm9qUmVmRnJhbWV3b3JrU2VsZWN0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwNCgkJCUltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKSB7DQoJCXN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgdGl0bGVJbWFnZSk7DQoJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KCX0NCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KCQlzZXRDb250cm9sKGNyZWF0ZUNvbnRyb2xzKHBhcmVudCkpOw0KCX0NCgkvKioNCgkgKiBjcmVhdGVDb250cm9sczogYnVpbGRzIHRoZSBjb21wb3NpdGVzIGFuZCBjb250cm9scyB0byBzaG93IHRoZSByZWZlcmVuY2VzIGFuZCANCgkgKiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzZWxlY3RlZCByZWZlcmVuY2UNCgkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgd2hlcmUgdGhlIGNvbnRyb2xzIGFyZSBnb2luZyB0byBiZSBsb2NhdGVkDQoJICogQHJldHVybiB0aGUgY29tcG9zaXRlIHBhcmVudCAodGhlIG9uZSB0aGF0IGlzIHRoZSBpbnB1dCBwYXJhbWVlcg0KCSAqLw0KCQ0KCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCkgew0KCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FIHwgU1dULkZJTEwpOw0KCQlHcmlkTGF5b3V0IGxheW91dDEgPSBuZXcgR3JpZExheW91dCgzLHRydWUpOw0KCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dDEpOw0KCQkNCgkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuRklMTCk7DQoJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOw0KDQoJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSkpOw0KCQlncm91cC5zZXRUZXh0KFJFRkVSRU5DRV9GUkFNRVdPUktfU0VMRUNUSU9OKTsgLy8kTk9OLU5MUy0xJAkNCgkJDQoJCUNvbXBvc2l0ZSBtb2RlbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5GSUxMKTsNCgkJbW9kZWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7DQoJCXJlZkxpc3QgPSBuZXcgTGlzdChtb2RlbENvbXBvc2l0ZSwgU1dULkZJTEwgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTHwgU1dULkhfU0NST0xMKTsNCgkJR3JpZERhdGEgcmVmTGlzdEdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSk7DQoJCXJlZkxpc3RHcmlkRGF0YS5oZWlnaHRIaW50ID0gMzAwOw0KCQlyZWZMaXN0LnNldExheW91dERhdGEocmVmTGlzdEdyaWREYXRhKTsNCgkJcmVmTGlzdERpciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KCQlmaW5kUVJlZigpOw0KCQlxcmVmID0gIiI7DQoJCXJlZkxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQoJCSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCgkJCSAgCQlxcmVmID0gcmVmTGlzdERpci5nZXQocmVmTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKS50b1N0cmluZygpOw0KCQkJICAJCUNyZWF0ZUNyaXRpY2FsTW9kZWxGcm9tRmlsZShjcml0aWNhbGl0eVZpZXdlciwgcXJlZik7DQoJCQkgIAkJQ3JlYXRlTW9kZWxGcm9tRmlsZShtb2RlbFZpZXdlciwgcXJlZik7DQoJCQkgIAkJQ3JlYXRlQXBwbGljYWJpbGl0eUxpc3QoYXBsaWNhYmlsaXR5Vmlld2VyLCBxcmVmKTsNCgkJCSAgCQlyZXN1bHRzID0gbW9kZWxWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQoJCQkgIAkJY2hlY2tDb21wbGV0ZSgpOw0KCQkgICAgICB9DQoJCX0pOw0KCQlHcm91cCBncm91cFJlcSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OVUxMIHxTV1QuRklMTCk7DQoJCWdyb3VwUmVxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOw0KCQlncm91cFJlcS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLHRydWUsMiwzKSk7DQoJCWdyb3VwUmVxLnNldFRleHQoQkFTRUxJTkVfU0VMRUNUSU9OKTsgLy8kTk9OLU5MUy0xJA0KCQkNCgkJTGFiZWwgY3JpdGljYWxpdHlMYWJlbCA9IG5ldyBMYWJlbChncm91cFJlcSwgU1dULk5PTkUpOw0KCQlMYWJlbCBhcGxpY2FiaWxpdHlMYWJlbCA9IG5ldyBMYWJlbChncm91cFJlcSwgU1dULk5PTkUpOw0KCQkNCgkJY3JpdGljYWxpdHlMYWJlbC5zZXRUZXh0KENSSVRJQ0FMSVRZX1NFTEVDVElPTik7IA0KCSAgICBjcml0aWNhbGl0eVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoZ3JvdXBSZXEsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQlHcmlkRGF0YSBjcml0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlLDEsMSk7DQoJCWNyaXRHcmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOw0KCSAgICBjcml0aWNhbGl0eVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShjcml0R3JpZERhdGEpOw0KCSAgICBjcml0aWNhbGl0eVZpZXdlci5leHBhbmRBbGwoKTsNCg0KCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyaXRBZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7DQoJCWNyaXRpY2FsaXR5Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoY3JpdEFkYXB0ZXJGYWN0b3J5KSk7DQoJCWNyaXRpY2FsaXR5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihjcml0QWRhcHRlckZhY3RvcnkpKTsNCgkJDQoJCUlDaGVja1N0YXRlTGlzdGVuZXIgY2hlY2tDcml0U3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCl7DQoJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZCAoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCl7DQoJCQkJT2JqZWN0IGNoYW5nZWRFbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOw0KCQkJCWJvb2xlYW4gc3RhdHVzID0gY3JpdGljYWxpdHlWaWV3ZXIuZ2V0Q2hlY2tlZChjaGFuZ2VkRWxlbWVudCk7DQoJCQkJYm9vbGVhbiBpc0V4cGFuZGVkID0gY3JpdGljYWxpdHlWaWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShjaGFuZ2VkRWxlbWVudCk7DQoNCgkJCQljcml0aWNhbGl0eVZpZXdlci5leHBhbmRUb0xldmVsKGNoYW5nZWRFbGVtZW50LCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7DQoJCQkJY3JpdGljYWxpdHlWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hhbmdlZEVsZW1lbnQsIHN0YXR1cyk7DQoJCQkJaWYgKCFpc0V4cGFuZGVkKXsNCgkJCQkJY3JpdGljYWxpdHlWaWV3ZXIuY29sbGFwc2VUb0xldmVsKGNoYW5nZWRFbGVtZW50LCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7DQoJCQkJfQ0KCQkJCWlmIChzdGF0dXMpew0KCQkJCQljcml0aWNhbGl0eVZpZXdlci5zZXRQYXJlbnRzQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCx0cnVlKTsNCgkJCQl9DQovLwkJCQllbHNlew0KLy8JCQkJCWlmIChtb2RlbFZpZXdlci5hbGxCcm90aGVyc1VuQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCkpew0KLy8JCQkJCQltb2RlbFZpZXdlci5zZXRQYXJlbnRzQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCxmYWxzZSk7DQovLwkJCQkJfQ0KLy8JCQkJfQ0KCQkJCXVwZGF0ZU1vZGVsVmlld2VyKGNyaXRpY2FsaXR5Vmlld2VyLGFwbGljYWJpbGl0eVZpZXdlciwgbW9kZWxWaWV3ZXIsIHFyZWYpOw0KCQkJCXJlc3VsdHMgPSBtb2RlbFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCgkJCQljaGVja0NvbXBsZXRlKCk7DQoJCQl9DQoNCgkJfTsNCgkJY3JpdGljYWxpdHlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNoZWNrQ3JpdFN0YXRlTGlzdGVuZXIpOw0KCQkNCi8vCQlMYWJlbCBhcGxpY2FiaWxpdHlMYWJlbCA9IG5ldyBMYWJlbChncm91cFJlcSwgU1dULk5PTkUpOw0KCQlhcGxpY2FiaWxpdHlMYWJlbC5zZXRUZXh0KEFQUExJQ0FCSUxJVFlfU0VMRUNUSU9OKTsgDQoJCWFwbGljYWJpbGl0eVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoZ3JvdXBSZXEsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQlHcmlkRGF0YSBhcHBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLGZhbHNlLDEsMSk7DQoJCWFwcEdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDA7DQoJCWFwbGljYWJpbGl0eVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShhcHBHcmlkRGF0YSk7DQoJCWFwbGljYWJpbGl0eVZpZXdlci5leHBhbmRBbGwoKTsNCg0KCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFwcGxpQWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOw0KCQlhcGxpY2FiaWxpdHlWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhcHBsaUFkYXB0ZXJGYWN0b3J5KSk7DQoJCWFwbGljYWJpbGl0eVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYXBwbGlBZGFwdGVyRmFjdG9yeSkpOw0KCQkNCgkJSUNoZWNrU3RhdGVMaXN0ZW5lciBjaGVja0FwcFN0YXRlTGlzdGVuZXIgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpew0KCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQgKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpew0KCQkJCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsNCgkJCQlib29sZWFuIHN0YXR1cyA9IGFwbGljYWJpbGl0eVZpZXdlci5nZXRDaGVja2VkKGNoYW5nZWRFbGVtZW50KTsNCgkJCQlib29sZWFuIGlzRXhwYW5kZWQgPSBhcGxpY2FiaWxpdHlWaWV3ZXIuZ2V0RXhwYW5kZWRTdGF0ZShjaGFuZ2VkRWxlbWVudCk7DQoNCgkJCQlhcGxpY2FiaWxpdHlWaWV3ZXIuZXhwYW5kVG9MZXZlbChjaGFuZ2VkRWxlbWVudCwgQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOw0KCQkJCWFwbGljYWJpbGl0eVZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCwgc3RhdHVzKTsNCgkJCQlpZiAoIWlzRXhwYW5kZWQpew0KCQkJCQlhcGxpY2FiaWxpdHlWaWV3ZXIuY29sbGFwc2VUb0xldmVsKGNoYW5nZWRFbGVtZW50LCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7DQoJCQkJfQ0KCQkJCWlmIChzdGF0dXMpew0KCQkJCQlhcGxpY2FiaWxpdHlWaWV3ZXIuc2V0UGFyZW50c0NoZWNrZWQoY2hhbmdlZEVsZW1lbnQsdHJ1ZSk7DQoJCQkJfQ0KCQkJCXVwZGF0ZU1vZGVsVmlld2VyKGNyaXRpY2FsaXR5Vmlld2VyLGFwbGljYWJpbGl0eVZpZXdlciwgbW9kZWxWaWV3ZXIsIHFyZWYpOw0KCQkJCXJlc3VsdHMgPSBtb2RlbFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCgkJCQljaGVja0NvbXBsZXRlKCk7DQoJCQl9DQoNCgkJfTsNCgkJYXBsaWNhYmlsaXR5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjaGVja0FwcFN0YXRlTGlzdGVuZXIpOw0KCQkNCi8vCQltb2RlbFZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoZ3JvdXBSZXEsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQltb2RlbFZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoZ3JvdXBSZXEsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQlHcmlkRGF0YSBtb2RlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSwyLDEpOw0KCQltb2RlbEdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7DQoJCW1vZGVsVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG1vZGVsR3JpZERhdGEpOw0KCQltb2RlbFZpZXdlci5leHBhbmRBbGwoKTsNCgkJDQoJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOw0KCQltb2RlbFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQoJCW1vZGVsVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KDQoJCUlDaGVja1N0YXRlTGlzdGVuZXIgY2hlY2tTdGF0ZUxpc3RlbmVyID0gbmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKXsNCgkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkIChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KXsNCgkJCQlPYmplY3QgY2hhbmdlZEVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7DQoJCQkJYm9vbGVhbiBzdGF0dXMgPSBtb2RlbFZpZXdlci5nZXRDaGVja2VkKGNoYW5nZWRFbGVtZW50KTsNCgkJCQlib29sZWFuIGlzRXhwYW5kZWQgPSBtb2RlbFZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGNoYW5nZWRFbGVtZW50KTsNCgkJCQltb2RlbFZpZXdlci5leHBhbmRUb0xldmVsKGNoYW5nZWRFbGVtZW50LCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7DQoJCQkJbW9kZWxWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hhbmdlZEVsZW1lbnQsIHN0YXR1cyk7DQoJCQkJaWYgKCFpc0V4cGFuZGVkKXsNCgkJCQkJbW9kZWxWaWV3ZXIuY29sbGFwc2VUb0xldmVsKGNoYW5nZWRFbGVtZW50LCBBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7DQoJCQkJfQ0KCQkJCWlmIChzdGF0dXMpew0KCQkJCQltb2RlbFZpZXdlci5zZXRQYXJlbnRzQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCx0cnVlKTsNCgkJCQl9DQovLwkJCQllbHNlew0KLy8JCQkJCWlmIChtb2RlbFZpZXdlci5hbGxCcm90aGVyc1VuQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCkpew0KLy8JCQkJCQltb2RlbFZpZXdlci5zZXRQYXJlbnRzQ2hlY2tlZChjaGFuZ2VkRWxlbWVudCxmYWxzZSk7DQovLwkJCQkJfQ0KLy8JCQkJfQ0KCQkJCXJlc3VsdHMgPSBtb2RlbFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCg0KCQkJCWNoZWNrQ29tcGxldGUoKTsNCgkJCX0NCgkJfTsNCgkJbW9kZWxWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKGNoZWNrU3RhdGVMaXN0ZW5lcik7DQoNCgkJQ29tcG9zaXRlIG5hbWVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUgfCBTV1QuRklMTCk7DQoJCUdyaWRMYXlvdXQgbmFtZUdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLGZhbHNlKTsNCgkJbmFtZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmFtZUdyaWRMYXlvdXQpOw0KCQkNCgkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKG5hbWVDb21wb3NpdGUsIFNXVC5OT05FKTsNCgkgICAgbGFiZWwxLnNldFRleHQoTkFNRV9GT1JfQkFTRUxJTkUpOw0KCSAgICBiYXNlbGluZU5hbWUgPSBuZXcgVGV4dChuYW1lQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GSUxMKTsNCgkgICAgR3JpZERhdGEgdGV4dEdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLGZhbHNlLDEsMSk7DQoJICAgIHRleHRHcmlkRGF0YS53aWR0aEhpbnQ9IDMwMDsNCiAgICAgICAgYmFzZWxpbmVOYW1lLnNldExheW91dERhdGEodGV4dEdyaWREYXRhKTsNCgkgICAgYmFzZWxpbmVOYW1lLnNldFRleHQoVEFJTE9SRURfUkVGRlJBTUVXT1JLKTsNCgkgICAgYmFzZWxpbmVOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsNCgkJCQ0KCQkJQE92ZXJyaWRlDQoJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsNCgkJCQlyZXN1bHRzID0gbW9kZWxWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQoJCQkJY2hlY2tDb21wbGV0ZSgpOw0KCQkJfQ0KCQl9KTsNCg0KCSAgICB0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQoJCXJldHVybiBjb21wb3NpdGU7DQoJfQ0KDQoJcHVibGljIFN0cmluZyBnZXRCYXNlbGluZU5hbWUoKSB7DQoJICAgIHJldHVybiBiYXNlbGluZU5hbWUuZ2V0VGV4dCgpOw0KDQoJICB9DQoNCiAgICBwdWJsaWMgdm9pZCBjaGVja0NvbXBsZXRlKCl7DQogICAgCWlmKCF0aGlzLmdldEJhc2VsaW5lTmFtZSgpLmVxdWFscygiIikgJiYgbW9kZWxWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoPjApew0KICAgIAkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQogICAgCX0NCiAgICAJZWxzZSB7DQogICAgCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQogICAgCX0NCiAgICAJICAgIA0KICAgIH0NCiAgICANCiAgICANCglwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQoJCW1vbml0b3Iud29ya2VkKDEpOw0KCQkNCgkJcmV0dXJuIHRydWU7DQoJfQ0KCS8qKg0KCSAqIGZpbmRRUmVmOiBvYnRhaW5zIGZyb20gcHJlZmVyZW5jZXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc3RhbmRhcmRzIG11c3QgYmUuIEl0IHdpbGwgc3RvcmUgaW4gcmVmTGlzdCBhbmQgcmVmTGlzdERpciBhbGwNCgkgKiBmb3VuZGVkIHN0YW5kYXJkcyAobmFtZSBhbmQgcGF0aCByZXNwZWN0aXZlbHkpDQoJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHN0YW5kYXJkcw0KCSAqLw0KCXB1YmxpYyBpbnQgZmluZFFSZWYgKCl7DQoJCWludCBuU3RhbmRhcmRzID0gMDsNCgkJLy8gR2V0cyB0aGUgZGlyZWN0b3J5IGZyb20gcHJlZmVyZW5jZXMgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIGNhbiBnZXQgdGhlIHN0YW5kYXJkcw0KCQkNCgkJLy9TdHJpbmcgc3RyUVJlZkRpciA9IFBsYXRmb3JtVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKE9QRU5DRVJUX1JFRkZSQU1FV09SS19ESVJfS0VZKTsNCgkJDQogICAgICAgIC8vRmlsZSBRUmVmRGlyID0gbmV3IEZpbGUoc3RyUVJlZkRpcik7DQogICAgICAgIC8vIExvb2tzIGludG8gdGhlIGRpcmVjdG9yeSB0byBvYnRhaW4gYWxsIHRoZSBmaWxlcyB3aXRoIC5yZWZmcmFtZXdvcmsgZXh0ZW5zaW9uDQogICAgICAgIC8vaWYgKCFRUmVmRGlyLmlzRGlyZWN0b3J5KCkpIHJldHVybiAwOw0KICAgICAgICBuU3RhbmRhcmRzID0gYWRkRmlsZXNPZkRpcigpOw0KCQlyZXR1cm4gblN0YW5kYXJkczsNCgl9DQoJLyoqDQoJICogYWRkRmlsZXNPZkRpcg0KCSAqIEBwYXJhbSBkaXIgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHN5c3RlbSB3aGVyZSB0byBsb29rIGludG8gKHJlY3Vyc2l2ZWx5KQ0KCSAqIEByZXR1cm4gbnVtYmVyIG9mIHN0YW5kYXJkcyBvYnRhaW5lZA0KCSAqLw0KCXB1YmxpYyBpbnQgYWRkRmlsZXNPZkRpciAoKXsNCgkJaW50IHN1bVN0ZD0wOw0KCQkNCgkJDQoJCUNET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmluaXQoDQoJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRSZXBvc2l0b3J5TmFtZSgpLA0KCQkJCVByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJvdG9jb2woKSwNCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFNlcnZlck5hbWUoKSk7DQoJCUNET1Nlc3Npb24gc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmdldEN1cnJlbnRTZXNzaW9uKCk7DQoJCQ0KCQkJCQkJDQoJCXZpZXdDRE8gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZS5vcGVuVmlldyhzZXNzaW9uQ0RPKTsJCQkJDQoJCUNET1Jlc291cmNlTm9kZVtdIGxpc3RSPSAgdmlld0NETy5nZXRFbGVtZW50cygpOwkJCQ0KCQlmb3IgKGludCBpPTA7IGk8bGlzdFIubGVuZ3RoOyBpKyspew0KCQkJaWYgKGhhc1JlYWRQZXJtaXNzaW9uKGxpc3RSW2ldKSkgew0KCQkJCWlmKGxpc3RSW2ldIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VGb2xkZXIpew0KCQkJCQljaGVja0ZvbGRlckNvbnRlbnRzKChDRE9SZXNvdXJjZUZvbGRlcilsaXN0UltpXSxzdW1TdGQpOw0KCQkJCX0NCgkJCQllbHNlIGlmIChsaXN0UltpXS5nZXROYW1lKCkuZW5kc1dpdGgoUkVGRlJBTUVXT1JLKSl7DQoJCQkJCQlyZWZMaXN0LmFkZChsaXN0UltpXS5nZXRQYXRoKCkpOw0KCQkJCQkJcmVmTGlzdERpci5hZGQobGlzdFJbaV0uZ2V0UGF0aCgpKTsNCgkgICAgICAgIAkJCXN1bVN0ZCsrOw0KCQkJCX0JCQ0KCQkJfQ0KCQl9DQoJCQ0KCQlyZXR1cm4gc3VtU3RkOw0KCX0NCgkNCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVhZFBlcm1pc3Npb24oQ0RPUmVzb3VyY2VOb2RlIG5vZGUpIHsNCgkJLy8gZm9yY2UgdG8gZ2V0IHRoZSBsYXN0IHJldmlzaW9uDQoJCW5vZGUuY2RvUmVsb2FkKCk7DQoJCUNET1Blcm1pc3Npb24gcGVybWlzc2lvbiA9IG5vZGUuY2RvUmV2aXNpb24oKS5nZXRQZXJtaXNzaW9uKCk7DQoJCXJldHVybiBwZXJtaXNzaW9uLmlzUmVhZGFibGUoKTsNCgl9DQoJDQoJcHJpdmF0ZSB2b2lkIGNoZWNrRm9sZGVyQ29udGVudHMoQ0RPUmVzb3VyY2VGb2xkZXIgY2RvUmVzb3VyY2VGb2xkZXIsIGludCBzdW1TdGQpIHsNCgkJaWYgKGhhc1JlYWRQZXJtaXNzaW9uKGNkb1Jlc291cmNlRm9sZGVyKSkgew0KCQkJRUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPiBsaXN0Tj0gIGNkb1Jlc291cmNlRm9sZGVyLmdldE5vZGVzKCk7DQoJCQlmb3IgKGludCBpPTA7IGk8bGlzdE4uc2l6ZSgpOyBpKyspew0KCQkJCWlmKGxpc3ROLmdldChpKSBpbnN0YW5jZW9mIENET1Jlc291cmNlRm9sZGVyKXsNCgkJCQkJY2hlY2tGb2xkZXJDb250ZW50cygoQ0RPUmVzb3VyY2VGb2xkZXIpbGlzdE4uZ2V0KGkpLHN1bVN0ZCk7DQoJCQkJfQ0KCQkJCWVsc2UgaWYgKGxpc3ROLmdldChpKS5nZXROYW1lKCkuZW5kc1dpdGgoUkVGRlJBTUVXT1JLKSl7DQoJCQkJCXJlZkxpc3QuYWRkKGxpc3ROLmdldChpKS5nZXRQYXRoKCkpOw0KCQkJCQlyZWZMaXN0RGlyLmFkZChsaXN0Ti5nZXQoaSkuZ2V0UGF0aCgpKTsNCgkgICAgCQkJc3VtU3RkKys7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCQ0KCX0NCg0KCXB1YmxpYyBTdHJpbmcgZ2V0UVJlZigpIHsNCgkJcmV0dXJuIHFyZWY7DQoJfQ0KCS8qKg0KCSAqIENyZWF0ZU1vZGVsRnJvbUZpbGU6IGxvYWQgdGhlIHJlc291cmNlIG9mIHRoZSBtb2RlbA0KCSAqIEBwYXJhbSB0dmlld2VyIHdpZGdldCBpbiB3aGljaCB0aGUgbW9kZWwgd2lsbCBiZSB2aXN1YWxpemVkDQoJICogQHBhcmFtIG1vZGVsIHN0cmluZyB3aXRoIHRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBtb2RlbCBpbiB0aGUgZmlsZSBzeXN0ZW0NCgkgKi8NCglwdWJsaWMgdm9pZCBDcmVhdGVNb2RlbEZyb21GaWxlKENoZWNrYm94VHJlZVZpZXdlckV4dCB0dmlld2VyLCBTdHJpbmcgbW9kZWwpew0KCQlpZiAobW9kZWwgIT0gbnVsbCkgew0KCQkJLy8gTG9hZCB0aGUgbW9kZWwgZnJvbSB0aGUgZmlsZQ0KCQkJLy9SZXNvdXJjZVNldCBycyA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCgkJCS8vVVJJIG1vZGVsVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkobW9kZWwpOw0KCQkJDQoJCSAgIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsNCgkJCXRyeSB7DQoJCQkJcmVzb3VyY2UgPSB2aWV3Q0RPLmdldFJlc291cmNlKG1vZGVsKTsNCgkJCQl0dmlld2VyLnNldElucHV0KG51bGwpOw0KCQkJCXR2aWV3ZXIuc2V0SW5wdXQocmVzb3VyY2UpOw0KCQkJICAgIGZpbmFsIFZpZXdlckZpbHRlciBtb2RlbEZpbHRlciA9IG5ldyBWaWV3ZXJGaWx0ZXIoKSB7DQoJCQkgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdCgNCgkJCSAgICAgICAgICBWaWV3ZXIgdmlld2VyLA0KCQkJICAgICAgICAgIE9iamVjdCBwYXJlbnRFbGVtZW50LA0KCQkJICAgICAgICAgIE9iamVjdCBlbGVtZW50KSB7DQoJCQkgICAgICAgIAlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlZkZyYW1ld29yaykNCgkJCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsNCgkJCSAgICAgICAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVmQWN0aXZpdHkpDQoJCQkgICAgICAgIAkJcmV0dXJuIHRydWU7DQoJCQkgICAgICAgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVmQXJ0ZWZhY3QpDQoJCQkgICAgICAgIAkJcmV0dXJuIHRydWU7DQoJCQkgICAgICAgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVmUm9sZSkNCgkJCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsNCgkJCSAgICAgICAgCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZSZXF1aXJlbWVudCkNCgkJCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsNCgkJCSAgICAgICAgCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZUZWNobmlxdWUpDQoJCQkgICAgICAgIAkJcmV0dXJuIHRydWU7DQoJCSAgICAgICAgCQllbHNlDQoJCSAgICAgICAgCQkJcmV0dXJuIGZhbHNlOw0KCQkJICAgICAgICB9DQoJCQkgICAgfTsNCgkJCSAgICB0dmlld2VyLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7DQovLwkJCSAgICB0dmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7DQoJCQkgICAgdHZpZXdlci5leHBhbmRBbGwoKTsNCgkJCSAgICB0dmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7DQoJCQkgICAvLyB2aWV3Q0RPLmdldFNlc3Npb24oKS5jbG9zZSgpOw0KCQkJfQ0KCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgdmFsaWQgbW9kZWwgZmlsZSIsICJUaGUgcHJvdmlkZWQgbW9kZWwgZmlsZSBjb3VsZG4ndCBiZSBwYXJzZWQgYXMgYW4gRU1GIHJlc291cmNlIik7DQoJCQkJdHZpZXdlci5zZXRJbnB1dChudWxsKTsNCgkJCX0NCgkJfQ0KCX0NCgkvKioNCgkgKiBDcmVhdGVDcml0aWNhbE1vZGVsRnJvbUZpbGU6IGxvYWQgdGhlIHJlc291cmNlIG9mIHRoZSBtb2RlbA0KCSAqIEBwYXJhbSB0dmlld2VyIHdpZGdldCBpbiB3aGljaCB0aGUgbW9kZWwgd2lsbCBiZSB2aXN1YWxpemVkDQoJICogQHBhcmFtIG1vZGVsIHN0cmluZyB3aXRoIHRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBtb2RlbCBpbiB0aGUgZmlsZSBzeXN0ZW0NCgkgKi8NCglwdWJsaWMgdm9pZCBDcmVhdGVDcml0aWNhbE1vZGVsRnJvbUZpbGUoQ2hlY2tib3hUcmVlVmlld2VyRXh0IHR2aWV3ZXIsIFN0cmluZyBtb2RlbCl7DQoJCWlmIChtb2RlbCAhPSBudWxsKSB7CQ0KCQkgICBSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7DQoJCQl0cnkgew0KCQkJCXJlc291cmNlID0gdmlld0NETy5nZXRSZXNvdXJjZShtb2RlbCk7DQoJCQkJdHZpZXdlci5zZXRJbnB1dChudWxsKTsNCgkJCQl0dmlld2VyLnNldElucHV0KHJlc291cmNlKTsNCgkJCQkNCgkJCSAgICBmaW5hbCBWaWV3ZXJGaWx0ZXIgbW9kZWxGaWx0ZXIgPSBuZXcgVmlld2VyRmlsdGVyKCkgew0KCQkJICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoDQoJCQkgICAgICAgICAgVmlld2VyIHZpZXdlciwNCgkJCSAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwNCgkJCSAgICAgICAgICBPYmplY3QgZWxlbWVudCkgew0KCQkJICAgICAgICAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZGcmFtZXdvcmspDQoJCQkgICAgICAgIAkJcmV0dXJuIHRydWU7DQoJCQkgICAgICAgIAlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlZkNyaXRpY2FsaXR5TGV2ZWwpDQoJCQkgICAgICAgIAkJcmV0dXJuIHRydWU7DQoJCSAgICAgICAgCQllbHNlDQoJCSAgICAgICAgCQkJcmV0dXJuIGZhbHNlOw0KCQkJICAgICAgICB9DQoJCQkgICAgfTsNCgkJCSAgICB0dmlld2VyLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7DQoJCQkgICAgdHZpZXdlci5leHBhbmRBbGwoKTsNCgkJCSAgICB0dmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7DQoJCQl9DQoJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQoJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIk5vdCB2YWxpZCBtb2RlbCBmaWxlIiwgIlRoZSBwcm92aWRlZCBtb2RlbCBmaWxlIGNvdWxkbid0IGJlIHBhcnNlZCBhcyBhbiBFTUYgcmVzb3VyY2UiKTsNCgkJCQl0dmlld2VyLnNldElucHV0KG51bGwpOw0KCQkJfQ0KCQl9DQoJfQ0KCXByaXZhdGUgdm9pZCBDcmVhdGVBcHBsaWNhYmlsaXR5TGlzdCggQ2hlY2tib3hUcmVlVmlld2VyRXh0IHZpZXdlciwgU3RyaW5nIG1vZGVsKSB7DQoJCWlmIChtb2RlbCAhPSBudWxsKSB7CQ0KCQkJICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOw0KCQkJICAgdHJ5IHsNCgkJCQkJcmVzb3VyY2UgPSB2aWV3Q0RPLmdldFJlc291cmNlKG1vZGVsKTsNCgkJCQkJdmlld2VyLnNldElucHV0KG51bGwpOw0KCQkJCQl2aWV3ZXIuc2V0SW5wdXQocmVzb3VyY2UpOw0KCQkJCQkNCgkJCQkgICAgZmluYWwgVmlld2VyRmlsdGVyIG1vZGVsRmlsdGVyID0gbmV3IFZpZXdlckZpbHRlcigpIHsNCgkJCQkgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdCgNCgkJCQkgICAgICAgICAgVmlld2VyIHZpZXdlciwNCgkJCQkgICAgICAgICAgT2JqZWN0IHBhcmVudEVsZW1lbnQsDQoJCQkJICAgICAgICAgIE9iamVjdCBlbGVtZW50KSB7DQoJCQkJICAgICAgICAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZWZGcmFtZXdvcmspDQoJCQkJICAgICAgICAJCXJldHVybiB0cnVlOw0KCQkJCSAgICAgICAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVmQXBwbGljYWJpbGl0eUxldmVsKQ0KCQkJCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsNCgkJCSAgICAgICAgCQllbHNlDQoJCQkgICAgICAgIAkJCXJldHVybiBmYWxzZTsNCgkJCQkgICAgICAgIH0NCgkJCQkgICAgfTsNCgkJCQkgICAgdmlld2VyLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7DQoJCQkJICAgIHZpZXdlci5leHBhbmRBbGwoKTsNCgkJCQkgICAgdmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7DQoJCQkJICAgLy8gdmlld0NETy5nZXRTZXNzaW9uKCkuY2xvc2UoKTsNCgkJCSAgIH1jYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQoJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgdmFsaWQgbW9kZWwgZmlsZSIsICJUaGUgcHJvdmlkZWQgbW9kZWwgZmlsZSBjb3VsZG4ndCBiZSBwYXJzZWQgYXMgYW4gRU1GIHJlc291cmNlIik7DQoJCQkJCXZpZXdlci5zZXRJbnB1dChudWxsKTsNCgkJCQl9DQoJCX0NCgkJDQoJfQ0KCXByaXZhdGUgdm9pZCB1cGRhdGVNb2RlbFZpZXdlcihDaGVja2JveFRyZWVWaWV3ZXJFeHQgY3JpdGljYWxpdHlWaWV3ZXIsIENoZWNrYm94VHJlZVZpZXdlckV4dCBhcGxpY2FiaWxpdHlWaWV3ZXIsIENoZWNrYm94VHJlZVZpZXdlckV4dCB0dmlld2VyLCBTdHJpbmcgcXJlZikgewkNCgkJUmVzb3VyY2UgbW9kZWw9dmlld0NETy5nZXRSZXNvdXJjZShxcmVmKTsNCgkJRU9iamVjdCByZWZlcmVuY2UgPSBtb2RlbC5nZXRDb250ZW50cygpLmdldCgwKTsNCgkJaWYocmVmZXJlbmNlIGluc3RhbmNlb2YgUmVmRnJhbWV3b3JrKXsNCgkJCQlFTGlzdDxSZWZBY3Rpdml0eT4gYWN0aXZpdGllcyA9ICgoUmVmRnJhbWV3b3JrKSByZWZlcmVuY2UpLmdldE93bmVkQWN0aXZpdGllcygpOw0KCQkJCS8vIEVMaXN0PFJlZlJlcXVpcmVtZW50PiByZXF1aXJlbWVudHMgPSAoKFJlZkZyYW1ld29yaykgcmVmZXJlbmNlKS5nZXRPd25lZFJlcXVpcmVtZW50KCk7DQoJCQkJVXBkYXRlQWN0Q3JpdGljYWxpdHkoY3JpdGljYWxpdHlWaWV3ZXIsYXBsaWNhYmlsaXR5Vmlld2VyLCB0dmlld2VyLGFjdGl2aXRpZXMpOw0KCQkJfQ0KCX0NCg0KCXB1YmxpYyB2b2lkIFVwZGF0ZUFjdENyaXRpY2FsaXR5KENoZWNrYm94VHJlZVZpZXdlckV4dCBjcml0aWNhbGl0eVZpZXdlciwgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGFwbGljYWJpbGl0eVZpZXdlciwgQ2hlY2tib3hUcmVlVmlld2VyRXh0IHR2aWV3ZXIsIEVMaXN0PFJlZkFjdGl2aXR5PiBhY3Rpdml0aWVzKXsNCgkJCQ0KCQlJdGVyYXRvcjxSZWZBY3Rpdml0eT4gYWN0SXRlcmF0b3IgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7DQoJCXdoaWxlIChhY3RJdGVyYXRvci5oYXNOZXh0KCkpew0KCQkJUmVmQWN0aXZpdHkgYWN0PWFjdEl0ZXJhdG9yLm5leHQoKTsNCgkJCUVMaXN0PFJlZkFjdGl2aXR5PiBzdWJBY3Rpdml0aWVzID0gYWN0LmdldFN1YkFjdGl2aXR5KCk7DQoJCQkNCgkJCUVMaXN0PFJlZlJlcXVpcmVtZW50PiByZXF1aXJlbWVudHMgPSBhY3QuZ2V0T3duZWRSZXF1aXJlbWVudCgpOw0KCQkJRUxpc3Q8UmVmQXBwbGljYWJpbGl0eT4gYXBwbGljYWJpbGl0aWVzID0gYWN0LmdldEFwcGxpY2FiaWxpdHkoKTsNCgkJCVVwZGF0ZUNyaXRpY2FsaXR5KGNyaXRpY2FsaXR5Vmlld2VyLGFwbGljYWJpbGl0eVZpZXdlciwgdHZpZXdlcixhcHBsaWNhYmlsaXRpZXMsYWN0LG51bGwpOw0KCQkJVXBkYXRlUmVxQ3JpdGljYWxpdHkoY3JpdGljYWxpdHlWaWV3ZXIsYXBsaWNhYmlsaXR5Vmlld2VyLCB0dmlld2VyLHJlcXVpcmVtZW50cyxhY3QpOw0KCQkJDQoJCQlpZihzdWJBY3Rpdml0aWVzLnNpemUoKT4wKXsNCgkJCQlVcGRhdGVBY3RDcml0aWNhbGl0eShjcml0aWNhbGl0eVZpZXdlcixhcGxpY2FiaWxpdHlWaWV3ZXIsIHR2aWV3ZXIsc3ViQWN0aXZpdGllcyk7DQoJCQl9DQoJCX0NCgl9DQoJDQoJcHVibGljIHZvaWQgVXBkYXRlUmVxQ3JpdGljYWxpdHkoQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNyaXRpY2FsaXR5Vmlld2VyLCANCgkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCBhcGxpY2FiaWxpdHlWaWV3ZXIsDQoJCQlDaGVja2JveFRyZWVWaWV3ZXJFeHQgdHZpZXdlciwNCgkJCUVMaXN0PFJlZlJlcXVpcmVtZW50PiByZXF1aXJlbWVudHMsDQoJCQlSZWZBY3Rpdml0eSBhY3Qpew0KCQlJdGVyYXRvcjxSZWZSZXF1aXJlbWVudD4gcmVxSXRlcmF0b3IgPSByZXF1aXJlbWVudHMuaXRlcmF0b3IoKTsNCgkJd2hpbGUocmVxSXRlcmF0b3IuaGFzTmV4dCgpKXsNCgkJCVJlZlJlcXVpcmVtZW50IHJlcSA9IHJlcUl0ZXJhdG9yLm5leHQoKTsNCgkJCUVMaXN0PFJlZlJlcXVpcmVtZW50PiBzdWJSZXEgPSByZXEuZ2V0U3ViUmVxdWlyZW1lbnQoKTsNCgkJCQ0KCQkJRUxpc3Q8UmVmQXBwbGljYWJpbGl0eT4gcmVxQXBwbGljYWJpbGl0aWVzID0gcmVxLmdldEFwcGxpY2FiaWxpdHkoKTsNCgkJCVVwZGF0ZUNyaXRpY2FsaXR5KGNyaXRpY2FsaXR5Vmlld2VyLCBhcGxpY2FiaWxpdHlWaWV3ZXIsIHR2aWV3ZXIscmVxQXBwbGljYWJpbGl0aWVzLGFjdCxyZXEpOw0KCQkJDQoJCQlpZihzdWJSZXEuc2l6ZSgpPjApew0KCQkJCVVwZGF0ZVJlcUNyaXRpY2FsaXR5KGNyaXRpY2FsaXR5Vmlld2VyLGFwbGljYWJpbGl0eVZpZXdlciwgdHZpZXdlcixzdWJSZXEsYWN0KTsNCgkJCX0NCgkJfQ0KCQkNCgkNCgl9DQoJcHVibGljIHZvaWQgVXBkYXRlQ3JpdGljYWxpdHkoQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNyaXRpY2FsaXR5Vmlld2VyLCBDaGVja2JveFRyZWVWaWV3ZXJFeHQgYXBsaWNhYmlsaXR5Vmlld2VyLENoZWNrYm94VHJlZVZpZXdlckV4dCB0dmlld2VyLEVMaXN0PFJlZkFwcGxpY2FiaWxpdHk+IGFwcGxpY2FiaWxpdGllcywgUmVmQWN0aXZpdHkgYWN0LCBSZWZSZXF1aXJlbWVudCByZXEpew0KCQkNCgkJLy9JcyB0aGVyZSBpcyBub3QgYXBwbGljYWJpbGl0aWVzICByZWxhdGVkIHRvIHRoZSBlbGVtZW50LGl0IHdpbGwgYmUgY2hlY2tlZCBpZiBpdCdzIHBhcmVudCByZWZBY3Rpdml0eSBpcyBjaGVja2VkDQoJCWlmKGFwcGxpY2FiaWxpdGllcy5zaXplKCk9PTApewkJDQoJCQlpZihyZXEhPW51bGwpew0KCQkJCXR2aWV3ZXIuc2V0Q2hlY2tlZChyZXEsIHR2aWV3ZXIuZ2V0Q2hlY2tlZChhY3QpKTsNCgkJCX0NCgkJfQ0KCQkNCgkJSXRlcmF0b3I8UmVmQXBwbGljYWJpbGl0eT4gYXBwbEl0ZXJhdG9yID0gYXBwbGljYWJpbGl0aWVzLml0ZXJhdG9yKCk7CQkNCgkJd2hpbGUoYXBwbEl0ZXJhdG9yLmhhc05leHQoKSl7DQoJCQlSZWZBcHBsaWNhYmlsaXR5IGFwcGxpID0gYXBwbEl0ZXJhdG9yLm5leHQoKTsNCgkJCVJlZkFzc3VyYWJsZUVsZW1lbnQgdGFyZ2V0ID0gYXBwbGkuZ2V0QXBwbGljVGFyZ2V0KCk7DQoJCQlpZiAodGFyZ2V0IT1udWxsKSB7CQkJDQoJCQkJdHZpZXdlci5zZXRDaGVja2VkKHRhcmdldCwgZmFsc2UpOw0KCQkJCS8vdHZpZXdlci5zZXRDaGlsZHJlblN0YXR1cyh0YXJnZXQsZmFsc2UpOw0KCQkJCUVMaXN0PFJlZkNyaXRpY2FsaXR5QXBwbGljYWJpbGl0eT4gY3JpdEFwcGxpID0gYXBwbGkuZ2V0QXBwbGljQ3JpdGljKCk7DQoJCQkJSXRlcmF0b3I8UmVmQ3JpdGljYWxpdHlBcHBsaWNhYmlsaXR5PiBjcml0QXBwbGlJdGVyYXRvciA9IGNyaXRBcHBsaS5pdGVyYXRvcigpOw0KCQkJCXdoaWxlKGNyaXRBcHBsaUl0ZXJhdG9yLmhhc05leHQoKSl7DQoJCQkJCVJlZkNyaXRpY2FsaXR5QXBwbGljYWJpbGl0eSBjcml0QXBwID0gY3JpdEFwcGxpSXRlcmF0b3IubmV4dCgpOw0KCQkJCQlSZWZDcml0aWNhbGl0eUxldmVsIGNyaXRpY2FsaXR5TGV2ZWwgPSBjcml0QXBwLmdldENyaXRpY0xldmVsKCk7DQoJCQkJCVJlZkFwcGxpY2FiaWxpdHlMZXZlbCBhcHBsaWNhYmlsaXR5TGV2ZWwgPSBjcml0QXBwLmdldEFwcGxpY0xldmVsKCk7DQoJCQkJCWJvb2xlYW4gc3RhdHVzQ3JpdCA9IGNyaXRpY2FsaXR5Vmlld2VyLmdldENoZWNrZWQoY3JpdGljYWxpdHlMZXZlbCk7DQoJCQkJCWJvb2xlYW4gc3RhdHVzQXBwID0gIGFwbGljYWJpbGl0eVZpZXdlci5nZXRDaGVja2VkKGFwcGxpY2FiaWxpdHlMZXZlbCk7DQoJCQkJCWlmKHN0YXR1c0NyaXQgJiYgc3RhdHVzQXBwICl7DQoJCQkJCQl0dmlld2VyLnNldENoZWNrZWQodGFyZ2V0LCB0cnVlKTsNCgkJCQkJCS8vdHZpZXdlci5zZXRDaGlsZHJlblN0YXR1cyh0YXJnZXQsdHJ1ZSk7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCS8vQUxDDQoJCQkJCS8qaWYodGFyZ2V0IGluc3RhbmNlb2YgUmVmQWN0aXZpdHkpew0KCQkJCQkJRUxpc3Q8UmVmQ3JpdGljYWxpdHlBcHBsaWNhYmlsaXR5PiBjcml0QXBwbGkgPSBhcHBsaS5nZXRBcHBsaWNDcml0aWMoKTsNCgkJCQkJCUl0ZXJhdG9yPFJlZkNyaXRpY2FsaXR5QXBwbGljYWJpbGl0eT4gY3JpdEFwcGxpSXRlcmF0b3IgPSBjcml0QXBwbGkuaXRlcmF0b3IoKTsNCgkJCQkJCUVMaXN0PFJlZkFwcGxpY2FiaWxpdHk+IGFwcGxpY2FiaWxpdGllczIgPSgoUmVmQWN0aXZpdHkpIHRhcmdldCkuZ2V0QXBwbGljYWJpbGl0eSgpOw0KCQkJCQl9DQoJCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFJlZlJlcXVpcmVtZW50KXsqDQoJCQkJCQkNCgkJCQkJfSovDQoJCQkJCQ0KCQkJCX0NCgkJCQkJDQoJCQl9CQ0KCQkJZWxzZSBpZiAoYWN0IT1udWxsKXsNCgkJCQlFTGlzdDxSZWZDcml0aWNhbGl0eUFwcGxpY2FiaWxpdHk+IGNyaXRBcHBsaSA9IGFwcGxpLmdldEFwcGxpY0NyaXRpYygpOw0KCQkJCUl0ZXJhdG9yPFJlZkNyaXRpY2FsaXR5QXBwbGljYWJpbGl0eT4gY3JpdEFwcGxpSXRlcmF0b3IgPSBjcml0QXBwbGkuaXRlcmF0b3IoKTsNCgkJCQl3aGlsZShjcml0QXBwbGlJdGVyYXRvci5oYXNOZXh0KCkpew0KCQkJCQlSZWZDcml0aWNhbGl0eUFwcGxpY2FiaWxpdHkgY3JpdEFwcCA9IGNyaXRBcHBsaUl0ZXJhdG9yLm5leHQoKTsNCgkJCQkJUmVmQ3JpdGljYWxpdHlMZXZlbCBjcml0aWNhbGl0eUxldmVsID0gY3JpdEFwcC5nZXRDcml0aWNMZXZlbCgpOw0KCQkJCQlSZWZBcHBsaWNhYmlsaXR5TGV2ZWwgYXBwbGljYWJpbGl0eUxldmVsID0gY3JpdEFwcC5nZXRBcHBsaWNMZXZlbCgpOw0KCQkJCQlib29sZWFuIHN0YXR1c0NyaXQgPSBjcml0aWNhbGl0eVZpZXdlci5nZXRDaGVja2VkKGNyaXRpY2FsaXR5TGV2ZWwpOw0KCQkJCQlib29sZWFuIHN0YXR1c0FwcCA9ICBhcGxpY2FiaWxpdHlWaWV3ZXIuZ2V0Q2hlY2tlZChhcHBsaWNhYmlsaXR5TGV2ZWwpOw0KCQkJCQlpZihzdGF0dXNDcml0ICYmIHN0YXR1c0FwcCApewkJCQkJCQ0KCQkJCQkJdHZpZXdlci5zZXRDaGVja2VkKGFjdCwgdHJ1ZSk7CQkJCQkJDQoJCQkJCQkvL3R2aWV3ZXIuc2V0Q2hpbGRyZW5TdGF0dXMoYWN0LHRydWUpOw0KCQkJCQkJaWYocmVxIT1udWxsKXsNCgkJCQkJCQl0dmlld2VyLnNldENoZWNrZWQocmVxLCB0cnVlKTsJCQkJCQkNCgkJCQkJCQkvL3R2aWV3ZXIuc2V0Q2hpbGRyZW5TdGF0dXMocmVxLHRydWUpOw0KCQkJCQkJfQ0KCQkJCQkJDQoJCQkJCX0NCgkJCQkJZWxzZXsNCgkJCQkJCXR2aWV3ZXIuc2V0Q2hlY2tlZChhY3QsIGZhbHNlKTsNCgkJCQkJCS8vdHZpZXdlci5zZXRDaGlsZHJlblN0YXR1cyhhY3QsZmFsc2UpOw0KCQkJCQkJDQoJCQkJCQlpZihyZXEhPW51bGwpew0KCQkJCQkJCXR2aWV3ZXIuc2V0Q2hlY2tlZChyZXEsIGZhbHNlKTsJCQkJCQkNCgkJCQkJCS8vCXR2aWV3ZXIuc2V0Q2hpbGRyZW5TdGF0dXMocmVxLGZhbHNlKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJfQ0KDQoJDQoJDQoJcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGVkUmVmUmVxKCl7DQoJCXJldHVybiByZXN1bHRzOw0KCX0NCgkNCglwdWJsaWMgT2JqZWN0W10gZ2V0U2VsZWN0ZWRDcml0TGV2ZWxzKCl7DQoJCXJldHVybiBjcml0aWNhbGl0eVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCgl9DQoJDQoJcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGVkQXBsaUxldmVscygpew0KCQlyZXR1cm4gYXBsaWNhYmlsaXR5Vmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOw0KCX0NCn0NCg==