LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5qZWxseS5hbnQudGFzazsKCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CgovKgoKPHRhc2tkZWYKICAgbmFtZT0ibmVzdGVkIgogICBjbGFzc25hbWU9ImplbGx5YnVnLk5lc3RlZFRhc2siCj4KICAgPGNsYXNzcGF0aD4KICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InNvbWV3aGVyZSIvPgogICA8L2NsYXNzcGF0aD4KPC90YXNrZGVmPgoKPG5lc3RlZD4KICAgPGRpbmcvPgogICA8ZGFuZy8+CiAgIDxkb25nLz4KICAgPGhpcGhvcC8+CiAgIDx3b250c3RvcC8+CiAgIDx0aWxseW91ZHJvcC8+CiAgIDxoaXBIb3AvPgogICA8d29udFN0b3AvPgogICA8dGlsbFlvdURyb3AvPgo8L25lc3RlZD4KCkFudDoKICAgW25lc3RlZF0gYQogICBbbmVzdGVkXSBiCiAgIFtuZXN0ZWRdIGMKICAgW25lc3RlZF0gZAogICBbbmVzdGVkXSBlCiAgIFtuZXN0ZWRdIGYKICAgW25lc3RlZF0gZwogICBbbmVzdGVkXSBoCiAgIFtuZXN0ZWRdIGkKCk1hdmVuL0plbGx5OgphCmIKYwpkCmUKZgpnCmgKaQoKKi8KCi8qKgogKiBBIHNhbXBsZSBUYXNrIHRvIHRlc3Qgb3V0IHRoZSBBbnQgaW50cm9zcGVjdGlvbiBsb2dpYwogKgogKiBAYXV0aG9yIEFzbGFrIEhlbGxlc/h5IChhc2xhay5oZWxsZXNveUBiZWtrLm5vKQogKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAqLwpwdWJsaWMgY2xhc3MgRHVtbXlUYXNrIGV4dGVuZHMgVGFzayB7CiAgICBwcml2YXRlIGludCBpID0gMDsKICAgIHByaXZhdGUgU3RyaW5nW10gbWVzc2FnZXMgPSB7ICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIgfTsKICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKCiAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICBpZiAoIWZvcmNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2hvdWxkIGhhdmUgc2V0IGZvcmNlIHRvIGJlIHRydWUhIik7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBUaGluZ3kgY3JlYXRlRGluZygpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZURpbmc6ICIgKyBtZXNzYWdlc1tpKytdKTsKICAgICAgICByZXR1cm4gbmV3IFRoaW5neSgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGFkZERhbmcoVGhpbmd5IHRoaW5neSkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkRGFuZzogIiArIG1lc3NhZ2VzW2krK10pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWREb25nKFRoaW5neSB0aGluZ3kpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZENvbmZpZ3VyZWREb25nOiAiICsgbWVzc2FnZXNbaSsrXSk7CiAgICB9CgogICAgcHVibGljIFRoaW5neSBjcmVhdGVIaXBIb3AoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVIaXBIb3A6ICIgKyBtZXNzYWdlc1tpKytdKTsKICAgICAgICByZXR1cm4gbmV3IFRoaW5neSgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGFkZFdvbnRTdG9wKFRoaW5neSB0aGluZ3kpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZFdvbnRTdG9wOiAiICsgbWVzc2FnZXNbaSsrXSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFRpbGxZb3VEcm9wKFRoaW5neSB0aGluZ3kpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZENvbmZpZ3VyZWRUaWxsWW91RHJvcDogIiArIG1lc3NhZ2VzW2krK10pOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGlzRm9yY2UoKSB7CiAgICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKICAgICAgICB0aGlzLmZvcmNlID0gZm9yY2U7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaGluZ3kgewogICAgfQp9