cGFja2FnZSBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubWV0cmljcy5nZW5lcmF0b3IudWk7CgppbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm1ldHJpY3MuY29yZS5NZXRyaWM7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubWV0cmljcy5tYW5hZ2Vycy5NZXRyaWNNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwoKcHVibGljIGNsYXNzIENvbXBvc2l0ZURhdGFXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubWV0cmljcy5Db21wb3NpdGVEYXRhV2l6YXJkUGFnZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiTmV3IE1ldHJpYzogQ29tcG9zaXRlIERhdGEiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIlBsZWFzZSBzcGVjaWZ5IHR3byBpbnB1dCBtZXRyaWNzIGFuZCBhIGpvaW4gb3BlcmF0aW9uICIgKwoJCQkiZm9yIHRoZSBuZXcgbWV0cmljLiBSZXF1aXJlZCBmaWVsZHMgYXJlIGRlbm90ZWQgYnkgXCIoKilcIi4iOwoJcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXI7Cglwcml2YXRlIFRhYmxlIGZpcnN0TWV0cmljVGFibGUsIHNlY29uZE1ldHJpY1RhYmxlOwoJcHJpdmF0ZSBUYWJsZUl0ZW1zTWFwcGluZyBmaXJzdFRhYmxlTWFwcGluZywgc2Vjb25kVGFibGVNYXBwaW5nOwoJcHJpdmF0ZSBDb21ibyBvcGVyYXRpb25Db21ibzsKCXByaXZhdGUgTWV0cmljIGZpcnN0TWV0cmljID0gbnVsbCwgc2Vjb25kTWV0cmljID0gbnVsbDsKCXByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbjsKCQkJCglwdWJsaWMgTWV0cmljIGdldEZpcnN0TWV0cmljKCkgewoJCXJldHVybiBmaXJzdE1ldHJpYzsKCX0KCglwdWJsaWMgTWV0cmljIGdldFNlY29uZE1ldHJpYygpIHsKCQlyZXR1cm4gc2Vjb25kTWV0cmljOwoJfQoKCXB1YmxpYyBDb21wb3NpdGVEYXRhV2l6YXJkUGFnZSgpIHsKCQlzdXBlcihQQUdFX05BTUUpOwoJCXNldFRpdGxlKFRJVExFKTsKCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Cgl9CgoJcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCl7CgkJcmV0dXJuIG9wZXJhdGlvbjsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7CgkJcmV0dXJuIG51bGw7Cgl9CgoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKCQlNZXRyaWNNYW5hZ2VyLmdldEluc3RhbmNlKCk7CgkJZmlyc3RUYWJsZU1hcHBpbmcgPSBuZXcgVGFibGVJdGVtc01hcHBpbmcoTWV0cmljTWFuYWdlci5nZXRBbGxNZXRyaWNzKCkpOwoJCXNlY29uZFRhYmxlTWFwcGluZyA9IG5ldyBUYWJsZUl0ZW1zTWFwcGluZyhNZXRyaWNNYW5hZ2VyLmdldEFsbE1ldHJpY3MoKSk7CgkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CgkJZmluYWwgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5udW1Db2x1bW5zID0gMjsKCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7CgkJc2V0Q29udHJvbChjb250YWluZXIpOwoJCWNyZWF0ZUNvbnRlbnQoY29udGFpbmVyKTsKCQlmaWxsVGFibGVzKCk7CgkJZmlsbE9wZXJhdGlvbk5hbWVzKCk7CgkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJfQoKCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBjb250YWluZXIpIHsKCQlUYWJsZUNvbHVtbiBjb2w7CgkJR3JpZERhdGEgZ3JpZERhdGE7CgkJR3JvdXAgZ3JvdXA7CgkJR3JpZExheW91dCBsYXlvdXQ7CgkJLy8gLSBGaXJzdCBNZXRyaWMgLQoJCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwoJCWdyb3VwLnNldFRleHQoIkZpcnN0IG1ldHJpYyIpOwoJICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwoJICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwoJICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJICAgIGdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwoJCWZpcnN0TWV0cmljVGFibGUgPSBuZXcgVGFibGUoZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5TSU5HTEUKCQkJCSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwoJCWZpcnN0TWV0cmljVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKCQlmaXJzdE1ldHJpY1RhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBNZXRyaWNUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKAoJCQkJZmlyc3RNZXRyaWNUYWJsZSkpOwoJICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKCSAgICBncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7CgkJZmlyc3RNZXRyaWNUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKCQljb2wgPSBuZXcgVGFibGVDb2x1bW4oZmlyc3RNZXRyaWNUYWJsZSwgU1dULkNFTlRFUiB8IFNXVC5SRUFEX09OTFkpOwoJCWNvbC5zZXRUZXh0KCJTZWxlY3RlZCIpOwoJCWNvbC5zZXRXaWR0aCg2MCk7CgkJY29sID0gbmV3IFRhYmxlQ29sdW1uKGZpcnN0TWV0cmljVGFibGUsIFNXVC5MRUZUIHwgU1dULlJFQURfT05MWSk7CgkJY29sLnNldFRleHQoIk5hbWUiKTsKCQljb2wuc2V0V2lkdGgoMTAwKTsKCQljb2wgPSBuZXcgVGFibGVDb2x1bW4oZmlyc3RNZXRyaWNUYWJsZSwgU1dULkxFRlQgfCBTV1QuUkVBRF9PTkxZKTsKCQljb2wuc2V0VGV4dCgiRGVzY3JpcHRpb24iKTsKCQljb2wuc2V0V2lkdGgoMjAwKTsKCQkKCQkvLyAtIE9wZXJhdGlvbiAtCgkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7CgkJZ3JvdXAuc2V0VGV4dCgiT3BlcmF0aW9uIik7CgkgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkgICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CgkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKCSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CgkgICAgb3BlcmF0aW9uQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SRUFEX09OTFkpOwoJICAgIG9wZXJhdGlvbkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwoJICAgIG9wZXJhdGlvbkNvbWJvLnNldFRleHQoIlNlbGVjdCBvcGVyYXRpb24iKTsKCSAgICBvcGVyYXRpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoJCQkJc2V0T3BlcmF0aW9uTmFtZSgoKENvbWJvKWUuZ2V0U291cmNlKCkpLmdldFRleHQoKSk7CgkJCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKCQkJfQoJCX0pOwoJICAgIAoJIC8vIC0gU2Vjb25kIE1ldHJpYyAtCgkgCQlncm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKCSAJCWdyb3VwLnNldFRleHQoIlNlY29uZCBtZXRyaWMiKTsKCSAJICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CgkgCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7CgkgCSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKCSAJICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CgkgCSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkgCSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKCSAJCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihncm91cCwgU1dULkNIRUNLICB8IFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMKTsKCSAJICAgIHNlY29uZE1ldHJpY1RhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7CgkgCQlzZWNvbmRNZXRyaWNUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwoJIAkJc2Vjb25kTWV0cmljVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IE1ldHJpY1RhYmxlU2VsZWN0aW9uTGlzdGVuZXIoCgkgCQkJCQkJc2Vjb25kTWV0cmljVGFibGUpKTsKCSAJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkgCSAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwoJIAkgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwoJIAkJc2Vjb25kTWV0cmljVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CgkgCQljb2wgPSBuZXcgVGFibGVDb2x1bW4oc2Vjb25kTWV0cmljVGFibGUsIFNXVC5DRU5URVIgfCBTV1QuUkVBRF9PTkxZKTsKCSAJCWNvbC5zZXRUZXh0KCJTZWxlY3RlZCIpOwoJIAkJY29sLnNldFdpZHRoKDYwKTsKCSAJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihzZWNvbmRNZXRyaWNUYWJsZSwgU1dULkxFRlQgfCBTV1QuUkVBRF9PTkxZKTsKCSAJCWNvbC5zZXRUZXh0KCJOYW1lIik7CgkgCQljb2wuc2V0V2lkdGgoMTAwKTsKCSAJCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihzZWNvbmRNZXRyaWNUYWJsZSwgU1dULkxFRlQgfCBTV1QuUkVBRF9PTkxZKTsKCSAJCWNvbC5zZXRUZXh0KCJEZXNjcmlwdGlvbiIpOwoJIAkJY29sLnNldFdpZHRoKDIwMCk7Cgl9CgkKCXByb3RlY3RlZCB2b2lkIGZpbGxUYWJsZXMoKXsKCQlTdHJpbmcgbWV0YW1vZGVsID0gKChOZXdNZXRyaWNXaXphcmRDb21wb3NpdGUpZ2V0V2l6YXJkKCkpLmdldE1ldGFtb2RlbCgpOwoJCVN0cmluZyBjb250ZXh0ID0gKChOZXdNZXRyaWNXaXphcmRDb21wb3NpdGUpZ2V0V2l6YXJkKCkpLmdldENvbnRleHQoKSA7CgkJU3lzdGVtLm91dC5wcmludGxuKCJmaWxsaW5nIHRhYmxlcyBmb3IgbWV0YW1vZGVsOiIrbWV0YW1vZGVsKyIgY29udGV4dDoiK2NvbnRleHQpOwoJCWZpcnN0TWV0cmljVGFibGUucmVtb3ZlQWxsKCk7CgkJc2Vjb25kTWV0cmljVGFibGUucmVtb3ZlQWxsKCk7CgkJTGlua2VkTGlzdDxNZXRyaWM+IG1ldHJpY3MgPSBNZXRyaWNNYW5hZ2VyLmdldEZpbHRlcmVkTWV0cmljcyhtZXRhbW9kZWwsIGNvbnRleHQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQ6IittZXRyaWNzLnNpemUoKSsiIG1ldHJpY3MiKTsgCgkJVGFibGVJdGVtIGl0ZW07CgkJZm9yIChNZXRyaWMgbWV0cmljIDogbWV0cmljcykgewoJCQlpdGVtID0gbmV3IFRhYmxlSXRlbShmaXJzdE1ldHJpY1RhYmxlLCBTV1QuTk9ORSk7CgkJCWl0ZW0uc2V0VGV4dCgxLCBtZXRyaWMuZ2V0TmFtZSgpKTsKCQkJaXRlbS5zZXRUZXh0KDIsIG1ldHJpYy5nZXREZXNjcmlwdGlvbigpKTsKCQkJaXRlbS5zZXRUZXh0KDMsIG1ldHJpYy5nZXRDb250ZXh0KCkpOwoJCQlmaXJzdFRhYmxlTWFwcGluZy5zZXRJdGVtRm9yTWV0cmljKG1ldHJpYywgaXRlbSk7CgkJCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHNlY29uZE1ldHJpY1RhYmxlLCBTV1QuTk9ORSk7CgkJCWl0ZW0uc2V0VGV4dCgxLCBtZXRyaWMuZ2V0TmFtZSgpKTsKCQkJaXRlbS5zZXRUZXh0KDIsIG1ldHJpYy5nZXREZXNjcmlwdGlvbigpKTsKCQkJaXRlbS5zZXRUZXh0KDMsIG1ldHJpYy5nZXRDb250ZXh0KCkpOwoJCQlzZWNvbmRUYWJsZU1hcHBpbmcuc2V0SXRlbUZvck1ldHJpYyhtZXRyaWMsIGl0ZW0pOwoJCX0KCX0KCglwcml2YXRlIHZvaWQgZmlsbE9wZXJhdGlvbk5hbWVzKCl7CgkJU3RyaW5nW10gb3BlcmF0aW9uTmFtZXMgPSBNZXRyaWNNYW5hZ2VyLmdldE9wZXJhdGlvbk5hbWVzKCk7CgkJZm9yKFN0cmluZyBuYW1lIDogb3BlcmF0aW9uTmFtZXMpCgkJCW9wZXJhdGlvbkNvbWJvLmFkZChuYW1lKTsKCX0KCQoJLyoqCgkgKiBXaXJkIGplZGVzIG1hbCBhdXNnZWb8aHIgd2VubiBzaWNoIGRlciBJbmhhbHQgZWluZXMgVGV4dGZlbGRlcyBpbSBXaXphcmQKCSAqIHZlcuRuZGVydC4g3GJlcnBy/GZ0IGRpZSBpbmhhbHRlIGRlciBUZXh0ZmVsZGVyIHVuZCBlcnpldWd0CgkgKiBlbnRzY2hwcmVjaGVuZGUgTWVsZHVuZ2VuIGltIFdpemFyZGZlbnN0ZXIuCgkgKi8KCXByaXZhdGUgdm9pZCB1cGRhdGVQYWdlQ29tcGxldGUoKSB7CgkJdGhpcy5maXJzdE1ldHJpYyA9IGdldFNlbGVjdGVkTWV0cmljKHRoaXMuZmlyc3RUYWJsZU1hcHBpbmcpOwoJCXRoaXMuc2Vjb25kTWV0cmljID0gZ2V0U2VsZWN0ZWRNZXRyaWModGhpcy5zZWNvbmRUYWJsZU1hcHBpbmcpOwoJCWlmICh0aGlzLmZpcnN0TWV0cmljID09IG51bGwpIHsKCQkJc2V0TWVzc2FnZSgiRmlyc3QgTWV0cmljIGlzIG5vdCBzZWxlY3RlZCIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CgkJfSBlbHNlIGlmICh0aGlzLnNlY29uZE1ldHJpYyA9PSBudWxsKSB7CgkJCXNldE1lc3NhZ2UoIlNlY29uZCBNZXRyaWMgaXMgbm90IHNlbGVjdGVkIiwgRVJST1IpOwoJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CgkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKCQl9IGVsc2UgaWYgKCEodGhpcy5vcGVyYXRpb25Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpID49IDApKSB7CgkJCXNldE1lc3NhZ2UoIkpvaW4gb3BlcmF0aW9uIGlzIG5vdCBzZWxlY3RlZCIsIEVSUk9SKTsKCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwoJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CgkJfSBlbHNlIHsKCQkJc2V0TWVzc2FnZSgiIik7CgkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwoJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CgkJfQoJfQoKCXByaXZhdGUgdm9pZCBzZXRPcGVyYXRpb25OYW1lKFN0cmluZyBuYW1lKXsKCQlvcGVyYXRpb24gPSBuYW1lOwoJfQoJCglwcml2YXRlIE1ldHJpYyBnZXRTZWxlY3RlZE1ldHJpYyhUYWJsZUl0ZW1zTWFwcGluZyBtYXBwaW5nKSB7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nLmdldFNpemUoKTsgaSsrKSB7CgkJCWlmKG1hcHBpbmcuZ2V0VGFibGVJdGVtKGkpIT1udWxsKQoJCQkJaWYgKG1hcHBpbmcuZ2V0VGFibGVJdGVtKGkpLmdldENoZWNrZWQoKSkgewoJCQkJCXJldHVybiBtYXBwaW5nLmdldE1ldHJpYyhpKTsKCQkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXByaXZhdGUgY2xhc3MgTWV0cmljVGFibGVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKCgkJVGFibGUgdGFibGU7CgoJCU1ldHJpY1RhYmxlU2VsZWN0aW9uTGlzdGVuZXIoVGFibGUgdGFibGUpIHsKCQkJdGhpcy50YWJsZSA9IHRhYmxlOwoJCX0KCgkJQE92ZXJyaWRlCgkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoJCQlmb3IgKFRhYmxlSXRlbSBpdGVtIDogdGFibGUuZ2V0SXRlbXMoKSkgewoJCQkJaXRlbS5zZXRDaGVja2VkKGZhbHNlKTsKCQkJfQoJCQkoKFRhYmxlSXRlbSkgZS5pdGVtKS5zZXRDaGVja2VkKHRydWUpOwoJCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKCQl9CgoJCUBPdmVycmlkZQoJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQoKCX0KCn0K