LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDE2IEZ1bmRhY2nzbiBUZWNuYWxpYSBSZXNlYXJjaCAmIElubm92YXRpb24uCiAqCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBIdWFzY2FyIEVzcGlub3phIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgTWFyaSBDYXJtZW4gUGFsYWNpb3MgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLmFzc3VyYW5jZXByb2plY3QudXRpbHM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLk1hcDsKCmltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLkNET09iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uY29tbW9uLnV0aWwuQ0RPRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udWkudmlld3MuRGF3bkV4cGxvcmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZXJlc291cmNlLkNET1Jlc291cmNlOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5lcmVzb3VyY2UuQ0RPUmVzb3VyY2VGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZU5vZGU7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnNlc3Npb24uQ0RPU2Vzc2lvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udHJhbnNhY3Rpb24uQ0RPVHJhbnNhY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnV0aWwuQ0RPVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udmlldy5DRE9WaWV3OwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZWYucnVudGltZS51aS5ub3RpZnkuT3BlbldpemFyZE9uRG91YmxlQ2xpY2s7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5JU2hlbGxQcm92aWRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJhbmNlYXNzZXRzLmFzc3VyYW5jZWFzc2V0LkFzc3VyYW5jZUFzc2V0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai5hc3N1cmFuY2Vwcm9qZWN0LkFzc2V0c1BhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLmFzc3VyYW5jZXByb2plY3QuQXNzdXJhbmNlUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5CYXNlbGluZUNvbmZpZzsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZUFjdGl2aXR5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VBY3Rpdml0eVJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlQXJ0ZWZhY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZUFydGVmYWN0UmVsOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VBc3N1cmFibGVFbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VDb21wbGlhbmNlTWFwOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VFcXVpdmFsZW5jZU1hcDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlRnJhbWV3b3JrOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VSZXF1aXJlbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlUmVxdWlyZW1lbnRSZWw7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZVJvbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZVRlY2huaXF1ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlbGluZUVsZW1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUuQmFzZWxpbmVGYWN0b3J5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLmJhc2VsaW5lLkJhc2VsaW5lUGFja2FnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS51dGlscy5NYXBwaW5nU2V0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0RGVmaW5pdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdE1vZGVsOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkV2aWRlbmNlRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5FdmlkZW5jZVBhY2thZ2U7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5pbmZyYS5tYXBwaW5ncy5tYXBwaW5nLk1hcEdyb3VwOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEubWFwcGluZ3MubWFwcGluZy5NYXBKdXN0aWZpY2F0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEubWFwcGluZ3MubWFwcGluZy5NYXBLaW5kOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEubWFwcGluZ3MubWFwcGluZy5NYXBNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmluZnJhLm1hcHBpbmdzLm1hcHBpbmcuTWFwcGluZ0ZhY3Rvcnk7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5pbmZyYS5tYXBwaW5ncy5tYXBwaW5nLk1hcHBpbmdQYWNrYWdlOwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuaW5mcmEuc3Zua2l0Lk1haW5DbGFzczsKaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBhbS5wcm9jc3BlYy5wcm9jZXNzLkFjdGl2aXR5OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuUGFydGljaXBhbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5wYW0ucHJvY3NwZWMucHJvY2Vzcy5UZWNobmlxdWU7CmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5wa20ucmVmZnJhbWV3b3JrLnJlZmZyYW1ld29yay5SZWZBc3N1cmFibGVFbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2xhaW07CgoKCnB1YmxpYyBjbGFzcyBDcm9zc0RvbWFpblVJIGV4dGVuZHMgRGlhbG9nIHsKCQoJCgoJcHJvdGVjdGVkIEFycmF5TGlzdDxTdHJpbmc+IHNSZXN1bHQgPSBudWxsOwoJCgoJcHJpdmF0ZSBJRWRpdG9yUGFydCBlZGl0b3I7Cglwcml2YXRlIFVSSSByZXNvdXJjZVVSSTsKCXByaXZhdGUgQ0RPVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBudWxsOwoJcHJpdmF0ZSBDRE9TZXNzaW9uIHNlc3Npb25DRE8gPSBudWxsOwoKCXByaXZhdGUgQ0RPUmVzb3VyY2UgcmVzb3VyY2VGcm9tID0gbnVsbDsgCQkvLyBSZXNvdXJjZSBTb3VyY2UgQXNzdXJhbmNlIHByb2plY3QKCXByaXZhdGUgQ0RPUmVzb3VyY2UgcmVzb3VyY2VUYXJnZXQgPSBudWxsOyAJCS8vIFJlc291cmNlIFRhcmdldCBBc3N1cmFuY2UgcHJvamVjdAoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RGcm9tOwkvL21vZGVsIFNvdXJjZSBBc3N1cmFuY2UgcHJvamVjdAoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RUYXJnZXQ7Ly9tb2RlbCBUcmFnZXQgQXNzdXJhbmNlIHByb2plY3QKCXByaXZhdGUgQ0RPUmVzb3VyY2UgYXJ0ZWZhY3RSZXNvdXJjZSA9IG51bGw7Cglwcml2YXRlIENET1Jlc291cmNlIG1hcFJlc291cmNlID0gbnVsbDsKCQoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJURUZBQ1RNT0RFTF9DTEFTUyA9ICJBcnRlZmFjdE1vZGVsIjsKCXByaXZhdGUgZmluYWwgU3RyaW5nIEFSVEVGQUNUREVGSU5JVElPTl9DTEFTUyA9ICJBcnRlZmFjdERlZmluaXRpb24iOwoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJURUZBQ1RfQ0xBU1MgPSAiQXJ0ZWZhY3QiOwoJCglwcml2YXRlIEV2aWRlbmNlUGFja2FnZSBldmlkZW5jZVBhY2thZ2UgPSBFdmlkZW5jZVBhY2thZ2UuZUlOU1RBTkNFOwoJcHJpdmF0ZSBFdmlkZW5jZUZhY3RvcnkgZXZpZGVuY2VGYWN0b3J5ID0gZXZpZGVuY2VQYWNrYWdlLmdldEV2aWRlbmNlRmFjdG9yeSgpOwoJCglwcml2YXRlIEJhc2VsaW5lUGFja2FnZSBiYXNlbGluZVBhY2thZ2UgPSBCYXNlbGluZVBhY2thZ2UuZUlOU1RBTkNFOwoJcHJpdmF0ZSBCYXNlbGluZUZhY3RvcnkgYmFzZWxpbmVGYWN0b3J5ID0gYmFzZWxpbmVQYWNrYWdlLmdldEJhc2VsaW5lRmFjdG9yeSgpOwoJCglwcml2YXRlIE1hcHBpbmdQYWNrYWdlIG1hcHBpbmdQYWNrYWdlID0gTWFwcGluZ1BhY2thZ2UuZUlOU1RBTkNFOwoJcHJpdmF0ZSBNYXBwaW5nRmFjdG9yeSBtYXBwaW5nRmFjdG9yeT1tYXBwaW5nUGFja2FnZS5nZXRNYXBwaW5nRmFjdG9yeSgpOwoJCglwcml2YXRlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgcmVmTGlzdDsKCQoJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiByZWZMaXN0TWFwOwoJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiByZWZMaXN0RGlyTWFwOwoJcHJpdmF0ZSBDRE9WaWV3IHZpZXdDRE8gPSBudWxsOwoKCglwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZUJhc2VsaW5lVGFyZ2V0OwoJcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVCYXNlbGluZVNvdXJjZTsKCXByaXZhdGUgUmVzb3VyY2VTZXQgYmFzZWxpbmVTb3VyY2VSZXNvdXJjZVNldDsKCXByaXZhdGUgUmVzb3VyY2VTZXQgYmFzZWxpbmVUYXJnZXRSZXNvdXJjZVNldDsKCQoJcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVFdmlkZW5jZVRhcmdldDsKCXByaXZhdGUgUmVzb3VyY2VTZXQgZXZpZGVuY2VTb3VyY2VSZXNvdXJjZVNldDsKCXByaXZhdGUgUmVzb3VyY2VTZXQgZXZpZGVuY2VUYXJnZXRSZXNvdXJjZVNldDsKCXByaXZhdGUgVGV4dCBwcm9qZWN0c291cmNlVGV4dDsKCXByaXZhdGUgTGFiZWwgc291cmNlTGFiZWw7Cglwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlckV4dCBjaGVja3RyZWVFdmlkZW5jZVNvdXJjZTsKCQoJcHJpdmF0ZSBDb21ibyBjYk1hcEdyb3VwOwoJLy9wcml2YXRlIENvbWJvIGNiQ29tcGxpYW5jZU1hcDsKCS8vcHJpdmF0ZSBDb21ibyBjYkZpbHRlckVsZW1lbnRNYXA7Cglwcml2YXRlIFRleHQgdHh0SnVzdGlmaWNhdGlvbjsKCXByaXZhdGUgVGV4dCBpZFRleHQ7Cglwcml2YXRlIFRleHQgbmFtZVRleHQ7CgkKCXByaXZhdGUgQ29tYm8gY2JUeXBlOwoJcHJpdmF0ZSBMYWJlbCB0YXJnZXRMYWJlbDsKCXByaXZhdGUgVGV4dCBwcm9qZWN0dGFyZ2V0VGV4dDsKCQkKCWJvb2xlYW4gYm5ld0VxdWl2YWxlbmNlTWFwID0gZmFsc2U7Cglib29sZWFuIGJFcXVhbE1hcEdyb3VwID0gZmFsc2U7CgkJCglFT2JqZWN0IG9iamVjdDsKCgkvLyBMaXN0IEVxdWl2YWxlbmNlIE1hcCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudCB0cmVlCglFTGlzdDxCYXNlQ29tcGxpYW5jZU1hcD4gbHN0cmVmQ29tcE1hcEZyb207CgoJRUxpc3Q8VHJlZUl0ZW0+IGxpc3RHcmVlbkl0ZW0gPSBuZXcgQmFzaWNFTGlzdDxUcmVlSXRlbT4oKTsKCQoJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CgoJRUxpc3Q8QmFzZUNvbXBsaWFuY2VNYXA+IGxzdENvbXBsaWFuY2VNYXA7CglFTGlzdDxNYXBHcm91cD4gbHN0TWFwR3JvdXA7CglFTGlzdDxBY3Rpdml0eT4gbHN0cmVmQWN0aXZpdHk7CglFTGlzdDxBcnRlZmFjdD4gbHN0cmVmQXJ0ZWZhY3Q7CglFTGlzdDxDbGFpbT4gbHN0cmVmUmVxdWlyZW1lbnQ7CglFTGlzdDxQYXJ0aWNpcGFudD4gbHN0cmVmUm9sZTsKCUVMaXN0PFRlY2huaXF1ZT4gbHN0cmVmVGVjaG5pcXVlOwoKCQoJLy9Tb3VyY2UgQ29tcGxpYW5jZSBNYXAgY29udHJvbHMKCXByb3RlY3RlZCBUZXh0IFNDTWlkVGV4dDsKCXByb3RlY3RlZCBUZXh0IFNDTW5hbWVUZXh0OwoJcHJvdGVjdGVkIENvbWJvIFNDTWNiVHlwZTsKCXByb3RlY3RlZCBUZXh0IFNDTXR4dEp1c3RpZmljYXRpb247CgkKCQoJLy9UYXJnZXQgQ29tcGxpYW5jZSBNYXAgY29udHJvbHMKCXByb3RlY3RlZCBUZXh0IFRDTWlkVGV4dDsKCXByb3RlY3RlZCBUZXh0IFRDTW5hbWVUZXh0OwoJcHJvdGVjdGVkIENvbWJvIFRDTWNiVHlwZTsKCXByb3RlY3RlZCBUZXh0IFRDTXR4dEp1c3RpZmljYXRpb247CgkKCS8vUG9zdGNvbmRpdGlvbnMgY29udHJvbHMKCXByb3RlY3RlZCBUYWJsZVZpZXdlciBsaXN0UG9zdENvbmRpdGlvbnM7Cglwcm90ZWN0ZWQgVGV4dCBQQ2lkVGV4dDsKCXByb3RlY3RlZCBUZXh0IFBDbmFtZVRleHQ7Cglwcm90ZWN0ZWQgVGV4dCBQQ3R4dGRlc2NyaXB0aW9uOwoJCglwcm90ZWN0ZWQgQXNzdXJhbmNlUHJvamVjdCBhc3N1cmFuY2VQcm9qZWN0OwoJCglwcm90ZWN0ZWQgTWFwR3JvdXAgbWFwR3JvdXBBY3RpdmU7Cglwcm90ZWN0ZWQgTWFwR3JvdXAgbWFwR3JvdXA7Cglwcm90ZWN0ZWQgTWFwS2luZCBtYXBLaW5kOwoJcHJvdGVjdGVkIE1hcEp1c3RpZmljYXRpb24gbWFwSnVzdGlmaWNhdGlvbjsKCXByb3RlY3RlZCBNYXBNb2RlbCBtYXBNb2RlbDsKCXByb3RlY3RlZCBCYXNlQ29tcGxpYW5jZU1hcCBiYXNlQ29tcGxpYW5jZU1hcDsgCgoJLy9TdHJpbmcgc0VsZW1lbnRGaWx0ZXI7CgkKCVRleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBudWxsOwkJCgkKCXByaXZhdGUgTWFwR3JvdXAgdGFyZ2V0Q29tcGxpYW5jZUdyb3VwOwoJcHVibGljIENyb3NzRG9tYWluVUkoU2hlbGwgcGFyZW50U2hlbGwpIHsKCQkKCQlzdXBlcihwYXJlbnRTaGVsbCk7CgoJCQoJCWVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKCQkJCS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7CgkJcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7CgoJCUNET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmluaXQoCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByb3RvY29sKCksCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFNlcnZlck5hbWUoKSk7CgkJc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLm9wZW5TZXNzaW9uKCk7CgkJdmlld0NETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLm9wZW5WaWV3KHNlc3Npb25DRE8pOwoJCXRyYW5zYWN0aW9uID0gc2Vzc2lvbkNETy5vcGVuVHJhbnNhY3Rpb24oKTsKCQkKCgkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFIHwgU1dULk1BWCk7CQkKCQkKCX0KCglwdWJsaWMgQ3Jvc3NEb21haW5VSShJU2hlbGxQcm92aWRlciBwYXJlbnRTaGVsbCkgewoJCXN1cGVyKHBhcmVudFNoZWxsKTsKCX0KCglAT3ZlcnJpZGUKCXByb3RlY3RlZCB2b2lkIGNvbnN0cmFpblNoZWxsU2l6ZSgpIHsKCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCgkJc3VwZXIuY29uc3RyYWluU2hlbGxTaXplKCk7CgkJZ2V0U2hlbGwoKS5zZXRNYXhpbWl6ZWQodHJ1ZSk7Cgl9CgkKCUBPdmVycmlkZQoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CgkgICAgc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwoKCSAgICBCdXR0b24gb2sgPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7CgkgICAgb2suc2V0VGV4dCgiUmV1c2UiKTsKCSAgICBzZXRCdXR0b25MYXlvdXREYXRhKG9rKTsKCgkgICAgQnV0dG9uIGNhbmNlbCA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7CgkgICAgY2FuY2VsLnNldFRleHQoIkNsb3NlIik7CgkgICAgc2V0QnV0dG9uTGF5b3V0RGF0YShjYW5jZWwpOwoJIH0KCQoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKCgkJcmVmTGlzdERpck1hcCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwoJCQoJCXJlZkxpc3RNYXA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwoJCgkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAoJCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKCgkJZmluYWwgQ29tcG9zaXRlIGNvbnRlbnRzID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwoKCQlHcmlkTGF5b3V0IGNvbnRlbnRzR3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb250ZW50cy5nZXRMYXlvdXQoKTsKCQljb250ZW50c0dyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7CgoJCUdyaWREYXRhIGNvbnRlbnRzR3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRlbnRzLmdldExheW91dERhdGEoKTsKCQljb250ZW50c0dyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQljb250ZW50c0dyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgoJCS8vIERlZmF1bHQgZmlsdGVyCgkvLwlzRWxlbWVudEZpbHRlciA9ICJBcnRlZmFjdCI7CgoJCQoJCWNyZWF0ZVRhcmdldERpYWxvZ0FyZWEoY29udGVudHMsYWRhcHRlckZhY3RvcnkpOwoJCWNyZWF0ZU1pZGRsZURpYWxvZ0FyZWEoY29udGVudHMsYWRhcHRlckZhY3RvcnkpOwoJCWNyZWF0ZVNvdXJjZURpYWxvZ0FyZWEoY29udGVudHMsIGFkYXB0ZXJGYWN0b3J5KTsKCgkJcmV0dXJuIGNvbnRlbnRzOwoJfQoKCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZURpYWxvZ0FyZWEoZmluYWwgQ29tcG9zaXRlIGNvbnRlbnRzLAoJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CgoJCQoJCWZpbmFsIENvbXBvc2l0ZSBzb3VyY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRlbnRzLCBTV1QuTk9ORSk7CgkJewoJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOwoJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJc291cmNlQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CgoJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwoJCQkKCQkJc291cmNlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwoJCX0KCgkJCgoJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGVTb3VyY2VQcm9qZWN0ID0gbmV3IENvbXBvc2l0ZShzb3VyY2VDb21wb3NpdGUsIFNXVC5OT05FKTsKCQl7CgkJCUdyaWREYXRhIGRhdGFOZXcgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7CgkJCWNvbXBvc2l0ZVNvdXJjZVByb2plY3Quc2V0TGF5b3V0RGF0YShkYXRhTmV3KTsKCgkJCUdyaWRMYXlvdXQgbGF5b3V0TmV3ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJZGF0YU5ldy5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWxheW91dE5ldy5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXROZXcubnVtQ29sdW1ucyA9IDM7CgkJCWNvbXBvc2l0ZVNvdXJjZVByb2plY3Quc2V0TGF5b3V0KGxheW91dE5ldyk7CgkJfQoJCQoJCS8vIExhYmVsCgkJc291cmNlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlU291cmNlUHJvamVjdCwgU1dULk5PTkUpOwoJCXNvdXJjZUxhYmVsLnNldFRleHQoIlNvdXJjZSBQcm9qZWN0OiIpOwoJCUdyaWREYXRhIHNvdXJjZUxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlzb3VyY2VMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlzb3VyY2VMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJc291cmNlTGFiZWwuc2V0TGF5b3V0RGF0YShzb3VyY2VMYWJlbEdyaWREYXRhKTsKCQkvLyBUZXh0CgkJcHJvamVjdHNvdXJjZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuTk9ORSk7CgkJR3JpZERhdGEgbmFtZVRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCW5hbWVUZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSA1MDsKCQluYW1lVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQluYW1lVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJcHJvamVjdHNvdXJjZVRleHQuc2V0TGF5b3V0RGF0YShuYW1lVGV4dEdyaWREYXRhKTsKCQkKCQkvL0J1dHRvbgoJCUJ1dHRvbiBzZWxlY3RTb3VyY2VQcm9qZWN0ID0gbmV3IEJ1dHRvbihjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuTk9ORSk7CgkJc2VsZWN0U291cmNlUHJvamVjdC5zZXRUZXh0KCJTZWFyY2guLi4iKTsKCQlHcmlkRGF0YSBOZXdHcm91cE1hcEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJc2VsZWN0U291cmNlUHJvamVjdC5zZXRMYXlvdXREYXRhKE5ld0dyb3VwTWFwR3JpZERhdGEpOwoKCQlzZWxlY3RTb3VyY2VQcm9qZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CgkJCQkKCQkJCUxpc3RBc3N1cmFuY2VQcm9qZWN0IGxpc3RBc3N1cmFuY2VQcm9qZWN0ID0gbmV3IExpc3RBc3N1cmFuY2VQcm9qZWN0KGNvbXBvc2l0ZVNvdXJjZVByb2plY3QuZ2V0U2hlbGwoKSwgc2Vzc2lvbkNETyk7CgkJCQlpZiAobGlzdEFzc3VyYW5jZVByb2plY3Qub3BlbigpID09IFdpbmRvdy5PSykgewoJCQkJCXNSZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKCQkJCQlzUmVzdWx0LmFkZChsaXN0QXNzdXJhbmNlUHJvamVjdC5nZXRSZXN1bHQoKS5nZXQoMCkpOwoJCQkJCXNSZXN1bHQuYWRkKGxpc3RBc3N1cmFuY2VQcm9qZWN0LmdldFJlc3VsdCgpLmdldCgxKSk7CgkJCQkJCgkJCQkJcHJvamVjdHNvdXJjZVRleHQuc2V0VGV4dChsaXN0QXNzdXJhbmNlUHJvamVjdC5nZXRSZXN1bHQoKS5nZXQoMSkpOwoJCQkJCQoJCQkJCXRyeSB7CQoJCQkJCQlyZXNvdXJjZUZyb20gPSB2aWV3Q0RPLmdldFJlc291cmNlKHNSZXN1bHQuZ2V0KDEpLCB0cnVlKTsKCQkJCQkJYXNzdXJhbmNlUHJvamVjdEZyb20gPSAoQXNzdXJhbmNlUHJvamVjdCkgcmVzb3VyY2VGcm9tLmdldENvbnRlbnRzKCkuZ2V0KDApOwoJCQkJCQkKCQkJCQkJCgkJCQkJCS8vTG9hZCBTb3VyY2UgQmFzZWxpbmVzCgkJCQkJCUVMaXN0PEJhc2VsaW5lQ29uZmlnPiBsc3RCYXNlbGluZUNvbmZpZyA9IGFzc3VyYW5jZVByb2plY3RGcm9tLmdldEJhc2VsaW5lQ29uZmlnKCk7CgkJCQkJCUl0ZXJhdG9yPEJhc2VsaW5lQ29uZmlnPiBiYXNlbGluZUNvbmZpZyA9IGxzdEJhc2VsaW5lQ29uZmlnLml0ZXJhdG9yKCk7CgkJCQkJCQoJCQkJCQliYXNlbGluZVNvdXJjZVJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwoJCQkJCQkKCQkJCQkJYm9vbGVhbiBiRmluZCA9IGZhbHNlOwoJCQkJCQl3aGlsZSAoYmFzZWxpbmVDb25maWcuaGFzTmV4dCgpICYmICFiRmluZCkgewoJCQkJCQkJQmFzZWxpbmVDb25maWcgYmNvbmZpZyA9IGJhc2VsaW5lQ29uZmlnLm5leHQoKTsKCQkJCQkJCWlmIChiY29uZmlnLmlzSXNBY3RpdmUoKSkgewoJCQkJCQkJCWJGaW5kID0gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJCQlFTGlzdDxCYXNlRnJhbWV3b3JrPiBsc3RCYXNlRnJhbWV3b3JrID0gYmNvbmZpZy5nZXRSZWZGcmFtZXdvcmsoKTsJCQkJCQkJCQkJCgkJCQkJCQkJSXRlcmF0b3I8QmFzZUZyYW1ld29yaz4gaXRiYXNlRnJhbWV3b3JrID0gbHN0QmFzZUZyYW1ld29yay5pdGVyYXRvcigpOwoJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJd2hpbGUgKGl0YmFzZUZyYW1ld29yay5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCUJhc2VGcmFtZXdvcmsgYmFzZUZyYW1ld29yayA9IGl0YmFzZUZyYW1ld29yay5uZXh0KCk7CQkJCQkJCQkJCgkJCQkJCQkJCWJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGJhc2VGcmFtZXdvcmsuZVJlc291cmNlKCkpOwoJCQkJCQkJCX0KCQkJCQkJCQkvL3RyZWVCYXNlbGluZVNvdXJjZS5zZXRJbnB1dChiYXNlbGluZVNvdXJjZVJlc291cmNlU2V0KTsKCQkJCQkJCQkKCQkJCQkJCQlDcmVhdGVCYXNlbGluZU1vZGVsRnJvbVJlc291cmNlU2V0KHRyZWVCYXNlbGluZVNvdXJjZSxiYXNlbGluZVNvdXJjZVJlc291cmNlU2V0KTsKCQkJCQkJCQkKCQkJCQkJCQkvL1RvIHNlYXJjaCB0aGUgbm9kZXMgdG8gYmUgbW92ZWQuCgkJCQkJCQkJdHJlZUJhc2VsaW5lU291cmNlLmV4cGFuZEFsbCgpOwoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJCW1vdmVCYXNlUmVxdWlyZW1lbnRzQWJvdmVCYXNlQXJ0ZWZhY3RzKHRyZWVCYXNlbGluZVNvdXJjZSk7CgkJCQkJCQkJLy9UbyBleHBhbmQgdGhlIG1vdmVkIG5vZGVzLgoJCQkJCQkJCS8vdHJlZUJhc2VsaW5lU291cmNlLmV4cGFuZEFsbCgpOwoJCQkJCQkJCQoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvL0xvYWQgdGhlIGV2aWRlbmNlIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IAoJCQkJCQlFTGlzdDxBc3NldHNQYWNrYWdlPiBsc3RBc3NldHNQYWNrYWdlID0gYXNzdXJhbmNlUHJvamVjdEZyb20uZ2V0QXNzZXRzUGFja2FnZSgpOwoJCQkJCQlJdGVyYXRvcjxBc3NldHNQYWNrYWdlPiBhc3NldHNQYWNrYWdlID0gbHN0QXNzZXRzUGFja2FnZS5pdGVyYXRvcigpOwoJCQkJCQkKCQkJCQkJZXZpZGVuY2VTb3VyY2VSZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKCQkJCQkJCQoJCQkJCQkgYkZpbmQgPSBmYWxzZTsKCQkJCQkJd2hpbGUgKGFzc2V0c1BhY2thZ2UuaGFzTmV4dCgpICYmICFiRmluZCkgewoJCQkJCQkJQXNzZXRzUGFja2FnZSBhUGFja2FnZSA9IGFzc2V0c1BhY2thZ2UubmV4dCgpOwoJCQkJCQkJaWYgKGFQYWNrYWdlLmlzSXNBY3RpdmUoKSkgewoJCQkJCQkJCWJGaW5kPSB0cnVlOwoJCQkJCQkJCUVMaXN0PEFydGVmYWN0TW9kZWw+IGxzdEFydGVmYWN0TW9kZWwgPSBhUGFja2FnZS5nZXRBcnRlZmFjdHNNb2RlbCgpOwoJCQkJCQkJCUl0ZXJhdG9yPEFydGVmYWN0TW9kZWw+IGFydGVmYWN0TW9kZWwgPSBsc3RBcnRlZmFjdE1vZGVsLml0ZXJhdG9yKCk7CgkJCQkJCQkJd2hpbGUgKGFydGVmYWN0TW9kZWwuaGFzTmV4dCgpKSB7CgkJCQkJCQkJCUFydGVmYWN0TW9kZWwgYXJ0ZWZhY3QgPSBhcnRlZmFjdE1vZGVsLm5leHQoKTsKCQkJCQkJCQkJYXJ0ZWZhY3RSZXNvdXJjZSA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGFydGVmYWN0KS5jZG9SZXNvdXJjZSgpOwoJCQkJCQkJCQlldmlkZW5jZVNvdXJjZVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChhcnRlZmFjdFJlc291cmNlKTsKCQkJCQkJCQl9CQkJCQkJCQoJCQkJCQkJCUNyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KGNoZWNrdHJlZUV2aWRlbmNlU291cmNlLGV2aWRlbmNlU291cmNlUmVzb3VyY2VTZXQpOwoJCQkJCQkJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmV4cGFuZEFsbCgpOwoJCQkJCQkJfQoJCQkJCQl9CQkJCQkJCgkJCQkJfSBjYXRjaCAoQ0RPRXhjZXB0aW9uIGNkb2UpIHsKCQkJCQkJY2RvZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJCQl9CQoJCQkJfQoJCQl9CgkJfSk7CgkJCgkJCgkJLy9Mb2FkIHRoZSBiYXNlbGluZQoJCUdyaWREYXRhIG1vZGVsVmlld2VyR3JpZERhdGExID0gbmV3IEdyaWREYXRhKCk7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQltb2RlbFZpZXdlckdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEud2lkdGhIaW50ID0gKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMyk7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEuaGVpZ2h0SGludCA9IChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS5oZWlnaHQgLyAzKSAtIDIwOwoJCW1vZGVsVmlld2VyR3JpZERhdGExLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCW1vZGVsVmlld2VyR3JpZERhdGExLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKCQkKCQl0cmVlQmFzZWxpbmVTb3VyY2UgPSBuZXcgVHJlZVZpZXdlcihzb3VyY2VDb21wb3NpdGUsCgkJCQlTV1QuTk9ORSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwoJCQoJCXRyZWVCYXNlbGluZVNvdXJjZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShtb2RlbFZpZXdlckdyaWREYXRhMSk7CgkJdHJlZUJhc2VsaW5lU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCgkJCQlhZGFwdGVyRmFjdG9yeSkpOwoJCXRyZWVCYXNlbGluZVNvdXJjZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCgkJCQlhZGFwdGVyRmFjdG9yeSkpOwoJCXRyZWVCYXNlbGluZVNvdXJjZS5leHBhbmRBbGwoKTsKCQkKCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2tCTCA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwoJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbkJMID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrQkwsIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsKCQl0cmVlQmFzZWxpbmVTb3VyY2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgT3BlbldpemFyZE9uRG91YmxlQ2xpY2soZWRpdGluZ0RvbWFpbkJMLCBhZGFwdGVyRmFjdG9yeSkpOwoJCQoJCS8vU291cmNlIGNvbXBsaWFuY2UgY29udHJvbHMKCQkvL0NvbXBsaWFuY2UgbWFwIGNvbnRyb2xzCgkJR3JvdXAgZ3JvdXBTb3VyY2VDTSA9IG5ldyBHcm91cChzb3VyY2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKCQlncm91cFNvdXJjZUNNLnNldExheW91dChuZXcgR3JpZExheW91dCgxLHRydWUpKTsKCQlncm91cFNvdXJjZUNNLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSwxLDEpKTsKCQlncm91cFNvdXJjZUNNLnNldFRleHQoIlRhcmdldCBDb21wbGlhbmNlIE1hcCIpOwoKCQkKCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbFNDTSA9IG5ldyBDb21wb3NpdGUoZ3JvdXBTb3VyY2VDTSwgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgZGF0YU5ldyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sU0NNLnNldExheW91dERhdGEoZGF0YU5ldyk7CgoJCQlHcmlkTGF5b3V0IGxheW91dE5ldyA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlkYXRhTmV3LnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWxheW91dE5ldy5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXROZXcubnVtQ29sdW1ucyA9IDI7CgkJCWNvbnRyb2xTQ00uc2V0TGF5b3V0KGxheW91dE5ldyk7CgkJfQoJCWZpbmFsIENvbXBvc2l0ZSBjb250cm9sU0NNQ29sMSA9IG5ldyBDb21wb3NpdGUoY29udHJvbFNDTSwgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgU0NNQ29sMSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlTQ01Db2wxLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sU0NNQ29sMS5zZXRMYXlvdXREYXRhKFNDTUNvbDEpOwoJCQkKCQkJR3JpZExheW91dCBsYXlvdXROZXcxID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJU0NNQ29sMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVNDTUNvbDEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3MS5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcxLm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0TmV3MS5udW1Db2x1bW5zID0gMjsKCQkJY29udHJvbFNDTUNvbDEuc2V0TGF5b3V0KGxheW91dE5ldzEpOwoJCQkKCQl9CgkJZmluYWwgQ29tcG9zaXRlIGNvbnRyb2xTQ01Db2wyID0gbmV3IENvbXBvc2l0ZShjb250cm9sU0NNLCBTV1QuTk9ORSk7CgkJewoJCQkKCQkJR3JpZERhdGEgU0NNQ29sMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlTQ01Db2wyLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sU0NNQ29sMi5zZXRMYXlvdXREYXRhKFNDTUNvbDIpOwoJCQkJCQkKCQkJR3JpZExheW91dCBsYXlvdXROZXcyID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJU0NNQ29sMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVNDTUNvbDIudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3Mi5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcyLm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0TmV3Mi5udW1Db2x1bW5zID0gMTsKCQkJY29udHJvbFNDTUNvbDIuc2V0TGF5b3V0KGxheW91dE5ldzIpOwoJCX0KCQkKCQkvKmNiQ29tcGxpYW5jZU1hcCA9IG5ldyBDb21ibyAoY29udHJvbEVxdWl2TWFwLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBjYkNvbXBsaWFuY2VNYXBEYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwLnNldExheW91dERhdGEoY2JDb21wbGlhbmNlTWFwRGF0YSk7Ki8KCQkKCQkKCQkJCQoJCQoJCS8vIExhYmVsCgkJTGFiZWwgU0NNaWRMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sU0NNQ29sMSwgU1dULk5PTkUpOwoJCVNDTWlkTGFiZWwuc2V0VGV4dCgiSUQiKTsKCQlHcmlkRGF0YSBTQ01pZExhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlTQ01pZExhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVNDTWlkTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVNDTWlkTGFiZWwuc2V0TGF5b3V0RGF0YShTQ01pZExhYmVsR3JpZERhdGEpOwoKCQkvLyBUZXh0CgkJU0NNaWRUZXh0ID0gbmV3IFRleHQoY29udHJvbFNDTUNvbDEsIFNXVC5OT05FKTsKCQlHcmlkRGF0YSBTQ01pZFRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVNDTWlkVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlTQ01pZFRleHRHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVNDTWlkVGV4dC5zZXRMYXlvdXREYXRhKFNDTWlkVGV4dEdyaWREYXRhKTsKCQkKCQkKCQkvLyBMYWJlbAoJCUxhYmVsIFNDTW5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sU0NNQ29sMSwgU1dULk5PTkUpOwoJCVNDTW5hbWVMYWJlbC5zZXRUZXh0KCJOYW1lIik7CgkJR3JpZERhdGEgU0NNbmFtZUxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlTQ01uYW1lTGFiZWxHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKCQlTQ01uYW1lTGFiZWxHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAyMDsKCQlTQ01uYW1lTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNbmFtZUxhYmVsR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlTQ01uYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShTQ01uYW1lTGFiZWxHcmlkRGF0YSk7CgoJCS8vIFRleHQKCQlTQ01uYW1lVGV4dCA9IG5ldyBUZXh0KGNvbnRyb2xTQ01Db2wxLCBTV1QuTk9ORSk7CgkJR3JpZERhdGEgU0NNbmFtZVRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVNDTW5hbWVUZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJU0NNbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAzMDsKCQlTQ01uYW1lVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlTQ01uYW1lVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuYW1lVGV4dEdyaWREYXRhKTsKCQkKCQkKCQkvLyBUZXh0CgkJTGFiZWwgU0NNdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xTQ01Db2wxLCBTV1QuTk9ORSk7CgkJU0NNdHlwZUxhYmVsLnNldFRleHQoIlR5cGUiKTsKCQlHcmlkRGF0YSBTQ010eXBlTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVNDTXR5cGVMYWJlbEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCQoJCVNDTXR5cGVMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlTQ010eXBlTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVNDTXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKFNDTXR5cGVMYWJlbEdyaWREYXRhKTsKCQkKCQlTQ01jYlR5cGUgPSBuZXcgQ29tYm8gKGNvbnRyb2xTQ01Db2wxLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBTQ01jYlR5cGVHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVNDTWNiVHlwZUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNY2JUeXBlR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCS8vU0NNY2JUeXBlR3JpZERhdGEud2lkdGhIaW50ID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3OwoJCS8vU0NNY2JUeXBlR3JpZERhdGEuaGVpZ2h0SGludCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLmhlaWdodCAvIDc7CgkJU0NNY2JUeXBlR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJU0NNY2JUeXBlR3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwoJCVNDTWNiVHlwZS5zZXRMYXlvdXREYXRhKFNDTWNiVHlwZUdyaWREYXRhKTsKCQkKCQlFRW51bSBlbnVtTWFwS2luZCA9IE1hcHBpbmdGYWN0b3J5LmVJTlNUQU5DRS5nZXRNYXBwaW5nUGFja2FnZSgpLmdldE1hcEtpbmQoKTsKCQlFTGlzdDxFRW51bUxpdGVyYWw+IG1hcGtpbmRMaXN0PSBlbnVtTWFwS2luZC5nZXRFTGl0ZXJhbHMoKTsKCQkKCQlJdGVyYXRvcjxFRW51bUxpdGVyYWw+IGl0ZXJUbyA9IG1hcGtpbmRMaXN0Lml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJUby5oYXNOZXh0KCkpIHsKCQkJU0NNY2JUeXBlLmFkZChpdGVyVG8ubmV4dCgpLmdldE5hbWUoKSk7CgkJfQoJCVNDTWNiVHlwZS5zZWxlY3QoMCk7CgkJCgkJTGFiZWwgU0NNanVzdGlmaWNhdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xTQ01Db2wyLCBTV1QuTk9ORSk7CgkJU0NNanVzdGlmaWNhdGlvbkxhYmVsLnNldFRleHQoIkp1c3RpZmljYXRpb24iKTsKCQlHcmlkRGF0YSBTQ01qdXN0aWZpY2F0aW9uTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVNDTWp1c3RpZmljYXRpb25MYWJlbEdyaWREYXRhLmhvcml6b250YWxTcGFuPTE7CgkJU0NNanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVNDTWp1c3RpZmljYXRpb25MYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNanVzdGlmaWNhdGlvbkxhYmVsLnNldExheW91dERhdGEoU0NNanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEpOwoJCQoJCVNDTXR4dEp1c3RpZmljYXRpb24gPSBuZXcgVGV4dChjb250cm9sU0NNQ29sMiwgU1dULk1VTFRJKTsKCQlTQ010eHRKdXN0aWZpY2F0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSkpOwoJCS8qR3JpZERhdGEgU0NNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJU0NNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsJCQoJCVNDTXR4dEp1c3RpZmljYXRpb25HcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJU0NNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLndpZHRoSGludCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gNDsKCQlTQ010eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEuaGVpZ2h0SGludCA9IDMzOwoJCVNDTXR4dEp1c3RpZmljYXRpb24uc2V0TGF5b3V0RGF0YShTQ010eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEpOyoqLwoKCQkKCQkKCQkvLyBUcmVlVmlld2VyIGZvciBBcnRlZmFjdCBtb2RlbHMKCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZSA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoc291cmNlQ29tcG9zaXRlLCBTV1QuU0lOR0xFCgkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwoJCQoJCWZpbmFsIEdyaWREYXRhIG1vZGVsVmlld2VyR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQltb2RlbFZpZXdlckdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS53aWR0aEhpbnQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDM7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5oZWlnaHRIaW50ID0gKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLmhlaWdodCAvIDMpIC0gMjA7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgoJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG1vZGVsVmlld2VyR3JpZERhdGEpOwoJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKCQkKCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsKCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBPcGVuV2l6YXJkT25Eb3VibGVDbGljayhlZGl0aW5nRG9tYWluLCBhZGFwdGVyRmFjdG9yeSkpOwoJCQkJCQkKCX0KCgkvL1RvIHB1dCB0aGUgUmVxdWlyZW1lbnQgYWJvdmUgdGhlIGNvcnJlc3BvbmRlbnQgQmFzZUFydGVmYWN0cwoJcHJvdGVjdGVkIHZvaWQgbW92ZUJhc2VSZXF1aXJlbWVudHNBYm92ZUJhc2VBcnRlZmFjdHMoVHJlZVZpZXdlciB0cmVlQmFzZWxpbmUpIHsKCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCgkJVHJlZSBtb2RpZnlUcmVlID10cmVlQmFzZWxpbmUuZ2V0VHJlZSgpOwoJCVRyZWVJdGVtW10gcm9vdE5vZGVzID0gbW9kaWZ5VHJlZS5nZXRJdGVtcygpOwoJCWZvcihUcmVlSXRlbSByb290OnJvb3ROb2Rlcyl7CgkJCWZvcihpbnQgeD0wOyB4IDxyb290LmdldEl0ZW1zKClbMF0uZ2V0SXRlbXMoKS5sZW5ndGg7eCsrKXsKCQkJCVRyZWVJdGVtICBvbmVJdGVtID0gcm9vdC5nZXRJdGVtcygpWzBdLmdldEl0ZW1zKClbeF07CgkJCQlPYmplY3QgZGF0YU9iamVjdCA9IG9uZUl0ZW0uZ2V0RGF0YSgpOwoJCQkJaWYoZGF0YU9iamVjdCBpbnN0YW5jZW9mIEJhc2VBcnRlZmFjdCl7CgkJCQkJLy9CdXNjYXIgc3VzIEJhc2VSZXF1aXJlbWVudGVzIHkgbW92ZXJsb3MKCQkJCQlCYXNlQXJ0ZWZhY3Qgb25lQXJ0ZWZhY3Q9IChCYXNlQXJ0ZWZhY3QpZGF0YU9iamVjdDsKCQkJCQlFTGlzdCA8QmFzZVJlcXVpcmVtZW50Pmxpc3RSZXF1aXJlbWVudCA9IG9uZUFydGVmYWN0LmdldENvbnN0cmFpbmluZ1JlcXVpcmVtZW50KCk7CgkJCQkJZm9yKEJhc2VSZXF1aXJlbWVudCBvblJlcTpsaXN0UmVxdWlyZW1lbnQpewoJCQkJCQlUcmVlSXRlbSBub2RlVG9Nb3ZlPSBzZWFyY2hSZXF1aXJlbWVudChvblJlcSxyb290LmdldEl0ZW1zKClbMF0pOwoJCQkJCQlpZihub2RlVG9Nb3ZlIT1udWxsKXsKCQkJCQkJCS8vb25lSXRlbS5nZXRJdGVtcygpCgkJCQkJCQlUcmVlSXRlbSBuZXdOb2RlID0gbmV3IFRyZWVJdGVtKG9uZUl0ZW0sU1dULk5PTkUsb25lSXRlbS5nZXRJdGVtcygpLmxlbmd0aCk7CgkJCQkJCQluZXdOb2RlLnNldERhdGEobm9kZVRvTW92ZS5nZXREYXRhKCkpOwoJCQkJCQkJbmV3Tm9kZS5zZXRUZXh0KG5vZGVUb01vdmUuZ2V0VGV4dCgpKTsKCQkJCQkJCW5ld05vZGUuc2V0SW1hZ2Uobm9kZVRvTW92ZS5nZXRJbWFnZSgpKTsJCQkJCQkJCgkJCQkJCX0KCQkJCQkJb25lSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCX0KCQl9CgkJCgl9CgkKCXByaXZhdGUgVHJlZUl0ZW0gc2VhcmNoUmVxdWlyZW1lbnQoQmFzZVJlcXVpcmVtZW50IGVxdWl2UmVxdWlyZW1lbnQsIFRyZWVJdGVtIHJvb3QpIHsKCQlmb3IoaW50IHg9MDsgeCA8cm9vdC5nZXRJdGVtcygpLmxlbmd0aDt4KyspewoJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsJCQkKCQkJT2JqZWN0IGRhdGFPYmplY3QgPSBvbmVJdGVtLmdldERhdGEoKTsKCQkJaWYoZGF0YU9iamVjdCBpbnN0YW5jZW9mIEJhc2VSZXF1aXJlbWVudCl7CgkJCQlpZigoKEJhc2VSZXF1aXJlbWVudClkYXRhT2JqZWN0KS5jZG9JRCgpPT1lcXVpdlJlcXVpcmVtZW50LmNkb0lEKCkpewkJCQkJCgkJCQkJcmV0dXJuIG9uZUl0ZW07CgkJCQl9CgkJCX0JCgkJCWlmKG9uZUl0ZW0uZ2V0SXRlbXMoKS5sZW5ndGg+MCl7CgkJCQlUcmVlSXRlbSBmb3VuZD1zZWFyY2hSZXF1aXJlbWVudCggZXF1aXZSZXF1aXJlbWVudCwgIG9uZUl0ZW0pOwoJCQkJaWYgKGZvdW5kIT1udWxsKSByZXR1cm4gZm91bmQ7CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CQkJCQkJCgoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWlkZGxlRGlhbG9nQXJlYShmaW5hbCBDb21wb3NpdGUgY29udGVudHMsCgkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKCQkKCQlDb21wb3NpdGUgY29udHJvbE1hcHBpbmcgPSBuZXcgQ29tcG9zaXRlKGNvbnRlbnRzLCBTV1QuTk9ORSk7CgkJewoJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CgkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7CgkJCWNvbnRyb2xNYXBwaW5nLnNldExheW91dERhdGEoZGF0YSk7CgoJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwoJCQljb250cm9sTWFwcGluZy5zZXRMYXlvdXQobGF5b3V0KTsKCQl9CgoJCUdyb3VwIGdyb3VwRmlsdGVyID0gbmV3IEdyb3VwKGNvbnRyb2xNYXBwaW5nLCBTV1QuTlVMTCk7CgkJZ3JvdXBGaWx0ZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsZmFsc2UpKTsKCQlncm91cEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLHRydWUsMiwxKSk7CgkJZ3JvdXBGaWx0ZXIuc2V0VGV4dCgiRmlsdGVyaW5nIik7CgkJCgkJcmVmTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KGdyb3VwRmlsdGVyLCBTV1QuRklMTCB8IFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMfCBTV1QuSF9TQ1JPTEwpOwoJCXJlZkxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlKSk7CgkJZm9yIChTdHJpbmcgb25lOnJlZkxpc3RNYXApewoJCQlyZWZMaXN0LmFkZChvbmUpOwoJCX0KCQkvL3JlZkxpc3REaXJNYXAgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKCQkKCQlyZWZMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJICAJCUNyZWF0ZU1vZGVsRnJvbUZpbGV0b2NvbWJvKGNiTWFwR3JvdXAsIHJlZkxpc3REaXJNYXAuZ2V0KHJlZkxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSkudG9TdHJpbmcoKSk7CgkJICAgICAgfQoJCX0pOwoJCQoJCQoJCQoJCQoJCUxhYmVsIG1hcExhYmVsID0gbmV3IExhYmVsKGdyb3VwRmlsdGVyLCBTV1QuTk9ORSk7CgkJbWFwTGFiZWwuc2V0VGV4dCgiTWFwIEdyb3VwIik7CgkJR3JpZERhdGEgbWFwTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCW1hcExhYmVsR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJCW1hcExhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCW1hcExhYmVsR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQltYXBMYWJlbC5zZXRMYXlvdXREYXRhKG1hcExhYmVsR3JpZERhdGEpOwoKCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbE1hcHBpbmdOZXcgPSBuZXcgQ29tcG9zaXRlKGdyb3VwRmlsdGVyLCBTV1QuTk9ORSk7CgkJewoJCQlHcmlkRGF0YSBkYXRhTmV3ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7CgkJCWNvbnRyb2xNYXBwaW5nTmV3LnNldExheW91dERhdGEoZGF0YU5ldyk7CgoJCQlHcmlkTGF5b3V0IGxheW91dE5ldyA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlsYXlvdXROZXcubWFyZ2luSGVpZ2h0ID0gMDsKCQkJbGF5b3V0TmV3Lm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0TmV3Lm51bUNvbHVtbnMgPSAxOwoJCQljb250cm9sTWFwcGluZ05ldy5zZXRMYXlvdXQobGF5b3V0TmV3KTsKCQl9CgkJCgkJCgkJY2JNYXBHcm91cCA9IG5ldyBDb21ibyAoY29udHJvbE1hcHBpbmdOZXcsIFNXVC5SRUFEX09OTFkpOwoJCUdyaWREYXRhIGNiTWFwR3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCWNiTWFwR3JvdXBHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiTWFwR3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJY2JNYXBHcm91cEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCWNiTWFwR3JvdXBHcmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JNYXBHcm91cC5zZXRMYXlvdXREYXRhKGNiTWFwR3JvdXBHcmlkRGF0YSk7CgkJCgkJLy8gaWYgd2Ugc2VsZWN0IGEgbWFwIGdyb3VwLCB2ZXJpZnkgc2VsZWN0ZWQgZWxlbWVudCBmcm9tIHNvdXJjZXRyZWUgYW5kIGNidGFyZ2V0CgkJLy8gc2hvdyB0aGUgZXF1aXZhbGVuY2UgZnJvbSB0aGUgZWxlbWVudCBzZWxlY3RlZAoJCQoJCWNiTWFwR3JvdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQoJCQkJCgkJCQkKCQkJCXR4dEp1c3RpZmljYXRpb24uc2V0VGV4dCgiIik7CgkJCQlpZFRleHQuc2V0VGV4dCgiIik7CgkJCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsKCQkJCWNiVHlwZS5zZWxlY3QoLTEpOwkJCgkJCQkvLyBtYXBHcm91cCBzZWxlY3RlZAoJCQkJbWFwR3JvdXAgPSBsc3RNYXBHcm91cC5nZXQoY2JNYXBHcm91cC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKCQkJCQoJCQkJaWYgKENET1V0aWwuZ2V0Q0RPT2JqZWN0KG1hcEdyb3VwKS5jZG9JRCgpLmVxdWFscyhDRE9VdGlsLmdldENET09iamVjdChtYXBHcm91cEFjdGl2ZSkuY2RvSUQoKSkpewoJCQkJCS8vaWYgKG1hcEdyb3VwLmdldE5hbWUoKS5jb250ZW50RXF1YWxzKG1hcEdyb3VwQWN0aXZlLmdldE5hbWUoKSkpIHsKCQkJCX0gZWxzZSB7CgkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlNlbGVjdGVkIE1hcCBHcm91cCIsCgkJCQkJCQkiVGhlIHNlbGV0ZWQgbWFwIGdyb3VwIGlzIG5vdCB0aGUgbWFwIGdyb3VwIG9mIHRoZSBhY3RpdmUgYmFzZSBsaW5lLiIpOwoJCQkJfQoJCQl9CgkJfSk7CgoJCQoJCS8qTGFiZWwgZmlsdGVybWFwTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXBGaWx0ZXIsIFNXVC5OT05FKTsKCQlmaWx0ZXJtYXBMYWJlbC5zZXRUZXh0KCJGaWx0ZXIgTWFwIEVsZW1lbnQiKTsKCQlHcmlkRGF0YSBmaWx0ZXJtYXBMYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJZmlsdGVybWFwTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkJZmlsdGVybWFwTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJZmlsdGVybWFwTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWZpbHRlcm1hcExhYmVsLnNldExheW91dERhdGEoZmlsdGVybWFwTGFiZWxHcmlkRGF0YSk7CgkJCgkJY2JGaWx0ZXJFbGVtZW50TWFwID0gbmV3IENvbWJvIChncm91cEZpbHRlciwgU1dULlJFQURfT05MWSk7CgkJR3JpZERhdGEgY2JGaWx0ZXJFbGVtZW50TWFwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQljYkZpbHRlckVsZW1lbnRNYXBHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiRmlsdGVyRWxlbWVudE1hcEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQljYkZpbHRlckVsZW1lbnRNYXBHcmlkRGF0YS53aWR0aEhpbnQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDc7CgkJY2JGaWx0ZXJFbGVtZW50TWFwR3JpZERhdGEuaGVpZ2h0SGludCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLmhlaWdodCAvIDc7CgkJY2JGaWx0ZXJFbGVtZW50TWFwR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJY2JGaWx0ZXJFbGVtZW50TWFwR3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwoJCWNiRmlsdGVyRWxlbWVudE1hcC5zZXRMYXlvdXREYXRhKGNiRmlsdGVyRWxlbWVudE1hcEdyaWREYXRhKTsKCQkKCQljYkZpbHRlckVsZW1lbnRNYXAuYWRkKCJBY3Rpdml0eSIpOwoJCWNiRmlsdGVyRWxlbWVudE1hcC5hZGQoIkFydGVmYWN0Iik7CgkJY2JGaWx0ZXJFbGVtZW50TWFwLmFkZCgiUmVxdWlyZW1lbnQiKTsKCQljYkZpbHRlckVsZW1lbnRNYXAuYWRkKCJUZWNobmlxdWUiKTsKCQljYkZpbHRlckVsZW1lbnRNYXAuYWRkKCJSb2xlIik7CgkJY2JGaWx0ZXJFbGVtZW50TWFwLnNlbGVjdCgxKTsKCQkKCQkqLwoJCgkJR3JvdXAgZ3JvdXBFcXVNYXAgPSBuZXcgR3JvdXAoY29udHJvbE1hcHBpbmcsIFNXVC5OVUxMKTsKCQlncm91cEVxdU1hcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSx0cnVlKSk7CgkJZ3JvdXBFcXVNYXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULkZJTEwsdHJ1ZSx0cnVlLDEsMSkpOwoJCWdyb3VwRXF1TWFwLnNldFRleHQoIkV4aXN0aW5nIEVxdWl2YWxlbmNlIE1hcCIpOwoKCQkKCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbEVxdWl2TWFwID0gbmV3IENvbXBvc2l0ZShncm91cEVxdU1hcCwgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgZGF0YU5ldyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sRXF1aXZNYXAuc2V0TGF5b3V0RGF0YShkYXRhTmV3KTsKCgkJCUdyaWRMYXlvdXQgbGF5b3V0TmV3ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJZGF0YU5ldy5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWRhdGFOZXcudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3Lm1hcmdpbkhlaWdodCA9IDA7CgkJCWxheW91dE5ldy5tYXJnaW5XaWR0aCA9IDA7CgkJCWxheW91dE5ldy5udW1Db2x1bW5zID0gMjsKCQkJY29udHJvbEVxdWl2TWFwLnNldExheW91dChsYXlvdXROZXcpOwoJCX0KCQkKCQkKCQkvKmNiQ29tcGxpYW5jZU1hcCA9IG5ldyBDb21ibyAoY29udHJvbEVxdWl2TWFwLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBjYkNvbXBsaWFuY2VNYXBEYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwLnNldExheW91dERhdGEoY2JDb21wbGlhbmNlTWFwRGF0YSk7Ki8KCQkKCQkKCQkJCQoJCQoJCS8vIExhYmVsCgkJTGFiZWwgaWRMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sRXF1aXZNYXAsIFNXVC5OT05FKTsKCQlpZExhYmVsLnNldFRleHQoIklEIik7CgkJR3JpZERhdGEgaWRMYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJaWRMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlpZExhYmVsR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlpZExhYmVsLnNldExheW91dERhdGEoaWRMYWJlbEdyaWREYXRhKTsKCgkJLy8gVGV4dAoJCWlkVGV4dCA9IG5ldyBUZXh0KGNvbnRyb2xFcXVpdk1hcCwgU1dULk5PTkUpOwoJCUdyaWREYXRhIGlkVGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJaWRUZXh0R3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWlkVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJaWRUZXh0LnNldExheW91dERhdGEoaWRUZXh0R3JpZERhdGEpOwoJCQoJCQoJCS8vIExhYmVsCgkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xFcXVpdk1hcCwgU1dULk5PTkUpOwoJCW5hbWVMYWJlbC5zZXRUZXh0KCJOYW1lIik7CgkJR3JpZERhdGEgbmFtZUxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQluYW1lTGFiZWxHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKCQluYW1lTGFiZWxHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAyMDsKCQluYW1lTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbmFtZUxhYmVsR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuYW1lTGFiZWxHcmlkRGF0YSk7CgoJCS8vIFRleHQKCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbnRyb2xFcXVpdk1hcCwgU1dULk5PTkUpOwoJCUdyaWREYXRhIG5hbWVUZXh0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQluYW1lVGV4dEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCW5hbWVUZXh0R3JpZERhdGEubWluaW11bVdpZHRoID0gMjA7CgkJbmFtZVRleHRHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbmFtZVRleHRHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCW5hbWVUZXh0LnNldExheW91dERhdGEobmFtZVRleHRHcmlkRGF0YSk7CgkJCgkJCgkJLy8gVGV4dAoJCUxhYmVsIHR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sRXF1aXZNYXAsIFNXVC5OT05FKTsKCQl0eXBlTGFiZWwuc2V0VGV4dCgiVHlwZSIpOwoJCUdyaWREYXRhIHR5cGVMYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJdHlwZUxhYmVsR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJdHlwZUxhYmVsR3JpZERhdGEubWluaW11bVdpZHRoID0gMjA7CgkJdHlwZUxhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCXR5cGVMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJdHlwZUxhYmVsLnNldExheW91dERhdGEodHlwZUxhYmVsR3JpZERhdGEpOwoJCQoJCWNiVHlwZSA9IG5ldyBDb21ibyAoY29udHJvbEVxdWl2TWFwLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBjYlR5cGVHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCWNiVHlwZUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJY2JUeXBlR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiVHlwZUdyaWREYXRhLndpZHRoSGludCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gNzsKCQljYlR5cGVHcmlkRGF0YS5oZWlnaHRIaW50ID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gNzsKCQljYlR5cGVHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKCQljYlR5cGVHcmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JUeXBlLnNldExheW91dERhdGEoY2JUeXBlR3JpZERhdGEpOwoJCQoJCUVFbnVtIGVudW1NYXBLaW5kID0gTWFwcGluZ0ZhY3RvcnkuZUlOU1RBTkNFLmdldE1hcHBpbmdQYWNrYWdlKCkuZ2V0TWFwS2luZCgpOwoJCUVMaXN0PEVFbnVtTGl0ZXJhbD4gbWFwa2luZExpc3Q9IGVudW1NYXBLaW5kLmdldEVMaXRlcmFscygpOwoJCQoJCUl0ZXJhdG9yPEVFbnVtTGl0ZXJhbD4gaXRlclRvID0gbWFwa2luZExpc3QuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlclRvLmhhc05leHQoKSkgewoJCQljYlR5cGUuYWRkKGl0ZXJUby5uZXh0KCkuZ2V0TmFtZSgpKTsKCQl9CgkJY2JUeXBlLnNlbGVjdCgwKTsKCQkKCQlMYWJlbCBqdXN0aWZpY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXBFcXVNYXAsIFNXVC5OT05FKTsKCQlqdXN0aWZpY2F0aW9uTGFiZWwuc2V0VGV4dCgiSnVzdGlmaWNhdGlvbiIpOwoJCUdyaWREYXRhIGp1c3RpZmljYXRpb25MYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWp1c3RpZmljYXRpb25MYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJanVzdGlmaWNhdGlvbkxhYmVsLnNldExheW91dERhdGEoanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEpOwoJCQoJCXR4dEp1c3RpZmljYXRpb24gPSBuZXcgVGV4dChncm91cEVxdU1hcCwgU1dULk1VTFRJKTsKCQlHcmlkRGF0YSB0eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQl0eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJCXR4dEp1c3RpZmljYXRpb25HcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLmhlaWdodEhpbnQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS5oZWlnaHQgLyA5OwoJCXR4dEp1c3RpZmljYXRpb24uc2V0TGF5b3V0RGF0YSh0eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEpOwoJCQoJCQoJCS8vUE9TVENPTkRJVElPTlMgY29udHJvbHMKCQlHcm91cCBncm91cFBvc3RDb25kaXRpb25zID0gbmV3IEdyb3VwKGNvbnRyb2xNYXBwaW5nLCBTV1QuTlVMTCk7CgkJZ3JvdXBQb3N0Q29uZGl0aW9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSx0cnVlKSk7CgkJZ3JvdXBQb3N0Q29uZGl0aW9ucy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLHRydWUsMSwxKSk7CgkJZ3JvdXBQb3N0Q29uZGl0aW9ucy5zZXRUZXh0KCJQb3N0Q29uZGl0aW9ucyIpOwoKCQkKCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbFBvc3RDb25kaXRpb25zID0gbmV3IENvbXBvc2l0ZShncm91cFBvc3RDb25kaXRpb25zLCBTV1QuTk9ORSk7CgkJewoJCQlHcmlkRGF0YSBkYXRhTmV3ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7CgkJCWRhdGFOZXcuaGVpZ2h0SGludD1EaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS5oZWlnaHQgLzMgLTIwOwoJCQljb250cm9sUG9zdENvbmRpdGlvbnMuc2V0TGF5b3V0RGF0YShkYXRhTmV3KTsKCgkJCUdyaWRMYXlvdXQgbGF5b3V0TmV3ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJZGF0YU5ldy5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWRhdGFOZXcudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3Lm1hcmdpbkhlaWdodCA9IDA7CgkJCWxheW91dE5ldy5tYXJnaW5XaWR0aCA9IDA7CgkJCWxheW91dE5ldy5udW1Db2x1bW5zID0gMjsKCQkJY29udHJvbFBvc3RDb25kaXRpb25zLnNldExheW91dChsYXlvdXROZXcpOwoJCX0KCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbFBDQ29sMSA9IG5ldyBDb21wb3NpdGUoY29udHJvbFBvc3RDb25kaXRpb25zLCBTV1QuTk9ORSk7CgkJewoJCQlHcmlkRGF0YSBQQ0NvbDEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKCQkJUENDb2wxLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sUENDb2wxLnNldExheW91dERhdGEoUENDb2wxKTsKCQkJCgkJCUdyaWRMYXlvdXQgbGF5b3V0TmV3MSA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCVBDQ29sMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVBDQ29sMS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlsYXlvdXROZXcxLm1hcmdpbkhlaWdodCA9IDA7CgkJCWxheW91dE5ldzEubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXROZXcxLm51bUNvbHVtbnMgPSAxOwoJCQljb250cm9sUENDb2wxLnNldExheW91dChsYXlvdXROZXcxKTsKCQkJCgkJfQoJCWZpbmFsIENvbXBvc2l0ZSBjb250cm9sUENDb2wyID0gbmV3IENvbXBvc2l0ZShjb250cm9sUG9zdENvbmRpdGlvbnMsIFNXVC5OT05FKTsKCQl7CgkJCQoJCQlHcmlkRGF0YSBQQ0NvbDIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKCQkJUENDb2wyLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sUENDb2wyLnNldExheW91dERhdGEoUENDb2wyKTsKCQkJCQkJCgkJCUdyaWRMYXlvdXQgbGF5b3V0TmV3MiA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCVBDQ29sMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVBDQ29sMi52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlsYXlvdXROZXcyLm1hcmdpbkhlaWdodCA9IDA7CgkJCWxheW91dE5ldzIubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXROZXcyLm51bUNvbHVtbnMgPSAxOwoJCQljb250cm9sUENDb2wyLnNldExheW91dChsYXlvdXROZXcyKTsKCQl9CgkKCQkvKmNiQ29tcGxpYW5jZU1hcCA9IG5ldyBDb21ibyAoY29udHJvbEVxdWl2TWFwLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBjYkNvbXBsaWFuY2VNYXBEYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwLnNldExheW91dERhdGEoY2JDb21wbGlhbmNlTWFwRGF0YSk7Ki8KCQkKCQkvLyBMYWJlbAoJCUxhYmVsIFBDT2JsaWdhdGlvbnNMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sUENDb2wxLCBTV1QuTk9ORSk7CgkJUENPYmxpZ2F0aW9uc0xhYmVsLnNldFRleHQoIk5ldyBPYmxpZ2F0aW9ucyIpOwoJCUdyaWREYXRhIFBDT2JsaWdhdGlvbnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVBDT2JsaWdhdGlvbnNHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7CgkJUENPYmxpZ2F0aW9uc0dyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJUENPYmxpZ2F0aW9uc0xhYmVsLnNldExheW91dERhdGEoUENPYmxpZ2F0aW9uc0dyaWREYXRhKTsKCQlsaXN0UG9zdENvbmRpdGlvbnMgPSBuZXcgVGFibGVWaWV3ZXIoY29udHJvbFBDQ29sMSwgU1dULkZJTEwgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTHwgU1dULkhfU0NST0xMKTsKCgkJbGlzdFBvc3RDb25kaXRpb25zLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCgkJCQlhZGFwdGVyRmFjdG9yeSkpOwoJCWxpc3RQb3N0Q29uZGl0aW9ucy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCgkJCQlhZGFwdGVyRmFjdG9yeSkpOwoJCQoJCWxpc3RQb3N0Q29uZGl0aW9ucy5nZXRUYWJsZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSkpOwoJCQkJCgkJbGlzdFBvc3RDb25kaXRpb25zLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKCQkgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewoJCSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOwoJCSAgICAgICAgRU9iamVjdCBvYmplY3RQb3N0Q29uZGl0aW9uID0gKEVPYmplY3QpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKCQkgICAgICAgIGlmKG9iamVjdFBvc3RDb25kaXRpb24hPW51bGwpewoJCSAgICAgICAgCU9iamVjdCBpZEZlYXR1cmU9IG9iamVjdFBvc3RDb25kaXRpb24uZUdldChvYmplY3RQb3N0Q29uZGl0aW9uLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgiaWQiKSk7CgkJICAgICAgICAJaWYoaWRGZWF0dXJlIT1udWxsKSBQQ2lkVGV4dC5zZXRUZXh0KGlkRmVhdHVyZS50b1N0cmluZygpKTsKCQkgICAgICAgIAlPYmplY3QgbmFtZUZlYXR1cmU9IG9iamVjdFBvc3RDb25kaXRpb24uZUdldChvYmplY3RQb3N0Q29uZGl0aW9uLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgibmFtZSIpKTsKCQkgICAgICAgIAlpZihuYW1lRmVhdHVyZSE9bnVsbCkgUENuYW1lVGV4dC5zZXRUZXh0KG5hbWVGZWF0dXJlLnRvU3RyaW5nKCkpOwoJCSAgICAgICAgCU9iamVjdCBkZXNjRmVhdHVyZT0gb2JqZWN0UG9zdENvbmRpdGlvbi5lR2V0KG9iamVjdFBvc3RDb25kaXRpb24uZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJkZXNjcmlwdGlvbiIpKTsKCQkgICAgICAgIAlpZihkZXNjRmVhdHVyZSE9bnVsbCkgUEN0eHRkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2NGZWF0dXJlLnRvU3RyaW5nKCkpOwoJCSAgICAgICAgfQoJCSAgICAgIH0KCQkgICAgfSk7CgkJIAoJCS8vQnV0dG9uCgkJLypCdXR0b24gT2JsaWdhdGlvbnNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2xQQ0NvbDIsIFNXVC5OT05FKTsKCQlPYmxpZ2F0aW9uc0J1dHRvbi5zZXRUZXh0KCJOZXcuLi4iKTsKCQlHcmlkRGF0YSBOZXdPYmxpZ2F0aW9uc0dyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJTmV3T2JsaWdhdGlvbnNHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5FTkQ7CgkJTmV3T2JsaWdhdGlvbnNHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULk5PTkU7CgkJT2JsaWdhdGlvbnNCdXR0b24uc2V0TGF5b3V0RGF0YShOZXdPYmxpZ2F0aW9uc0dyaWREYXRhKTsqLwoJCQoJCQkJCQoJCS8vIExhYmVsCgkJTGFiZWwgUENpZExhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xQQ0NvbDIsIFNXVC5OT05FKTsKCQlQQ2lkTGFiZWwuc2V0VGV4dCgiSUQiKTsKCQlHcmlkRGF0YSBQQ2lkTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVBDaWRMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlQQ2lkTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVBDaWRMYWJlbC5zZXRMYXlvdXREYXRhKFBDaWRMYWJlbEdyaWREYXRhKTsKCgkJLy8gVGV4dAoJCVBDaWRUZXh0ID0gbmV3IFRleHQoY29udHJvbFBDQ29sMiwgU1dULk5PTkUpOwoJCUdyaWREYXRhIFBDaWRUZXh0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlQQ2lkVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlQQ2lkVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJUENpZFRleHQuc2V0TGF5b3V0RGF0YShQQ2lkVGV4dEdyaWREYXRhKTsKCQkKCQkKCQkvLyBMYWJlbAoJCUxhYmVsIFBDbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xQQ0NvbDIsIFNXVC5OT05FKTsKCQlQQ25hbWVMYWJlbC5zZXRUZXh0KCJOYW1lIik7CgkJR3JpZERhdGEgUENuYW1lTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVBDbmFtZUxhYmVsR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJUENuYW1lTGFiZWxHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAyMDsKCQlQQ25hbWVMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlQQ25hbWVMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJUENuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShQQ25hbWVMYWJlbEdyaWREYXRhKTsKCgkJLy8gVGV4dAoJCVBDbmFtZVRleHQgPSBuZXcgVGV4dChjb250cm9sUENDb2wyLCBTV1QuTk9ORSk7CgkJR3JpZERhdGEgUENuYW1lVGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJUENuYW1lVGV4dEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCVBDbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAzMDsKCQlQQ25hbWVUZXh0R3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVBDbmFtZVRleHRHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVBDbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuYW1lVGV4dEdyaWREYXRhKTsKCQkJCQkJCQoJCQoJCUxhYmVsIFBDZGVzY3JpcHRpb25MYWJlbCA9IG5ldyBMYWJlbChjb250cm9sUENDb2wyLCBTV1QuTk9ORSk7CgkJUENkZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoIkRlc2NyaXB0aW9uIik7CgkJR3JpZERhdGEgUENkZXNjcmlwdGlvbkxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlQQ2Rlc2NyaXB0aW9uTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsU3Bhbj0xOwoJCVBDZGVzY3JpcHRpb25MYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlQQ2Rlc2NyaXB0aW9uTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVBDZGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKFBDZGVzY3JpcHRpb25MYWJlbEdyaWREYXRhKTsKCQkKCQlQQ3R4dGRlc2NyaXB0aW9uID0gbmV3IFRleHQoY29udHJvbFBDQ29sMiwgU1dULk1VTFRJKTsKCQlQQ3R4dGRlc2NyaXB0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSkpOwoJCS8qR3JpZERhdGEgUEN0eHRkZXNjcmlwdGlvbkdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJUEN0eHRkZXNjcmlwdGlvbkdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsJCQoJCVBDdHh0ZGVzY3JpcHRpb25HcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJUEN0eHRkZXNjcmlwdGlvbkdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJLy9QQ3R4dGRlc2NyaXB0aW9uR3JpZERhdGEud2lkdGhIaW50ID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA0OwoJCVBDdHh0ZGVzY3JpcHRpb25HcmlkRGF0YS5oZWlnaHRIaW50ID0gMzM7CgkJUEN0eHRkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKFBDdHh0ZGVzY3JpcHRpb25HcmlkRGF0YSk7Ki8KCX0KCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYXJnZXREaWFsb2dBcmVhKGZpbmFsIENvbXBvc2l0ZSBjb250ZW50cywKCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewoKCQlDb21wb3NpdGUgdGFyZ2V0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb250ZW50cywgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQl0YXJnZXRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKCgkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkJCXRhcmdldENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKCQl9CgoJCQoJCQoJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGVUYXJnZXRQcm9qZWN0ID0gbmV3IENvbXBvc2l0ZSh0YXJnZXRDb21wb3NpdGUsIFNXVC5OT05FKTsKCQl7CgkJCUdyaWREYXRhIGRhdGFOZXcgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKCQkJZGF0YU5ldy5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkVORDsKCQkJY29tcG9zaXRlVGFyZ2V0UHJvamVjdC5zZXRMYXlvdXREYXRhKGRhdGFOZXcpOwoKCQkJR3JpZExheW91dCBsYXlvdXROZXcgPSBuZXcgR3JpZExheW91dCgpOwoJCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3Lm1hcmdpbkhlaWdodCA9IDA7CgkJCWxheW91dE5ldy5tYXJnaW5XaWR0aCA9IDA7CgkJCWxheW91dE5ldy5udW1Db2x1bW5zID0gMjsKCQkJY29tcG9zaXRlVGFyZ2V0UHJvamVjdC5zZXRMYXlvdXQobGF5b3V0TmV3KTsKCQl9CgkJCgkKCQkvLyBMYWJlbAoJCXRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZVRhcmdldFByb2plY3QsIFNXVC5OT05FKTsKCQl0YXJnZXRMYWJlbC5zZXRUZXh0KCJUYXJnZXQgUHJvamVjdDoiKTsKCQlHcmlkRGF0YSB0YXJnZXRMYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CQkKCQl0YXJnZXRMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQl0YXJnZXRMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJdGFyZ2V0TGFiZWwuc2V0TGF5b3V0RGF0YSh0YXJnZXRMYWJlbEdyaWREYXRhKTsKCQkvLyBUZXh0CgkJcHJvamVjdHRhcmdldFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGVUYXJnZXRQcm9qZWN0LCBTV1QuTk9ORSk7CgkJCgkJR3JpZERhdGEgbmFtZVRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCW5hbWVUZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSA1MDsKCQluYW1lVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQluYW1lVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJcHJvamVjdHRhcmdldFRleHQuc2V0TGF5b3V0RGF0YShuYW1lVGV4dEdyaWREYXRhKTsKCQkvL3Byb2plY3R0YXJnZXRUZXh0LnNldFRleHQocmVzb3VyY2VVUkkudG9TdHJpbmcoKSk7CgkJCgkJCQkKCQlTdHJpbmcgcGF0aCA9ICIiOwoJCWZvciAoaW50IGkgPSAwOyBpPCByZXNvdXJjZVVSSS5zZWdtZW50Q291bnQoKTsgaSsrICkgewoJCQlwYXRoID0gcGF0aCArIHJlc291cmNlVVJJLnNlZ21lbnQoaSkgKyAiLyI7CgkJfQoJCQoJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLHBhdGgubGVuZ3RoKCktMSk7CgkJcHJvamVjdHRhcmdldFRleHQuc2V0VGV4dChwYXRoKTsKCQkKCQlwcm9qZWN0dGFyZ2V0VGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CgkJCgkJCgkJLyogSVJSIG1vZGVsIHRyZWUKCQlJUlI6IENyZWF0ZSBldmlkZW5jZSBtb2RlbCBhdCB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzICovCgkJdHJ5IHsKCQkJLy9BbG1hY2VuYXIgbWFwZ3JvdXAgZGVsIHRhcmdldCBwcm9qZWN0CgkJCVN0cmluZyBtYXBwaW5nUGF0aCA9IHBhdGgucmVwbGFjZSgiYXNzdXJhbmNlcHJvamVjdCIsICJtYXBwaW5nIik7CgkJCUNET1Jlc291cmNlIHRhcmdldE1hcHBpbmdNb2RlbD0gdHJhbnNhY3Rpb24uZ2V0UmVzb3VyY2UobWFwcGluZ1BhdGgpOwoJCQlNYXBNb2RlbCBtbT0oTWFwTW9kZWwpIHRhcmdldE1hcHBpbmdNb2RlbC5nZXRDb250ZW50cygpLmdldCgwKTsKCQkJCgkJCWlmKG1tLmdldE1hcEdyb3VwTW9kZWwoKS5zaXplKCk+MCl7CgkJCQl0YXJnZXRDb21wbGlhbmNlR3JvdXA9IG1tLmdldE1hcEdyb3VwTW9kZWwoKS5nZXQoMCk7CgkJCX0KCQkJCgkJCQoJCQlyZXNvdXJjZVRhcmdldCA9IHRyYW5zYWN0aW9uLmdldFJlc291cmNlKHBhdGgpOwoJCQlhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0ID0gKEFzc3VyYW5jZVByb2plY3QpIHJlc291cmNlVGFyZ2V0LmdldENvbnRlbnRzKCkuZ2V0KDApOwoJCQlDRE9SZXNvdXJjZUZvbGRlciBldmlkZW5jZUZvbGRlciA9IHRyYW5zYWN0aW9uLmdldFJlc291cmNlRm9sZGVyKHJlc291cmNlVVJJLnNlZ21lbnQoMCkgKyAiL0VWSURFTkNFIik7CgkJCUNyZWF0ZU1vZGVsRXZpZGVuY2VGcm9tQmFzZUxpbmUoYXNzdXJhbmNlUHJvamVjdFRhcmdldCxldmlkZW5jZUZvbGRlciApOwoJCQkKCQl9IGNhdGNoIChDRE9FeGNlcHRpb24gZSkgewoKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQl9CgkJCgkJCgkJCgkJLy9CdXR0b24KCQkvKkJ1dHRvbiBzZWxlY3RTb3VyY2VQcm9qZWN0ID0gbmV3IEJ1dHRvbihjb21wb3NpdGVUYXJnZXRQcm9qZWN0LCBTV1QuTk9ORSk7CgkJc2VsZWN0U291cmNlUHJvamVjdC5zZXRUZXh0KCJTZWFyY2guLi4iKTsKCQlHcmlkRGF0YSBOZXdHcm91cE1hcEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJc2VsZWN0U291cmNlUHJvamVjdC5zZXRMYXlvdXREYXRhKE5ld0dyb3VwTWFwR3JpZERhdGEpOyovCgkJCgkJCgkJLy9Mb2FkIHRoZSBiYXNlbGluZQoJCUdyaWREYXRhIG1vZGVsVmlld2VyR3JpZERhdGExID0gbmV3IEdyaWREYXRhKCk7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQltb2RlbFZpZXdlckdyaWREYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEud2lkdGhIaW50ID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAzOwoJCW1vZGVsVmlld2VyR3JpZERhdGExLmhlaWdodEhpbnQgPSAoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gMyktMjA7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwoJCQoJCXRyZWVCYXNlbGluZVRhcmdldCA9IG5ldyBUcmVlVmlld2VyKHRhcmdldENvbXBvc2l0ZSwKCQkJCVNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKCQkKCQl0cmVlQmFzZWxpbmVUYXJnZXQuZ2V0VHJlZSgpLnNldExheW91dERhdGEobW9kZWxWaWV3ZXJHcmlkRGF0YTEpOwoJCXRyZWVCYXNlbGluZVRhcmdldC5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAoJCQkJYWRhcHRlckZhY3RvcnkpKTsKCQl0cmVlQmFzZWxpbmVUYXJnZXQuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAoJCQkJYWRhcHRlckZhY3RvcnkpKTsKCgkJLy90cmVlQmFzZWxpbmVUYXJnZXQuc2V0SW5wdXQoYmFzZWxpbmVUYXJnZXRSZXNvdXJjZVNldCk7CgkJQ3JlYXRlQmFzZWxpbmVNb2RlbEZyb21SZXNvdXJjZVNldCh0cmVlQmFzZWxpbmVUYXJnZXQsYmFzZWxpbmVUYXJnZXRSZXNvdXJjZVNldCk7CgkJCgkJCgkJCgkJLy9UbyBzZWFyY2ggdGhlIG5vZGVzIHRvIGJlIG1vdmVkLgoJCXRyZWVCYXNlbGluZVRhcmdldC5leHBhbmRBbGwoKTsKCgkJbW92ZUJhc2VSZXF1aXJlbWVudHNBYm92ZUJhc2VBcnRlZmFjdHModHJlZUJhc2VsaW5lVGFyZ2V0KTsKCQkvL1RvIGV4cGFuZCB0aGUgbW92ZWQgbm9kZXMuCgkJLy90cmVlQmFzZWxpbmVUYXJnZXQuZXhwYW5kQWxsKCk7CgkJCgkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrQkwgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW5CTCA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFja0JMLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CgkJdHJlZUJhc2VsaW5lVGFyZ2V0LmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IE9wZW5XaXphcmRPbkRvdWJsZUNsaWNrKGVkaXRpbmdEb21haW5CTCwgYWRhcHRlckZhY3RvcnkpKTsKCQkKCQkKCQkvL0NvbXBsaWFuY2UgbWFwIGNvbnRyb2xzCgkJR3JvdXAgZ3JvdXBUYXJnZXRDTSA9IG5ldyBHcm91cCh0YXJnZXRDb21wb3NpdGUsIFNXVC5OVUxMKTsKCQlncm91cFRhcmdldENNLnNldExheW91dChuZXcgR3JpZExheW91dCgxLHRydWUpKTsKCQlncm91cFRhcmdldENNLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLFNXVC5GSUxMLHRydWUsdHJ1ZSwxLDEpKTsKCQlncm91cFRhcmdldENNLnNldFRleHQoIlRhcmdldCBDb21wbGlhbmNlIE1hcCIpOwoKCQkKCQlmaW5hbCBDb21wb3NpdGUgY29udHJvbFRDTSA9IG5ldyBDb21wb3NpdGUoZ3JvdXBUYXJnZXRDTSwgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgZGF0YU5ldyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sVENNLnNldExheW91dERhdGEoZGF0YU5ldyk7CgoJCQlHcmlkTGF5b3V0IGxheW91dE5ldyA9IG5ldyBHcmlkTGF5b3V0KCk7CgkJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCQlkYXRhTmV3LnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCWxheW91dE5ldy5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcubWFyZ2luV2lkdGggPSAwOwoJCQlsYXlvdXROZXcubnVtQ29sdW1ucyA9IDI7CgkJCWNvbnRyb2xUQ00uc2V0TGF5b3V0KGxheW91dE5ldyk7CgkJfQoJCWZpbmFsIENvbXBvc2l0ZSBjb250cm9sVENNQ29sMSA9IG5ldyBDb21wb3NpdGUoY29udHJvbFRDTSwgU1dULk5PTkUpOwoJCXsKCQkJR3JpZERhdGEgVENNQ29sMSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlUQ01Db2wxLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sVENNQ29sMS5zZXRMYXlvdXREYXRhKFRDTUNvbDEpOwoJCQkKCQkJR3JpZExheW91dCBsYXlvdXROZXcxID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJVENNQ29sMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVRDTUNvbDEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3MS5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcxLm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0TmV3MS5udW1Db2x1bW5zID0gMjsKCQkJY29udHJvbFRDTUNvbDEuc2V0TGF5b3V0KGxheW91dE5ldzEpOwoJCQkKCQl9CgkJZmluYWwgQ29tcG9zaXRlIGNvbnRyb2xUQ01Db2wyID0gbmV3IENvbXBvc2l0ZShjb250cm9sVENNLCBTV1QuTk9ORSk7CgkJewoJCQkKCQkJR3JpZERhdGEgVENNQ29sMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwoJCQlUQ01Db2wyLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwoJCQljb250cm9sVENNQ29sMi5zZXRMYXlvdXREYXRhKFRDTUNvbDIpOwoJCQkJCQkKCQkJR3JpZExheW91dCBsYXlvdXROZXcyID0gbmV3IEdyaWRMYXlvdXQoKTsKCQkJVENNQ29sMi5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJCVRDTUNvbDIudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkJbGF5b3V0TmV3Mi5tYXJnaW5IZWlnaHQgPSAwOwoJCQlsYXlvdXROZXcyLm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0TmV3Mi5udW1Db2x1bW5zID0gMjsKCQkJY29udHJvbFRDTUNvbDIuc2V0TGF5b3V0KGxheW91dE5ldzIpOwoJCX0KCQkKCQkvKmNiQ29tcGxpYW5jZU1hcCA9IG5ldyBDb21ibyAoY29udHJvbEVxdWl2TWFwLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBjYkNvbXBsaWFuY2VNYXBEYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCWNiQ29tcGxpYW5jZU1hcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CgkJY2JDb21wbGlhbmNlTWFwLnNldExheW91dERhdGEoY2JDb21wbGlhbmNlTWFwRGF0YSk7Ki8KCQkKCQkKCQkJCQoJCQoJCS8vIExhYmVsCgkJTGFiZWwgVENNaWRMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sVENNQ29sMSwgU1dULk5PTkUpOwoJCVRDTWlkTGFiZWwuc2V0VGV4dCgiSUQiKTsKCQlHcmlkRGF0YSBUQ01pZExhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlUQ01pZExhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVRDTWlkTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVRDTWlkTGFiZWwuc2V0TGF5b3V0RGF0YShUQ01pZExhYmVsR3JpZERhdGEpOwoKCQkvLyBUZXh0CgkJVENNaWRUZXh0ID0gbmV3IFRleHQoY29udHJvbFRDTUNvbDEsIFNXVC5OT05FKTsKCQlHcmlkRGF0YSBUQ01pZFRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVRDTWlkVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlUQ01pZFRleHRHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVRDTWlkVGV4dC5zZXRMYXlvdXREYXRhKFRDTWlkVGV4dEdyaWREYXRhKTsKCQkKCQkKCQkvLyBMYWJlbAoJCUxhYmVsIFRDTW5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb250cm9sVENNQ29sMSwgU1dULk5PTkUpOwoJCVRDTW5hbWVMYWJlbC5zZXRUZXh0KCJOYW1lIik7CgkJR3JpZERhdGEgVENNbmFtZUxhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlUQ01uYW1lTGFiZWxHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKCQlUQ01uYW1lTGFiZWxHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAyMDsKCQlUQ01uYW1lTGFiZWxHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJVENNbmFtZUxhYmVsR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlUQ01uYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShUQ01uYW1lTGFiZWxHcmlkRGF0YSk7CgoJCS8vIFRleHQKCQlUQ01uYW1lVGV4dCA9IG5ldyBUZXh0KGNvbnRyb2xUQ01Db2wxLCBTV1QuTk9ORSk7CgkJR3JpZERhdGEgVENNbmFtZVRleHRHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVRDTW5hbWVUZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJVENNbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSAzMDsKCQlUQ01uYW1lVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlUQ01uYW1lVGV4dEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJVENNbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuYW1lVGV4dEdyaWREYXRhKTsKCQkKCQkKCQkvLyBUZXh0CgkJTGFiZWwgVENNdHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xUQ01Db2wxLCBTV1QuTk9ORSk7CgkJVENNdHlwZUxhYmVsLnNldFRleHQoIlR5cGUiKTsKCQlHcmlkRGF0YSBUQ010eXBlTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVRDTXR5cGVMYWJlbEdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCQoJCVRDTXR5cGVMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlUQ010eXBlTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVRDTXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKFRDTXR5cGVMYWJlbEdyaWREYXRhKTsKCQkKCQlUQ01jYlR5cGUgPSBuZXcgQ29tYm8gKGNvbnRyb2xUQ01Db2wxLCBTV1QuUkVBRF9PTkxZKTsKCQlHcmlkRGF0YSBUQ01jYlR5cGVHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCVRDTWNiVHlwZUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJVENNY2JUeXBlR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCS8vVENNY2JUeXBlR3JpZERhdGEud2lkdGhIaW50ID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3OwoJCS8vVENNY2JUeXBlR3JpZERhdGEuaGVpZ2h0SGludCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLmhlaWdodCAvIDc7CgkJVENNY2JUeXBlR3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CgkJVENNY2JUeXBlR3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwoJCVRDTWNiVHlwZS5zZXRMYXlvdXREYXRhKFRDTWNiVHlwZUdyaWREYXRhKTsKCQkKCQlFRW51bSBlbnVtTWFwS2luZCA9IE1hcHBpbmdGYWN0b3J5LmVJTlNUQU5DRS5nZXRNYXBwaW5nUGFja2FnZSgpLmdldE1hcEtpbmQoKTsKCQlFTGlzdDxFRW51bUxpdGVyYWw+IG1hcGtpbmRMaXN0PSBlbnVtTWFwS2luZC5nZXRFTGl0ZXJhbHMoKTsKCQkKCQlJdGVyYXRvcjxFRW51bUxpdGVyYWw+IGl0ZXJUbyA9IG1hcGtpbmRMaXN0Lml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJUby5oYXNOZXh0KCkpIHsKCQkJVENNY2JUeXBlLmFkZChpdGVyVG8ubmV4dCgpLmdldE5hbWUoKSk7CgkJfQoJCVRDTWNiVHlwZS5zZWxlY3QoMCk7CQkJCQkJCgkJCgkJTGFiZWwgVENNanVzdGlmaWNhdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbnRyb2xUQ01Db2wyLCBTV1QuTk9ORSk7CgkJVENNanVzdGlmaWNhdGlvbkxhYmVsLnNldFRleHQoIkp1c3RpZmljYXRpb24iKTsKCQlHcmlkRGF0YSBUQ01qdXN0aWZpY2F0aW9uTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwkJCgkJVENNanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCVRDTWp1c3RpZmljYXRpb25MYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7CgkJVENNanVzdGlmaWNhdGlvbkxhYmVsLnNldExheW91dERhdGEoVENNanVzdGlmaWNhdGlvbkxhYmVsR3JpZERhdGEpOwoJCQoJCS8vQnV0dG9uCgkJQnV0dG9uIG5ld0NNQnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sVENNQ29sMiwgU1dULk5PTkUpOwoJCW5ld0NNQnV0dG9uLnNldFRleHQoIk5ldyBDTSIpOwoJCUdyaWREYXRhIG5ld0NNR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQluZXdDTUdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkVORDsKCQluZXdDTUdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPVNXVC5FTkQ7CgkJbmV3Q01CdXR0b24uc2V0TGF5b3V0RGF0YShuZXdDTUdyaWREYXRhKTsKCQkKCQkKCQluZXdDTUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCgkJCS8qKgoJCQkgKiB7QGluaGVyaXREb2N9CgkJCSAqIAoJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQoJCQkgKi8KCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoKCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuc2F2ZUFsbEVkaXRvcnModHJ1ZSk7CgkJCQlNYXBwaW5nU2V0IENvbXBsaWFuY2VNYXBwaW5nU2V0ID0gbmV3IE1hcHBpbmdTZXQoZ2V0U2hlbGwoKSwgYmFzZWxpbmVUYXJnZXRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCkuZ2V0VVJJKCkpOwoJCQkJQ29tcGxpYW5jZU1hcHBpbmdTZXQub3BlbigpOwoJCQl9CgkJfSk7CgkKCQkKCQkKCQlUQ010eHRKdXN0aWZpY2F0aW9uID0gbmV3IFRleHQoY29udHJvbFRDTUNvbDIsIFNXVC5NVUxUSSk7CgkJVENNdHh0SnVzdGlmaWNhdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCxTV1QuRklMTCx0cnVlLHRydWUsMiwxKSk7CgkJLypHcmlkRGF0YSBUQ010eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKCQlUQ010eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwkJCgkJVENNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQlUQ010eHRKdXN0aWZpY2F0aW9uR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQkKCQlUQ010eHRKdXN0aWZpY2F0aW9uLnNldExheW91dERhdGEoVENNdHh0SnVzdGlmaWNhdGlvbkdyaWREYXRhKTsqLwoJCQoJCQoJCQoJCS8vTG9hZCB0aGUgZXZpZGVuY2UgbW9kZWxzCgkJR3JpZERhdGEgbW9kZWxWaWV3ZXJHcmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoKTsKCQltb2RlbFZpZXdlckdyaWREYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwoJCW1vZGVsVmlld2VyR3JpZERhdGEyLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKCQltb2RlbFZpZXdlckdyaWREYXRhMi53aWR0aEhpbnQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDM7CgkJbW9kZWxWaWV3ZXJHcmlkRGF0YTIuaGVpZ2h0SGludCA9IChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS5oZWlnaHQgLyAzKSAtIDIwOwoJCW1vZGVsVmlld2VyR3JpZERhdGEyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwoJCW1vZGVsVmlld2VyR3JpZERhdGEyLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKCQkKCQl0cmVlRXZpZGVuY2VUYXJnZXQgPSBuZXcgVHJlZVZpZXdlcih0YXJnZXRDb21wb3NpdGUsCgkJCQlTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7CgkJCgkJdHJlZUV2aWRlbmNlVGFyZ2V0LmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG1vZGVsVmlld2VyR3JpZERhdGEyKTsKCQl0cmVlRXZpZGVuY2VUYXJnZXQuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKCQkJCWFkYXB0ZXJGYWN0b3J5KSk7CgkJdHJlZUV2aWRlbmNlVGFyZ2V0LnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKCQkJCWFkYXB0ZXJGYWN0b3J5KSk7CgoJCUNyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KHRyZWVFdmlkZW5jZVRhcmdldCxldmlkZW5jZVRhcmdldFJlc291cmNlU2V0KTsKCQkJCQkJCgkJdHJlZUV2aWRlbmNlVGFyZ2V0LmV4cGFuZEFsbCgpOwkJCQoJCQoJCQoJCQoJCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFja0VUID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7CgkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluRVQgPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2tFVCwgbmV3IEhhc2hNYXA8UmVzb3VyY2UsIEJvb2xlYW4+KCkpOwoJCXRyZWVFdmlkZW5jZVRhcmdldC5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBPcGVuV2l6YXJkT25Eb3VibGVDbGljayhlZGl0aW5nRG9tYWluRVQsIGFkYXB0ZXJGYWN0b3J5KSk7CgkJCgkJCgkJdHJlZUJhc2VsaW5lVGFyZ2V0LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKCQkJCgkJCUBPdmVycmlkZQoJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewoJCQkJCgkJCQlpZihldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVtcHR5Iik7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJCgkJCQkKCQkJCW9iamVjdCA9IG51bGw7CgkJCQlpZihldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CgkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKCQkJCQlvYmplY3QgPSAoRU9iamVjdCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCWNsZWFyQWxsQ29udHJvbHMoKTsKCQkJCQkKCQkJCQkvL0NsZWFuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBiYXNlbGluZSBhbmQgZXZpZGVuY2UgdHJlZSBncmVlbiBub2RlcwoJCQkJCQoJCQkJCWlmKGNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmdldFRyZWUoKS5nZXRJdGVtQ291bnQoKT4wKXsKCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCX0KCQkJCQllbHNlewoJCQkJCQlpZihwcm9qZWN0c291cmNlVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCk9PTApewoJCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlNlbGVjdGVkIFNvdXJjZSBQcm9qZWN0IiwKCQkJCQkJCQkiWW91IG11c3Qgc2VsZWN0IHRoZSBzb3VyY2UgcHJvamVjdCBvZiB0aGUgcmV1c2UuIik7CgkJCQkJCX0KCQkJCQkJZWxzZXsKCQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJXcm9uZyBTb3VyY2UgUHJvamVjdCIsCgkJCQkJCQkJCSJUaGUgc2VsZWN0ZWQgc291cmNlIHByb2plY3QgZG9lc24ndCBoYXZlIGV2aWRlbmNlIG1vZGVsLiIpOwoJCQkJCQl9CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJCgkJCQkJLy8gCgkJCQkJaWYgKChvYmplY3QgaW5zdGFuY2VvZiBCYXNlRnJhbWV3b3JrKSB8fCAKCQkJCQkJCShvYmplY3QgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSkpIHsJCQkJCQkKCQkJCQkJcmV0dXJuOwoJCQkJCX0gCgkJCQkJCgkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKCQkJCQkJLy9pZiAoc0VsZW1lbnRGaWx0ZXIuY29udGVudEVxdWFscygiQXJ0ZWZhY3QiKSkgewoKCQkJCQkJaWYoIGNiTWFwR3JvdXAuZ2V0U2VsZWN0aW9uSW5kZXgoKT09LTEpewoJCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlNlbGVjdGVkIE1hcCBHcm91cCIsCgkJCQkJCQkJCSJZb3UgbXVzdCBzZWxlY3QgdGhlIGVxdWl2YWxlbmNlIG1hcCBncm91cC4iKTsKCQkJCQkJCXJldHVybjsKCQkJCQkJfQoKCQkJCQkJLy9TZWFyY2ggdGhlIFRhcmdldCBCYXNlQXJ0ZWZhY3Qgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBhcnRlZmFjdAoJCQkJCQlFT2JqZWN0IHNlbGVjdGVkT2JqZWN0PSBvYmplY3Q7Ly8vL0hlIGRlIG1pcmFyIGRlIHF1aWVuIGVzIHRhcmdldAoKCQkJCQkJLy9SZWFkIHRoZSBlcXVpdmFsZW5jZSBtYXAgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBiYXNlQXJ0ZWZhY3QgCgkJCQkJCWlmKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQmFzZUFzc3VyYWJsZUVsZW1lbnQpewoJCQkJCQkJQmFzZUFzc3VyYWJsZUVsZW1lbnQgdGFyZ2V0QmFzZUFzc3VyYWJsZUVsZW1lbnQ9KEJhc2VBc3N1cmFibGVFbGVtZW50KXNlbGVjdGVkT2JqZWN0OwoKCQkJCQkJCUVMaXN0PEJhc2VDb21wbGlhbmNlTWFwPiBsc3RUYXJnZXRDb21wbGlhbmNlTWFwID0gdGFyZ2V0QmFzZUFzc3VyYWJsZUVsZW1lbnQuZ2V0Q29tcGxpYW5jZU1hcCgpOwoJCQkJCQkJSXRlcmF0b3I8QmFzZUNvbXBsaWFuY2VNYXA+IGl0VGFyZ2V0Q29tcGxpYW5jZU1hcCA9IGxzdFRhcmdldENvbXBsaWFuY2VNYXAuaXRlcmF0b3IoKTsKCQkJCQkJCXdoaWxlIChpdFRhcmdldENvbXBsaWFuY2VNYXAuaGFzTmV4dCgpKSB7CgoJCQkJCQkJCS8vRmlsbCB0aGUgdGFyZ2V0IHRoZSBjb21wbGlhbmNlIGNvbnRyb2xzCgkJCQkJCQkJQmFzZUNvbXBsaWFuY2VNYXAgdGFyZ2V0Q29tcGxpYW5jZU1hcCA9IGl0VGFyZ2V0Q29tcGxpYW5jZU1hcC5uZXh0KCk7CgkJCQkJCQkJCgkJCQkJCQkJLy9Fc3RvcyBzb24gbG9zIHRhcmdldCBxdWUgbWUgaW50ZXJlc2FuCgkJCQkJCQkJaWYodGFyZ2V0Q29tcGxpYW5jZU1hcC5nZXRJZCgpIT1udWxsKXsKCQkJCQkJCQkJVENNaWRUZXh0LnNldFRleHQodGFyZ2V0Q29tcGxpYW5jZU1hcC5nZXRJZCgpKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZXsKCQkJCQkJCQkJVENNaWRUZXh0LnNldFRleHQoIiIpOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQlpZih0YXJnZXRDb21wbGlhbmNlTWFwLmdldE5hbWUoKSE9bnVsbCl7CgkJCQkJCQkJCVRDTW5hbWVUZXh0LnNldFRleHQodGFyZ2V0Q29tcGxpYW5jZU1hcC5nZXROYW1lKCkpOwkJCgkJCQkJCQkJfQoJCQkJCQkJCWVsc2V7CgkJCQkJCQkJCVRDTW5hbWVUZXh0LnNldFRleHQoIiIpOwoJCQkJCQkJCX0KCQkJCQkJCQlpZih0YXJnZXRDb21wbGlhbmNlTWFwLmdldE1hcEp1c3RpZmljYXRpb24oKSE9bnVsbCl7CgkJCQkJCQkJCWlmKHRhcmdldENvbXBsaWFuY2VNYXAuZ2V0TWFwSnVzdGlmaWNhdGlvbigpLmdldEV4cGxhbmF0aW9uKCkhPW51bGwpewoJCQkJCQkJCQkJVENNdHh0SnVzdGlmaWNhdGlvbi5zZXRUZXh0KHRhcmdldENvbXBsaWFuY2VNYXAuZ2V0TWFwSnVzdGlmaWNhdGlvbigpLmdldEV4cGxhbmF0aW9uKCkpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQkKCQkJCQkJCQllbHNlewoJCQkJCQkJCQlUQ010eHRKdXN0aWZpY2F0aW9uLnNldFRleHQoIiIpOwoJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCWlmKHRhcmdldENvbXBsaWFuY2VNYXAuZ2V0VHlwZSgpIT1udWxsKXsKCQkJCQkJCQkJRUVudW0gZW51bU1hcEtpbmQgPSBNYXBwaW5nRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0TWFwcGluZ1BhY2thZ2UoKS5nZXRNYXBLaW5kKCk7CgkJCQkJCQkJCUVMaXN0PEVFbnVtTGl0ZXJhbD4gbWFwa2luZExpc3Q9IGVudW1NYXBLaW5kLmdldEVMaXRlcmFscygpOwoKCQkJCQkJCQkJSXRlcmF0b3I8RUVudW1MaXRlcmFsPiBpdGVyVG8gPSBtYXBraW5kTGlzdC5pdGVyYXRvcigpOwoJCQkJCQkJCQlpbnQgaW5kZXg9MDsKCQkJCQkJCQkJd2hpbGUgKGl0ZXJUby5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJCWlmKGl0ZXJUby5uZXh0KCkuZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRDb21wbGlhbmNlTWFwLmdldFR5cGUoKS5nZXRMaXRlcmFsKCkpKXsKCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWluZGV4Kys7CgkJCQkJCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQoKCQkJCQkJCQkJVENNY2JUeXBlLnNlbGVjdChpbmRleCk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpZih0YXJnZXRDb21wbGlhbmNlTWFwLmdldFRhcmdldCgpLnNpemUoKT4wKXsKCQkJCQkJCQkJVHJlZSBtb2RpZnlUcmVlID10cmVlRXZpZGVuY2VUYXJnZXQuZ2V0VHJlZSgpOwoJCQkJCQkJCQlUcmVlSXRlbVtdIHJvb3ROb2RlcyA9IG1vZGlmeVRyZWUuZ2V0SXRlbXMoKTsKCQkJCQkJCQkJYm9vbGVhbiBmb3VuZCA9ZmFsc2U7CgkJCQkJCQkJCS8vRm9yIGVhY2ggdGFyZ2V0IGluIGNvbXBsaWFuY2Ugc2VhcmNoIGluIGV2aWRlbmNlIHRyZWUKCQkJCQkJCQkJZm9yKEFzc3VyYW5jZUFzc2V0IHRhcmdldEV2aWRlbmNlOnRhcmdldENvbXBsaWFuY2VNYXAuZ2V0VGFyZ2V0KCkpewoJCQkJCQkJCQkJZm9yKFRyZWVJdGVtIHJvb3Q6cm9vdE5vZGVzKXsKCQkJCQkJCQkJCQlmb3IoaW50IHg9MDsgeCA8cm9vdC5nZXRJdGVtcygpLmxlbmd0aDt4KyspewoJCQkJCQkJCQkJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsKCQkJCQkJCQkJCQkJZm91bmQgPSBzZWFyY2hJblRyZWVOb2Rlcyh0YXJnZXRFdmlkZW5jZSxvbmVJdGVtKTsJCQkJCgkJCQkJCQkJCQkJCWlmIChmb3VuZCkgYnJlYWs7CgkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQlpZiAoZm91bmQpIGJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoKCgoJCQkJCQkJRUxpc3QgPFJlZkFzc3VyYWJsZUVsZW1lbnQ+IGVxdWl2YWxlbmNlUmVmQXNzdXJhYmxlRWxlbWVudCA9IHNlYXJjaFJlZkFzc3VyYWJsZUVsZW1lbnRzKHRhcmdldEJhc2VBc3N1cmFibGVFbGVtZW50KTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKCgkJCQkJCQkvL1NlYXJjaCB0aGUgcG9zdENvbmRpdGlvbnMuIFRoZSBzb3VyY2UgbW9kZWwgaXMgdGhlIHNhbWUgdGhhbiB0aGUgZXF1aXZhbGVuY2UgbWFwCgkJCQkJCQlmb3IoUmVmQXNzdXJhYmxlRWxlbWVudCByYTplcXVpdmFsZW5jZVJlZkFzc3VyYWJsZUVsZW1lbnQpewoJCQkJCQkJCUNET1Jlc291cmNlIHRhcmdldCA9IHJhLmNkb1Jlc291cmNlKCk7CgkJCQkJCQkJaWYodGFyZ2V0LmVxdWFscygodGFyZ2V0QmFzZUFzc3VyYWJsZUVsZW1lbnQuZ2V0UmVmQXNzdXJhYmxlRWxlbWVudCgpKS5jZG9SZXNvdXJjZSgpKSl7CgkJCQkJCQkJCS8vU2VhcmNoIGl0IGluIHRoZSB0YXJnZXQgQmFzZWxpbmUgdHJlZQoKCQkJCQkJCQkJVHJlZSBtb2RpZnlUcmVlU0IgPXRyZWVCYXNlbGluZVRhcmdldC5nZXRUcmVlKCk7CgkJCQkJCQkJCVRyZWVJdGVtW10gcm9vdE5vZGVzU0IgPSBtb2RpZnlUcmVlU0IuZ2V0SXRlbXMoKTsKCQkJCQkJCQkJYm9vbGVhbiBmb3VuZFNCID1mYWxzZTsKCQkJCQkJCQkJZm9yKFRyZWVJdGVtIHJvb3Q6cm9vdE5vZGVzU0IpewoJCQkJCQkJCQkJZm9yKGludCB4PTA7IHggPHJvb3QuZ2V0SXRlbXMoKS5sZW5ndGg7eCsrKXsKCQkJCQkJCQkJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsKCQkJCQkJCQkJCQlmb3VuZFNCID0gc2VhcmNoUG9zdENvbmRpdGlvbnNUQlRyZWUocmEsb25lSXRlbSk7CQkJCQoJCQkJCQkJCQkJCWlmIChmb3VuZFNCKSBicmVhazsKCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQlpZiAoZm91bmRTQikgYnJlYWs7CQkJCQkJCQkJCQkKCgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgoKCQkJCQkJCS8vTG9hZCB0aGUgZXZpZGVuY2UgbW9kZWxzIG9mIHRoZSBhY3RpdmUgYXNzZXRzUGFja2FnZSBvZiB0aGUgc2VsZWN0ZWQgc291cmNlIGFzc3VyYW5jZSBwcm9qZWN0IAoJCQkJCQkJRUxpc3Q8QmFzZWxpbmVDb25maWc+IGxzdEJhc2VsaW5lQ29uZmlnID0gYXNzdXJhbmNlUHJvamVjdEZyb20uZ2V0QmFzZWxpbmVDb25maWcoKTsKCQkJCQkJCUl0ZXJhdG9yPEJhc2VsaW5lQ29uZmlnPiBiYXNlbGluZUNvbmZpZyA9IGxzdEJhc2VsaW5lQ29uZmlnLml0ZXJhdG9yKCk7CgkJCQkJCQlib29sZWFuIGJGaW5kPWZhbHNlOwoJCQkJCQkJd2hpbGUgKGJhc2VsaW5lQ29uZmlnLmhhc05leHQoKSAmJiAhYkZpbmQpIHsKCQkJCQkJCQlCYXNlbGluZUNvbmZpZyBiY29uZmlnID0gYmFzZWxpbmVDb25maWcubmV4dCgpOwoJCQkJCQkJCWlmIChiY29uZmlnLmlzSXNBY3RpdmUoKSkgewoJCQkJCQkJCQliRmluZCA9IHRydWU7CgoJCQkJCQkJCQlFTGlzdDxCYXNlRnJhbWV3b3JrPiBsc3RCYXNlRnJhbWV3b3JrID0gYmNvbmZpZy5nZXRSZWZGcmFtZXdvcmsoKTsKCQkJCQkJCQkJSXRlcmF0b3I8QmFzZUZyYW1ld29yaz4gaXRiYXNlRnJhbWV3b3JrID0gbHN0QmFzZUZyYW1ld29yay5pdGVyYXRvcigpOwoKCQkJCQkJCQkJd2hpbGUgKGl0YmFzZUZyYW1ld29yay5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJCUJhc2VGcmFtZXdvcmsgc291cmNlRnJhbWV3b3JrID0gaXRiYXNlRnJhbWV3b3JrLm5leHQoKTsKCgkJCQkJCQkJCQkvL0VMaXN0PEJhc2VBcnRlZmFjdD4gbHN0QmFzZUFydGVmYWN0ID1zb3VyY2VGcmFtZXdvcmsuZ2V0T3duZWRBcnRlZmFjdCgpOwoKCQkJCQkJCQkJCUVMaXN0PEJhc2VBc3N1cmFibGVFbGVtZW50PiBsc3RCYXNlQXNzdXJhYmxlRWxlbWVudCA9IGdldEFsbEJhc2VBc3N1cmFibGVFbGVtZW50cyhzb3VyY2VGcmFtZXdvcmspOwoKCQkJCQkJCQkJCUl0ZXJhdG9yPEJhc2VBc3N1cmFibGVFbGVtZW50PiBpdGJhc2VCQUUgPSBsc3RCYXNlQXNzdXJhYmxlRWxlbWVudC5pdGVyYXRvcigpOwoKCQkJCQkJCQkJCS8vU2VhcmNoIHRoZSBiYXNlQXJ0ZWZhY3RzIG9mIHRoZSBzb3VyY2UgcHJvamVjdCBhY2NvcmRpbmcgdG8gdGhlIGVxdWl2YWxlbmNlIG1hcAoJCQkJCQkJCQkJd2hpbGUgKGl0YmFzZUJBRS5oYXNOZXh0KCkpewoJCQkJCQkJCQkJCUJhc2VBc3N1cmFibGVFbGVtZW50IHNvdXJjZUJBRSA9IGl0YmFzZUJBRS5uZXh0KCk7CgoJCQkJCQkJCQkJCS8vaWYgKHNvdXJjZUJhc2VBcnRlZmFjdC5pc0lzU2VsZWN0ZWQoKSkgewoJCQkJCQkJCQkJCVJlZkFzc3VyYWJsZUVsZW1lbnQgc291cmNlUkFFPSAoUmVmQXNzdXJhYmxlRWxlbWVudClzb3VyY2VCQUUuZ2V0UmVmQXNzdXJhYmxlRWxlbWVudCgpOwoKCQkJCQkJCQkJCQlmb3IoUmVmQXNzdXJhYmxlRWxlbWVudCByYTplcXVpdmFsZW5jZVJlZkFzc3VyYWJsZUVsZW1lbnQpewoKCQkJCQkJCQkJCQkJLy9SZWxsZW5hciBsYSBwYXJ0ZSBjZW50cmFsOgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCS8vUmVmRXF1aXZhbGVuY2VNYXAgcm0gPSBzb3VyY2VSZWZBcnRlZmFjdC5nZXRFcXVpdmFsZW5jZSgpLmdldCgwKTsKCQkJCQkJCQkJCQkJLy90eHRKdXN0aWZpY2F0aW9uLnNldFRleHQocm0uZ2V0TWFwSnVzdGlmaWNhdGlvbigpLmdldEV4cGxhbmF0aW9uKCkpOwoJCQkJCQkJCQkJCQkvL1JlYWQgdGhlIGNvbXBsaWFuY2UgbWFwIG9mIHRoZSBlcXVpdmFsZW5jZSBzb3VyY2UgQmFzZUFydGVmYWN0cyBvZiB0aGUgc3VyY2UgQmFzZUFydGVmYWN0cyB0byBsb29rIGZvciB0aGUgQXJ0ZWZhY3RzCgkJCQkJCQkJCQkJCWlmIChyYS5jZG9JRCgpPT1zb3VyY2VSQUUuY2RvSUQoKSl7CQkKCgoJCQkJCQkJCQkJCQkJVHJlZSBtb2RpZnlUcmVlU0IgPXRyZWVCYXNlbGluZVNvdXJjZS5nZXRUcmVlKCk7CgkJCQkJCQkJCQkJCQlUcmVlSXRlbVtdIHJvb3ROb2Rlc1NCID0gbW9kaWZ5VHJlZVNCLmdldEl0ZW1zKCk7CgkJCQkJCQkJCQkJCQlib29sZWFuIGZvdW5kU0IgPWZhbHNlOwoJCQkJCQkJCQkJCQkJZm9yKFRyZWVJdGVtIHJvb3Q6cm9vdE5vZGVzU0IpewoJCQkJCQkJCQkJCQkJCWZvcihpbnQgeD0wOyB4IDxyb290LmdldEl0ZW1zKCkubGVuZ3RoO3grKyl7CgkJCQkJCQkJCQkJCQkJCVRyZWVJdGVtICBvbmVJdGVtID0gcm9vdC5nZXRJdGVtcygpW3hdOwoJCQkJCQkJCQkJCQkJCQlmb3VuZFNCID0gc2VhcmNoSW5UcmVlTm9kZXMoc291cmNlQkFFLG9uZUl0ZW0pOwkJCQkKCQkJCQkJCQkJCQkJCQkJaWYgKGZvdW5kU0IpIGJyZWFrOwoJCQkJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJCQkJaWYgKGZvdW5kU0IpIGJyZWFrOwoJCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJCUVMaXN0PEJhc2VDb21wbGlhbmNlTWFwPiBsc3RCYXNlQ29tcGxpYW5jZU1hcCA9IHNvdXJjZUJBRS5nZXRDb21wbGlhbmNlTWFwKCk7CgkJCQkJCQkJCQkJCQlJdGVyYXRvcjxCYXNlQ29tcGxpYW5jZU1hcD4gaXRiYXNlQ29tcGxpYW5jZU1hcCA9IGxzdEJhc2VDb21wbGlhbmNlTWFwLml0ZXJhdG9yKCk7CgkJCQkJCQkJCQkJCQl3aGlsZSAoaXRiYXNlQ29tcGxpYW5jZU1hcC5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJCQkJCQlCYXNlQ29tcGxpYW5jZU1hcCBiYXNlQ29tcGxpYW5jZU1hcCA9IGl0YmFzZUNvbXBsaWFuY2VNYXAubmV4dCgpOwoJCQkJCQkJCQkJCQkJCS8vRXN0b3Mgc29uIGxvcyB0YXJnZXQgcXVlIG1lIGludGVyZXNhbgoJCQkJCQkJCQkJCQkJCWlmKGJhc2VDb21wbGlhbmNlTWFwLmdldElkKCkhPW51bGwpewoJCQkJCQkJCQkJCQkJCQlTQ01pZFRleHQuc2V0VGV4dChiYXNlQ29tcGxpYW5jZU1hcC5nZXRJZCgpKTsKCQkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJZWxzZXsKCQkJCQkJCQkJCQkJCQkJU0NNaWRUZXh0LnNldFRleHQoIiIpOwoJCQkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkJCQlpZihiYXNlQ29tcGxpYW5jZU1hcC5nZXROYW1lKCkhPW51bGwpewoJCQkJCQkJCQkJCQkJCQlTQ01uYW1lVGV4dC5zZXRUZXh0KGJhc2VDb21wbGlhbmNlTWFwLmdldE5hbWUoKSk7CQoJCQkJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQllbHNlewoJCQkJCQkJCQkJCQkJCQlTQ01uYW1lVGV4dC5zZXRUZXh0KCIiKTsKCQkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJaWYoYmFzZUNvbXBsaWFuY2VNYXAuZ2V0TWFwSnVzdGlmaWNhdGlvbigpIT1udWxsKXsKCQkJCQkJCQkJCQkJCQkJaWYoYmFzZUNvbXBsaWFuY2VNYXAuZ2V0TWFwSnVzdGlmaWNhdGlvbigpLmdldEV4cGxhbmF0aW9uKCkhPW51bGwpewoJCQkJCQkJCQkJCQkJCQkJU0NNdHh0SnVzdGlmaWNhdGlvbi5zZXRUZXh0KGJhc2VDb21wbGlhbmNlTWFwLmdldE1hcEp1c3RpZmljYXRpb24oKS5nZXRFeHBsYW5hdGlvbigpKTsKCQkJCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCQkJCX0JCgkJCQkJCQkJCQkJCQkJZWxzZXsKCQkJCQkJCQkJCQkJCQkJU0NNdHh0SnVzdGlmaWNhdGlvbi5zZXRUZXh0KCIiKTsKCQkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCQkJaWYoYmFzZUNvbXBsaWFuY2VNYXAuZ2V0VHlwZSgpIT1udWxsKXsKCQkJCQkJCQkJCQkJCQkJRUVudW0gZW51bU1hcEtpbmQgPSBNYXBwaW5nRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0TWFwcGluZ1BhY2thZ2UoKS5nZXRNYXBLaW5kKCk7CgkJCQkJCQkJCQkJCQkJCUVMaXN0PEVFbnVtTGl0ZXJhbD4gbWFwa2luZExpc3Q9IGVudW1NYXBLaW5kLmdldEVMaXRlcmFscygpOwoKCQkJCQkJCQkJCQkJCQkJSXRlcmF0b3I8RUVudW1MaXRlcmFsPiBpdGVyVG8gPSBtYXBraW5kTGlzdC5pdGVyYXRvcigpOwoJCQkJCQkJCQkJCQkJCQlpbnQgaW5kZXg9MDsKCQkJCQkJCQkJCQkJCQkJd2hpbGUgKGl0ZXJUby5oYXNOZXh0KCkpIHsKCQkJCQkJCQkJCQkJCQkJCWlmKGl0ZXJUby5uZXh0KCkuZ2V0TmFtZSgpLmVxdWFscyhiYXNlQ29tcGxpYW5jZU1hcC5nZXRUeXBlKCkuZ2V0TGl0ZXJhbCgpKSl7CgkJCQkJCQkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQkJCQlpbmRleCsrOwoJCQkJCQkJCQkJCQkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkKCgkJCQkJCQkJCQkJCQkJCVNDTWNiVHlwZS5zZWxlY3QoaW5kZXgpOwoJCQkJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJCQkJRUxpc3Q8QXNzdXJhbmNlQXNzZXQ+IGxzdEFydGVmYWN0cyA9IGJhc2VDb21wbGlhbmNlTWFwLmdldFRhcmdldCgpOwoJCQkJCQkJCQkJCQkJCUl0ZXJhdG9yPEFzc3VyYW5jZUFzc2V0PiBpdEFydGVmYWN0cyA9IGxzdEFydGVmYWN0cy5pdGVyYXRvcigpOwoKCQkJCQkJCQkJCQkJCQlUcmVlIG1vZGlmeVRyZWUgPWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmdldFRyZWUoKTsKCQkJCQkJCQkJCQkJCQlUcmVlSXRlbVtdIHJvb3ROb2RlcyA9IG1vZGlmeVRyZWUuZ2V0SXRlbXMoKTsKCQkJCQkJCQkJCQkJCQlib29sZWFuIGZvdW5kID1mYWxzZTsKCgkJCQkJCQkJCQkJCQkJd2hpbGUgKGl0QXJ0ZWZhY3RzLmhhc05leHQoKSl7CgkJCQkJCQkJCQkJCQkJCUFydGVmYWN0IGVxdWl2QXJ0ZWZhY3QgPSAoQXJ0ZWZhY3QpaXRBcnRlZmFjdHMubmV4dCgpOwkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCQkJCS8vU2VhcmNoIHRoZSBlcXVpdmFsZW5jZSBBcnRlZmFjdHMgaW4gdGhlIHRyZWV2aWV3IHNob3dpbmcgdGhlICBldmlkZW5jZSBtb2RlbCBvZiB0aGUgc291cmNlIHByb2plY3QJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQkJCQlmb3IoVHJlZUl0ZW0gcm9vdDpyb290Tm9kZXMpewoJCQkJCQkJCQkJCQkJCQkJZm9yKGludCB4PTA7IHggPHJvb3QuZ2V0SXRlbXMoKS5sZW5ndGg7eCsrKXsKCQkJCQkJCQkJCQkJCQkJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsKCQkJCQkJCQkJCQkJCQkJCQlmb3VuZCA9IHNlYXJjaEluVHJlZU5vZGVzKGVxdWl2QXJ0ZWZhY3Qsb25lSXRlbSk7CQkJCQoJCQkJCQkJCQkJCQkJCQkJCWlmIChmb3VuZCkgYnJlYWs7CgkJCQkJCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCQkJCQkJaWYgKGZvdW5kKSBicmVhazsKCQkJCQkJCQkJCQkJCQkJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJCQl9CgkJCQkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCSAJCgkJCQkJfQkKCQkJCX0KCQkJfQkJCQkJCQkJCQkJCQoKCQl9KTsJCQkJCgkJCgkJLy9CdXR0b24KCQlCdXR0b24gc2F2ZVRhcmdldEV2aWRlbmNlcyA9IG5ldyBCdXR0b24odGFyZ2V0Q29tcG9zaXRlLCBTV1QuTk9ORSk7CgkJc2F2ZVRhcmdldEV2aWRlbmNlcy5zZXRUZXh0KCJTYXZlIHRhcmdldCBldmlkZW5jZXMiKTsKCQlHcmlkRGF0YSBOZXdHcm91cE1hcEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7CgkJTmV3R3JvdXBNYXBHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkVORDsKCQlzYXZlVGFyZ2V0RXZpZGVuY2VzLnNldExheW91dERhdGEoTmV3R3JvdXBNYXBHcmlkRGF0YSk7CgoJCXNhdmVUYXJnZXRFdmlkZW5jZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCWZvcihSZXNvdXJjZSBldlJlcyA6ZXZpZGVuY2VUYXJnZXRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSl7CgkJCQkJQ0RPUmVzb3VyY2Ugc2F2UmVzPSAoQ0RPUmVzb3VyY2UpZXZSZXM7CgkJCQkJdHJ5IHsKCQkJCQkJc2F2UmVzLnNhdmUob3B0aW9ucyk7CgkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawoJCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKCQkJCQl9CQkJCQoJCQkJfQoJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgIkV2aWRlbmNlcyBzYXZlZCIsICJUYXJnZXQgY2hhbmdlcyBldmlkZW5jZXMgc2F2ZWQuIik7CgkJCX0JCQkJCQkJCgkJCX0pOwoJCQoJfQoJCQoJCglwcm90ZWN0ZWQgRUxpc3Q8QmFzZUFzc3VyYWJsZUVsZW1lbnQ+IGdldEFsbEJhc2VBc3N1cmFibGVFbGVtZW50cyhCYXNlRnJhbWV3b3JrIHNvdXJjZUZyYW1ld29yaykgewoJCUVMaXN0PEJhc2VBc3N1cmFibGVFbGVtZW50PiBsaXN0UmVzdWx0ID0gbmV3IEJhc2ljRUxpc3Q8QmFzZUFzc3VyYWJsZUVsZW1lbnQ+KCk7CgkJQ0RPUmVzb3VyY2UgYmFzZWxpbmVTb3VyY2VSZXM9IHNvdXJjZUZyYW1ld29yay5jZG9SZXNvdXJjZSgpOwkJCgkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyPWJhc2VsaW5lU291cmNlUmVzLmdldEFsbENvbnRlbnRzKCk7aXRlci5oYXNOZXh0KCk7KSB7CQkJCQkKCQkJRU9iamVjdCBhRU9iamVjdD0gaXRlci5uZXh0KCk7CQkJCQoJCQlpZihhRU9iamVjdCBpbnN0YW5jZW9mIEJhc2VBc3N1cmFibGVFbGVtZW50KXsKCQkJCWxpc3RSZXN1bHQuYWRkKChCYXNlQXNzdXJhYmxlRWxlbWVudClhRU9iamVjdCk7CgkJCX0JCQkJCQkJCQkJCQoJCX0JCQoJCXJldHVybiBsaXN0UmVzdWx0OwoJfQoJCQkKCQoJcHJpdmF0ZSBib29sZWFuIHNlYXJjaEluVHJlZU5vZGVzKENET09iamVjdCBzZWFyY2hPYmplY3QsIFRyZWVJdGVtIHJvb3QpIHsKCQlmb3IoaW50IHg9MDsgeCA8cm9vdC5nZXRJdGVtcygpLmxlbmd0aDt4KyspewoJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsKCQkJCgkJCU9iamVjdCBkYXRhT2JqZWN0ID0gb25lSXRlbS5nZXREYXRhKCk7CgkJCWlmKGRhdGFPYmplY3QgaW5zdGFuY2VvZiBDRE9PYmplY3QpewoJCQkJaWYoKChDRE9PYmplY3QpZGF0YU9iamVjdCkuY2RvSUQoKT09c2VhcmNoT2JqZWN0LmNkb0lEKCkpewoJCQkJCW9uZUl0ZW0uc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKCQkJCQlvbmVJdGVtLnNldENoZWNrZWQodHJ1ZSk7CgkJCQkJbGlzdEdyZWVuSXRlbS5hZGQob25lSXRlbSk7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQkJaWYob25lSXRlbS5nZXRJdGVtcygpLmxlbmd0aD4wKXsKCQkJCWJvb2xlYW4gZm91bmQ9c2VhcmNoSW5UcmVlTm9kZXMoIHNlYXJjaE9iamVjdCwgIG9uZUl0ZW0pOwoJCQkJaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTsKCQkJfQkJCQkJCgkJfQoJCXJldHVybiBmYWxzZTsKCX0JCgkJCgkKCXByaXZhdGUgYm9vbGVhbiBzZWFyY2hQb3N0Q29uZGl0aW9uc1RCVHJlZShSZWZBc3N1cmFibGVFbGVtZW50IHNlYXJjaE9iamVjdCwgVHJlZUl0ZW0gcm9vdCkgewoJCWZvcihpbnQgeD0wOyB4IDxyb290LmdldEl0ZW1zKCkubGVuZ3RoO3grKyl7CgkJCVRyZWVJdGVtICBvbmVJdGVtID0gcm9vdC5nZXRJdGVtcygpW3hdOwoJCQkKCQkJT2JqZWN0IGRhdGFPYmplY3QgPSBvbmVJdGVtLmdldERhdGEoKTsKCQkJaWYoZGF0YU9iamVjdCBpbnN0YW5jZW9mIEJhc2VBc3N1cmFibGVFbGVtZW50KXsKCQkJCUJhc2VBc3N1cmFibGVFbGVtZW50IHRyZWVPYmplY3Q9IChCYXNlQXNzdXJhYmxlRWxlbWVudClkYXRhT2JqZWN0OwoJCQkJCgkJCQlpZigodHJlZU9iamVjdC5nZXRSZWZBc3N1cmFibGVFbGVtZW50KCkpLmNkb0lEKCk9PXNlYXJjaE9iamVjdC5jZG9JRCgpKXsKCQkJCQkvL09iamVjdCBuYW1lRmVhdHVyZT0gdHJlZU9iamVjdC5lR2V0KHRyZWVPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJuYW1lIikpOwkKCQkJCQkvL1N0cmluZyBjbGFzc05hbWU9IHRyZWVPYmplY3QudG9TdHJpbmcoKS5zcGxpdCgiQCIpWzBdOwoJCQkJCWxpc3RQb3N0Q29uZGl0aW9ucy5hZGQodHJlZU9iamVjdCk7CgkJCQkJLy9yZWZMaXN0UG9zdC5nZXRJdGVtKHJlZkxpc3QuZ2V0SXRlbUNvdW50KCkpLgoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJCWlmKG9uZUl0ZW0uZ2V0SXRlbXMoKS5sZW5ndGg+MCl7CgkJCQlib29sZWFuIGZvdW5kPXNlYXJjaFBvc3RDb25kaXRpb25zVEJUcmVlKCBzZWFyY2hPYmplY3QsICBvbmVJdGVtKTsKCQkJCWlmIChmb3VuZCkgcmV0dXJuIHRydWU7CgkJCX0JCQkJCQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCS8vT2J0YWluIGFsbCB0aGUgZXF1aXZhbGVuY2UgUmVmQXNzdXJhYmxlRWxlbWVudHMgb2YgdGhlIHRoZSBzZWxlY3RlZCB0YXJnZXQgQmFzZUFzc3VyYWJsZUVsZW1lbnQKCXByaXZhdGUgRUxpc3QgPFJlZkFzc3VyYWJsZUVsZW1lbnQ+IHNlYXJjaFJlZkFzc3VyYWJsZUVsZW1lbnRzKEJhc2VBc3N1cmFibGVFbGVtZW50IHRhcmdldEJhc2VBc3N1cmFibGVFbGVtZW50KXsKCQlFTGlzdDxCYXNlRXF1aXZhbGVuY2VNYXA+IGxzdEJhc2VFcXVpdmFsZW5jZU1hcCA9IHRhcmdldEJhc2VBc3N1cmFibGVFbGVtZW50LmdldEVxdWl2YWxlbmNlTWFwKCk7CgkJSXRlcmF0b3I8QmFzZUVxdWl2YWxlbmNlTWFwPiBpdGJhc2VFcXVpdmFsZW5jZU1hcCA9IGxzdEJhc2VFcXVpdmFsZW5jZU1hcC5pdGVyYXRvcigpOwoJCUVMaXN0IDxSZWZBc3N1cmFibGVFbGVtZW50PiBlcXVpdmFsZW5jZVJlZkFydGVmYWN0cz0gbmV3IEJhc2ljRUxpc3Q8UmVmQXNzdXJhYmxlRWxlbWVudD4oKTsKCQl3aGlsZSAoaXRiYXNlRXF1aXZhbGVuY2VNYXAuaGFzTmV4dCgpKSB7CgkJCUJhc2VFcXVpdmFsZW5jZU1hcCBiYXNlRXF1aXZhbGVuY2VNYXAgPSBpdGJhc2VFcXVpdmFsZW5jZU1hcC5uZXh0KCk7CgkJCU1hcEdyb3VwIG1hcEdyb3VwID0gKE1hcEdyb3VwKSBiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0TWFwR3JvdXAoKTsKCQkJaWYobWFwR3JvdXAuY2RvSUQoKT09KGxzdE1hcEdyb3VwLmdldChjYk1hcEdyb3VwLmdldFNlbGVjdGlvbkluZGV4KCkpKS5jZG9JRCgpKXsKCQkJCS8vRXN0b3Mgc29uIGxvcyB0YXJnZXQgcXVlIG1lIGludGVyZXNhbgoJCQkJaWYoYmFzZUVxdWl2YWxlbmNlTWFwLmdldElkKCkhPW51bGwpewoJCQkJCWlkVGV4dC5zZXRUZXh0KGJhc2VFcXVpdmFsZW5jZU1hcC5nZXRJZCgpKTsKCQkJCX0KCQkJCWVsc2V7CgkJCQkJaWRUZXh0LnNldFRleHQoIiIpOwoJCQkJfQoJCQkJCgkJCQlpZihiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0TmFtZSgpIT1udWxsKXsKCQkJCQluYW1lVGV4dC5zZXRUZXh0KGJhc2VFcXVpdmFsZW5jZU1hcC5nZXROYW1lKCkpOwoJCQkJfQoJCQkJZWxzZXsKCQkJCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsKCQkJCX0KCQkJCWlmKGJhc2VFcXVpdmFsZW5jZU1hcC5nZXRNYXBKdXN0aWZpY2F0aW9uKCkhPW51bGwpewoJCQkJCWlmKGJhc2VFcXVpdmFsZW5jZU1hcC5nZXRNYXBKdXN0aWZpY2F0aW9uKCkuZ2V0RXhwbGFuYXRpb24oKSE9bnVsbCl7CgkJCQkJCXR4dEp1c3RpZmljYXRpb24uc2V0VGV4dChiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0TWFwSnVzdGlmaWNhdGlvbigpLmdldEV4cGxhbmF0aW9uKCkpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2V7CgkJCQkJdHh0SnVzdGlmaWNhdGlvbi5zZXRUZXh0KCIiKTsKCQkJCX0KCQkJCQoJCQkJaWYoYmFzZUVxdWl2YWxlbmNlTWFwLmdldFR5cGUoKSE9bnVsbCl7CgkJCQkJRUVudW0gZW51bU1hcEtpbmQgPSBNYXBwaW5nRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0TWFwcGluZ1BhY2thZ2UoKS5nZXRNYXBLaW5kKCk7CgkJCQkJRUxpc3Q8RUVudW1MaXRlcmFsPiBtYXBraW5kTGlzdD0gZW51bU1hcEtpbmQuZ2V0RUxpdGVyYWxzKCk7CgkJCQkJCgkJCQkJSXRlcmF0b3I8RUVudW1MaXRlcmFsPiBpdGVyVG8gPSBtYXBraW5kTGlzdC5pdGVyYXRvcigpOwoJCQkJCWludCBpbmRleD0wOwoJCQkJCXdoaWxlIChpdGVyVG8uaGFzTmV4dCgpKSB7CgkJCQkJCWlmKGl0ZXJUby5uZXh0KCkuZ2V0TmFtZSgpLmVxdWFscyhiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0VHlwZSgpLmdldExpdGVyYWwoKSkpewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJaW5kZXgrKzsKCQkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkKCQkJCQljYlR5cGUuc2VsZWN0KGluZGV4KTsKCQkJCX0KCQkJCWVxdWl2YWxlbmNlUmVmQXJ0ZWZhY3RzLmFkZEFsbChiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0VGFyZ2V0KCkpOwkKCQkJCS8vT25seSBzZWFyY2ggb25lIGVxdWl2YWxlbmNlIG1hcCwgaWYgZm91bmQsIG5vdCByZWFkIG1vcmUKCQkJCWJyZWFrOwoJCQkJCQkJCQkJCQkJCQoJCQl9CQkJCQkJCQkJCQoJCX0KCQlyZXR1cm4gZXF1aXZhbGVuY2VSZWZBcnRlZmFjdHM7Cgl9Cglwcml2YXRlIGludCBpc0VxdWl2YWxlbmNlQXJ0ZWZhY3QoT2JqZWN0IGVxdWl2QXJ0ZWZhY3QsIFRyZWVJdGVtIHJvb3QpIHsKCQlmb3IoaW50IHg9MDsgeCA8cm9vdC5nZXRJdGVtcygpLmxlbmd0aDt4KyspewoJCQlUcmVlSXRlbSAgb25lSXRlbSA9IHJvb3QuZ2V0SXRlbXMoKVt4XTsJCQkJCQoJCQlPYmplY3QgZGF0YU9iamVjdCA9IG9uZUl0ZW0uZ2V0RGF0YSgpOwoJCQlpZihkYXRhT2JqZWN0LmVxdWFscyhlcXVpdkFydGVmYWN0KSl7CQkJCQkJCgkJCQlpZiAob25lSXRlbS5nZXRCYWNrZ3JvdW5kKCkuZXF1YWxzKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpKXsKCQkJCQlyZXR1cm4gMTsKCQkJCX0KCQkJCWVsc2V7CgkJCQkJcmV0dXJuIDI7CgkJCQl9CQkJCQkJCQkJCQkJCQoJCQl9CgkJCWlmKG9uZUl0ZW0uZ2V0SXRlbXMoKS5sZW5ndGg+MCl7CgkJCQlpbnQgZm91bmQ9aXNFcXVpdmFsZW5jZUFydGVmYWN0KCBlcXVpdkFydGVmYWN0LCAgb25lSXRlbSk7CgkJCQlpZiAoZm91bmQgIT0wICkgcmV0dXJuIGZvdW5kOwoJCQl9CQkJCQkKCQl9CgkJcmV0dXJuIDA7Cgl9CQoKCgoJCgoJcHVibGljIHZvaWQgQ3JlYXRlTW9kZWxGcm9tRmlsZXRvY29tYm8oQ29tYm8gY29tYm8sU3RyaW5nIHNwYXRoKSB7CgkJCgkJCgkJaWYgKHNwYXRoICE9IG51bGwpIHsJCgkJCUNET1Jlc291cmNlIHJlc291cmNlID0gbnVsbDsKCQkJdHJ5IHsKCQkJCQoJCQkJcmVzb3VyY2UgPSB2aWV3Q0RPLmdldFJlc291cmNlKHNwYXRoLCB0cnVlKTsKCQkJCW1hcE1vZGVsID0gbnVsbDsKCQkJCW1hcE1vZGVsID0gKE1hcE1vZGVsKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKCQkJCQoJCQkJY29tYm8ucmVtb3ZlQWxsKCk7CgkJCQlsc3RNYXBHcm91cCA9IG1hcE1vZGVsLmdldE1hcEdyb3VwTW9kZWwoKTsKCgkJCQlJdGVyYXRvcjxNYXBHcm91cD4gaXRlcm1hcEdyb3VwID0gbHN0TWFwR3JvdXAuaXRlcmF0b3IoKTsKCQkJCXdoaWxlIChpdGVybWFwR3JvdXAuaGFzTmV4dCgpKSB7CgkJCQkJY29tYm8uYWRkKGl0ZXJtYXBHcm91cC5uZXh0KCkuZ2V0TmFtZSgpKTsKCQkJCX0KCQkJfQoJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7CgkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCAiTm90IHZhbGlkIG1vZGVsIGZpbGUiLCAiVGhlIHByb3ZpZGVkIG1vZGVsIGZpbGUgY291bGRuJ3QgYmUgcGFyc2VkIGFzIGFuIEVNRiByZXNvdXJjZSIpOwoJCQl9CgkJfQoJfQoJCgkKCQoJCgoJCglwdWJsaWMgdm9pZCBDcmVhdGVNb2RlbEZyb21GaWxlKENET1Jlc291cmNlIHJlc291cmNlKSB7CgoJCXRyeSB7CgkJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLnNldElucHV0KHJlc291cmNlKTsKCQkJZmluYWwgVmlld2VyRmlsdGVyIG1vZGVsRmlsdGVyID0gbmV3IFZpZXdlckZpbHRlcigpIHsKCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwKCQkJCQkJT2JqZWN0IGVsZW1lbnQpIHsKCQkJCQkvL2lmIChzRWxlbWVudEZpbHRlci5jb250ZW50RXF1YWxzKCJBcnRlZmFjdCIpKSB7CgkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RNb2RlbCkKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3REZWZpbml0aW9uKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRlZmFjdCkKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLlJlc291cmNlKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCS8vCX0gZWxzZQoJCQkJLy8JCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfTsKCQkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuYWRkRmlsdGVyKG1vZGVsRmlsdGVyKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKCQkJTWVzc2FnZURpYWxvZwoJCQkJCS5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIk5vdCB2YWxpZCBtb2RlbCBmaWxlIiwKCQkJCQkJCSJUaGUgcHJvdmlkZWQgbW9kZWwgZmlsZSBjb3VsZG4ndCBiZSBwYXJzZWQgYXMgYW4gRU1GIHJlc291cmNlIik7CgkJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLnNldElucHV0KG51bGwpOwoJCX0KCX0KCgkKCXB1YmxpYyB2b2lkIENyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KFRyZWVWaWV3ZXIgdHJlZSAsUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKCgkJdHJ5IHsKCQkJdHJlZS5zZXRJbnB1dChyZXNvdXJjZVNldCk7CgkJCQoJCQlmaW5hbCBWaWV3ZXJGaWx0ZXIgbW9kZWxGaWx0ZXIgPSBuZXcgVmlld2VyRmlsdGVyKCkgewoJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LAoJCQkJCQlPYmplY3QgZWxlbWVudCkgewoJCQkJCQoJCQkJCS8vaWYgKHNFbGVtZW50RmlsdGVyLmNvbnRlbnRFcXVhbHMoIkFydGVmYWN0IikpIHsKCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSkgCgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0TW9kZWwpCgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0RGVmaW5pdGlvbikKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3QpCgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJLyplbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLlJlc291cmNlKQoJCQkJCQkJcmV0dXJuIHRydWU7Ki8KCQkJCQkJZWxzZQoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCS8vfSBlbHNlCgkJCQkJLy8JcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9OwoJCQl0cmVlLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CgkJCU1lc3NhZ2VEaWFsb2cKCQkJCQkub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgdmFsaWQgbW9kZWwgZmlsZSIsCgkJCQkJCQkiVGhlIHByb3ZpZGVkIG1vZGVsIGZpbGUgY291bGRuJ3QgYmUgcGFyc2VkIGFzIGFuIEVNRiByZXNvdXJjZSIpOwoJCQl0cmVlLnNldElucHV0KG51bGwpOwoJCX0KCX0KCQoJCglwdWJsaWMgdm9pZCBDcmVhdGVCYXNlbGluZU1vZGVsRnJvbVJlc291cmNlU2V0KFRyZWVWaWV3ZXIgdHJlZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKCgkJdHJ5IHsKCQkJdHJlZS5zZXRJbnB1dChyZXNvdXJjZVNldCk7CgkJCQoJCQlmaW5hbCBWaWV3ZXJGaWx0ZXIgbW9kZWxGaWx0ZXIgPSBuZXcgVmlld2VyRmlsdGVyKCkgewoJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LAoJCQkJCQlPYmplY3QgZWxlbWVudCkgewoJCQkJCQkJCQkJCgkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ0RPUmVzb3VyY2UpIAoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlRnJhbWV3b3JrKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlQWN0aXZpdHl8fCBlbGVtZW50IGluc3RhbmNlb2YgQmFzZUFjdGl2aXR5UmVsKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlQXJ0ZWZhY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEJhc2VBcnRlZmFjdFJlbCkKCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmFzZVJlcXVpcmVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlUmVxdWlyZW1lbnRSZWwpCgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJhc2VSb2xlKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCYXNlVGVjaG5pcXVlKQoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCS8qZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5SZXNvdXJjZSkKCQkJCQkJCXJldHVybiB0cnVlOyovCgkJCQkJCWVsc2UKCQkJCQkJCXJldHVybiBmYWxzZTsJCQkJCQoJCQkJfQoJCQl9OwoJCQl0cmVlLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CgkJCU1lc3NhZ2VEaWFsb2cKCQkJCQkub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgdmFsaWQgbW9kZWwgZmlsZSIsCgkJCQkJCQkiVGhlIHByb3ZpZGVkIG1vZGVsIGZpbGUgY291bGRuJ3QgYmUgcGFyc2VkIGFzIGFuIEVNRiByZXNvdXJjZSIpOwoJCQl0cmVlLnNldElucHV0KG51bGwpOwoJCX0KCX0KCQogICAgLy9UYW1iaWVuIGRlYmVyaWEgY3JlYXIgdW4gY29tcGxpYW5jZSBtYXBwIGVuIG1lbW9yaWEKCXB1YmxpYyB2b2lkIENyZWF0ZU1vZGVsRXZpZGVuY2VGcm9tQmFzZUxpbmUoQXNzdXJhbmNlUHJvamVjdCBhc3N1cmFuY2VQcm9qZWN0LENET1Jlc291cmNlRm9sZGVyIGV2aWRlbmNlRm9sZGVyKSB7CgkJCgkJQXNzZXRzUGFja2FnZSBhUGFja2FnZSA9IG51bGw7IC8vQWN0aXZlIEFzc2V0cyBQYWNrYWdlIAoJCWJvb2xlYW4gYkZpbmQgPSBmYWxzZTsKCQlib29sZWFuIGJFcXVpdmFsZW5jZU1hcCA9IGZhbHNlOwoJCQoJCWJvb2xlYW4gcmV1c2U9ZmFsc2U7CgkJCgkJCgkJZXZpZGVuY2VUYXJnZXRSZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKCQliYXNlbGluZVRhcmdldFJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwoJCQoJCUVMaXN0PEFzc2V0c1BhY2thZ2U+IGxzdEFzc2V0c1BhY2thZ2UgPSBhc3N1cmFuY2VQcm9qZWN0LmdldEFzc2V0c1BhY2thZ2UoKTsKCQlJdGVyYXRvcjxBc3NldHNQYWNrYWdlPiBhc3NldHNQYWNrYWdlID0gbHN0QXNzZXRzUGFja2FnZS5pdGVyYXRvcigpOwoJCQoJCXdoaWxlIChhc3NldHNQYWNrYWdlLmhhc05leHQoKSAmJiAhYkZpbmQpIHsKCQkJYVBhY2thZ2UgPSBhc3NldHNQYWNrYWdlLm5leHQoKTsKCQkJaWYgKGFQYWNrYWdlLmlzSXNBY3RpdmUoKSkgewoJCQkJYkZpbmQ9dHJ1ZTsKCQkJCWlmKGFQYWNrYWdlLmdldEFydGVmYWN0c01vZGVsKCkuc2l6ZSgpPjApewoJCQkJCQkJCQkJCgkJCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCAiUmV1c2UgZXZpZGVuY2UgbW9kZWxzIiwgbnVsbCwKCQkJCQkJICAgICJUaGUgdGFyZ2V0IHByb2plY3QgYWxyZWFkeSBoYXMgZXZpZGVuY2UgbW9kZWwvcy4gRG8geW91IHdhbnQgdG8gcmV1c2UgaXQvdGhlbT8iLCBNZXNzYWdlRGlhbG9nLkNPTkZJUk0sIG5ldyBTdHJpbmdbXSB7ICJZRVMiLAoJCQkJCQkgICJOTyIgfSwgMCk7CgkJCQkJCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwoJCQkJCQoJCQkJCWlmIChyZXN1bHQ9PTApewoJCQkJCQlyZXVzZT10cnVlOwoJCQkJCQlmb3IoQXJ0ZWZhY3RNb2RlbCBleGl0aW5nVGFyZ2V0QU06YVBhY2thZ2UuZ2V0QXJ0ZWZhY3RzTW9kZWwoKSl7CgkJCQkJCQlldmlkZW5jZVRhcmdldFJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChleGl0aW5nVGFyZ2V0QU0uZVJlc291cmNlKCkpOwoJCQkJCQl9CgkJCQkJCQoJCQkJCX0JCQkJCQoJCQkJfQoJCQkJaWYocmV1c2U9PWZhbHNlKXsKCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZzIgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRTaGVsbCgpLCAiTmV3IGV2aWRlbmNlIG1vZGVsIHdpbGwgYmUgY3JlYXRlZCIsIG51bGwsCgkJCQkJCSAgICAiQSBuZXcgZXZpZGVuY2UgbW9kZWwgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgUmVwb3NpdG9yeS4gRG8geW91IGFncmVlPyIsIE1lc3NhZ2VEaWFsb2cuQ09ORklSTSwgbmV3IFN0cmluZ1tdIHsgIllFUyIsCgkJCQkJCSAgIk5PIiB9LCAwKTsKCQkJCQkJaW50IHJlc3VsdCA9IGRpYWxvZzIub3BlbigpOwoJCQkJCQkvL0lmIGRvZXNuJ3Qgd2FudCBjbG9zZSB0aGUgY3Jvc3Nkb21haW4gd2luZG93CgkJCQkJCWlmIChyZXN1bHQ9PTEpewoJCQkJCQkJdGhpcy5jbG9zZSgpOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJCgkJaWYgKGJGaW5kKSB7CgkJCUVMaXN0PEJhc2VsaW5lQ29uZmlnPiBsc3RCYXNlbGluZUNvbmZpZyA9IGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QmFzZWxpbmVDb25maWcoKTsKCQkJSXRlcmF0b3I8QmFzZWxpbmVDb25maWc+IGJhc2VsaW5lQ29uZmlnID0gbHN0QmFzZWxpbmVDb25maWcuaXRlcmF0b3IoKTsKCgkJCWJGaW5kID0gZmFsc2U7CgkJCXdoaWxlIChiYXNlbGluZUNvbmZpZy5oYXNOZXh0KCkgJiYgIWJGaW5kKSB7CgkJCQlCYXNlbGluZUNvbmZpZyBiY29uZmlnID0gYmFzZWxpbmVDb25maWcubmV4dCgpOwoJCQkJaWYgKGJjb25maWcuaXNJc0FjdGl2ZSgpKSB7CgkJCQkJYkZpbmQgPSB0cnVlOwoJCQkJCQoJCQkJCUVMaXN0PEJhc2VGcmFtZXdvcms+IGxzdEJhc2VGcmFtZXdvcmsgPSBiY29uZmlnLmdldFJlZkZyYW1ld29yaygpOwkJCQkJCQkJCQkKCQkJCQlJdGVyYXRvcjxCYXNlRnJhbWV3b3JrPiBpdGJhc2VGcmFtZXdvcmsgPSBsc3RCYXNlRnJhbWV3b3JrLml0ZXJhdG9yKCk7CgkJCQkJCgkJCQkJaW50IGkgPSAxOwoJCQkJCXdoaWxlIChpdGJhc2VGcmFtZXdvcmsuaGFzTmV4dCgpKSB7CgkJCQkJCQoJCQkJCQkKCQkJCQkJQmFzZUZyYW1ld29yayBiYXNlRnJhbWV3b3JrID0gaXRiYXNlRnJhbWV3b3JrLm5leHQoKTsKCQkJCQkJCgkJCQkJCWJhc2VsaW5lVGFyZ2V0UmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGJhc2VGcmFtZXdvcmsuZVJlc291cmNlKCkpOwoJCQkJCQkKCQkJCQkJaWYoIXJldXNlKXsKCQkJCQkJLy9DaGVjayByZXNvdXJjZUNvbnRlbnRzCgkJCQkJCQlDRE9SZXNvdXJjZSB0YXJnZXRldmlkZW5jZVJlc291cmNlPW51bGw7CgoJCQkJCQkJU3RyaW5nIGV4aXN0aW5nUGF0aD0iIjsKCQkJCQkJCWJvb2xlYW4gbmV3TmFtZUZvdW5kPWZhbHNlOwoJCQkJCQkJRU9iamVjdCByb290T2JqZWN0QXJ0ZWZhY3RNb2RlbCA9bnVsbDsKCQkJCQkJCWZvciAoQ0RPUmVzb3VyY2VOb2RlIG9uZVJlc291cmNlOmV2aWRlbmNlRm9sZGVyLmdldE5vZGVzKCkpewoJCQkJCQkJCS8vVGhlIG1vZGVsIGV4aXN0cyBjcmVhdGUgYSBuZXcgb25lCgkJCQkJCQkJaWYob25lUmVzb3VyY2UuZ2V0UGF0aCgpLmVuZHNXaXRoKCJFdmlkZW5jZV8iICsgaSArICIuZXZpZGVuY2UiKSl7CQkJCQkJCQkKCQkJCQkJCQkJZXhpc3RpbmdQYXRoPW9uZVJlc291cmNlLmdldFBhdGgoKTsJCQkJCQkJCQkJCQkJCQkJCgoJCQkJCQkJCQkvL0xvb2tpbmcgZm9yIGEgbm90IGV4aXN0aW5nIGV2aWRlbmNlIG1vZGVsIG5hbWUgdG8gY3JlYXRlIGEgbmV3IG9uZQoJCQkJCQkJCQlpbnQgc3VtYT0gaTsKCQkJCQkJCQkJd2hpbGUgKHRydWUpewoKCQkJCQkJCQkJCXN1bWE9c3VtYSArMTsKCQkJCQkJCQkJCWludCBjdXQ9IGV4aXN0aW5nUGF0aC5sYXN0SW5kZXhPZigiXyIpOwoJCQkJCQkJCQkJZXhpc3RpbmdQYXRoPWV4aXN0aW5nUGF0aC5zdWJzdHJpbmcoMCxjdXQrMSkgKyBzdW1hICsgIi5ldmlkZW5jZSI7CgkJCQkJCQkJCQl0cnl7CgkJCQkJCQkJCQkJLy9UbyBjaGVjayBpZiBleGlzdHMKCQkJCQkJCQkJCQl2aWV3Q0RPLmdldFJlc291cmNlKGV4aXN0aW5nUGF0aCk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSl7CgkJCQkJCQkJCQkJdGFyZ2V0ZXZpZGVuY2VSZXNvdXJjZSA9IGV2aWRlbmNlRm9sZGVyLmFkZFJlc291cmNlKCJFdmlkZW5jZV8iICsgc3VtYSArICIuZXZpZGVuY2UiKTsKCQkJCQkJCQkJCQlyb290T2JqZWN0QXJ0ZWZhY3RNb2RlbCA9IGNyZWF0ZUFydGVmYWN0TW9kZWwoc3VtYSwgYmFzZUZyYW1ld29yayk7IAoJCQkJCQkJCQkJCW5ld05hbWVGb3VuZD10cnVlOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCQl9CQoJCQkJCQkJCQlpZihuZXdOYW1lRm91bmQpIGJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKCFuZXdOYW1lRm91bmQpewoJCQkJCQkJCXRhcmdldGV2aWRlbmNlUmVzb3VyY2UgPSBldmlkZW5jZUZvbGRlci5hZGRSZXNvdXJjZSgiRXZpZGVuY2VfIiArIGkgKyAiLmV2aWRlbmNlIik7IAoJCQkJCQkJCXJvb3RPYmplY3RBcnRlZmFjdE1vZGVsID0gY3JlYXRlQXJ0ZWZhY3RNb2RlbChpLCBiYXNlRnJhbWV3b3JrKTsgCQkJCQkJCQoJCQkJCQkJfQoKCQkJCQkJCXRhcmdldGV2aWRlbmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdEFydGVmYWN0TW9kZWwpOyAKCQkJCQkJCWFQYWNrYWdlLmdldEFydGVmYWN0c01vZGVsKCkuYWRkKChBcnRlZmFjdE1vZGVsKSByb290T2JqZWN0QXJ0ZWZhY3RNb2RlbCk7CgoJCQkJCQkJZXZpZGVuY2VUYXJnZXRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0ZXZpZGVuY2VSZXNvdXJjZSk7CgkJCQkJCQkKCQkJCQkJCXRyeSB7CgkJCQkJCQkJLy9TYXZlIHRoZSB0YXJnZXQgZXZpZGVuY2VuY2UgbW9kZWwKCQkJCQkJCQl0YXJnZXRldmlkZW5jZVJlc291cmNlLnNhdmUob3B0aW9ucyk7CgkJCQkJCQkJCgkJCQkJCQkJLy9TYXZlIHRoZSBhc3N1cmFuY2UgcHJvamVjCgkJCQkJCQkJYVBhY2thZ2UuY2RvUmVzb3VyY2UoKS5zYXZlKG9wdGlvbnMpOwoJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCQoJCQkJCQkvL0ZvciB0aGUgQmFzZUZyYW1ld29yayBmaW5kIHRoZSBCYXNlRXF1aXZhbGVuY2VNYXAKCQkJCQkJCgkJCQkJCWJFcXVpdmFsZW5jZU1hcCA9IEZpbmRCYXNlRnJhbWV3b3JrTWFwcGluZyhiYXNlRnJhbWV3b3JrKTsKCQkJCQkJCgkJCQkJCWkrKzsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCFiRXF1aXZhbGVuY2VNYXApIHsKCQkJCQkJTWVzc2FnZURpYWxvZwoJCQkJCQkub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgRXF1aXZhbGVuY2UgTWFwIiwKCQkJCQkJCQkiVGhlIEFzc3VyYW5jZSBQcm9qZWN0ICIgKyBhc3N1cmFuY2VQcm9qZWN0LmdldE5hbWUoKSArICIgZG9lc24ndCBoYXZlIGVxdWl2YWxlbmNlIG1hcC4iKTsKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCX0KCQkJaWYgKCEgYkZpbmQpIHsKCQkJCU1lc3NhZ2VEaWFsb2cKCQkJCS5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIk5vdCBBY3RpdmUgQmFzZUxpbmUiLAoJCQkJCQkiVGhlIEFzc3VyYW5jZSBQcm9qZWN0ICIgKyBhc3N1cmFuY2VQcm9qZWN0LmdldE5hbWUoKSArICIgZG9lc24ndCBoYXZlIGFuIGFjdGl2ZSBCYXNlIExpbmUuIik7CgkJCX0KCQkJCgkJfSBlbHNlIHsKCQkJTWVzc2FnZURpYWxvZwoJCQkub3BlbkVycm9yKGdldFNoZWxsKCksICJOb3QgQWN0aXZlIEFzc2V0c1BhY2thZ2UiLAoJCQkJCSJUaGUgQXNzdXJhbmNlIFByb2plY3QgIiArIGFzc3VyYW5jZVByb2plY3QuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgYW4gYWN0aXZlIGFzc2V0cyBwYWNrYWdlLiIpOwoJCX0KCQkJCQoJCS8vcmV0dXJuIHJlc291cmNlU2V0RXZpZGVuY2U7CgkJCgl9CgkKCQoJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlQXJ0ZWZhY3RNb2RlbChpbnQgaSxCYXNlRnJhbWV3b3JrIGJhc2VGcmFtZXdvcmsgKSB7CgkJCgkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpZXZpZGVuY2VQYWNrYWdlLmdldEVDbGFzc2lmaWVyKEFSVEVGQUNUTU9ERUxfQ0xBU1MpOwoJCUVPYmplY3Qgcm9vdE9iamVjdCA9IGV2aWRlbmNlRmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsKCQkoKG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdE1vZGVsKXJvb3RPYmplY3QpLnNldElkKCIiICsgaSk7CgkJKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3RNb2RlbClyb290T2JqZWN0KS5zZXROYW1lKCJBcnRlZmFjdE1vZGVsXyIgKyBpKTsKCQkKCQlFTGlzdDxCYXNlQXJ0ZWZhY3Q+IGxzdEJhc2VBcnRlZmFjdCA9YmFzZUZyYW1ld29yay5nZXRPd25lZEFydGVmYWN0KCk7CgkJSXRlcmF0b3I8QmFzZUFydGVmYWN0PiBpdGJhc2VBcnRlZmFjdCA9IGxzdEJhc2VBcnRlZmFjdC5pdGVyYXRvcigpOwoJCWludCBqID0gMTsKCQl3aGlsZSAoaXRiYXNlQXJ0ZWZhY3QuaGFzTmV4dCgpKXsKCQkJQmFzZUFydGVmYWN0IHRhcmdldEJhc2VBcnRlZmFjdCA9IGl0YmFzZUFydGVmYWN0Lm5leHQoKTsKCQkJCQkJCgkJCWlmICh0YXJnZXRCYXNlQXJ0ZWZhY3QuaXNJc1NlbGVjdGVkKCkpIHsKCQkJCUVDbGFzcyBlQXJ0ZWZhY3REZWZpbml0aW9uID0gKEVDbGFzcylldmlkZW5jZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoQVJURUZBQ1RERUZJTklUSU9OX0NMQVNTKTsKCQkJCUVPYmplY3QgYXJ0ZWZhY3REZWZpbml0aW9uT2JqZWN0ID0gZXZpZGVuY2VGYWN0b3J5LmNyZWF0ZShlQXJ0ZWZhY3REZWZpbml0aW9uKTsKCQkJCSgob3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0RGVmaW5pdGlvbilhcnRlZmFjdERlZmluaXRpb25PYmplY3QpLnNldElkKHRhcmdldEJhc2VBcnRlZmFjdC5nZXRJZCgpKTsKCQkJCS8vKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3REZWZpbml0aW9uKWFydGVmYWN0RGVmaW5pdGlvbk9iamVjdCkuc2V0TmFtZSgiQXJ0ZWZhY3REZWZpbml0aW9uXyIgKyBqKTsKCQkJCSgob3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0RGVmaW5pdGlvbilhcnRlZmFjdERlZmluaXRpb25PYmplY3QpLnNldE5hbWUodGFyZ2V0QmFzZUFydGVmYWN0LmdldE5hbWUoKSk7CgkJCQkoKG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdE1vZGVsKXJvb3RPYmplY3QpLmdldEFydGVmYWN0KCkuYWRkKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3REZWZpbml0aW9uKWFydGVmYWN0RGVmaW5pdGlvbk9iamVjdCk7CgkJCQkgCgkJCQlFQ2xhc3MgZUFydGVmYWN0ID0gKEVDbGFzcylldmlkZW5jZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoQVJURUZBQ1RfQ0xBU1MpOwoJCQkJRU9iamVjdCBhcnRlZmFjdE9iamVjdCA9IGV2aWRlbmNlRmFjdG9yeS5jcmVhdGUoZUFydGVmYWN0KTsKCQkJCSgob3JnLmVjbGlwc2Uub3BlbmNlcnQuZXZtLmV2aWRzcGVjLmV2aWRlbmNlLkFydGVmYWN0KWFydGVmYWN0T2JqZWN0KS5zZXRJZCgiMSIpOwoJCQkJKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3QpYXJ0ZWZhY3RPYmplY3QpLnNldE5hbWUoIkFydGVmYWN0IHZlcnNpb24gMSIpOwoJCQkJKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3REZWZpbml0aW9uKWFydGVmYWN0RGVmaW5pdGlvbk9iamVjdCkuZ2V0QXJ0ZWZhY3QoKS5hZGQoKG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdClhcnRlZmFjdE9iamVjdCk7CQkJCQkJCQoJCQkJKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3QpYXJ0ZWZhY3RPYmplY3QpLnNldFZlcnNpb25JRCgiMSIpOwoJCQkJKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3QpYXJ0ZWZhY3RPYmplY3QpLnNldElzTGFzdFZlcnNpb24odHJ1ZSk7CgkJCQkvLy9DcmVhdGUgYSBjb21wbGlhbmNlIG1hcCBiZXR3ZWVuIHRoZSB0YXJnZXQgYmFzZWxpbmUgYW5kIHRoZSBldmlkZW5jZSBtb2RlbCB0byBnZW5lcmF0ZQoJCQkJQmFzZUNvbXBsaWFuY2VNYXAgdGFyZ2V0UHJvamVjdENNPSBiYXNlbGluZUZhY3RvcnkuY3JlYXRlQmFzZUNvbXBsaWFuY2VNYXAoKTsKCQkJCXRhcmdldFByb2plY3RDTS5zZXRJZCgiIitqKTsKCQkJCXRhcmdldFByb2plY3RDTS5zZXROYW1lKCJDcm9zcyBEb21haW4gY29tcGxpYW5jZSAiK2opOwoJCQkJTWFwSnVzdGlmaWNhdGlvbiBtaj0gbWFwcGluZ0ZhY3RvcnkuY3JlYXRlTWFwSnVzdGlmaWNhdGlvbigpOwoJCQkJbWouc2V0RXhwbGFuYXRpb24oIkNvbXBsaWFuY2UgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgQ3Jvc3MgRG9tYWluIik7CgkJCQl0YXJnZXRQcm9qZWN0Q00uc2V0TWFwSnVzdGlmaWNhdGlvbihtaik7CgkJCQl0YXJnZXRQcm9qZWN0Q00uZ2V0VGFyZ2V0KCkuYWRkKChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3QpYXJ0ZWZhY3RPYmplY3QpOwoJCQkJdGFyZ2V0UHJvamVjdENNLnNldE1hcEdyb3VwKHRhcmdldENvbXBsaWFuY2VHcm91cCk7CgkJCQkKCQkJCQoJCQkJLy9PYnRlbmVyIGVsIG1hcGdyb3VwIGRlbCBjb21wbGlhbmNlIGRlbCBhc3N1cmFuY2UgcHJvamVjdAkJCQkJCQkJCgkJCQl0YXJnZXRCYXNlQXJ0ZWZhY3QuZ2V0Q29tcGxpYW5jZU1hcCgpLmFkZCh0YXJnZXRQcm9qZWN0Q00pOwkJCQkKCQkJCQoJCQkJaisrOwkJIAoJCQl9CgkJfQoJCXJldHVybiByb290T2JqZWN0OwoJfQoJCgkKCgkvL0ZvciBBcnRlZmFjdHMgYW5kIGZvciBSZXF1aXJlbWVudHMgb25seSwgYmVjYXVzZSBhcmUgdGhlIEJhc2UgZWxlbWVudHMgcmVsYXRlZCB0byBBcnRlZmFjdHMKCXByaXZhdGUgYm9vbGVhbiBGaW5kQmFzZUZyYW1ld29ya01hcHBpbmcoQmFzZUZyYW1ld29yayBiYXNlRnJhbWV3b3JrKSB7CgkJYm9vbGVhbiBiRmluZCA9IGZhbHNlOwoKCQkvL2lmIChzRWxlbWVudEZpbHRlci5jb250ZW50RXF1YWxzKCJBcnRlZmFjdCIpKSB7CgkJCUVMaXN0PEJhc2VBcnRlZmFjdD4gbHN0QmFzZUFydGVmYWN0ID0gYmFzZUZyYW1ld29yay5nZXRPd25lZEFydGVmYWN0KCk7CgkJCUl0ZXJhdG9yPEJhc2VBcnRlZmFjdD4gaXRiYXNlQXJ0ZWZhY3QgPSBsc3RCYXNlQXJ0ZWZhY3QuaXRlcmF0b3IoKTsKCgkJCXdoaWxlIChpdGJhc2VBcnRlZmFjdC5oYXNOZXh0KCkpIHsKCQkJCUJhc2VBcnRlZmFjdCBiYXNlQXJ0ZWZhY3QgPSBpdGJhc2VBcnRlZmFjdC5uZXh0KCk7CgoJCQkJRUxpc3Q8QmFzZUVxdWl2YWxlbmNlTWFwPiBsc3RCYXNlRXF1aXZhbGVuY2VNYXAgPSBiYXNlQXJ0ZWZhY3QuZ2V0RXF1aXZhbGVuY2VNYXAoKTsKCQkJCUl0ZXJhdG9yPEJhc2VFcXVpdmFsZW5jZU1hcD4gaXRiYXNlRXF1aXZhbGVuY2VNYXAgPSBsc3RCYXNlRXF1aXZhbGVuY2VNYXAuaXRlcmF0b3IoKTsKCQkJCXdoaWxlIChpdGJhc2VFcXVpdmFsZW5jZU1hcC5oYXNOZXh0KCkpIHsKCQkJCQlCYXNlRXF1aXZhbGVuY2VNYXAgYmFzZUVxdWl2YWxlbmNlTWFwID0gaXRiYXNlRXF1aXZhbGVuY2VNYXAubmV4dCgpOwoJCQkJCU1hcE1vZGVsIG1hcE1vZGVsID0gKE1hcE1vZGVsKSBiYXNlRXF1aXZhbGVuY2VNYXAuZ2V0TWFwR3JvdXAoKS5lQ29udGFpbmVyKCk7CgkJCQkJbWFwUmVzb3VyY2UgPSBDRE9VdGlsLmdldENET09iamVjdChtYXBNb2RlbCkuY2RvUmVzb3VyY2UoKTsKCgkJCQkJLy8gQW50ZXMgZGUgYe+/vWFkaXIgY29tcHJvYmFyIHF1ZSBubyBleGlzdGEgeWEgZW4gbGEgbGlzdGEKCQkJCQlpZiAoIVZlcmlmeU1hcFJlc291cmNlKG1hcFJlc291cmNlLmdldFBhdGgoKSkpIHsKCQkJCQkJcmVmTGlzdE1hcC5hZGQobWFwUmVzb3VyY2UuZ2V0TmFtZSgpKTsKCQkJCQkJcmVmTGlzdERpck1hcC5hZGQobWFwUmVzb3VyY2UuZ2V0UGF0aCgpKTsKCQkJCQkJYkZpbmQgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkKCQkJLy9SZXF1aXJlbWVudGVzIG9mIHRoZSBiYXNlRnJhbWV3b3JrCgkJCUVMaXN0PEJhc2VSZXF1aXJlbWVudD4gbHN0QmFzZVJlcXVpcmVtZW50ID0gYmFzZUZyYW1ld29yay5nZXRPd25lZFJlcXVpcmVtZW50KCk7CgkJCWJGaW5kID0gc2VhcmNoQmFzZVJlcXVpcmVtZW50c0VxdWl2TWFwKGJGaW5kLCBsc3RCYXNlUmVxdWlyZW1lbnQpOwoJCQkKCQkJLy9SZXF1aXJlbWVudGVzIG9mIHRoZSBCYXNlQWN0aXZpdGllcwoJCQlFTGlzdDxCYXNlQWN0aXZpdHk+IGxzdEJhc2VBY3Rpdml0eSA9IGJhc2VGcmFtZXdvcmsuZ2V0T3duZWRBY3Rpdml0aWVzKCk7CgkJCWJGaW5kID0gc2VhcmNoQWN0dml0eVJlcXVpcmVtZW50cyhiRmluZCwgbHN0QmFzZUFjdGl2aXR5KTsJCQoKCQlyZXR1cm4gYkZpbmQ7Cgl9CgoJcHJpdmF0ZSBib29sZWFuIHNlYXJjaEFjdHZpdHlSZXF1aXJlbWVudHMoYm9vbGVhbiBiRmluZCwKCQkJRUxpc3Q8QmFzZUFjdGl2aXR5PiBsc3RCYXNlQWN0aXZpdHkpIHsKCQlFTGlzdDxCYXNlUmVxdWlyZW1lbnQ+IGxzdEJhc2VSZXF1aXJlbWVudDsKCQlJdGVyYXRvcjxCYXNlQWN0aXZpdHk+IGl0YmFzZUFjdGl2aXR5ID0gbHN0QmFzZUFjdGl2aXR5Lml0ZXJhdG9yKCk7CgoJCXdoaWxlIChpdGJhc2VBY3Rpdml0eS5oYXNOZXh0KCkpIHsKCQkJQmFzZUFjdGl2aXR5IGJhc2VBY3Rpdml0eSA9IGl0YmFzZUFjdGl2aXR5Lm5leHQoKTsKCgkJCWxzdEJhc2VSZXF1aXJlbWVudCA9IGJhc2VBY3Rpdml0eS5nZXRPd25lZFJlcXVpcmVtZW50KCk7CgkJCWJGaW5kID0gc2VhcmNoQmFzZVJlcXVpcmVtZW50c0VxdWl2TWFwKGJGaW5kLCBsc3RCYXNlUmVxdWlyZW1lbnQpOwoJCQkKCQkJaWYoYmFzZUFjdGl2aXR5LmdldFN1YkFjdGl2aXR5KCkuc2l6ZSgpPjApewoJCQkJRUxpc3Q8QmFzZUFjdGl2aXR5PiBsc3RTdWJBY3Rpdml0aWVzID0gYmFzZUFjdGl2aXR5LmdldFN1YkFjdGl2aXR5KCk7CgkJCQliRmluZCA9IHNlYXJjaEFjdHZpdHlSZXF1aXJlbWVudHMoYkZpbmQsIGxzdFN1YkFjdGl2aXRpZXMpOwoJCQl9CgkJCgkJfQoJCXJldHVybiBiRmluZDsKCX0KCglwcml2YXRlIGJvb2xlYW4gc2VhcmNoQmFzZVJlcXVpcmVtZW50c0VxdWl2TWFwKGJvb2xlYW4gYkZpbmQsCgkJCUVMaXN0PEJhc2VSZXF1aXJlbWVudD4gbHN0QmFzZVJlcXVpcmVtZW50KSB7CgkJSXRlcmF0b3I8QmFzZVJlcXVpcmVtZW50PiBpdGJhc2VSZXF1aXJlbWVudCA9IGxzdEJhc2VSZXF1aXJlbWVudC5pdGVyYXRvcigpOwoKCQl3aGlsZSAoaXRiYXNlUmVxdWlyZW1lbnQuaGFzTmV4dCgpKSB7CgkJCUJhc2VSZXF1aXJlbWVudCBiYXNlUmVxdWlyZW1lbnQgPSBpdGJhc2VSZXF1aXJlbWVudC5uZXh0KCk7CgoJCQlFTGlzdDxCYXNlRXF1aXZhbGVuY2VNYXA+IGxzdEJhc2VFcXVpdmFsZW5jZU1hcCA9IGJhc2VSZXF1aXJlbWVudC5nZXRFcXVpdmFsZW5jZU1hcCgpOwoJCQlJdGVyYXRvcjxCYXNlRXF1aXZhbGVuY2VNYXA+IGl0YmFzZUVxdWl2YWxlbmNlTWFwID0gbHN0QmFzZUVxdWl2YWxlbmNlTWFwLml0ZXJhdG9yKCk7CgkJCXdoaWxlIChpdGJhc2VFcXVpdmFsZW5jZU1hcC5oYXNOZXh0KCkpIHsKCQkJCUJhc2VFcXVpdmFsZW5jZU1hcCBiYXNlRXF1aXZhbGVuY2VNYXAgPSBpdGJhc2VFcXVpdmFsZW5jZU1hcC5uZXh0KCk7CgkJCQlNYXBNb2RlbCBtYXBNb2RlbCA9IChNYXBNb2RlbCkgYmFzZUVxdWl2YWxlbmNlTWFwLmdldE1hcEdyb3VwKCkuZUNvbnRhaW5lcigpOwoJCQkJbWFwUmVzb3VyY2UgPSBDRE9VdGlsLmdldENET09iamVjdChtYXBNb2RlbCkuY2RvUmVzb3VyY2UoKTsKCgkJCQkvLyBBbnRlcyBkZSBh77+9YWRpciBjb21wcm9iYXIgcXVlIG5vIGV4aXN0YSB5YSBlbiBsYSBsaXN0YQoJCQkJaWYgKCFWZXJpZnlNYXBSZXNvdXJjZShtYXBSZXNvdXJjZS5nZXRQYXRoKCkpKSB7CgkJCQkJcmVmTGlzdE1hcC5hZGQobWFwUmVzb3VyY2UuZ2V0TmFtZSgpKTsKCQkJCQlyZWZMaXN0RGlyTWFwLmFkZChtYXBSZXNvdXJjZS5nZXRQYXRoKCkpOwoJCQkJCWJGaW5kID0gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gYkZpbmQ7Cgl9CgkKCXByaXZhdGUgYm9vbGVhbiBWZXJpZnlNYXBSZXNvdXJjZSAoU3RyaW5nIG5hbWVNYXBNb2RlbCkgewoJCWJvb2xlYW4gYkZpbmQgPSBmYWxzZTsKCQlpbnQgaSA9IDA7CgkJCgkJd2hpbGUgKGk8IHJlZkxpc3REaXJNYXAuc2l6ZSgpICYmICFiRmluZCkgewoJCQlpZiAocmVmTGlzdERpck1hcC5nZXQoMCkuY29udGVudEVxdWFscyhuYW1lTWFwTW9kZWwpKXsKCQkJCWJGaW5kID0gdHJ1ZTsKCQkJfQoJCQlpKys7CgkJfQoJCXJldHVybiBiRmluZDsKCX0KCQoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewoJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKCQluZXdTaGVsbC5zZXRUZXh0KCJDcm9zcyBEb21haW4iKTsKCX0KCQoJQE92ZXJyaWRlCglwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CgkJCgkJCgkJLy91c2FyIGVsIHRhcmdldFJlc291cmNlU2V0IHkgY29tcGFyYXIgY29uIGVsIGFyYm9sICBtb2RlbFZpZXdlclRhcmdldAoJCS8vbW9kZWxWaWV3ZXJUYXJnZXQuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CgkJCgkJCgkJLypvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yIGN1cnNvcjsqLwoJCS8vdGhpcy5nZXRDb250ZW50cygpLnNldEN1cnNvcihuZXcgQ3Vyc29yKG5ldyBEaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwoJCQoJCS8vUmVzb3VyY2UgZmlyc3Rldk1vZGVsID10YXJnZXRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7CgkJCgkJCQoJCQoJCQoJCQoJCQoJCUFydGVmYWN0TW9kZWwgYW1GID1udWxsOwoJCQoJCQoJCQoJCWlmKHByb2plY3Rzb3VyY2VUZXh0LmdldFRleHQoKS5sZW5ndGgoKT09MCl7CgkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJTZWxlY3RlZCBTb3VyY2UgUHJvamVjdCIsCgkJCQkiWW91IG11c3Qgc2VsZWN0IHRoZSBzb3VyY2UgcHJvamVjdCBvZiB0aGUgcmV1c2UuIik7CgkJCXJldHVybjsKCQl9CgkJCgkJaWYoY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpPT0wKXsKCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIldyb25nIFNvdXJjZSBQcm9qZWN0IiwKCQkJCQkiVGhlIHNlbGVjdGVkIHNvdXJjZSBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBldmlkZW5jZSBtb2RlbC4iKTsKCQkJcmV0dXJuOwoJCX0KCQkKCQlpZih0cmVlRXZpZGVuY2VUYXJnZXQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKXsKCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlNlbGVjdGVkIFRhcmdldCBBcnRlZmFjdHMiLAoJCQkJCSJZb3UgbXVzdCBzZWxlY3QgdGhlIFRhcmdldCBBcnRlZmFjdCBvZiB0aGUgcmV1c2UuIik7CgkJCXJldHVybjsJCQkKCQl9CgkJZWxzZXsKCQkJZm9yKFRyZWVJdGVtIG9uZVNlbGVjdGVkOiB0cmVlRXZpZGVuY2VUYXJnZXQuZ2V0VHJlZSgpLmdldFNlbGVjdGlvbigpKXsKCQkJCWlmICghb25lU2VsZWN0ZWQuZ2V0QmFja2dyb3VuZCgpLmVxdWFscyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKSl7CgkJCQkJaW50IGF4ID0gSk9wdGlvblBhbmUuc2hvd0NvbmZpcm1EaWFsb2cobnVsbCwgIlRoZSBzZWxlY3RlZCBUYXJnZXQgQXJ0ZWZhY3QgaGFzIG5vdCBlcXVpdmFsZW5jZSB3aXRoIHRoZSBjaGVja2VkIFNvdXJjZSBBcnRlZmFjdC9zLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSB0aGUgcmV1c2UgYW55d2F5PyIpOwoJCQkJCWlmKGF4ID09IEpPcHRpb25QYW5lLk9LX09QVElPTil7CgkJCQkJCWJyZWFrOwkJCQkKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkJCQoJCQl0cmVlRXZpZGVuY2VUYXJnZXQuZ2V0VHJlZSgpLmdldFNlbGVjdGlvbigpOwoJCX0KCQkKCQlPYmplY3RbXSBzb3VyY2VBcnRlZmFjdHMgPSAgY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CgkJCgkJaWYoc291cmNlQXJ0ZWZhY3RzLmxlbmd0aD09MCl7CgkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksICJTZWxlY3RlZCBTb3VyY2UgQXJ0ZWZhY3RzIiwKCQkJCQkiWW91IG11c3Qgc2VsZWN0IHRoZSBTb3VyY2UgUHJvamVjdCBBcnRlZmFjdHMgZm9yIHRoZSByZXVzZS4iKTsKCQkJCXJldHVybjsKCQl9CgkJCQkKCQlmb3IoT2JqZWN0IG9uZUFydGVmYWN0OnNvdXJjZUFydGVmYWN0cyl7CgkJCWludCBmb3VuZCA9IGlzRXF1aXZhbGVuY2VBcnRlZmFjdChvbmVBcnRlZmFjdCxjaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5nZXRUcmVlKCkuZ2V0SXRlbSgwKSk7CgkJCWlmKGZvdW5kID09IDIpewkJCQkKCQkJCWludCBheCA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKG51bGwsICJZb3UgaGF2ZSBzZWxlY3RlZCBzb3VyY2UgQXJ0ZWZhY3RzKG5vdCBoaWdobGlnaHRlZCBpbiBncmVlbikgd2l0aG91dCBlcXVpdmFsZW5jZSB3aXRoIHRoZSBzZWxlY3RlZCB0YXJnZXQgQXJ0ZWZhY3QuIERvIHlvdSB3YW50IHRvIHJldXNlIHRoZW0gYW55d2F5PyIpOwoJCQkJaWYoYXggPT0gSk9wdGlvblBhbmUuT0tfT1BUSU9OKXsKCQkJCQlicmVhazsJCQkJCgkJCQl9CgkJCQllbHNlewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCQkKCQlTdHJpbmcgcmVzdW1lID0iWW91IGFyZSBnb2luZyB0byBjb3B5IHRoZSBTb3VyY2UgQXJ0ZWZhY3RzOlxyXG4iOwoJCWZvcihPYmplY3Qgb25lQXJ0ZWZhY3Q6c291cmNlQXJ0ZWZhY3RzKXsKCQkJaWYob25lQXJ0ZWZhY3QgaW5zdGFuY2VvZiBBcnRlZmFjdCl7CgkJCQlBcnRlZmFjdCBzYT0gKEFydGVmYWN0KW9uZUFydGVmYWN0OwoJCQkJcmVzdW1lKz0iICAiICsgc2EuZ2V0SWQoKSArICIgLSAiICsgc2EuZ2V0TmFtZSgpICsgIiBpbiBtb2RlbCAiICsgc2EuY2RvUmVzb3VyY2UoKS5nZXROYW1lKCkgKyAiXHJcbiI7CgkJCX0JCQkKCQl9CgkJcmVzdW1lKz0gImFuZCB0aGVpciByZWxhdGVkIFJlc291cmNlcyBhbiBmaWxlcyB0byB0aGUgdGFyZ2V0IEFydGVmYWN0OlxyXG4iOwoJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbFQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVFdmlkZW5jZVRhcmdldC5nZXRTZWxlY3Rpb24oKTsKCQlFT2JqZWN0IG9iamVjdFRhcmdldCA9IChFT2JqZWN0KSBzZWxULmdldEZpcnN0RWxlbWVudCgpOwkKCQlBcnRlZmFjdCBhcnRUbzsKCQlpZiAob2JqZWN0VGFyZ2V0IGluc3RhbmNlb2YgQXJ0ZWZhY3QpewoJCQlhcnRUbyA9IChBcnRlZmFjdCkgb2JqZWN0VGFyZ2V0OwoJCQlyZXN1bWUrPSIgICIgKyBhcnRUby5nZXRJZCgpICsgIi0iICsgYXJ0VG8uZ2V0TmFtZSgpICsgICIgaW4gbW9kZWwgIiArIGFydFRvLmNkb1Jlc291cmNlKCkuZ2V0TmFtZSgpICsgIlxyXG4iOwoJCX0KCQkKCQlpbnQgYXggPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyhudWxsLCByZXN1bWUgKyAiRG8geW91IHdhbnQgdG8gY29udGludWU/Iik7CgkJaWYoYXggPT0gSk9wdGlvblBhbmUuT0tfT1BUSU9OKXsJCQkKCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0U2hlbGwoKSwgIkxvbmcgUHJvY2VzcyIsCgkJCQkJIlRoZSByZXVzZSBwcm9jZXNzIGNvdWxkIHRha2Ugc2V2ZXJhbCBtaW51dGVzLiBQbGVhc2UsIGJlIHBhdGllbnQuIik7CgkJfQoJCWVsc2V7CgkJCXJldHVybjsKCQl9CgkJZm9yIChUYWJsZUl0ZW0gcG9zdENvbmRJdGVtOmxpc3RQb3N0Q29uZGl0aW9ucy5nZXRUYWJsZSgpLmdldEl0ZW1zKCkpewoJCQlPYmplY3Qgb25lUENPYmplY3Q9IHBvc3RDb25kSXRlbS5nZXREYXRhKCk7CgkJCWlmKG9uZVBDT2JqZWN0IGluc3RhbmNlb2YgQmFzZWxpbmVFbGVtZW50KXsKCQkJCUJhc2VsaW5lRWxlbWVudCBwb3N0Y29uZD0gKEJhc2VsaW5lRWxlbWVudClvbmVQQ09iamVjdDsKCQkJCXBvc3Rjb25kLnNldElzU2VsZWN0ZWQodHJ1ZSk7CgkJCQlwb3N0Y29uZC5zZXRTZWxlY3Rpb25KdXN0aWZpY2F0aW9uKCJBdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGZvciBiZWluZyBwb3N0Q29uZGl0aW9uIG9mIGEgQ3Jvc3MgRG9tYWluIFJldXNpbmciKTsKCQkJfQoJCX0KCQkKCQlmb3IoT2JqZWN0IG9uZUFydGVmYWN0OnNvdXJjZUFydGVmYWN0cyl7CQkJCgkJCQoJCQlpZiAob25lQXJ0ZWZhY3QgaW5zdGFuY2VvZiBBcnRlZmFjdCl7CgkJCQlBcnRlZmFjdCBhcnRGcm9tID0gKEFydGVmYWN0KSBvbmVBcnRlZmFjdDsKCQkJCUFydGVmYWN0RGVmaW5pdGlvbiBhZEYgPShBcnRlZmFjdERlZmluaXRpb24pYXJ0RnJvbS5lQ29udGFpbmVyKCk7CgkJCQlhbUYgPSAoQXJ0ZWZhY3RNb2RlbCkgYWRGLmVDb250YWluZXIoKTsKCQkJCQoJCQkJQXJ0ZWZhY3RNb2RlbCBhbVQgPW51bGw7CQkJCQkJCQoJCQkJaWYgKG9iamVjdFRhcmdldCBpbnN0YW5jZW9mIEFydGVmYWN0KXsKCQkJCQlhcnRUbyA9IChBcnRlZmFjdCkgb2JqZWN0VGFyZ2V0OwoJCQkJCUFydGVmYWN0RGVmaW5pdGlvbiBhZFQgPShBcnRlZmFjdERlZmluaXRpb24pYXJ0VG8uZUNvbnRhaW5lcigpOwoJCQkJCWFtVCA9IChBcnRlZmFjdE1vZGVsKSBhZFQuZUNvbnRhaW5lcigpOwoJCQkJCQoJCQkJCS8vQ29weSB0aGUgQXJ0ZWZhY3RNb2RlbERhdGEgdG8gZGVzdGluYXRpb24KCQkJCQlhbVQuc2V0SWQoYW1GLmdldElkKCkpOwoJCQkJCWFtVC5zZXROYW1lKGFtRi5nZXROYW1lKCkpOwoJCQkJCWFtVC5zZXRSZXBvTG9jYWxQYXRoKGFtRi5nZXRSZXBvTG9jYWxQYXRoKCkpOwoJCQkJCWFtVC5zZXRSZXBvUGFzc3dvcmQoYW1GLmdldFJlcG9QYXNzd29yZCgpKTsKCQkJCQlhbVQuc2V0UmVwb1VybChhbUYuZ2V0UmVwb1VybCgpKTsKCQkJCQlhbVQuc2V0UmVwb1VzZXIoYW1GLmdldFJlcG9Vc2VyKCkpOwoJCQkJCWFtVC5zZXRSZXBvVXNlc0xvY2FsKGFtRi5pc1JlcG9Vc2VzTG9jYWwoKSk7CgkJCQl9CgkJCQllbHNlewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCQoJCQkJaWYgKGFtRi5pc1JlcG9Vc2VzTG9jYWwoKSkgewoJCQkJCVN0cmluZyBsb2NhbFJlcG8gPSBhbUYuZ2V0UmVwb0xvY2FsUGF0aCgpOwoJCQkJCUZpbGUgcHJvamVjdEZvbGRlcj1uZXcgRmlsZShsb2NhbFJlcG8rIi8iICsgYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXROYW1lKCkpOwoJCQkJCWlmKCFwcm9qZWN0Rm9sZGVyLmV4aXN0cygpKXsJICAgICAgICAgICAJCQkKCQkJCQkJcHJvamVjdEZvbGRlci5ta2RpcigpOwoJCQkgICAgICAgIH0KCQkJCQkKCQkJCQlGaWxlIGFydGVmYWN0TW9kZWxGb2xkZXJQYXRoPW5ldyBGaWxlKHByb2plY3RGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyIvIiArIGFtVC5nZXROYW1lKCkpOwoJCQkJCWlmKCFhcnRlZmFjdE1vZGVsRm9sZGVyUGF0aC5leGlzdHMoKSl7CSAgICAgICAgICAgCQkKCQkJCQkJYXJ0ZWZhY3RNb2RlbEZvbGRlclBhdGgubWtkaXIoKTsKCQkJICAgICAgIH0KCQkJCQkKCQkJCQkKCQkJCQlGaWxlIGFydGVmYWN0RGVmaW5pdGlvbkZvbGRlclBhdGg9bmV3IEZpbGUoYXJ0ZWZhY3RNb2RlbEZvbGRlclBhdGguZ2V0QWJzb2x1dGVQYXRoKCkgKyIvIiArIGFtVC5nZXRBcnRlZmFjdCgpLmdldCgwKS5nZXROYW1lKCkpOwoJCQkJCWlmKCFhcnRlZmFjdERlZmluaXRpb25Gb2xkZXJQYXRoLmV4aXN0cygpKXsJICAgICAgICAgICAJCQoJCQkJCQlhcnRlZmFjdERlZmluaXRpb25Gb2xkZXJQYXRoLm1rZGlyKCk7CgkJCSAgICAgICB9CgkJCQkJCQoJCQkJCUZpbGUgYXJ0ZWZhY3RGb2xkZXJQYXRoPW5ldyBGaWxlKGFydGVmYWN0RGVmaW5pdGlvbkZvbGRlclBhdGguZ2V0QWJzb2x1dGVQYXRoKCkgKyIvIiArIGFydFRvLmdldE5hbWUoKSk7CgkJCQkJaWYoIWFydGVmYWN0Rm9sZGVyUGF0aC5leGlzdHMoKSl7CQkJICAgICAKCQkJCQkJYXJ0ZWZhY3RGb2xkZXJQYXRoLm1rZGlyKCk7CgkJCSAgICAgICAgfQkJCQkJCQkKCQkJCQkJCgkJCQkJZm9yIChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuUmVzb3VyY2UgZnJvbUZpbGUgOiBhcnRGcm9tLmdldFJlc291cmNlKCkpewoJCQkJCQkvL0NvcHkgdGhlIHJlc291cmNlIHRvIHRhcmdldCBhcnRlZmFjdAoJCQkJCQlvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuUmVzb3VyY2UgY29weSA9IGV2aWRlbmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwoJCQkJCQljb3B5LnNldElkKGZyb21GaWxlLmdldElkKCkpOwoJCQkJCQljb3B5LnNldE5hbWUoZnJvbUZpbGUuZ2V0TmFtZSgpKTsKCQkJCQkJY29weS5zZXREZXNjcmlwdGlvbihmcm9tRmlsZS5nZXREZXNjcmlwdGlvbigpKTsKCQkJCQkJY29weS5zZXRGb3JtYXQoZnJvbUZpbGUuZ2V0Rm9ybWF0KCkpOwoJCQkJCQkKCQkJCQkJRmlsZSBmcm9tUmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoZnJvbUZpbGUuZ2V0TG9jYXRpb24oKSk7CgkJCQkJCQoJCQkJCQkvL09idGFpbiBvbmx5IHRoZSBuYW1lIGFuZCBleHRlbnNpb24KCQkJCQkJCgkJCQkJCQoJCQkJCQlGaWxlIGRlc3RpbmF0aW9uUmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoYXJ0ZWZhY3RGb2xkZXJQYXRoICsgIi8iICsgZnJvbVJlc291cmNlRmlsZS5nZXROYW1lKCkpOwoJCQkJCQkKCQkJCQkJaWYoZGVzdGluYXRpb25SZXNvdXJjZUZpbGUuZXhpc3RzKCkpewoJCQkJCQkJYXggPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyhudWxsLCAiUmVzb3VyY2UgZmlsZSAgIiArIGZyb21GaWxlLmdldExvY2F0aW9uKCkgKyIgZXhpc3RzIGluIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0LiBEbyB5b3Ugd2FudCB0byB1cGRhdGUgaXQ/Iik7CgkJCQkJCQlpZihheCA9PSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKXsKCQkJCQkJCQljb3B5RmlsZVVzaW5nU3RyZWFtKGZyb21SZXNvdXJjZUZpbGUsIGRlc3RpbmF0aW9uUmVzb3VyY2VGaWxlKTsKCQkJCQkJCQljb3B5LnNldExvY2F0aW9uKGRlc3RpbmF0aW9uUmVzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCQkJCgkJCQkJCQl9ICAKCQkJCQkJCWVsc2V7CgkJCQkJCQkJY29weS5zZXRMb2NhdGlvbihkZXN0aW5hdGlvblJlc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZXsKCQkJCQkJCWNvcHlGaWxlVXNpbmdTdHJlYW0oZnJvbVJlc291cmNlRmlsZSwgZGVzdGluYXRpb25SZXNvdXJjZUZpbGUpOwoJCQkJCQkJY29weS5zZXRMb2NhdGlvbihkZXN0aW5hdGlvblJlc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CQoJCQkJICAgICAgICB9CQkJCQkJCQkJCQkJCQoJCQkJCQlhcnRUby5nZXRSZXNvdXJjZSgpLmFkZChjb3B5KTsJCQkJCQkJCQoJCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCSAKCQkJCX0KCQkJCWVsc2V7CgkJCQkJTWFpbkNsYXNzIHJlcG9MaWJyYXJ5ID0gbmV3IE1haW5DbGFzcygpOwoJCQkJCXJlcG9MaWJyYXJ5LmNvbm5lY3RSZXBvc2l0b3J5KGFtRi5nZXRSZXBvVXJsKCksIGFtRi5nZXRSZXBvVXNlcigpLCBhbUYuZ2V0UmVwb1Bhc3N3b3JkKCkpOwoJCQkJCQoJCQkJCVN0cmluZyBwcm9qZWN0Rm9sZGVyUGF0aCA9IiI7CgkJCQkJaWYoIXJlcG9MaWJyYXJ5LmV4aXN0c0ZvbGRlclJlcG8oYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXROYW1lKCkpKXsJCQkJCQkJCQkKCQkJCQkJcHJvamVjdEZvbGRlclBhdGggPSByZXBvTGlicmFyeS5hZGRGb2xkZXJUb1JlcG8oIiIsYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXROYW1lKCksICIiKTsKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJcHJvamVjdEZvbGRlclBhdGggPWFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0TmFtZSgpOwoJCQkJCX0KCQkJCQkKCQkJCQlTdHJpbmcgYXJ0ZWZhY3RNb2RlbEZvbGRlclBhdGggPSAiIjsKCQkJCQlpZighcmVwb0xpYnJhcnkuZXhpc3RzRm9sZGVyUmVwbyhwcm9qZWN0Rm9sZGVyUGF0aCsiLyIgKyBhbVQuZ2V0TmFtZSgpKSl7CgkJCQkJCWFydGVmYWN0TW9kZWxGb2xkZXJQYXRoID0gcmVwb0xpYnJhcnkuYWRkRm9sZGVyVG9SZXBvKHByb2plY3RGb2xkZXJQYXRoLGFtVC5nZXROYW1lKCksICIiKTsKCQkJCQkJLy9TdHJpbmcgQXJ0ZWZhY3REZWZGb2xkZXJQYXRoID0gcmVwb0xpYnJhcnkuYWRkRm9sZGVyVG9SZXBvKEFydGVmYWN0TW9kZWxGb2xkZXJQYXRoLGFtLmdldEFydGVmYWN0KCkuZ2V0KDApLmdldE5hbWUoKSwgIiIpOwoJCQkJCX0KCQkJCQllbHNlewoJCQkJCQlhcnRlZmFjdE1vZGVsRm9sZGVyUGF0aCA9cHJvamVjdEZvbGRlclBhdGgrIi8iK2FtVC5nZXROYW1lKCk7CgkJCQkJfQoJCQkJCQkJCgkJCQkJCgkJCQkJU3RyaW5nIGFydGVmYWN0RGVmaW5pdGlvbkZvbGRlclBhdGggPSAiIjsKCQkJCQlpZighcmVwb0xpYnJhcnkuZXhpc3RzRm9sZGVyUmVwbyhhcnRlZmFjdE1vZGVsRm9sZGVyUGF0aCArICIvIiArIGFtVC5nZXRBcnRlZmFjdCgpLmdldCgwKS5nZXROYW1lKCkpKXsKCQkJCQkJYXJ0ZWZhY3REZWZpbml0aW9uRm9sZGVyUGF0aCA9IHJlcG9MaWJyYXJ5LmFkZEZvbGRlclRvUmVwbyhhcnRlZmFjdE1vZGVsRm9sZGVyUGF0aCxhbVQuZ2V0QXJ0ZWZhY3QoKS5nZXQoMCkuZ2V0TmFtZSgpLCAiIik7CgkJCQkJCS8vU3RyaW5nIEFydGVmYWN0RGVmRm9sZGVyUGF0aCA9IHJlcG9MaWJyYXJ5LmFkZEZvbGRlclRvUmVwbyhBcnRlZmFjdE1vZGVsRm9sZGVyUGF0aCxhbS5nZXRBcnRlZmFjdCgpLmdldCgwKS5nZXROYW1lKCksICIiKTsKCQkJCQl9CgkJCQkJZWxzZXsKCQkJCQkJYXJ0ZWZhY3REZWZpbml0aW9uRm9sZGVyUGF0aCA9YXJ0ZWZhY3RNb2RlbEZvbGRlclBhdGgrIi8iK2FtVC5nZXRBcnRlZmFjdCgpLmdldCgwKS5nZXROYW1lKCk7CgkJCQkJfQoJCQkJCQoJCQkJCQkKCQkJCQlTdHJpbmcgYXJ0ZWZhY3RGb2xkZXJQYXRoPSIiOwoJCQkJCWlmKCFyZXBvTGlicmFyeS5leGlzdHNGb2xkZXJSZXBvKGFydGVmYWN0RGVmaW5pdGlvbkZvbGRlclBhdGgrIi8iICsgYXJ0VG8uZ2V0TmFtZSgpKSl7CgkJCQkJCWFydGVmYWN0Rm9sZGVyUGF0aCA9IHJlcG9MaWJyYXJ5LmFkZEZvbGRlclRvUmVwbyhhcnRlZmFjdERlZmluaXRpb25Gb2xkZXJQYXRoLGFydFRvLmdldE5hbWUoKSwgIiIpOwoJCQkJCQkvL1N0cmluZyBBcnRlZmFjdERlZkZvbGRlclBhdGggPSByZXBvTGlicmFyeS5hZGRGb2xkZXJUb1JlcG8oQXJ0ZWZhY3RNb2RlbEZvbGRlclBhdGgsYW0uZ2V0QXJ0ZWZhY3QoKS5nZXQoMCkuZ2V0TmFtZSgpLCAiIik7CgkJCQkJfQoJCQkJCWVsc2V7CgkJCQkJCWFydGVmYWN0Rm9sZGVyUGF0aCA9YXJ0ZWZhY3REZWZpbml0aW9uRm9sZGVyUGF0aCsiLyIgKyBhcnRUby5nZXROYW1lKCk7CgkJCQkJfQkJCQkJCQkJCgkJCQkJCgkJCQkJZm9yIChvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuUmVzb3VyY2UgZnJvbUZpbGUgOiBhcnRGcm9tLmdldFJlc291cmNlKCkpewoJCQkJCQkvL0NvcHkgdGhlIHJlc291cmNlIHRvIHRhcmdldCBhcnRlZmFjdAoJCQkJCQlvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuUmVzb3VyY2UgY29weSA9IGV2aWRlbmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwoJCQkJCQljb3B5LnNldElkKGZyb21GaWxlLmdldElkKCkpOwoJCQkJCQljb3B5LnNldE5hbWUoZnJvbUZpbGUuZ2V0TmFtZSgpKTsKCQkJCQkJY29weS5zZXREZXNjcmlwdGlvbihmcm9tRmlsZS5nZXREZXNjcmlwdGlvbigpKTsKCQkJCQkJY29weS5zZXRGb3JtYXQoZnJvbUZpbGUuZ2V0Rm9ybWF0KCkpOwoJCQkJCQkKCQkJCQkJU3RyaW5nIHJlc291cmNlUGF0aD0gcmVwb0xpYnJhcnkuY29weUZpbGVGcm9tUmVwbyhmcm9tRmlsZS5nZXRMb2NhdGlvbigpLCBhcnRlZmFjdEZvbGRlclBhdGgsIiIpOwoJCQkJCQlpZighcmVzb3VyY2VQYXRoLmVxdWFscygiZXhpc3RzIikpewoJCQkJCQkJY29weS5zZXRMb2NhdGlvbihyZXNvdXJjZVBhdGgpOwoJCQkJCQl9CgkJCQkJCWVsc2V7CgkJCQkJCQlheCA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKG51bGwsICJSZXNvdXJjZSBmaWxlICAiICsgZnJvbUZpbGUuZ2V0TG9jYXRpb24oKSArIiBleGlzdHMgaW4gdGhlIGRlc3RpbmF0aW9uIHByb2plY3QuIERvIHlvdSB3YW50IHRvIHVwZGF0ZSBpdD8iKTsKCQkJCQkJCWlmKGF4ID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pewoJCQkJCQkJCVN0cmluZyByZXN1bHQ9cmVwb0xpYnJhcnkudXBkYXRlRmlsZUZyb21SZXBvKGZyb21GaWxlLmdldExvY2F0aW9uKCksIGFydGVmYWN0Rm9sZGVyUGF0aCwiIik7CgkJCQkJCQkJaWYoIXJlc3VsdC5jb250YWlucygiZXJyb3IiKSl7CgkJCQkJCQkJCWNvcHkuc2V0TG9jYXRpb24ocmVzdWx0KTsJCQkJCQkJCQkKCQkJCQkJCQl9CQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCWVsc2V7CgkJCQkJCQkJY29weS5zZXRMb2NhdGlvbihmcm9tRmlsZS5nZXRMb2NhdGlvbigpKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlhcnRUby5nZXRSZXNvdXJjZSgpLmFkZChjb3B5KTsJCQkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCQkJCQkJCQkJCQkJIAoJCQkJfQoJCQl9CgkJfQoJCQkJCQkJCQkJCQkJCgkJdHJ5IHsKCQkJZm9yKFJlc291cmNlIGV2UmVzIDpldmlkZW5jZVRhcmdldFJlc291cmNlU2V0LmdldFJlc291cmNlcygpKXsKCQkJCUNET1Jlc291cmNlIHNhdlJlcz0gKENET1Jlc291cmNlKWV2UmVzOwoJCQkJc2F2UmVzLnNhdmUob3B0aW9ucyk7CQkJCQoJCQl9CgkJCWZvcihSZXNvdXJjZSBibFJlcyA6YmFzZWxpbmVUYXJnZXRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSl7CgkJCQlDRE9SZXNvdXJjZSBzYXZCTFJlcz0gKENET1Jlc291cmNlKWJsUmVzOwoJCQkJc2F2QkxSZXMuc2F2ZShvcHRpb25zKTsJCQkJCgkJCX0KCQkJCgkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksICJSZXVzZSBzdWNjZXNzIiwgIlNlbGVjdGVkIGFydGVmYWN0cyByZXVzZWQiKTsKCQkJcmV0dXJuOwoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0KCQkKCQkKCQkvL21vZGVsVmlld2VyVGFyZ2V0LmdldENoZWNrZWRFbGVtZW50cygpCgkJLy90aGlzLmdldENvbnRlbnRzKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IobmV3IERpc3BsYXkoKSwgU1dULkFSUk9XKSk7CgkJLy9zdXBlci5va1ByZXNzZWQoKTsKCX0KCglAT3ZlcnJpZGUKCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewkJCgkJLy9SZWZyZXNoIHRoZSBSZXBvc2l0b3J5IGV4cGxvcmVyIHZpZXcKCQlEYXduRXhwbG9yZXIgcmVwb1ZpZXcgPW51bGw7CgkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZmVyZW5jZXNbXSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFZpZXdSZWZlcmVuY2VzKCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3UmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewoJCQlpZiAoIm9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS52aWV3cy5EYXduRXhwbG9yZXIiLmVxdWFscyh2aWV3UmVmZXJlbmNlc1tpXS5nZXRJZCgpKSkgewoJCQkJcmVwb1ZpZXcgPSAoRGF3bkV4cGxvcmVyKXZpZXdSZWZlcmVuY2VzW2ldLmdldFZpZXcoZmFsc2UpOwoJCQkJcmVwb1ZpZXcucmVmcmVzaFZpZXdlcihmYWxzZSk7CgkJCQlicmVhazsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKCX0KCglwcml2YXRlIHZvaWQgY2xlYXJBbGxDb250cm9scygpIHsKCQl0eHRKdXN0aWZpY2F0aW9uLnNldFRleHQoIiIpOwoJCWlkVGV4dC5zZXRUZXh0KCIiKTsKCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsKCQljYlR5cGUuc2VsZWN0KDApOwoJCQoJCWxpc3RQb3N0Q29uZGl0aW9ucy5zZXRJbnB1dChudWxsKTsKCQkKCQlQQ2lkVGV4dC5zZXRUZXh0KCIiKTsKCQlQQ25hbWVUZXh0LnNldFRleHQoIiIpOwoJCVBDdHh0ZGVzY3JpcHRpb24uc2V0VGV4dCgiIik7CgkJCgkJU0NNaWRUZXh0LnNldFRleHQoIiIpOwoJCVNDTW5hbWVUZXh0LnNldFRleHQoIiIpOwoJCVNDTWNiVHlwZS5zZWxlY3QoMCk7CgkJU0NNdHh0SnVzdGlmaWNhdGlvbi5zZXRUZXh0KCIiKTsKCQkKCQlUQ01pZFRleHQuc2V0VGV4dCgiIik7CgkJVENNbmFtZVRleHQuc2V0VGV4dCgiIik7CgkJVENNY2JUeXBlLnNlbGVjdCgwKTsKCQlUQ010eHRKdXN0aWZpY2F0aW9uLnNldFRleHQoIiIpOwoJCQoJCWZvcihUcmVlSXRlbSBncmVlbk5vZGU6bGlzdEdyZWVuSXRlbSl7CQkJCQkJCQoJCQlncmVlbk5vZGUuc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKCQkJZ3JlZW5Ob2RlLnNldEV4cGFuZGVkKGZhbHNlKTsKCQkJZ3JlZW5Ob2RlLnNldENoZWNrZWQoZmFsc2UpOwoJCQlncmVlbk5vZGUuc2V0RXhwYW5kZWQodHJ1ZSk7CgkJfQoJCWxpc3RHcmVlbkl0ZW0uY2xlYXIoKTsKCX0KCgkvKnB1YmxpYyBCb29sZWFuIGdldFJlc3VsdCgpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0qLwkJCQoJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5RmlsZVVzaW5nU3RyZWFtKEZpbGUgc291cmNlLCBGaWxlIGRlc3QpIHsKCSAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CgkgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKCSAgICB0cnkgewoJICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKCSAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKCSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwoJICAgICAgICBpbnQgbGVuZ3RoOwoJICAgICAgICB3aGlsZSAoKGxlbmd0aCA9IGlzLnJlYWQoYnVmZmVyKSkgPiAwKSB7CgkgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CgkgICAgICAgIH0KCSAgICAgICAgaXMuY2xvc2UoKTsKCSAgICAgICAgb3MuY2xvc2UoKTsKCSAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewoJICAgIAkKCSAgICB9CSAgICAJICAgIAoJfQoJCQkKCQp9Cgo=