ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9nZW5lcmF0b3IvYWN0aW9uL1JlZmFjdG9yaW5nR2VuZXJhdG9yQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvZ2VuZXJhdG9yL2FjdGlvbi9SZWZhY3RvcmluZ0dlbmVyYXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI5OTJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9nZW5lcmF0b3IvYWN0aW9uL1JlZmFjdG9yaW5nR2VuZXJhdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSBQaGlsaXBwcyBVbml2ZXJzaXR5IG9mIE1hcmJ1cmcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLSAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFBoaWxpcHBzIFVuaXZlcnNpdHkgb2YgTWFyYnVyZyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5nZW5lcmF0b3IuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci51aS5OZXdSZWZhY3RvcmluZ1dpemFyZEphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBDbGFzcyBmb3IgdHJpZ2dlcmluZyB0aGUgbW9kZWwgcmVmYWN0b3JpbmcgZ2VuZXJhdGlvbiBwcm9jZXNzLgotICogQGdlbmVyYXRlZCBOT1QKLSAqIEBhdXRob3IgVGhvcnN0ZW4gQXJlbmR0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWZhY3RvcmluZ0dlbmVyYXRvckFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JCi0JLyoqCi0JICogU2VsZWN0ZWQgZWxlbWVudHMgb24gdGhlIGFjdGl2ZSBwYXJ0LgotCSAqLwotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247CQotCQotCS8qKgotCSAqIEFjdGl2ZSBwYXJ0IG9mIHRoZSB3b3JrYmVuY2guCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdHZW5lcmF0b3JBY3Rpb24oKSB7fQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuCi0JICogKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJRU9iamVjdCBzZWxlY3RlZEVPYmplY3QgPSAoRU9iamVjdCkgc3MuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCVNoZWxsIHNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIHdpemFyZCA9IG5ldyBXaXphcmREaWFsb2cKLQkJCQkJCQkoc2hlbGwsIG5ldyBOZXdSZWZhY3RvcmluZ1dpemFyZEphdmEoc2VsZWN0ZWRFT2JqZWN0KSk7Ci0JCXdpemFyZC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqIChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQKLQkgKiAob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL0FjdGl2YXRvci5qYXZhCmluZGV4IGY4NDQ2MWUuLjNiYTQ2NjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvQWN0aXZhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci9BY3RpdmF0b3IuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmdlbmVyYXRvciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IiOwogCiAJLyoqCiAJICogQGdlbmVyYXRlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci9jb3JlL1JlZmFjdG9yaW5nSW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci9jb3JlL1JlZmFjdG9yaW5nSW5mby5qYXZhCmluZGV4IGZhNzhlNWUuLmRkMGFjZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvY29yZS9SZWZhY3RvcmluZ0luZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL2NvcmUvUmVmYWN0b3JpbmdJbmZvLmphdmEKQEAgLTMzMCw3ICszMzAsNyBAQAogCSAqIGhhcyB0byBiZSBnZW5lcmF0ZWQgZm9yLgogCSAqLwogCXB1YmxpYyB2b2lkIHNldE1ldGFNb2RlbE5hbWUoU3RyaW5nIG1ldGFNb2RlbE5hbWUpIHsKLQkJdGhpcy5tZXRhTW9kZWxOYW1lID0gYnVpbGRNZXRhTW9kZWxOYW1lKG1ldGFNb2RlbE5hbWUpOworCQl0aGlzLm1ldGFNb2RlbE5hbWUgPSBtZXRhTW9kZWxOYW1lOwogCX0KIAkgCiAJLyoqCkBAIC0zNTUsNCArMzU1LDE5IEBACiAJcHVibGljIGludCBnZXROdW1iZXJPZlRlc3RzKCl7CiAJCXJldHVybiBudW1iZXJPZlRlc3RzOwogCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiUmVmYWN0b3JpbmdJbmZvIFtwcm9qZWN0TmFtZT0iICsgcHJvamVjdE5hbWUKKwkJCQkrICIsIHJlZmFjdG9yaW5nSWQ9IiArIHJlZmFjdG9yaW5nSWQgKyAiLCBtZW51TGFiZWw9IgorCQkJCSsgbWVudUxhYmVsICsgIiwgbmFtZXNwYWNlVXJpPSIgKyBuYW1lc3BhY2VVcmkKKwkJCQkrICIsIHNlbGVjdGVkRU9iamVjdENsYXNzPSIgKyBzZWxlY3RlZEVPYmplY3RDbGFzcworCQkJCSsgIiwgc2VsZWN0ZWRFT2JqZWN0SmFyPSIgKyBzZWxlY3RlZEVPYmplY3RKYXIKKwkJCQkrICIsIGNvbnRyb2xsZXI9IiArIGNvbnRyb2xsZXIgKyAiLCBndWlIYW5kbGVyPSIgKyBndWlIYW5kbGVyCisJCQkJKyAiLCBwYXJhbWV0ZXJzPSIgKyBwYXJhbWV0ZXJzICsgIiwgcGFja2FnZU5hbWU9IiArIHBhY2thZ2VOYW1lCisJCQkJKyAiLCBuYW1lc3BhY2VQcmVmaXg9IiArIG5hbWVzcGFjZVByZWZpeCArICIsIG1ldGFNb2RlbE5hbWU9IgorCQkJCSsgbWV0YU1vZGVsTmFtZSArICIsIG51bWJlck9mVGVzdHM9IiArIG51bWJlck9mVGVzdHMgKyAiXSI7CisJfQorCQorCQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci9pbnRlcmZhY2VzL0lOZXdSZWZhY3RvcmluZ1dpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci9pbnRlcmZhY2VzL0lOZXdSZWZhY3RvcmluZ1dpemFyZC5qYXZhCmluZGV4IDFhMjJiODYuLjA5M2Q1ZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvaW50ZXJmYWNlcy9JTmV3UmVmYWN0b3JpbmdXaXphcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL2ludGVyZmFjZXMvSU5ld1JlZmFjdG9yaW5nV2l6YXJkLmphdmEKQEAgLTEsNSArMSwzMiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmludGVyZmFjZXM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOworCiBwdWJsaWMgaW50ZXJmYWNlIElOZXdSZWZhY3RvcmluZ1dpemFyZCB7CiAKKwlwdWJsaWMgTGlua2VkTGlzdDxJUHJvamVjdD4gZ2V0UHJvamVjdHMoKTsKKworCXB1YmxpYyBpbnQgZ2V0UGFnZU51bWJlcnMoKTsKKworCXB1YmxpYyB2b2lkIHVwZGF0ZVNlY29uZFBhZ2UoKTsKKworCXB1YmxpYyBXaXphcmRQYWdlIGdldFNlY29uZFBhZ2UoKTsKKworCXB1YmxpYyB2b2lkIHNldFRhcmdldFByb2plY3QoU3RyaW5nIHRleHQpOworCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdGV4dCk7CisKKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdGV4dCk7CisKKwlwdWJsaWMgdm9pZCBzZXRNZXRhbW9kZWwoU3RyaW5nIHRleHQpOworCisJcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgdGV4dCk7CisKKwlwdWJsaWMgdm9pZCBzZXRKYXIoU3RyaW5nIGphcik7CisKKwlwdWJsaWMgdm9pZCBzZXRJbXBvcnRQYWNrYWdlKFN0cmluZyBpbXBvcnRQYWNrYWdlKTsKKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci91aS9CYXNpY0RhdGFXaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL0Jhc2ljRGF0YVdpemFyZFBhZ2UuamF2YQppbmRleCAwZGIxZjRhLi5lOTJhMmI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL0Jhc2ljRGF0YVdpemFyZFBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL0Jhc2ljRGF0YVdpemFyZFBhZ2UuamF2YQpAQCAtMSwzOTMgKzEsMzI4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSBQaGlsaXBwcyBVbml2ZXJzaXR5IG9mIE1hcmJ1cmcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLSAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFBoaWxpcHBzIFVuaXZlcnNpdHkgb2YgTWFyYnVyZyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IudWk7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IuY29yZS5SZWZhY3RvcmluZ0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5tYW5hZ2Vycy5YTUxQbHVnaW5GaWxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmludGVyZmFjZXMuSU5ld1JlZmFjdG9yaW5nV2l6YXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwogCi0vKioKLSAqIFdpemFyZCBwYWdlIGZvciBjb25maWd1cmF0aW5nIG1vZGVsIHJlZmFjdG9yaW5nIGRhdGEgKGJhc2ljcykuCi0gKiBAZ2VuZXJhdGVkIE5PVAotICogQGF1dGhvciBUaG9yc3RlbiBBcmVuZHQKLSAqLwogcHVibGljIGNsYXNzIEJhc2ljRGF0YVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQotCXByaXZhdGUgVGV4dCBpZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IG1lbnVUZXh0OwotCXByaXZhdGUgVGV4dCBuc1VyaVRleHQ7Ci0JcHJpdmF0ZSBUZXh0IGNsYXNzVGV4dDsKLQlwcml2YXRlIFRleHQgamFyVGV4dDsKLQlwcml2YXRlIENvbWJvIHByb2plY3RDb21ibzsJCi0JCi0JLyoqCi0JICogSWQgb2YgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBpZCA9ICIiOwotCQotCS8qKgotCSAqIEluc2VydGVkIGlkIG9mIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgb3JpZ2luYWxJZCA9ICIiOwotCQotCS8qKgotCSAqIE1lbnUgTGFiZWwgb2YgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtZW51TGFiZWwgPSAiIjsKLQkKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRoZSBtb2RlbCByZWZhY3RvcmluZyBjb2RlIGhhcyB0byBiZSAKLQkgKiBnZW5lcmF0ZWQgdG8uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWUgPSAiIjsKLQkKLQkvKioKLQkgKiBOYW1lc3BhY2UgZm9yIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbnNVcmkgPSAiIjsKLQkKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBjbGFzcyB0aGUgbW9kZWwgcmVmYWN0b3Jpbmcgc2hhbGwgYmUgZXhlY3V0ZWQgb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lID0gIiI7Ci0JCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgamFyIGZpbGUgdGhhdCBvd25zIHRoZSBjbGFzcyBzcGVjaWZpZWQgaW4gJ2NsYXNzTmFtZScuCi0JICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IuQmFzaWNEYXRhV2l6YXJkUGFnZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVElUTEUgPSAiTmV3IFJlZmFjdG9yaW5nOiBCYXNpYyBEYXRhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9ERVNDUklQVElPTiA9ICJQbGVhc2Ugc3BlY2lmeSBiYXNpYyByZWZhY3RvcmluZyBkYXRhLiAiICsKKwkJCQkJCQkJCQkJCSJSZXF1aXJlZCBmaWVsZHMgYXJlIGRlbm90ZWQgYnkgXCIoKilcIi4iOworCXByaXZhdGUgVGV4dCBuYW1lVGV4dEZpZWxkLCBpZFRleHRGaWVsZDsKKy8vCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvblRleHRGaWVsZDsgVE9ETworCXByaXZhdGUgQ29tYm8gcHJvamVjdENvbWJvLCBtZXRhbW9kZWxDb21ibywgY29udGV4dENvbWJvOwogCXByaXZhdGUgU3RyaW5nIGphciA9ICIiOworCXByaXZhdGUgU3RyaW5nIGltcG9ydFBhY2thZ2UsIG1ldGFNb2RlbCwgY29udGV4dFR5cGU7CiAJCi0JLyoqCi0JICogVGhlIHNlbGVjdGVkIEVPYmplY3Qgd2hlbiBzdGFydGluZyB0aGUgZ2VuZXJhdGlvbiBwcm9jZXNzIG9mCi0JICogdGhlIG1vZGVsIHJlZmFjdG9yaW5nLgotCSAqLwotCXByaXZhdGUgRU9iamVjdCBzZWxlY3RlZEVPYmplY3Q7Ci0JCi0JLyoqCi0JICogTmFtZXNwYWNlIHByZWZpeCBmb3IgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuc1ByZWZpeCA9ICIiOwotCSAKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSBtZXRhIG1vZGVsIGZvciB0aGUgIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtZXRhTW9kZWxOYW1lID0gIiI7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBwYWdlTmFtZSBOYW1lIG9mIHRoZSB3aXphcmQgcGFnZS4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRFT2JqZWN0IFNlbGVjdGVkIEVPYmplY3Qgd2hlbiBzdGFydGluZyB0aGUgCi0JICogZ2VuZXJhdGlvbiBwcm9jZXNzIG9mIHRoZSBtb2RlbCByZWZhY3RvcmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQmFzaWNEYXRhV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIEVPYmplY3Qgc2VsZWN0ZWRFT2JqZWN0KSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJdGhpcy5zZWxlY3RlZEVPYmplY3QgPSBzZWxlY3RlZEVPYmplY3Q7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGlkIG9mIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHJldHVybiBJZCBvZiB0aGUgbW9kZWwgcmVmYWN0b3JpbmcgdG8gYmUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmYWN0b3JpbmdJZCgpewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG1lbnUgTGFiZWwgb2YgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBAcmV0dXJuIE1lbnUgTGFiZWwgb2YgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lbnVMYWJlbCgpewotCQlpZiAobWVudUxhYmVsLmlzRW1wdHkoKSl7Ci0JCQlyZXR1cm4gb3JpZ2luYWxJZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtZW51TGFiZWw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXNwYWNlIGZvciB0aGUgbW9kZWwgcmVmYWN0b3JpbmcgdG8gYmUgZ2VuZXJhdGVkLgotCSAqIEByZXR1cm4gTmFtZXNwYWNlIGZvciB0aGUgbW9kZWwgcmVmYWN0b3JpbmcgdG8gYmUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnNVcmkoKXsKLQkJcmV0dXJuIG5zVXJpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgbW9kZWwgcmVmYWN0b3Jpbmcgc2hhbGwgYmUgCi0JICogZXhlY3V0ZWQgb24uCi0JICogQHJldHVybiBOYW1lIG9mIHRoZSBjbGFzcyB0aGUgbW9kZWwgcmVmYWN0b3Jpbmcgc2hhbGwgYmUgCi0JICogZXhlY3V0ZWQgb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKXsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgdGhhdCBvd25zIHRoZSBjbGFzcyAKLQkgKiBzcGVjaWZpZWQgaW4gJ2NsYXNzTmFtZScuCi0JICogQHJldHVybiBOYW1lIG9mIHRoZSBqYXIgZmlsZSB0aGF0IG93bnMgdGhlIGNsYXNzIAotCSAqIHNwZWNpZmllZCBpbiAnY2xhc3NOYW1lJy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphcigpewotCQlyZXR1cm4gamFyOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoZSBtb2RlbCByZWZhY3RvcmluZyBjb2RlIAotCSAqIGhhcyB0byBiZSBnZW5lcmF0ZWQgdG8uCi0JICogQHJldHVybiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRoZSBtb2RlbCByZWZhY3RvcmluZyBjb2RlIAotCSAqIGhhcyB0byBiZSBnZW5lcmF0ZWQgdG8uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHJldHVybiBOYW1lc3BhY2UgcHJlZml4IGZvciB0aGUgbW9kZWwgcmVmYWN0b3JpbmcgdG8gYmUgZ2VuZXJhdGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnNQcmVmaXgoKXsKLQkJcmV0dXJuIG5zUHJlZml4OwotCX0KLQkJCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbWV0YSBtb2RlbCBmb3IgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIHRvIGJlIGdlbmVyYXRlZC4KLQkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIG1ldGEgbW9kZWwgZm9yIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRhTW9kZWxOYW1lKCl7Ci0JCXJldHVybiBtZXRhTW9kZWxOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sCi0JICogKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0JCWZpbGxMYXlvdXQuc3BhY2luZyA9IDU7Ci0JCWZpbGxMYXlvdXQudHlwZSA9IFNXVC5WRVJUSUNBTDsKLQkJY29tcG9zaXRlLnNldExheW91dChmaWxsTGF5b3V0KTsKLQkJY3JlYXRlVGV4dENvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljcmVhdGVTZWxlY3RlZEVPYmplY3RDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlUHJvamVjdENvbXBvc2l0ZShjb21wb3NpdGUpOwotCQljaGVja0lzUGFnZUNvbXBsZXRlKCk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCWZpbmFsIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7CisJCWNyZWF0ZVRleHRGaWVsZHMoY29udGFpbmVyKTsKKwkJaW5pdFByb2plY3RzQW5kTWV0YW1vZGVscygpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInZvcmhlciIpOworCQlpZiAobWV0YU1vZGVsICE9IG51bGwgJiYgISBtZXRhTW9kZWwuaXNFbXB0eSgpIAorCQkJCSYmIGNvbnRleHRUeXBlICE9IG51bGwgJiYgISBjb250ZXh0VHlwZS5pc0VtcHR5KCkpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZHJpbiIpOworCQkJc2V0Rml4ZWRNZXRhbW9kZWwobWV0YU1vZGVsKTsKKwkJCXNldEZpeGVkQ29udGV4dChjb250ZXh0VHlwZSk7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJuYWNoaGVyIik7CisJCXNldENvbnRyb2woY29udGFpbmVyKTsKKwkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCX0JCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKKwkJaWYgKCgoSU5ld1JlZmFjdG9yaW5nV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0UGFnZU51bWJlcnMoKSA+IDEpIHsKKwkJCWlmICh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpIHsKKwkJCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnVwZGF0ZVNlY29uZFBhZ2UoKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSAKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIGZvciBlZGl0aW5nIGlkIGFuZCBtZW51IGxhYmVsIG9mIHRoZSAKLQkgKiBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgY29tcG9zaXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsJCQotCQlMYWJlbCBpZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlpZExhYmVsLnNldFRleHQoIk5hbWUgb2YgdGhlIG5ldyBFTUYgTW9kZWwgUmVmYWN0b3JpbmcgKElkKTogIik7Ci0JCWlkTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsJCQotCQlpZFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlpZFRleHQuc2V0VG9vbFRpcFRleHQoIlJlZmFjdG9yaW5nLUlkIik7Ci0JCWlkVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlpZFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsJCQotCQlMYWJlbCBtZW51TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1lbnVMYWJlbC5zZXRUZXh0KCJUZXh0IHRvIGJlIHNob3duIGluIG1lbnUgKG1lbnUgbGFiZWwpOiAiKTsKLQkJbWVudUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7CQkKLQkJbWVudVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQltZW51VGV4dC5zZXRUb29sVGlwVGV4dCgiTWVudSBMYWJlbCBUZXh0Iik7Ci0JCW1lbnVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCW1lbnVUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQltZW51VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKKwlwdWJsaWMgV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKKwkJaWYgKCgoSU5ld1JlZmFjdG9yaW5nV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0UGFnZU51bWJlcnMoKSA+IDEpIHsKKwkJCXJldHVybiAoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFNlY29uZFBhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CiAJfQogCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgZm9yIGRpc3BsYXlpbmcgdGhlIG5hbWVzcGFjZSwgdGhlIHNlbGVjdGVkIGNsYXNzLAotCSAqIGFuZCB0aGUgb3duaW5nIGphciBmaWxlIG9mIHRoZSBtb2RlbCByZWZhY3RvcmluZyB0byBiZSBnZW5lcmF0ZWQuCi0JICogQHBhcmFtIHBhcmVudCBQYXJlbnQgY29tcG9zaXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3RlZEVPYmplY3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwkJCi0JCUxhYmVsIG5zVXJpTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5zVXJpTGFiZWwuc2V0VGV4dCgiTmFtZXNwYWNlLVVyaTogIik7Ci0JCW5zVXJpTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsJCQotCQluc1VyaVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluc1VyaSA9ICgoRVBhY2thZ2Upc2VsZWN0ZWRFT2JqZWN0LmVDbGFzcygpLmVDb250YWluZXIoKSkKLQkJCQkJCQkJCQkJCQkJLmdldE5zVVJJKCk7Ci0JCW5zVXJpVGV4dC5zZXRUZXh0KG5zVXJpKTsKLQkJbnNVcmlUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQluc1VyaVRleHQuc2V0TGF5b3V0RGF0YShnZCk7CQkKLQkJTGFiZWwgY2xhc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2xhc3NMYWJlbC5zZXRUZXh0KCJDbGFzcyBvZiBzZWxlY3RlZCBFT2JqZWN0IChjb250ZXh0KTogIik7Ci0JCWNsYXNzTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsJCQotCQljbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQljbGFzc05hbWUgPSBzZWxlY3RlZEVPYmplY3QuZUNsYXNzKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJY2xhc3NUZXh0LnNldFRleHQoY2xhc3NOYW1lKTsKLQkJY2xhc3NUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQljbGFzc1RleHQuc2V0TGF5b3V0RGF0YShnZCk7CQkKLQkJTGFiZWwgamFyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWphckxhYmVsLnNldFRleHQoImphci1GaWxlIHRvIGJlIGluY2x1ZGVkIChyZXF1aXJlZCBidW5kbGUpOiAiKTsKLQkJamFyTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsJCQotCQlqYXJUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJamFyID0gc2VsZWN0ZWRFT2JqZWN0LmVDbGFzcygpLmdldEluc3RhbmNlQ2xhc3MoKS5nZXRQYWNrYWdlKCkKLQkJCQkJCQkJCQkJCQkJCS5nZXROYW1lKCk7Ci0JCWphclRleHQuc2V0VGV4dChqYXIpOwotCQlqYXJUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQlqYXJUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJbnNQcmVmaXggPSAoKEVQYWNrYWdlKXNlbGVjdGVkRU9iamVjdC5lQ2xhc3MoKS5lQ29udGFpbmVyKCkpCi0JCQkJCQkJCQkJCQkJCS5nZXROc1ByZWZpeCgpOwotCQltZXRhTW9kZWxOYW1lID0gc2VsZWN0ZWRFT2JqZWN0LmVDbGFzcygpLmVDb250YWluZXIoKQotCQkJCQkJCQkJCQkJLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC53aWRnZXQgPT0gcHJvamVjdENvbWJvKSB7CisJCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldFRhcmdldFByb2plY3QocHJvamVjdENvbWJvLmdldFRleHQoKSk7CisJCX0KKwkJaWYgKGV2ZW50LndpZGdldCA9PSBtZXRhbW9kZWxDb21ibykgeworCQkJU3RyaW5nIG5zVVJJID0gbWV0YW1vZGVsQ29tYm8uZ2V0VGV4dCgpOworCQkJaWYgKG5zVVJJICE9IG51bGwgJiYgISBuc1VSSS5pc0VtcHR5KCkpIHsKKwkJCQlFUGFja2FnZSBlUGFja2FnZSA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG5zVVJJKTsKKwkJCQlpZiAoZVBhY2thZ2UgIT0gbnVsbCkgeworCQkJCQlpbXBvcnRQYWNrYWdlID0gZVBhY2thZ2UuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworCQkJCQlpZiAoaW1wb3J0UGFja2FnZS5lbmRzV2l0aCgiLmltcGwiKSkgeworCQkJCQkJaW50IGxlbmd0aCA9IGltcG9ydFBhY2thZ2UubGVuZ3RoKCk7CisJCQkJCQlpbXBvcnRQYWNrYWdlID0gaW1wb3J0UGFja2FnZS5zdWJzdHJpbmcoMCwgbGVuZ3RoLTUpOworCQkJCQl9CisJCQkJCWlmIChpbXBvcnRQYWNrYWdlLmVuZHNXaXRoKCIuaW50ZXJuYWwiKSkgeworCQkJCQkJaW50IGxlbmd0aCA9IGltcG9ydFBhY2thZ2UubGVuZ3RoKCk7CisJCQkJCQlpbXBvcnRQYWNrYWdlID0gaW1wb3J0UGFja2FnZS5zdWJzdHJpbmcoMCwgbGVuZ3RoLTkpOworCQkJCQl9CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW1wb3J0UGFja2FnZTogIiArIGltcG9ydFBhY2thZ2UpOworCQkJCQlGaWxlIGphckZpbGU7CisJCQkJCXRyeSB7CisJCQkJCQlqYXJGaWxlID0gbmV3IEZpbGUKKwkJCQkJCQkJKGVQYWNrYWdlLmdldENsYXNzKCkuZ2V0UHJvdGVjdGlvbkRvbWFpbigpCisJCQkJCQkJCS5nZXRDb2RlU291cmNlKCkuZ2V0TG9jYXRpb24oKS50b1VSSSgpKTsKKwkJCQkJCVN0cmluZyBqYXJOYW1lID0gamFyRmlsZS5nZXROYW1lKCk7CisJCQkJCQlpbnQgaW5kZXggPSBqYXJOYW1lLmluZGV4T2YoIl8iKTsKKwkJCQkJCWphciA9IGphck5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSmFyNTogIiArIGphcik7CisJCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9IGZpbmFsbHkgewkKKwkJCQkJCWNvbnRleHRDb21iby5yZW1vdmVBbGwoKTsKKwkJCQkJCU9iamVjdFtdIGVPYmplY3ROYW1lcyA9IG5ldyBPYmplY3RbZVBhY2thZ2UuZUNvbnRlbnRzKCkuc2l6ZSgpXTsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZU9iamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZVBhY2thZ2UuZUNvbnRlbnRzKCkuZ2V0KGkpOworCQkJCQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRU5hbWVkRWxlbWVudCkgeworCQkJCQkJCQllT2JqZWN0TmFtZXNbaV0gPSAoKEVOYW1lZEVsZW1lbnQpIGVQYWNrYWdlLmVDb250ZW50cygpLmdldChpKSkuZ2V0TmFtZSgpOworCQkJCQkJCX0KKwkJCQkJCX0JCQkJCQorCQkJCSAgICAgICAgQXJyYXlzLnNvcnQoZU9iamVjdE5hbWVzKTsKKwkJCQkJCWZvcihPYmplY3Qgb2JqZWN0IDogZU9iamVjdE5hbWVzKXsKKwkJCQkJCQljb250ZXh0Q29tYm8uYWRkKChTdHJpbmcpb2JqZWN0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJamFyID0gIiI7CisJCQkJY29udGV4dENvbWJvLnJlbW92ZUFsbCgpOworCQkJfQorCQl9CisJCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKKwkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsJCisJfQorCisJcHVibGljIEJhc2ljRGF0YVdpemFyZFBhZ2UoKSB7CisJCXN1cGVyKFBBR0VfTkFNRSk7CisJCXNldFRpdGxlKFBBR0VfVElUTEUpOworCQlzZXREZXNjcmlwdGlvbihQQUdFX0RFU0NSSVBUSU9OKTsKIAl9CiAJCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBmb3IgY2hvb3NpbmcgdGhlIHByb2plY3QgdGhlIG1vZGVsIHJlZmFjdG9yaW5nIAotCSAqIGNvZGUgaGFzIHRvIGJlIGdlbmVyYXRlZCB0by4KLQkgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjb21wb3NpdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwkJCi0JCUxhYmVsIHByb2plY3RMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoIlBsdWdpbi1Qcm9qZWN0IHRoYXQgd2lsbCBjb250YWluIHRoZSBjb2RlOiAiKTsKLQkJcHJvamVjdExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7CQkKLQkJcHJvamVjdENvbWJvID0gbmV3IENvbWJvIChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlwcm9qZWN0Q29tYm8uc2V0TGF5b3V0RGF0YShnZCk7CisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRGaWVsZHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworCQlMYWJlbCBsYWJlbDsKKwkJR3JpZERhdGEgZ3JpZERhdGE7CisJCUdyb3VwIGdyb3VwOworCQlHcmlkTGF5b3V0IGxheW91dDsKKwkJLy8gLSBQcm9qZWN0IC0KKwkJZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoIlByb2plY3QgRGF0YSIpOworCSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOworCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJLy8gY29sOjEKKwkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKwkJbGFiZWwuc2V0VGV4dCgiVGFyZ2V0IHByb2plY3QgKCopOiIpOworCQkvLyBjb2w6MgorCQlwcm9qZWN0Q29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SRUFEX09OTFkpOworCQlmaW5hbCBHcmlkRGF0YSBwcm9qZWN0Q29tYm9EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCXByb2plY3RDb21iby5zZXRMYXlvdXREYXRhKHByb2plY3RDb21ib0RhdGEpOworCQkvL3Byb2plY3RDb21iby5zZXRUZXh0KCJTZWxlY3QgUHJvamVjdCIpOwogCQlwcm9qZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWFkZFByb2plY3RzVG9Db21ibyhwcm9qZWN0Q29tYm8pOworCQkvLyAtIFJlZmFjdG9yaW5nIERhdGEgLQorCQlncm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dCgiUmVmYWN0b3JpbmcgRGF0YSIpOworCSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOworCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJLy8gLSBOYW1lIC0KKwkJLy8gY29sOjEKKwkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dCgiTmFtZSAoKik6Iik7CisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CisJCS8vIGNvbDoyCisJCW5hbWVUZXh0RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULkJPUkRFUik7CisJCW5hbWVUZXh0RmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7CisJCW5hbWVUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCS8vIC0gSWQgLQorCQkvLyBjb2w6MQorCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KCJSZWZhY3RvcmluZyBJRCAoKik6Iik7CisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7CisJCS8vIGNvbDoyCisJCWlkVGV4dEZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOworCQlpZFRleHRGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKKwkJaWRUZXh0RmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisvLwkJLy8gLSBEZXNjcmlwdGlvbiAtIFRPRE8KKy8vCQkvLyBjb2w6MQorLy8JCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CisvLwkJbGFiZWwuc2V0VGV4dCgiRGVzY3JpcHRpb246Iik7CisvLwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKy8vCQkvLyBjb2w6MgorLy8JCWRlc2NyaXB0aW9uVGV4dEZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5CT1JERVIpOworLy8JCWRlc2NyaXB0aW9uVGV4dEZpZWxkLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOworLy8JCWRlc2NyaXB0aW9uVGV4dEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkvLyAtIFNvdXJjZSAtCisJCWdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOworCQlncm91cC5zZXRUZXh0KCJNZXRhIE1vZGVsIGFuZCBDb250ZXh0IFR5cGUiKTsKKwkgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKKwkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkgICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisJICAgIC8vIC0gTWV0YW1vZGVsIC0KKwkgCS8vIGNvbDoxCisJIAlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOworCSAJbGFiZWwuc2V0VGV4dCgiTWV0YSBtb2RlbCAoKik6Iik7CisJIAlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOworCSAJLy8gY29sOjIKKwkgCW1ldGFtb2RlbENvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuQk9SREVSKTsKKwkgCW1ldGFtb2RlbENvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOworCSAgICAvLyAtIENvbnRleHQgLQorCSAJLy8gY29sOjEKKwkgCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CisJIAlsYWJlbC5zZXRUZXh0KCJDb250ZXh0IHR5cGUgKCopOiIpOworCSAJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKwkgCS8vIGNvbDoyCisJIAljb250ZXh0Q29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5CT1JERVIpOworCSAJY29udGV4dENvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwogCX0KIAkKLQkvKioKLQkgKiBBZGRzIHRoZSBwbHVnaW4tcHJvamVjdHMgb2YgdGhlIHdvcmtzcGFjZSB0byB0aGUgZ2l2ZW4gY29tYm8uCi0JICogQHBhcmFtIHByb2plY3RDb21ibyBDb21ibyB0aGUgcHJvamVjdHMgaGF2ZSB0byBiZSBpbnNlcnRlZCB0by4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUHJvamVjdHNUb0NvbWJvKENvbWJvIHByb2plY3RDb21ibykgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMpewotCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpewotCQkJCUlQcm9qZWN0TmF0dXJlIG5hdHVyZSA9IG51bGw7CisJcHJpdmF0ZSB2b2lkIGluaXRQcm9qZWN0c0FuZE1ldGFtb2RlbHMoKXsKKwkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogKChJTmV3UmVmYWN0b3JpbmdXaXphcmQpIGdldFdpemFyZCgpKS5nZXRQcm9qZWN0cygpKSB7CisJCQlwcm9qZWN0Q29tYm8uYWRkKHByb2plY3QuZ2V0TmFtZSgpKTsKKwkJfQorCQlPYmplY3QgW10gbWV0YW1vZGVsT2JqZWN0cyA9IAorCQkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmtleVNldCgpLnRvQXJyYXkobmV3IE9iamVjdFtFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5zaXplKCldKTsKKyAgICAgICAgQXJyYXlzLnNvcnQobWV0YW1vZGVsT2JqZWN0cyk7CisJCWZvcihPYmplY3Qgb2JqZWN0IDogbWV0YW1vZGVsT2JqZWN0cyl7CisJCQltZXRhbW9kZWxDb21iby5hZGQob2JqZWN0LnRvU3RyaW5nKCkpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRGaXhlZE1ldGFtb2RlbChTdHJpbmcgbWV0YU1vZGVsKSB7CisJCWZvciAoU3RyaW5nIG1tIDogbWV0YW1vZGVsQ29tYm8uZ2V0SXRlbXMoKSkgeworCQkJaWYgKG1tLmVxdWFscyhtZXRhTW9kZWwpKSB7CisJCQkJbWV0YW1vZGVsQ29tYm8ucmVtb3ZlQWxsKCk7CisJCQkJbWV0YW1vZGVsQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHttZXRhTW9kZWx9KTsKKwkJCQltZXRhbW9kZWxDb21iby5zZWxlY3QoMCk7CisJCQkJbWV0YW1vZGVsQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShtZXRhTW9kZWwpOworCQkJCWltcG9ydFBhY2thZ2UgPSBlUGFja2FnZS5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisJCQkJaWYgKGltcG9ydFBhY2thZ2UuZW5kc1dpdGgoIi5pbXBsIikpIHsKKwkJCQkJaW50IGxlbmd0aCA9IGltcG9ydFBhY2thZ2UubGVuZ3RoKCk7CisJCQkJCWltcG9ydFBhY2thZ2UgPSBpbXBvcnRQYWNrYWdlLnN1YnN0cmluZygwLCBsZW5ndGgtNSk7CisJCQkJfQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW1wb3J0UGFja2FnZTogIiArIGltcG9ydFBhY2thZ2UpOworCQkJCUZpbGUgamFyRmlsZTsKIAkJCQl0cnkgewotCQkJCQluYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZSgib3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZSIpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlqYXJGaWxlID0gbmV3IEZpbGUKKwkJCQkJCQkoZVBhY2thZ2UuZ2V0Q2xhc3MoKS5nZXRQcm90ZWN0aW9uRG9tYWluKCkKKwkJCQkJCQkuZ2V0Q29kZVNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9VUkkoKSk7CisJCQkJCVN0cmluZyBqYXJOYW1lID0gamFyRmlsZS5nZXROYW1lKCk7CisJCQkJCWludCBpbmRleCA9IGphck5hbWUuaW5kZXhPZigiXyIpOworCQkJCQlqYXIgPSBqYXJOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSmFyNTogIiArIGphcik7CisJCQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKIAkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKIAkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gbmF0dXJlKXsKLQkJCQkJcHJvamVjdENvbWJvLmFkZChwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfQogCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlZGl0ZWQgZGF0YSBhcmUgY29tcGxldGUgYW5kIHNldHMKLQkgKiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIHRvIHRoZSB0b3Agb2YgdGhlIHdpemFyZCBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0lzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAocHJvamVjdENvbWJvLmdldEl0ZW1Db3VudCgpID09IDApewotCQkJc2V0RXJyb3JNZXNzYWdlKCJFTUYgUmVmYWN0b3IgY2Fubm90IGdlbmVyYXRlIGNvZGUgd2l0aG91dCBhbiAiICsKLQkJCQkJIm9wZW4gcGx1Z2luLXByb2plY3QgaW4gdGhlIGFjdHVhbCB3b3Jrc3BhY2UuIik7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9CQkKLQkJaWYgKGlkLmlzRW1wdHkoKSl7Ci0JCQlzZXRNZXNzYWdlKCJQbGVhc2UgaW5zZXJ0IGEgbmFtZS4iLCBTV1QuRVJST1IpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwcm9qZWN0TmFtZS5pc0VtcHR5KCkpewotCQkJCXNldE1lc3NhZ2UoIlBsZWFzZSBzZWxlY3QgYSBwbHVnaW4tcHJvamVjdCB0byBnZW5lcmF0ZSAiICsKLQkJCQkJCSIJCQkJCQkJeW91ciBjb2RlIGluLiIsIFNXVC5FUlJPUik7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEgWE1MUGx1Z2luRmlsZU1hbmFnZXIucGx1Z2luWG1sRXhpc3RzKHByb2plY3ROYW1lKSl7Ci0JCQkJCVhNTFBsdWdpbkZpbGVNYW5hZ2VyLmNyZWF0ZVBsdWdpblhtbChwcm9qZWN0TmFtZSk7Ci0JCQkJfQotCQkJCUxpc3Q8UmVmYWN0b3JpbmdJbmZvPiByZWZhY3RvcmluZ0NvbmZpZyA9IAotCQkJCQlYTUxQbHVnaW5GaWxlTWFuYWdlci5nZXRSZWZhY3RvcmluZ0NvbmZpZyhwcm9qZWN0TmFtZSk7Ci0JCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQlmb3IgKFJlZmFjdG9yaW5nSW5mbyByZWZDb24gOiByZWZhY3RvcmluZ0NvbmZpZyl7Ci0JCQkJCWlmIChyZWZDb24uZ2V0UmVmYWN0b3JpbmdJZCgpLmVxdWFscyhpZCkpewotCQkJCQkJZXhpc3RzID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChleGlzdHMpewotCQkJCQlzZXRNZXNzYWdlKCJUaGVyZSBpcyBhbHJlYWR5IGEgcmVmYWN0b3Jpbmcgd2l0aCBpZCAnIiArIAotCQkJCQkJCQlpZCArICInIGluIHByb2plY3QgJyIgKyBwcm9qZWN0TmFtZSArICInISIpOwotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChtZW51TGFiZWwuaXNFbXB0eSgpKXsKLQkJCQkJCXNldE1lc3NhZ2UoIlBsZWFzZSBpbnNlcnQgYSB0ZXh0IHRvIGJlIHNob3duIGluICIgKwotCQkJCQkJCQkibWVudSAobWVudSBsYWJlbCkuIE90aGVyd2lzZSwgRU1GIFJlZmFjdG9yICIgKwotCQkJCQkJCQkid2lsbCBzaG93IHRoZSByZWZhY3RvcmluZyBuYW1lLiIsIFNXVC5FUlJPUik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRNZXNzYWdlKCIiLCBTV1QuTk9ORSk7Ci0JCQkJCX0KLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQorCXByaXZhdGUgdm9pZCBzZXRGaXhlZENvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsKKwkJY29udGV4dENvbWJvLnJlbW92ZUFsbCgpOworCQljb250ZXh0Q29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tdIHtjb250ZXh0fSk7CisJCWNvbnRleHRDb21iby5zZWxlY3QoMCk7CisJCWNvbnRleHRDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKIAl9CiAKIAkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50Ci0JICogKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQorCSAqIFdpcmQgamVkZXMgbWFsIGF1c2dlZvxociB3ZW5uIHNpY2ggZGVyIEluaGFsdCBlaW5lcyBUZXh0ZmVsZGVzIGltIFdpemFyZAorCSAqIHZlcuRuZGVydC4g3GJlcnBy/GZ0IGRpZSBpbmhhbHRlIGRlciBUZXh0ZmVsZGVyIHVuZCBlcnpldWd0CisJICogZW50c2NocHJlY2hlbmRlIE1lbGR1bmdlbiBpbSBXaXphcmRmZW5zdGVyLgogCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gaWRUZXh0KXsKLQkJCWlkID0gaWRUZXh0LmdldFRleHQoKS50cmltKCkucmVwbGFjZUFsbCgiICIsICIiKTsKLQkJCW9yaWdpbmFsSWQgPSBpZFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKKwlwcml2YXRlIHZvaWQgdXBkYXRlUGFnZUNvbXBsZXRlKCkgeworCQlpZihuYW1lVGV4dEZpZWxkLmdldFRleHQoKS5pc0VtcHR5KCkpeworCQkJdGhpcy5zZXRNZXNzYWdlKCJSZWZhY3RvcmluZyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOworCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCQl9ZWxzZQorCQlpZihpZFRleHRGaWVsZC5nZXRUZXh0KCkuaXNFbXB0eSgpKXsKKwkJCXRoaXMuc2V0TWVzc2FnZSgiUmVmYWN0b3JpbmcgSUQgaXMgbm90IHNwZWNpZmllZC4iLCBFUlJPUik7CisJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisJCX1lbHNlCisJCWlmKG1ldGFtb2RlbENvbWJvLmdldFRleHQoKS5pc0VtcHR5KCkpeworCQkJdGhpcy5zZXRNZXNzYWdlKCJSZWZhY3RvcmluZyBtZXRhIG1vZGVsIGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOworCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCQl9ZWxzZQorCQlpZiggY29udGV4dENvbWJvLmdldFRleHQoKS5pc0VtcHR5KCkpeworCQkJdGhpcy5zZXRNZXNzYWdlKCJSZWZhY3RvcmluZyBjb250ZXh0IGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOworCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCQl9ZWxzZQorCQlpZighY2hlY2tQcm9qZWN0KCkpeworCQkJdGhpcy5zZXRNZXNzYWdlKCJUYXJnZXQgcHJvamVjdCBmb3IgdGhlIG5ldyByZWZhY3RvcmluZyBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsKKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKwkJfWVsc2V7CisJCQl0aGlzLnNldE1lc3NhZ2UoIiIpOworCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7CisJCQlzYXZlVGV4dEZpZWxkVmFsdWVzKCk7CiAJCX0KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBtZW51VGV4dCl7Ci0JCQltZW51TGFiZWwgPSBtZW51VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQl9Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcHJvamVjdENvbWJvKXsKLQkJCWludCBpbmRleCA9IHByb2plY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKGluZGV4ID09IC0xKXsKLQkJCQlwcm9qZWN0TmFtZSA9ICIiOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0TmFtZSA9IHByb2plY3RDb21iby5nZXRJdGVtKGluZGV4KTsKLQkJCX0KLQkJfQotCQljaGVja0lzUGFnZUNvbXBsZXRlKCk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBjaGVja1Byb2plY3QoKXsKKwkJaWYoIXByb2plY3RDb21iby5nZXRUZXh0KCkuaXNFbXB0eSgpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNhdmVUZXh0RmllbGRWYWx1ZXMoKXsKKwkJKChJTmV3UmVmYWN0b3JpbmdXaXphcmQpIGdldFdpemFyZCgpKS5zZXROYW1lKHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCkpOworCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldElkKHRoaXMuaWRUZXh0RmllbGQuZ2V0VGV4dCgpKTsKKy8vCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb25UZXh0RmllbGQuZ2V0VGV4dCgpKTsgVE9ETworCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldE1ldGFtb2RlbCh0aGlzLm1ldGFtb2RlbENvbWJvLmdldFRleHQoKSk7CisJCSgoSU5ld1JlZmFjdG9yaW5nV2l6YXJkKSBnZXRXaXphcmQoKSkuc2V0Q29udGV4dCh0aGlzLmNvbnRleHRDb21iby5nZXRUZXh0KCkpOworCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldEphcihqYXIpOworCQkoKElOZXdSZWZhY3RvcmluZ1dpemFyZCkgZ2V0V2l6YXJkKCkpLnNldEltcG9ydFBhY2thZ2UoaW1wb3J0UGFja2FnZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWV0YW1vZGVsKFN0cmluZyBtZXRhTW9kZWwpIHsKKwkJdGhpcy5tZXRhTW9kZWwgPSBtZXRhTW9kZWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlKSB7CisJCXRoaXMuY29udGV4dFR5cGUgPSBjb250ZXh0VHlwZTsKIAl9CiAKIH0KKwkKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci91aS9OZXdSZWZhY3RvcmluZ1dpemFyZEphdmEuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvdWkvTmV3UmVmYWN0b3JpbmdXaXphcmRKYXZhLmphdmEKaW5kZXggMjIyYjJjYi4uNmVkMzljOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci91aS9OZXdSZWZhY3RvcmluZ1dpemFyZEphdmEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL05ld1JlZmFjdG9yaW5nV2l6YXJkSmF2YS5qYXZhCkBAIC0xMSwxMyArMTEsMjQgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci51aTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlLlJlZmFjdG9yaW5nSW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmludGVyZmFjZXMuSU5ld1JlZmFjdG9yaW5nV2l6YXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IubWFuYWdlcnMuR2VuZXJhdGlvTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwogCiAvKioKQEAgLTI1LDcgKzM2LDcgQEAKICAqIEBnZW5lcmF0ZWQgTk9UCiAgKiBAYXV0aG9yIFRob3JzdGVuIEFyZW5kdAogICovCi1wdWJsaWMgY2xhc3MgTmV3UmVmYWN0b3JpbmdXaXphcmRKYXZhIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1JlZmFjdG9yaW5nV2l6YXJkIHsKK3B1YmxpYyBjbGFzcyBOZXdSZWZhY3RvcmluZ1dpemFyZEphdmEgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJTmV3UmVmYWN0b3JpbmdXaXphcmQgewogCQogCS8qKgogCSAqICBXaXphcmQgcGFnZSBmb3IgY29uZmlndXJhdGluZyBtb2RlbCByZWZhY3RvcmluZyBkYXRhIChiYXNpY3MpLgpAQCAtNDEsMjIgKzUyLDU0IEBACiAJICAqIFdpemFyZCBwYWdlIGZvciBjb25maWd1cmF0aW5nIG1vZGVsIHRlc3QgcGFyYW1ldGVycy4KIAkgICovCiAJIHByaXZhdGUgVGVzdFdpemFyZFBhZ2UgdGVzdFdpemFyZFBhZ2U7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIGl0cyB3aXphcmQgcGFnZXMuCi0JICogQHBhcmFtIHNlbGVjdGVkRU9iamVjdCBUaGUgc2VsZWN0ZWQgRU9iamVjdCB3aGVuIHN0YXJ0aW5nIHRoZSAKLQkgKiBnZW5lcmF0aW9uIHByb2Nlc3Mgb2YgdGhlIG1vZGVsIHJlZmFjdG9yaW5nLgotCSAqLwotCXB1YmxpYyBOZXdSZWZhY3RvcmluZ1dpemFyZEphdmEoRU9iamVjdCBzZWxlY3RlZEVPYmplY3QpeworCSAKKwkgcHJpdmF0ZSBMaW5rZWRMaXN0PElQcm9qZWN0PiBwcm9qZWN0czsKKworCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgbWVudUxhYmVsOworCisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKwlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVcmk7CisKKwlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisKKwlwcml2YXRlIFN0cmluZyBqYXI7CisKKwlwcml2YXRlIFN0cmluZyBpbXBvcnRQYWNrYWdlOworCSAKKwkgLyoqCisJICAqIERlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyBpdHMgd2l6YXJkIHBhZ2VzLgorCQkqIEBwYXJhbSBzZWxlY3RlZEVPYmplY3QgVGhlIHNlbGVjdGVkIEVPYmplY3Qgd2hlbiBzdGFydGluZyB0aGUgCisJCSogZ2VuZXJhdGlvbiBwcm9jZXNzIG9mIHRoZSBtb2RlbCByZWZhY3RvcmluZy4KKwkJKi8KKwlwdWJsaWMgTmV3UmVmYWN0b3JpbmdXaXphcmRKYXZhKCl7CiAJCXN1cGVyKCk7CiAJCXNldFdpbmRvd1RpdGxlKCJFTUYgUmVmYWN0b3IgLSBTcGVjaWZ5IEVNRiBNb2RlbCBSZWZhY3RvcmluZyIpOwotCQl0aGlzLmJhc2ljV2l6YXJkUGFnZSA9IG5ldyBCYXNpY0RhdGFXaXphcmRQYWdlKCJFTUYgUmVmYWN0b3IiLCBzZWxlY3RlZEVPYmplY3QpOwotCQl0aGlzLnBhcmFtZXRlcldpemFyZFBhZ2UgPSBuZXcgUGFyYW1ldGVyV2l6YXJkUGFnZSgiRU1GIFJlZmFjdG9yIik7Ci0JCXRoaXMudGVzdFdpemFyZFBhZ2UgPSBuZXcgVGVzdFdpemFyZFBhZ2UoIkVNRiBSZWZhY3RvciIpOworCQl0aGlzLmJhc2ljV2l6YXJkUGFnZSA9IG5ldyBCYXNpY0RhdGFXaXphcmRQYWdlKCk7CisJCXRoaXMucGFyYW1ldGVyV2l6YXJkUGFnZSA9IG5ldyBQYXJhbWV0ZXJXaXphcmRQYWdlKCk7CisJCXRoaXMudGVzdFdpemFyZFBhZ2UgPSBuZXcgVGVzdFdpemFyZFBhZ2UoKTsKIAkJdGhpcy5hZGRQYWdlKGJhc2ljV2l6YXJkUGFnZSk7CiAJCXRoaXMuYWRkUGFnZShwYXJhbWV0ZXJXaXphcmRQYWdlKTsKIAkJdGhpcy5hZGRQYWdlKHRlc3RXaXphcmRQYWdlKTsKIAl9CisJCisvLwkvKioKKy8vCSAqIERlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyBpdHMgd2l6YXJkIHBhZ2VzLgorLy8JICogQHBhcmFtIHNlbGVjdGVkRU9iamVjdCBUaGUgc2VsZWN0ZWQgRU9iamVjdCB3aGVuIHN0YXJ0aW5nIHRoZSAKKy8vCSAqIGdlbmVyYXRpb24gcHJvY2VzcyBvZiB0aGUgbW9kZWwgcmVmYWN0b3JpbmcuCisvLwkgKi8KKy8vCXB1YmxpYyBOZXdSZWZhY3RvcmluZ1dpemFyZEphdmEoRU9iamVjdCBzZWxlY3RlZEVPYmplY3QpeworLy8JCXN1cGVyKCk7CisvLwkJc2V0V2luZG93VGl0bGUoIkVNRiBSZWZhY3RvciAtIFNwZWNpZnkgRU1GIE1vZGVsIFJlZmFjdG9yaW5nIik7CisvLwkJdGhpcy5iYXNpY1dpemFyZFBhZ2UgPSBuZXcgQmFzaWNEYXRhV2l6YXJkUGFnZSgiRU1GIFJlZmFjdG9yIiwgc2VsZWN0ZWRFT2JqZWN0KTsKKy8vCQl0aGlzLnBhcmFtZXRlcldpemFyZFBhZ2UgPSBuZXcgUGFyYW1ldGVyV2l6YXJkUGFnZSgiRU1GIFJlZmFjdG9yIik7CisvLwkJdGhpcy50ZXN0V2l6YXJkUGFnZSA9IG5ldyBUZXN0V2l6YXJkUGFnZSgiRU1GIFJlZmFjdG9yIik7CisvLwkJdGhpcy5hZGRQYWdlKGJhc2ljV2l6YXJkUGFnZSk7CisvLwkJdGhpcy5hZGRQYWdlKHBhcmFtZXRlcldpemFyZFBhZ2UpOworLy8JCXRoaXMuYWRkUGFnZSh0ZXN0V2l6YXJkUGFnZSk7CisvLwl9CiAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCkBAIC05MywyNCArMTM2LDExMyBAQAogCSAqIGdlbmVyYXRpb24gYWN0aXZpdHkuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmYWN0b3JpbmcoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGJhc2ljV2l6YXJkUGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotCQlTdHJpbmcgaWQgPSBiYXNpY1dpemFyZFBhZ2UuZ2V0UmVmYWN0b3JpbmdJZCgpOwotCQlTdHJpbmcgbWVudUxhYmVsID0gYmFzaWNXaXphcmRQYWdlLmdldE1lbnVMYWJlbCgpOwotCQlTdHJpbmcgbmFtZXNwYWNlVXJpID0gYmFzaWNXaXphcmRQYWdlLmdldE5zVXJpKCk7Ci0JCVN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSBiYXNpY1dpemFyZFBhZ2UuZ2V0TnNQcmVmaXgoKTsKLQkJU3RyaW5nIG1ldGFNb2RlbE5hbWUgPSBiYXNpY1dpemFyZFBhZ2UuZ2V0TWV0YU1vZGVsTmFtZSgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gYmFzaWNXaXphcmRQYWdlLmdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgamFyID0gYmFzaWNXaXphcmRQYWdlLmdldEphcigpOworLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGJhc2ljV2l6YXJkUGFnZS5nZXRQcm9qZWN0TmFtZSgpOworLy8JCVN0cmluZyBpZCA9IGJhc2ljV2l6YXJkUGFnZS5nZXRSZWZhY3RvcmluZ0lkKCk7CisvLwkJU3RyaW5nIG1lbnVMYWJlbCA9IGJhc2ljV2l6YXJkUGFnZS5nZXRNZW51TGFiZWwoKTsKKy8vCQlTdHJpbmcgbmFtZXNwYWNlVXJpID0gYmFzaWNXaXphcmRQYWdlLmdldE5zVXJpKCk7CisvLwkJU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IGJhc2ljV2l6YXJkUGFnZS5nZXROc1ByZWZpeCgpOworLy8JCVN0cmluZyBtZXRhTW9kZWxOYW1lID0gYmFzaWNXaXphcmRQYWdlLmdldE1ldGFNb2RlbE5hbWUoKTsKKy8vCQlTdHJpbmcgY2xhc3NOYW1lID0gYmFzaWNXaXphcmRQYWdlLmdldENsYXNzTmFtZSgpOworLy8JCVN0cmluZyBqYXIgPSBiYXNpY1dpemFyZFBhZ2UuZ2V0SmFyKCk7CiAJCWludCBudW1iZXJPZlRlc3RzID0gdGVzdFdpemFyZFBhZ2UuZ2V0TnVtYmVyT2ZUZXN0cygpOworCQlTdHJpbmcgbnNQcmVmaXggPSBnZXROc1ByZWZpeCgpOworCQlTdHJpbmcgbWV0YU1vZGVsTmFtZSA9IGdldE1ldGFNb2RlbE5hbWUoKTsKIAkJUmVmYWN0b3JpbmdJbmZvIHJlZmFjdG9yaW5nQ29uZmlnID0gCiAJCSAgIG5ldyBSZWZhY3RvcmluZ0luZm8ocHJvamVjdE5hbWUsIGlkLCBtZW51TGFiZWwsIG5hbWVzcGFjZVVyaSwKLQkJICAgICAgICAgbmFtZXNwYWNlUHJlZml4LCBudW1iZXJPZlRlc3RzKTsKKwkJICAgICAgICAgbnNQcmVmaXgsIG51bWJlck9mVGVzdHMpOwogCQlyZWZhY3RvcmluZ0NvbmZpZy5zZXRTZWxlY3RlZEVPYmplY3RKYXIoamFyKTsKLQkJcmVmYWN0b3JpbmdDb25maWcuc2V0U2VsZWN0ZWRFT2JqZWN0Q2xhc3MoY2xhc3NOYW1lKTsKKwkJcmVmYWN0b3JpbmdDb25maWcuc2V0U2VsZWN0ZWRFT2JqZWN0Q2xhc3MoaW1wb3J0UGFja2FnZSArICIuIiArIGNsYXNzTmFtZSk7CiAJCXJlZmFjdG9yaW5nQ29uZmlnLnNldE1ldGFNb2RlbE5hbWUobWV0YU1vZGVsTmFtZSk7CiAJCXJlZmFjdG9yaW5nQ29uZmlnLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyV2l6YXJkUGFnZS5nZXRQYXJhbWV0ZXJzKCkpOwotCQlHZW5lcmF0aW9NYW5hZ2VyIHJnID0gbmV3IEdlbmVyYXRpb01hbmFnZXIocmVmYWN0b3JpbmdDb25maWcpOworCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVmYWN0b3JpbmdDb25maWcpOworCQlHZW5lcmF0aW9NYW5hZ2VyIHJnID0gbmV3IEdlbmVyYXRpb01hbmFnZXIocmVmYWN0b3JpbmdDb25maWcpOyAKIAkJcmcucnVuKG1vbml0b3IpOwogCX0KIAorCXByaXZhdGUgU3RyaW5nIGdldE1ldGFNb2RlbE5hbWUoKSB7CisJCUVQYWNrYWdlIG1tID0gCisJCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UobmFtZXNwYWNlVXJpKTsKKwkJcmV0dXJuIG1tLmdldE5hbWUoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXROc1ByZWZpeCgpIHsKKwkJRVBhY2thZ2UgbW0gPSAKKwkJCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShuYW1lc3BhY2VVcmkpOworCQlyZXR1cm4gbW0uZ2V0TnNQcmVmaXgoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaW5pdFByb2plY3RzKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0UHJvamVjdHMoKXsKKwkJdGhpcy5wcm9qZWN0cyA9IG5ldyBMaW5rZWRMaXN0PElQcm9qZWN0PigpOworCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBhbGxQcm9qZWN0cykgeworCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKKwkJCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCW5hdHVyZSA9IHByb2plY3QuZ2V0TmF0dXJlKCJvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlIik7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJCWlmIChudWxsICE9IG5hdHVyZSkgCisJCQkJCXRoaXMucHJvamVjdHMuYWRkKHByb2plY3QpOworCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBMaW5rZWRMaXN0PElQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKKwkJcmV0dXJuIHByb2plY3RzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0UGFnZU51bWJlcnMoKSB7CisJCXJldHVybiAzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwZGF0ZVNlY29uZFBhZ2UoKSB7IH0KKworCUBPdmVycmlkZQorCXB1YmxpYyBXaXphcmRQYWdlIGdldFNlY29uZFBhZ2UoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJXaXphcmRQYWdlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRhcmdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7CisJCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubWVudUxhYmVsID0gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKwkJdGhpcy5pZCA9IGlkOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE1ldGFtb2RlbChTdHJpbmcgbWV0YW1vZGVsKSB7CisJCXRoaXMubmFtZXNwYWNlVXJpID0gbWV0YW1vZGVsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldENvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsKKwkJdGhpcy5jbGFzc05hbWUgPSBjb250ZXh0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEphcihTdHJpbmcgamFyKSB7CisJCXRoaXMuamFyID0gamFyOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldEltcG9ydFBhY2thZ2UoU3RyaW5nIGltcG9ydFBhY2thZ2UpIHsKKwkJdGhpcy5pbXBvcnRQYWNrYWdlID0gaW1wb3J0UGFja2FnZTsKKwl9CisJCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL1BhcmFtZXRlcldpemFyZFBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvdWkvUGFyYW1ldGVyV2l6YXJkUGFnZS5qYXZhCmluZGV4IDk0MWQwZmIuLjRkOWUzYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvdWkvUGFyYW1ldGVyV2l6YXJkUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvdWkvUGFyYW1ldGVyV2l6YXJkUGFnZS5qYXZhCkBAIC0zNiw2ICszNiwxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFyYW1ldGVyV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7CiAJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLlBhcmFtZXRlcldpemFyZFBhZ2UiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1RJVExFID0gIk5ldyBSZWZhY3RvcmluZzogUGFyYW1ldGVyIERhdGEiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0RFU0NSSVBUSU9OID0gIlBsZWFzZSBzcGVjaWZ5IHRoZSBwYXJhbWV0ZXIgb2YgdGhlIHJlZmFjdG9yaW5nLiAiICsKKwkJCQkJCQkJCQkJCSJSZXF1aXJlZCBmaWVsZHMgYXJlIGRlbm90ZWQgYnkgXCIoKilcIi4iOworCQogCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKIAlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247CiAJcHJpdmF0ZSBMaXN0IHBhcmFtZXRlckxpc3Q7CQpAQCAtNTEsMTAgKzU2LDExIEBACiAKIAkvKioKIAkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBwYWdlTmFtZSBOYW1lIG9mIHRoZSB3aXphcmQgcGFnZS4KIAkgKi8KLQlwcm90ZWN0ZWQgUGFyYW1ldGVyV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOworCXByb3RlY3RlZCBQYXJhbWV0ZXJXaXphcmRQYWdlKCkgeworCQlzdXBlcihQQUdFX05BTUUpOworCQlzZXRUaXRsZShQQUdFX1RJVExFKTsKKwkJc2V0RGVzY3JpcHRpb24oUEFHRV9ERVNDUklQVElPTik7CiAJCXBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckluZm8+KCk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci91aS9UZXN0V2l6YXJkUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci9zcmMvb3JnL2VjbGlwc2UvZW1mL3JlZmFjdG9yL3JlZmFjdG9yaW5nL2dlbmVyYXRvci91aS9UZXN0V2l6YXJkUGFnZS5qYXZhCmluZGV4IGEzZGJmMmYuLjY4MzU5OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VtZi9yZWZhY3Rvci9yZWZhY3RvcmluZy9nZW5lcmF0b3IvdWkvVGVzdFdpemFyZFBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lbWYvcmVmYWN0b3IvcmVmYWN0b3JpbmcvZ2VuZXJhdG9yL3VpL1Rlc3RXaXphcmRQYWdlLmphdmEKQEAgLTI5LDE1ICsyOSwyMSBAQAogICovCiBwdWJsaWMgY2xhc3MgVGVzdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewogCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5UZXN0V2l6YXJkUGFnZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVElUTEUgPSAiTmV3IFJlZmFjdG9yaW5nOiBUZXN0IERhdGEiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0RFU0NSSVBUSU9OID0gIlBsZWFzZSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0byBiZSBnZW5lcmF0ZWQuICIgKworCQkJCQkJCQkJCQkJIlJlcXVpcmVkIGZpZWxkcyBhcmUgZGVub3RlZCBieSBcIigqKVwiLiI7CisJCiAJcHJpdmF0ZSBUZXh0IG51bWJlclRleHQ7CiAJcHJpdmF0ZSBDb21ibyBudW1iZXJDb21ibzsJCiAJCiAJLyoqCiAJICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKiBAcGFyYW0gcGFnZU5hbWUgTmFtZSBvZiB0aGUgd2l6YXJkIHBhZ2UuCiAJICovCi0JcHJvdGVjdGVkIFRlc3RXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7CisJcHJvdGVjdGVkIFRlc3RXaXphcmRQYWdlKCkgeworCQlzdXBlcihQQUdFX05BTUUpOworCQlzZXRUaXRsZShQQUdFX1RJVExFKTsKKwkJc2V0RGVzY3JpcHRpb24oUEFHRV9ERVNDUklQVElPTik7CiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvQ29uZmlnLmphdmFqZXQgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9Db25maWcuamF2YWpldAppbmRleCA2YTA5YTQ0Li43MDU4YWMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9Db25maWcuamF2YWpldAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9Db25maWcuamF2YWpldApAQCAtMSw1ICsxLDUgQEAKIDwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nIiBjbGFzcz0iUmVmYWN0b3JpbmdDb250cm9sbGVyIgotaW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlIiU+CitpbXBvcnRzPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmNvcmUuKiIlPgogPCVSZWZhY3RvcmluZ0luZm8gaW5mbyA9IChSZWZhY3RvcmluZ0luZm8pIGFyZ3VtZW50OyAlPgogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxjb25maWc+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ0NvbnRyb2xsZXIuamF2YWpldCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nQ29udHJvbGxlci5qYXZhamV0CmluZGV4IGQ4ZDkzYjYuLjdkNzQ1YzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nQ29udHJvbGxlci5qYXZhamV0CisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nQ29udHJvbGxlci5qYXZhamV0CkBAIC0xLDExICsxLDExIEBACiA8JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZyIgY2xhc3M9IlJlZmFjdG9yaW5nQ29udHJvbGxlciIKLWltcG9ydHM9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IuY29yZSIlPgoraW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlLioiJT4KIDwlUmVmYWN0b3JpbmdJbmZvIGluZm8gPSAoUmVmYWN0b3JpbmdJbmZvKSBhcmd1bWVudDsgJT4KIC8qKgogICogPGNvcHlyaWdodD4KICAqIDwvY29weXJpZ2h0PgogICoKLSAqICRJZDogUmVmYWN0b3JpbmdDb250cm9sbGVyLmphdmFqZXQsdiAxLjEgMjAxMi8xMC8xNiAxMTo1MzowNSB0YXJlbmR0IEV4cCAkCisgKiAkSWQ6IFJlZmFjdG9yaW5nQ29udHJvbGxlci5qYXZhamV0LHYgMS4yIDIwMTIvMTAvMTYgMjE6MDM6MDIgdGFyZW5kdCBFeHAgJAogICovCiBwYWNrYWdlIDwlPWluZm8uZ2V0UGFja2FnZU5hbWUoKSU+OwogCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCQk8JT1pbmZvLmdldFNlbGVjdGVkRU9iamVjdENsYXNzKCklPiBzZWxlY3RlZEVPYmplY3QgPSAKIAkJCQkJKDwlPWluZm8uZ2V0U2VsZWN0ZWRFT2JqZWN0Q2xhc3MoKSU+KSBkYXRhTWFuYWdlbWVudC4KIAkJCQkJCQlnZXRJblBvcnRCeU5hbWUoZGF0YU1hbmFnZW1lbnQuU0VMRUNURURFT0JKRUNUKS5nZXRWYWx1ZSgpOzwlLyoKLQkJCQkqLyU+PCVmb3IgKFBhcmFtZXRlckNvbmZpZyBwQyA6IGluZm8uZ2V0UGFyYW1ldGVycygpKSB7ICU+CisJCQkJKi8lPjwlZm9yIChQYXJhbWV0ZXJJbmZvIHBDIDogaW5mby5nZXRQYXJhbWV0ZXJzKCkpIHsgJT4KIAkJCQlTdHJpbmcgPCU9cEMuZ2V0TmFtZSgpJT4gPQogCQkJCQkoU3RyaW5nKSBkYXRhTWFuYWdlbWVudC5nZXRJblBvcnRCeU5hbWUoIjwlPXBDLmdldE5hbWUoKSU+IikuZ2V0VmFsdWUoKTs8JX0lPgogCQkJCS8vIFRPRE86IGltcGxlbWVudCBtb2RlbCB0cmFuc2Zvcm1hdGlvbgpAQCAtMTc2LDcgKzE3Niw3IEBACiAJCQkJPCU9aW5mby5nZXRTZWxlY3RlZEVPYmplY3RDbGFzcygpJT4gc2VsZWN0ZWRFT2JqZWN0ID0gCiAJCQkJCSg8JT1pbmZvLmdldFNlbGVjdGVkRU9iamVjdENsYXNzKCklPikgZGF0YU1hbmFnZW1lbnQuCiAJCQkJCQkJZ2V0SW5Qb3J0QnlOYW1lKGRhdGFNYW5hZ2VtZW50LlNFTEVDVEVERU9CSkVDVCkuZ2V0VmFsdWUoKTs8JS8qCi0JCQkJKi8lPjwlZm9yIChQYXJhbWV0ZXJDb25maWcgcEMgOiBpbmZvLmdldFBhcmFtZXRlcnMoKSkgeyU+CisJCQkJKi8lPjwlZm9yIChQYXJhbWV0ZXJJbmZvIHBDIDogaW5mby5nZXRQYXJhbWV0ZXJzKCkpIHslPgogCQkJCVN0cmluZyA8JT1wQy5nZXROYW1lKCklPiA9CiAJCQkJCShTdHJpbmcpIGRhdGFNYW5hZ2VtZW50LmdldEluUG9ydEJ5TmFtZSgiPCU9cEMuZ2V0TmFtZSgpJT4iKS5nZXRWYWx1ZSgpOzwlfSU+CiAJCQkJLy8gVE9ETzogaW1wbGVtZW50IGZpbmFsIGNoZWNrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ0RhdGFNYW5hZ2VtZW50LmphdmFqZXQgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ0RhdGFNYW5hZ2VtZW50LmphdmFqZXQKaW5kZXggMWJmMzcyYi4uOGFjYzM5ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdEYXRhTWFuYWdlbWVudC5qYXZhamV0CisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nRGF0YU1hbmFnZW1lbnQuamF2YWpldApAQCAtMSwxMSArMSwxMSBAQAogPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmciIGNsYXNzPSJSZWZhY3RvcmluZ0RhdGFNYW5hZ2VtZW50IgotaW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlIiU+CitpbXBvcnRzPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmNvcmUuKiIlPgogPCVSZWZhY3RvcmluZ0luZm8gaW5mbyA9IChSZWZhY3RvcmluZ0luZm8pIGFyZ3VtZW50OyAlPgogLyoqCiAgKiA8Y29weXJpZ2h0PgogICogPC9jb3B5cmlnaHQ+CiAgKgotICogJElkOiBSZWZhY3RvcmluZ0RhdGFNYW5hZ2VtZW50LmphdmFqZXQsdiAxLjEgMjAxMi8xMC8xNiAxMTo1MzowNSB0YXJlbmR0IEV4cCAkCisgKiAkSWQ6IFJlZmFjdG9yaW5nRGF0YU1hbmFnZW1lbnQuamF2YWpldCx2IDEuMiAyMDEyLzEwLzE2IDIxOjAzOjAyIHRhcmVuZHQgRXhwICQKICAqLwogIHBhY2thZ2UgPCU9aW5mby5nZXRQYWNrYWdlTmFtZSgpJT47CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nR3VpSGFuZGxlci5qYXZhamV0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdHdWlIYW5kbGVyLmphdmFqZXQKaW5kZXggMmEzYTVmZC4uZWVhNzIxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdHdWlIYW5kbGVyLmphdmFqZXQKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdHdWlIYW5kbGVyLmphdmFqZXQKQEAgLTEsMTEgKzEsMTEgQEAKIDwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nIiBjbGFzcz0iUmVmYWN0b3JpbmdHdWlIYW5kbGVyIgotaW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlIiU+CitpbXBvcnRzPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmNvcmUuKiIlPgogPCVSZWZhY3RvcmluZ0luZm8gaW5mbyA9IChSZWZhY3RvcmluZ0luZm8pIGFyZ3VtZW50OyAlPgogLyoqCiAgKiA8Y29weXJpZ2h0PgogICogPC9jb3B5cmlnaHQ+CiAgKgotICogJElkOiBSZWZhY3RvcmluZ0d1aUhhbmRsZXIuamF2YWpldCx2IDEuMSAyMDEyLzEwLzE2IDExOjUzOjA0IHRhcmVuZHQgRXhwICQKKyAqICRJZDogUmVmYWN0b3JpbmdHdWlIYW5kbGVyLmphdmFqZXQsdiAxLjIgMjAxMi8xMC8xNiAyMTowMzowMiB0YXJlbmR0IEV4cCAkCiAgKi8KICBwYWNrYWdlIDwlPWluZm8uZ2V0UGFja2FnZU5hbWUoKSU+OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ1Rlc3QuamF2YWpldCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nVGVzdC5qYXZhamV0CmluZGV4IDYwMWNmMWEuLjNmY2FhYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nVGVzdC5qYXZhamV0CisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nVGVzdC5qYXZhamV0CkBAIC0xLDExICsxLDExIEBACiA8JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZyIgY2xhc3M9IlJlZmFjdG9yaW5nVGVzdCIKLWltcG9ydHM9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IuY29yZSIlPgoraW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlLioiJT4KIDwlUmVmYWN0b3JpbmdJbmZvIGluZm8gPSAoUmVmYWN0b3JpbmdJbmZvKSBhcmd1bWVudDsgJT4KIC8qKgogICogPGNvcHlyaWdodD4KICAqIDwvY29weXJpZ2h0PgogICoKLSAqICRJZDogUmVmYWN0b3JpbmdUZXN0LmphdmFqZXQsdiAxLjEgMjAxMi8xMC8xNiAxMTo1MzowNSB0YXJlbmR0IEV4cCAkCisgKiAkSWQ6IFJlZmFjdG9yaW5nVGVzdC5qYXZhamV0LHYgMS4yIDIwMTIvMTAvMTYgMjE6MDM6MDIgdGFyZW5kdCBFeHAgJAogICovCiAgCiBwYWNrYWdlIDwlPWluZm8uZ2V0UGFja2FnZU5hbWUoKSU+OwpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IDwlPWluZm8uZ2V0UGFja2FnZU5hbWUoKSU+LlJlZmFjdG9yaW5nQ29udHJvbGxlcjsKIGltcG9ydCA8JT1pbmZvLmdldFBhY2thZ2VOYW1lKCklPi5SZWZhY3RvcmluZ0d1aUhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLnJ1bnRpbWUudGVzdC5KVW5pdFRlc3RDYXNlQWRhcHRlcjsKLWltcG9ydCA8JT1pbmZvLmdldEphcigpJT4uPCU9aW5mby5nZXRNZXRhTW9kZWxOYW1lKCklPlBhY2thZ2U7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CkBAIC01Miw3ICs1MSw3IEBACiAJCQkiPCU9aW5mby5nZXROYW1lc3BhY2VQcmVmaXgoKSU+IiwKIAkJCW5ldyBGaWxlKCIuIikuZ2V0Q2Fub25pY2FsUGF0aCgpLAogCQkJbmV3IFJlZmFjdG9yaW5nKG51bGwsICIiLCAiPCU9aW5mby5nZXROYW1lc3BhY2VVcmkoKSU+IiwgbmV3IFJlZmFjdG9yaW5nR3VpSGFuZGxlcigpLCBuZXcgUmVmYWN0b3JpbmdDb250cm9sbGVyKCkpKTsKLQkJcmVnaXN0ZXIoPCU9aW5mby5nZXRNZXRhTW9kZWxOYW1lKCklPlBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJLy9yZWdpc3RlcihpbmZvLmdldE1ldGFNb2RlbE5hbWUoKVBhY2thZ2UuZUlOU1RBTkNFKTsKIAkJdGhpcy5udW1iZXIgPSBudW1iZXI7CiAJfQogCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdXaXphcmQuamF2YWpldCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IvdGVtcGxhdGVzL1JlZmFjdG9yaW5nV2l6YXJkLmphdmFqZXQKaW5kZXggNWFhMjIyOS4uOTRlOWU5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdXaXphcmQuamF2YWpldAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ1dpemFyZC5qYXZhamV0CkBAIC0xLDExICsxLDExIEBACiA8JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZyIgY2xhc3M9IlJlZmFjdG9yaW5nV2l6YXJkIgotaW1wb3J0cz0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci5jb3JlIiU+CitpbXBvcnRzPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmNvcmUuKiIlPgogPCVSZWZhY3RvcmluZ0luZm8gaW5mbyA9IChSZWZhY3RvcmluZ0luZm8pIGFyZ3VtZW50OyAlPgogLyoqCiAgKiA8Y29weXJpZ2h0PgogICogPC9jb3B5cmlnaHQ+CiAgKgotICogJElkOiBSZWZhY3RvcmluZ1dpemFyZC5qYXZhamV0LHYgMS4xIDIwMTIvMTAvMTYgMTE6NTM6MDUgdGFyZW5kdCBFeHAgJAorICogJElkOiBSZWZhY3RvcmluZ1dpemFyZC5qYXZhamV0LHYgMS4yIDIwMTIvMTAvMTYgMjE6MDM6MDIgdGFyZW5kdCBFeHAgJAogICovCiAgcGFja2FnZSA8JT1pbmZvLmdldFBhY2thZ2VOYW1lKCklPjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmdlbmVyYXRvci90ZW1wbGF0ZXMvUmVmYWN0b3JpbmdXaXphcmRQYWdlLmphdmFqZXQgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ1dpemFyZFBhZ2UuamF2YWpldAppbmRleCA1N2U5Yjg2Li4yYjUzMDZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ1dpemFyZFBhZ2UuamF2YWpldAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yL3RlbXBsYXRlcy9SZWZhY3RvcmluZ1dpemFyZFBhZ2UuamF2YWpldApAQCAtMSwxMSArMSwxMSBAQAogPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmciIGNsYXNzPSJSZWZhY3RvcmluZ1dpemFyZFBhZ2UiCi1pbXBvcnRzPSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuZ2VuZXJhdG9yLmNvcmUiJT4KK2ltcG9ydHM9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5nZW5lcmF0b3IuY29yZS4qIiU+CiA8JVJlZmFjdG9yaW5nSW5mbyBpbmZvID0gKFJlZmFjdG9yaW5nSW5mbykgYXJndW1lbnQ7ICU+CiAvKioKICAqIDxjb3B5cmlnaHQ+CiAgKiA8L2NvcHlyaWdodD4KICAqCi0gKiAkSWQ6IFJlZmFjdG9yaW5nV2l6YXJkUGFnZS5qYXZhamV0LHYgMS4xIDIwMTIvMTAvMTYgMTE6NTM6MDUgdGFyZW5kdCBFeHAgJAorICogJElkOiBSZWZhY3RvcmluZ1dpemFyZFBhZ2UuamF2YWpldCx2IDEuMiAyMDEyLzEwLzE2IDIxOjAzOjAyIHRhcmVuZHQgRXhwICQKICAqLwogIHBhY2thZ2UgPCU9aW5mby5nZXRQYWNrYWdlTmFtZSgpJT47CiAK