LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai53aXphcmRzLnVpLndpemFyZHM7DQoNCi8vaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS5jb21wb3NpdGVzLkNET1Jlc291cmNlTm9kZUNob29zZXJDb21wb3NpdGU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnVpLmNvbXBvc2l0ZXMuQ0RPUmVzb3VyY2VOb2RlU2VsZWN0aW9uV2lkZ2V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51dGlsLmNvbm5lY3Rpb24uQ0RPQ29ubmVjdGlvblV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5lcmVzb3VyY2UuQ0RPUmVzb3VyY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5lcmVzb3VyY2UuQ0RPUmVzb3VyY2VOb2RlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uc2Vzc2lvbi5DRE9TZXNzaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udmlldy5DRE9WaWV3Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCg0KDQoNCnB1YmxpYyBjbGFzcyBQcm9qZWN0TmFtZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KDQogIHByaXZhdGUgVGV4dCB0ZXh0TmFtZTsNCg0KICBwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7DQoNCiAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBcmdNb2RlbDsNCiANCiAgcHJpdmF0ZSBDRE9SZXNvdXJjZU5vZGVTZWxlY3Rpb25XaWRnZXQgY2hvb3NlckNvbXBvc2l0ZTsNCg0KICBwcml2YXRlIFN0cmluZyBjZG9Gb2xkZXI9IiI7DQogIA0KICBwdWJsaWMgUHJvamVjdE5hbWUoKSB7DQoNCiAgICBzdXBlcigiQ3JlYXRpb24gb2YgQXNzdXJhbmNlIFByb2plY3QiKTsNCg0KICAgIHNldFRpdGxlKCJDcmVhdGlvbiBvZiBBc3N1cmFuY2UgUHJvamVjdCIpOw0KDQogICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0aW9uIG9mIEFzc3VyYW5jZSBQcm9qZWN0Iik7DQoNCiAgfQ0KDQoNCg0KICBAT3ZlcnJpZGUNCg0KICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCg0KICAgIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQogICAgDQogICAgDQogICAgDQogICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KDQogICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOw0KDQogICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KICAgIA0KICAgIENET1Nlc3Npb24gc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmdldEN1cnJlbnRTZXNzaW9uKCk7DQoJQ0RPVmlldyB2aWV3ID0gc2Vzc2lvbkNETy5vcGVuVmlldygpOw0KCQ0KCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsNCg0KICAgIGxhYmVsMS5zZXRUZXh0KCJTZWxlY3QgUHJvamVjdCBmb2xkZXI6Iik7DQoJDQogICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCg0KICAgIA0KICAgIA0KICAgIGNob29zZXJDb21wb3NpdGUgPSBuZXcgQ0RPUmVzb3VyY2VOb2RlU2VsZWN0aW9uV2lkZ2V0KGNvbnRhaW5lciwgU1dULk5PTkUpOw0KICAgIA0KICAgIGNob29zZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7DQogICAgDQogICAgY2hvb3NlckNvbXBvc2l0ZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQ0KICAgIHsNCiAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQ0KICAgICAgew0KICAgIAkgIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsNCiAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIAljZG9Gb2xkZXI9IiI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VOb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgCWNkb0ZvbGRlcj0gKChDRE9SZXNvdXJjZU5vZGUpZWxlbWVudCkuZ2V0UGF0aCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAJICANCiAgICAJICBpZiAoIXRleHROYW1lLmdldFRleHQoKS5pc0VtcHR5KCkgJiYgY2RvRm9sZGVyIT0gIiIpIHsNCg0KICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQoNCiAgICAgICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgICAJCQ0KICAgIAkJLy9DRE9SZXNvdXJjZU5vZGVDaG9vc2VyQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUsICIiLCB2aWV3KTsNCiAgICBjaG9vc2VyQ29tcG9zaXRlLnNldFNob3dSZXNvdXJjZXMoZmFsc2UpOw0KICAgIC8vY2hvb3NlckNvbXBvc2l0ZS5zZQ0KDQogICAgDQogICAgDQogICAgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOw0KDQogICAgbGFiZWwyLnNldFRleHQoIlByb2plY3QgbmFtZToiKTsNCg0KDQoNCiAgICB0ZXh0TmFtZSA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOw0KDQogICAgdGV4dE5hbWUuc2V0VGV4dCgiIik7DQoNCiAgICB0ZXh0TmFtZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7DQoNCg0KDQogICAgICBAT3ZlcnJpZGUNCg0KICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7DQoNCiAgICAgIH0NCg0KDQoNCiAgICAgIEBPdmVycmlkZQ0KDQogICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7ICAgIAkgICAgIAkgIA0KDQogICAgICAgIGlmICghdGV4dE5hbWUuZ2V0VGV4dCgpLmlzRW1wdHkoKSAmJiBjZG9Gb2xkZXIhPSAiIikgew0KDQogICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOw0KDQogICAgICAgIH0NCg0KICAgICAgfQ0KDQoNCg0KICAgIH0pOw0KDQogICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQoNCiAgICB0ZXh0TmFtZS5zZXRMYXlvdXREYXRhKGdkMik7DQogICAgDQogICAgZ2VuZXJhdGVBcmdNb2RlbD0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7DQogICAgZ2VuZXJhdGVBcmdNb2RlbC5zZXRUZXh0KCJHZW5lcmF0ZSBBcmd1bWVudGF0aW9uIG1vZGVsIGFuZCBkaWFncmFtIik7DQogICAgZ2VuZXJhdGVBcmdNb2RlbC5zZXRTZWxlY3Rpb24oZmFsc2UpOw0KDQogICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsNCiAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7DQogICAgZ2VuZXJhdGVBcmdNb2RlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCiAgICANCiAgICAvLyBSZXF1aXJlZCB0byBhdm9pZCBhbiBlcnJvciBpbiB0aGUgc3lzdGVtDQoNCiAgICBzZXRDb250cm9sKGNvbnRhaW5lcik7DQoNCiAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KDQoNCg0KICB9DQoNCg0KDQogIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCg0KICAgIHJldHVybiB0ZXh0TmFtZS5nZXRUZXh0KCk7DQoNCiAgfQ0KICANCiAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0Rm9sZGVyKCl7DQoJICByZXR1cm4gY2RvRm9sZGVyOw0KICB9DQogIA0KICANCiAgcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVBcmd1bWVudGF0aW9uKCkgew0KDQogICAgcmV0dXJuIGdlbmVyYXRlQXJnTW9kZWwuZ2V0U2VsZWN0aW9uKCk7DQoNCiAgfQ0KDQp9DQog