cGFja2FnZSBvcmcuZWNsaXBzZS54dGVuZC5saWIuYW5ub3RhdGlvbnMKCmltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5CZXRhCmltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5Hd3RDb21wYXRpYmxlCmltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZQppbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0CmltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uQWJzdHJhY3RDbGFzc1Byb2Nlc3NvcgppbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLkFjdGl2ZQppbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLlRyYW5zZm9ybWF0aW9uQ29udGV4dAppbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLkFubm90YXRpb25SZWZlcmVuY2UKaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbgppbXBvcnQgb3JnLmVjbGlwc2UueHRlbmQubGliLm1hY3JvLmRlY2xhcmF0aW9uLk11dGFibGVDbGFzc0RlY2xhcmF0aW9uCmltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIudXRpbC5Ub1N0cmluZ0J1aWxkZXIKCi8qKgogKiBDcmVhdGVzIGEgZGVmYXVsdCB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nIHRvU3RyaW5nfSBpbXBsZW1lbnRhdGlvbi4gCiAqIAogKiA8cD4KICogQWxsIG5vbi1zdGF0aWMgZmllbGRzIG9mIHRoaXMgY2xhc3MgYW5kIGFsbCBvZiBpdHMgc3VwZXJjbGFzc2VzIGFyZSB1c2VkLgogKiBSZWZsZWN0aW9uIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBmaWVsZHMgaWYgdGhpcyBjbGFzcyBoYXMgYSBzdXBlcmNsYXNzLiBUaGlzIG1heSBub3Qgd29yayBpbiByZXN0cmljdGl2ZSBlbnZpcm9ubWVudHMuIAogKiBGb3Igc3VjaCBjYXNlcyB1c2Uge0BsaW5rIFRvU3RyaW5nQnVpbGRlcn0gdG8gd3JpdGUgYSBub24tcmVmbGVjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KICogPC9wPgogKiBUaGUgZGVmYXVsdCBmb3JtYXQgaXM6CiAqIDxwcmU+CiAqICBDbGFzc05hbWUgWwogKiAgICBmaWVsZDEgPSAiRm9vIgogKiAgICBmaWVsZDIgPSAyCiAqICAgIGZpZWxkMyA9IG51bGwKICogIF0KICogPC9wcmU+CiAqIAogKiBUaGUgY2xhc3MgbmFtZSBpcyBoYXJkY29kZWQuIFN1YmNsYXNzZXMgd2hpY2ggaW5oZXJpdCB0aGlzIGNsYXNzIHdpdGhvdXQgb3ZlcnJpZGluZyA8Y29kZT50b1N0cmluZzwvY29kZT4gd2lsbCBzaG93IHRoZSBzYW1lIG5hbWUuCiAqIAogKiA8L3A+CiAqIDxwPgogKiBGb3IgYnJldml0eSB0aGVyZSBhcmUgb3B0aW9ucyB0byBoaWRlIGZpZWxkIG5hbWVzLCBza2lwIGZpZWxkcyB3aXRoIG51bGwgdmFsdWVzIGFuZCBwcmludCBldmVyeXRoaW5nIG9uIG9uZSBsaW5lLgogKiA8L3A+CiAqIEBzaW5jZSAyLjcKICovCkBCZXRhCkBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKQEFjdGl2ZShUb1N0cmluZ1Byb2Nlc3NvcikKQEd3dENvbXBhdGlibGUKYW5ub3RhdGlvbiBUb1N0cmluZyB7CgkvKioKCSAqIEZpZWxkcyB3aXRoIG51bGwgdmFsdWVzIGFyZSBub3Qgc2hvd24gaW4gdGhlIG91dHB1dC4KCSAqLwoJdmFsIHNraXBOdWxscyA9IGZhbHNlCgkvKioKCSAqIFNlcGVyYXRlIGZpZWxkcyB3aXRoIGEgY29tbWEgYW5kIGEgc2luZ2xlIHNwYWNlCgkgKi8KCXZhbCBzaW5nbGVMaW5lID0gZmFsc2UKCS8qKgoJICogT25seSBsaXN0IHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkcywgbm90IHRoZWlyIG5hbWVzCgkgKi8KCXZhbCBoaWRlRmllbGROYW1lcyA9IGZhbHNlCgoJLyoqCgkgKiBCeSBkZWZhdWx0LCBJdGVyYWJsZXMsIEFycmF5cyBhbmQgbXVsdGlsaW5lIFN0cmluZ3MgYXJlIHByZXR0eS1wcmludGVkLgoJICogU3dpdGNoaW5nIHRvIHRoZWlyIG5vcm1hbCByZXByZXNlbnRhdGlvbiBtYWtlcyB0aGUgdG9TdHJpbmcgbWV0aG9kIHNpZ25pZmljYW50bHkgZmFzdGVyLgoJICogQHNpbmNlIDIuOQoJICovCgl2YWwgdmVyYmF0aW1WYWx1ZXMgPSBmYWxzZQp9CgovKioKICogQHNpbmNlIDIuNwogKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgogKiBAbm9yZWZlcmVuY2UgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgogKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KICovCkBCZXRhCmNsYXNzIFRvU3RyaW5nQ29uZmlndXJhdGlvbiB7Cgl2YWwgYm9vbGVhbiBza2lwTnVsbHMKCXZhbCBib29sZWFuIHNpbmdsZUxpbmUKCXZhbCBib29sZWFuIGhpZGVGaWVsZE5hbWVzCgl2YWwgYm9vbGVhbiB2ZXJiYXRpbVZhbHVlcwoKCW5ldygpIHsKCQl0aGlzKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKQoJfQoKCW5ldyhib29sZWFuIHNraXBOdWxscywgYm9vbGVhbiBzaW5nbGVMaW5lLCBib29sZWFuIGhpZGVGaWVsZE5hbWVzLCBib29sZWFuIHZlcmJhdGltVmFsdWVzKSB7CgkJdGhpcy5za2lwTnVsbHMgPSBza2lwTnVsbHMKCQl0aGlzLnNpbmdsZUxpbmUgPSBzaW5nbGVMaW5lCgkJdGhpcy5oaWRlRmllbGROYW1lcyA9IGhpZGVGaWVsZE5hbWVzCgkJdGhpcy52ZXJiYXRpbVZhbHVlcyA9IHZlcmJhdGltVmFsdWVzCgl9CgoJbmV3KEFubm90YXRpb25SZWZlcmVuY2UgYW5ub3RhdGlvbikgewoJCXRoaXMuc2tpcE51bGxzID0gYW5ub3RhdGlvbi5nZXRCb29sZWFuVmFsdWUoInNraXBOdWxscyIpCgkJdGhpcy5zaW5nbGVMaW5lID0gYW5ub3RhdGlvbi5nZXRCb29sZWFuVmFsdWUoInNpbmdsZUxpbmUiKQoJCXRoaXMuaGlkZUZpZWxkTmFtZXMgPSBhbm5vdGF0aW9uLmdldEJvb2xlYW5WYWx1ZSgiaGlkZUZpZWxkTmFtZXMiKQoJCXRoaXMudmVyYmF0aW1WYWx1ZXMgPSBhbm5vdGF0aW9uLmdldEJvb2xlYW5WYWx1ZSgidmVyYmF0aW1WYWx1ZXMiKQoJfQoKCWRlZiBpc1NraXBOdWxscygpIHsKCQlza2lwTnVsbHMKCX0KCglkZWYgaXNTaW5nbGVMaW5lKCkgewoJCXNpbmdsZUxpbmUKCX0KCglkZWYgaXNIaWRlRmllbGROYW1lcygpIHsKCQloaWRlRmllbGROYW1lcwoJfQoKCWRlZiBpc1ZlcmJhdGltVmFsdWVzKCkgewoJCXZlcmJhdGltVmFsdWVzCgl9Cn0KCi8qKgogKiBAc2luY2UgMi43CiAqIEBub2V4dGVuZAogKiBAbm9yZWZlcmVuY2UKICovCkBCZXRhCmNsYXNzIFRvU3RyaW5nUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDbGFzc1Byb2Nlc3NvciB7CgoJb3ZlcnJpZGUgZG9UcmFuc2Zvcm0oTXV0YWJsZUNsYXNzRGVjbGFyYXRpb24gaXQsIGV4dGVuc2lvbiBUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgewoJCWlmIChmaW5kQW5ub3RhdGlvbihEYXRhLmZpbmRUeXBlR2xvYmFsbHkpICE9PSBudWxsKSB7CgkJCXJldHVybgoJCX0KCQl2YWwgZXh0ZW5zaW9uIHV0aWwgPSBuZXcgVG9TdHJpbmdQcm9jZXNzb3IuVXRpbChjb250ZXh0KQoJCXZhbCBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24oVG9TdHJpbmcuZmluZFR5cGVHbG9iYWxseSkKCQl2YWwgY29uZmlndXJhdGlvbiA9IG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oYW5ub3RhdGlvbikKCQlpZiAoaGFzVG9TdHJpbmcpIHsKCQkJYW5ub3RhdGlvbi5hZGRXYXJuaW5nKCJ0b1N0cmluZyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoaXMgYW5ub3RhdGlvbiBoYXMgbm8gZWZmZWN0LiIpCgkJfSBlbHNlIGlmIChleHRlbmRlZENsYXNzICE9IG9iamVjdCkgewoJCQlhZGRSZWZsZWN0aXZlVG9TdHJpbmcoY29uZmlndXJhdGlvbikKCQl9IGVsc2UgewoJCQlhZGRUb1N0cmluZyhkZWNsYXJlZEZpZWxkcy5maWx0ZXJbdGhlUHJpbWFyeUdlbmVyYXRlZEphdmFFbGVtZW50ICYmICEgc3RhdGljICYmICF0cmFuc2llbnRdLCBjb25maWd1cmF0aW9uKQoJCX0KCX0KCgkvKioKCSAqIEBzaW5jZSAyLjcKCSAqIEBub2V4dGVuZAoJICogQG5vcmVmZXJlbmNlCgkgKi8KCUBCZXRhCglzdGF0aWMgY2xhc3MgVXRpbCB7CgkJZXh0ZW5zaW9uIFRyYW5zZm9ybWF0aW9uQ29udGV4dCBjb250ZXh0CgoJCW5ldyhUcmFuc2Zvcm1hdGlvbkNvbnRleHQgY29udGV4dCkgewoJCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0CgkJfQoKCQlkZWYgaGFzVG9TdHJpbmcoQ2xhc3NEZWNsYXJhdGlvbiBpdCkgewoJCQlmaW5kRGVjbGFyZWRNZXRob2QoInRvU3RyaW5nIikgIT09IG51bGwKCQl9CgoJCWRlZiBnZXRUb1N0cmluZ0NvbmZpZyhDbGFzc0RlY2xhcmF0aW9uIGl0KSB7CgkJCXZhbCBhbm5vID0gZmluZEFubm90YXRpb24oVG9TdHJpbmcuZmluZFR5cGVHbG9iYWxseSkKCQkJaWYoYW5ubyA9PT0gbnVsbCkgbnVsbCBlbHNlIG5ldyBUb1N0cmluZ0NvbmZpZ3VyYXRpb24oYW5ubykKCQl9CgoJCWRlZiB2b2lkIGFkZFJlZmxlY3RpdmVUb1N0cmluZyhNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBjbHMsIFRvU3RyaW5nQ29uZmlndXJhdGlvbiBjb25maWcpIHsKCQkJY2xzLmFkZE1ldGhvZCgidG9TdHJpbmciKSBbCgkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGNscy5wcmltYXJ5U291cmNlRWxlbWVudAoJCQkJcmV0dXJuVHlwZSA9IHN0cmluZwoJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlKSkKCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShQdXJlKSkKCQkJCWJvZHkgPSAnJycKCQkJCQlyZXR1cm4gbmV3IKtUb1N0cmluZ0J1aWxkZXK7KHRoaXMpCgkJCQkJCS5hZGRBbGxGaWVsZHMoKQoJCQkJCQmrSUYgY29uZmlnLnNraXBOdWxsc7suc2tpcE51bGxzKCmrRU5ESUa7CgkJCQkJCatJRiBjb25maWcuc2luZ2xlTGluZbsuc2luZ2xlTGluZSgpq0VORElGuwoJCQkJCQmrSUYgY29uZmlnLmhpZGVGaWVsZE5hbWVzuy5oaWRlRmllbGROYW1lcygpq0VORElGuwoJCQkJCQmrSUYgY29uZmlnLnZlcmJhdGltVmFsdWVzuy52ZXJiYXRpbVZhbHVlcygpq0VORElGuwoJCQkJCQkudG9TdHJpbmcoKTsKCQkJCScnJwoJCQldCgkJfQoKCQlkZWYgdm9pZCBhZGRUb1N0cmluZyhNdXRhYmxlQ2xhc3NEZWNsYXJhdGlvbiBjbHMsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBGaWVsZERlY2xhcmF0aW9uPiBmaWVsZHMsCgkJCVRvU3RyaW5nQ29uZmlndXJhdGlvbiBjb25maWcpIHsKCQkJY2xzLmFkZE1ldGhvZCgidG9TdHJpbmciKSBbCgkJCQlwcmltYXJ5U291cmNlRWxlbWVudCA9IGNscy5wcmltYXJ5U291cmNlRWxlbWVudAoJCQkJcmV0dXJuVHlwZSA9IHN0cmluZwoJCQkJYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uUmVmZXJlbmNlKE92ZXJyaWRlKSkKCQkJCWFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvblJlZmVyZW5jZShQdXJlKSkKCQkJCWJvZHkgPSAnJycKCQkJCQmrVG9TdHJpbmdCdWlsZGVyuyBiID0gbmV3IKtUb1N0cmluZ0J1aWxkZXK7KHRoaXMpOwoJCQkJCatJRiBjb25maWcuc2tpcE51bGxzu2Iuc2tpcE51bGxzKCk7q0VORElGuwoJCQkJCatJRiBjb25maWcuc2luZ2xlTGluZbtiLnNpbmdsZUxpbmUoKTurRU5ESUa7CgkJCQkJq0lGIGNvbmZpZy5oaWRlRmllbGROYW1lc7tiLmhpZGVGaWVsZE5hbWVzKCk7q0VORElGuwoJCQkJCatJRiBjb25maWcudmVyYmF0aW1WYWx1ZXO7Yi52ZXJiYXRpbVZhbHVlcygpO6tFTkRJRrsKCQkJCQmrRk9SIGZpZWxkIDogZmllbGRzuwoJCQkJCQliLmFkZCgiq2ZpZWxkLnNpbXBsZU5hbWW7IiwgdGhpcy6rZmllbGQuc2ltcGxlTmFtZbspOwoJCQkJCatFTkRGT1K7CgkJCQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKCQkJCScnJwoJCQldCgkJfQoJfQp9Cg==