ZGlmZiAtLWdpdCBhL3YxL1JFQURNRS50eHQgYi92MS9SRUFETUUudHh0CmluZGV4IGUxMGMyNmQuLmQ4YjFmMWMgMTAwNjQ0Ci0tLSBhL3YxL1JFQURNRS50eHQKKysrIGIvdjEvUkVBRE1FLnR4dApAQCAtMSw0ICsxLDQgQEAKLVhNTEJlYW5zIHYxLjAuMworWE1MQmVhbnMgdjEuMC4zIChqZGsxLjMgcG9ydCkKIAogV2VsY29tZSB0byBYbWxCZWFucyEKIApkaWZmIC0tZ2l0IGEvdjEvYmluL2R1bXB4c2IgYi92MS9iaW4vZHVtcHhzYgppbmRleCBlMDI0ZGE1Li45MDNiMzgxIDEwMDc1NQotLS0gYS92MS9iaW4vZHVtcHhzYgorKysgYi92MS9iaW4vZHVtcHhzYgpAQCAtNiw4ICs2LDEyIEBACiAKIGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyIF07IHRoZW4KICAgICBjcD0kY3A6JFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveG1sLWFwaXMuamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveGVyY2VzSW1wbC5qYXI7CiBlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCiAgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94bWwtYXBpcy5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94ZXJjZXNJbXBsLmphcjsKIGZpCiAKIGNhc2UgImB1bmFtZWAiIGluCmRpZmYgLS1naXQgYS92MS9iaW4vZHVtcHhzYi5jbWQgYi92MS9iaW4vZHVtcHhzYi5jbWQKaW5kZXggNzQ5ZmUxYS4uMThjYTliZSAxMDA2NDQKLS0tIGEvdjEvYmluL2R1bXB4c2IuY21kCisrKyBiL3YxL2Jpbi9kdW1weHNiLmNtZApAQCAtOSw5ICs5LDkgQEAKIHNldCBjcD0KIAogaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4ZXJjZXNJbXBsLmphci4KICkgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhlcmNlc0ltcGwuamFyLgogKQogCiBqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Yc2JEdW1wZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi9qYXhiYy5jbWQgYi92MS9iaW4vamF4YmMuY21kCmluZGV4IGE5ZDIwNzkuLmE2ZGU2Y2UgMTAwNjQ0Ci0tLSBhL3YxL2Jpbi9qYXhiYy5jbWQKKysrIGIvdjEvYmluL2pheGJjLmNtZApAQCAtMTAsNiArMTAsOCBAQAogc2V0IGNwPQogc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcgogc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGV4dGVybmFsXGxpYlxqYXhiLTEuMFxqYXhiLWFwaS5qYXIKK3NldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceG1sLWFwaXMuamFyCitzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhlcmNlc0ltcGwuamFyCiAKIGphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIC1qYXhiICUqCiAKZGlmZiAtLWdpdCBhL3YxL2Jpbi9yYW5kb20uY21kIGIvdjEvYmluL3JhbmRvbS5jbWQKaW5kZXggMDcyN2QyNi4uM2Y1NTk2YiAxMDA2NDQKLS0tIGEvdjEvYmluL3JhbmRvbS5jbWQKKysrIGIvdjEvYmluL3JhbmRvbS5jbWQKQEAgLTksOCArOSwxMCBAQAogCiBzZXQgY3A9CiBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCitzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhtbC1hcGlzLmphcgorc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4ZXJjZXNJbXBsLmphcgogc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXHByaXZhdGVcbGliXHJhbmRvbS5qYXIKIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxwcml2YXRlXGxpYlxlYXN5cG8uamFyCiAKLXJlbSBqYXZhIC1lYSAtRHRyZWVhc3NlcnRzPXRydWUgIC1EeGJlYW4ucm9vdGRpcj0lWE1MQkVBTlNfSE9NRSUgLWNsYXNzcGF0aCAlY3AlIFJhbmRvbSAtbm9xdWVyeSAlKgotICAgIGphdmEgLWVhIC1EdHJlZWFzc2VydHM9ZmFsc2UgLUR4YmVhbi5yb290ZGlyPSVYTUxCRUFOU19IT01FJSAtY2xhc3NwYXRoICVjcCUgUmFuZG9tIC1ub3F1ZXJ5ICUqCityZW0gamF2YSAtRHhtbGJlYW5zLmVhIC1EdHJlZWFzc2VydHM9dHJ1ZSAgLUR4YmVhbi5yb290ZGlyPSVYTUxCRUFOU19IT01FJSAtY2xhc3NwYXRoICVjcCUgUmFuZG9tIC1ub3F1ZXJ5ICUqCisgICAgamF2YSAtRHhtbGJlYW5zLmVhIC1EdHJlZWFzc2VydHM9ZmFsc2UgLUR4YmVhbi5yb290ZGlyPSVYTUxCRUFOU19IT01FJSAtY2xhc3NwYXRoICVjcCUgUmFuZG9tIC1ub3F1ZXJ5ICUqCmRpZmYgLS1naXQgYS92MS9iaW4vc2NvbXAgYi92MS9iaW4vc2NvbXAKaW5kZXggMjdjYmVlZS4uZjYyZTgwNiAxMDA3NTUKLS0tIGEvdjEvYmluL3Njb21wCisrKyBiL3YxL2Jpbi9zY29tcApAQCAtNyw4ICs3LDEyIEBACiAKIGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyIF07IHRoZW4KICAgICBjcD0kY3A6JFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveG1sLWFwaXMuamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveGVyY2VzSW1wbC5qYXI7CiBlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCiAgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94bWwtYXBpcy5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94ZXJjZXNJbXBsLmphcjsKIGZpCiAKIGNhc2UgImB1bmFtZWAiIGluCmRpZmYgLS1naXQgYS92MS9iaW4vc2NvbXAuY21kIGIvdjEvYmluL3Njb21wLmNtZAppbmRleCA2M2ZiMDU2Li5mYzRjZTE4IDEwMDY0NAotLS0gYS92MS9iaW4vc2NvbXAuY21kCisrKyBiL3YxL2Jpbi9zY29tcC5jbWQKQEAgLTEwLDkgKzEwLDkgQEAKIHNldCBjcD0KIAogaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4ZXJjZXNJbXBsLmphci4KICkgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhlcmNlc0ltcGwuamFyLgogKQogCiBqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb3B5LmNtZCBiL3YxL2Jpbi9zY29weS5jbWQKaW5kZXggMzUyOWE2Mi4uZGJkZjM0YiAxMDA2NDQKLS0tIGEvdjEvYmluL3Njb3B5LmNtZAorKysgYi92MS9iaW4vc2NvcHkuY21kCkBAIC0xMCw5ICsxMCw5IEBACiBzZXQgY3A9CiAKIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceG1sLWFwaXMuamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceGVyY2VzSW1wbC5qYXIuCiApIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKyAgICBzZXQgY3A9JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4ZXJjZXNJbXBsLmphci4KICkKIAogamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29weSAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Nkb3dubG9hZC5jbWQgYi92MS9iaW4vc2Rvd25sb2FkLmNtZAppbmRleCAxYmIzZTJiLi4xMjE2OTU3IDEwMDY0NAotLS0gYS92MS9iaW4vc2Rvd25sb2FkLmNtZAorKysgYi92MS9iaW4vc2Rvd25sb2FkLmNtZApAQCAtMTAsOSArMTAsOSBAQAogc2V0IGNwPQogCiBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KKyAgICBzZXQgY3A9JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhlcmNlc0ltcGwuamFyLgogKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceGJlYW4uamFyOyVYTUxCRUFOU19IT01FJVxsaWJceG1sLWFwaXMuamFyOyVYTUxCRUFOU19IT01FJVxsaWJceGVyY2VzSW1wbC5qYXIuCiApCiAKIGphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYVJlc291cmNlTWFuYWdlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3NmYWN0b3IuY21kIGIvdjEvYmluL3NmYWN0b3IuY21kCmluZGV4IDAzMzRlMzIuLjM3OWQ1NWEgMTAwNjQ0Ci0tLSBhL3YxL2Jpbi9zZmFjdG9yLmNtZAorKysgYi92MS9iaW4vc2ZhY3Rvci5jbWQKQEAgLTEwLDkgKzEwLDkgQEAKIHNldCBjcD0KIAogaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4ZXJjZXNJbXBsLmphci4KICkgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhlcmNlc0ltcGwuamFyLgogKQogCiBqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5GYWN0b3JJbXBvcnRzICUqCmRpZmYgLS1naXQgYS92MS9iaW4vdmFsaWRhdGUgYi92MS9iaW4vdmFsaWRhdGUKaW5kZXggOTU4OWRjOS4uMjUzNTU4MyAxMDA3NTUKLS0tIGEvdjEvYmluL3ZhbGlkYXRlCisrKyBiL3YxL2Jpbi92YWxpZGF0ZQpAQCAtOCw4ICs4LDEyIEBACiAKIGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyIF07IHRoZW4KICAgICBjcD0kY3A6JFhNTEJFQU5TX0hPTUUvYnVpbGQvYXIveGJlYW4uamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveG1sLWFwaXMuamFyOworICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9saWIveGVyY2VzSW1wbC5qYXI7CiBlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCiAgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94bWwtYXBpcy5qYXI7CisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94ZXJjZXNJbXBsLmphcjsKIGZpCiAKIGNhc2UgImB1bmFtZWAiIGluCmRpZmYgLS1naXQgYS92MS9iaW4vdmFsaWRhdGUuY21kIGIvdjEvYmluL3ZhbGlkYXRlLmNtZAppbmRleCBiMDNkZDQxLi4wNmQ1YTY4IDEwMDY0NAotLS0gYS92MS9iaW4vdmFsaWRhdGUuY21kCisrKyBiL3YxL2Jpbi92YWxpZGF0ZS5jbWQKQEAgLTEwLDkgKzEwLDkgQEAKIHNldCBjcD0KIAogaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4ZXJjZXNJbXBsLmphci4KICkgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAotICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcbGliXHhlcmNlc0ltcGwuamFyLgogKQogCiBqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3hwcmV0dHkuY21kIGIvdjEvYmluL3hwcmV0dHkuY21kCmluZGV4IDAxZmUxM2IuLmQ1OTIwMzMgMTAwNjQ0Ci0tLSBhL3YxL2Jpbi94cHJldHR5LmNtZAorKysgYi92MS9iaW4veHByZXR0eS5jbWQKQEAgLTgsOSArOCw5IEBACiBzZXQgY3A9CiAKIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceG1sLWFwaXMuamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceGVyY2VzSW1wbC5qYXIuCiApIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKyAgICBzZXQgY3A9JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4ZXJjZXNJbXBsLmphci4KICkKIAogamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuUHJldHR5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3hzZHRyZWUuY21kIGIvdjEvYmluL3hzZHRyZWUuY21kCmluZGV4IDQyNjIwMmMuLjBlMDhmYmEgMTAwNjQ0Ci0tLSBhL3YxL2Jpbi94c2R0cmVlLmNtZAorKysgYi92MS9iaW4veHNkdHJlZS5jbWQKQEAgLTgsOSArOCw5IEBACiBzZXQgY3A9CiAKIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgorICAgIHNldCBjcD0lWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceG1sLWFwaXMuamFyOyVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceGVyY2VzSW1wbC5qYXIuCiApIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKLSAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKyAgICBzZXQgY3A9JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGxpYlx4YmVhbi5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4bWwtYXBpcy5qYXI7JVhNTEJFQU5TX0hPTUUlXGxpYlx4ZXJjZXNJbXBsLmphci4KICkKIAogamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi94c3RjLmNtZCBiL3YxL2Jpbi94c3RjLmNtZAppbmRleCAzM2I4ZTdiLi5jYWI1YTcwIDEwMDY0NAotLS0gYS92MS9iaW4veHN0Yy5jbWQKKysrIGIvdjEvYmluL3hzdGMuY21kCkBAIC04LDkgKzgsOSBAQAogc2V0IGNwPQogCiBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KKyAgICBzZXQgY3A9JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphcjslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhtbC1hcGlzLmphcjslWE1MQkVBTlNfSE9NRSVcYnVpbGRcbGliXHhlcmNlc0ltcGwuamFyLgogKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCi0gICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCisgICAgc2V0IGNwPSVYTUxCRUFOU19IT01FJVxidWlsZFxsaWJceGJlYW4uamFyOyVYTUxCRUFOU19IT01FJVxsaWJceG1sLWFwaXMuamFyOyVYTUxCRUFOU19IT01FJVxsaWJceGVyY2VzSW1wbC5qYXIuCiApCiAKIGphdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhTVENUZXN0ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2J1aWxkLnhtbCBiL3YxL2J1aWxkLnhtbAppbmRleCBiNWY2ZjhkLi5iYjFjNDZlIDEwMDY0NAotLS0gYS92MS9idWlsZC54bWwKKysrIGIvdjEvYnVpbGQueG1sCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KIDxwcm9qZWN0IG5hbWU9IlhiZWFuIiBkZWZhdWx0PSJkZWZhdWx0IiBiYXNlZGlyPSIuIj4KIAotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJqYXZhYzEuNCIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJqYXZhYzEuMyIvPgogICA8cHJvcGVydHkgbmFtZT0icHJvZHVjdC52ZXJzaW9uIiB2YWx1ZT0iMS4wLjMiLz4KIAogICA8dGFyZ2V0IG5hbWU9InVzYWdlIj4KQEAgLTU2LDEwICs1NiwxMiBAQAogICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iUmFuZG9tIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CiAgICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KKyAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvcmFuZG9tLmphciIvPgogICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICAgICA8YXJnIGxpbmU9Ii1zZWVkIDAgLWkgMjAgLW5vcXVlcnkiLz4KICAgICAgICA8L2phdmE+CiAKQEAgLTY3LDEyICs2OSwxNCBAQAogICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgeGJlYW4gcHJvZHVjdCBkcnQgdGVzdHMiLz4KICAgICA8ZWNobyBtZXNzYWdlPSJKVW5pdCBvdXRwdXQgYmVpbmcgc2VudCB0byBidWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdC50eHQiLz4KICAgICA8anVuaXQgZm9yaz0ieWVzIiBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBzaG93b3V0cHV0PSJ5ZXMiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICA8c3lzcHJvcGVydHkga2V5PSJ4YmVhbi5yb290ZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgogICAgICAgPHN5c3Byb3BlcnR5IGtleT0idHJlZWFzc2VydHMiIHZhbHVlPSJ0cnVlIi8+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZHJ0LmphciIvPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciIvPgpAQCAtMTAyLDcgKzEwNiw3IEBACiAgICAgPHRhcmdldCBuYW1lPSJleHRlbnNpb25zVGVzdCIgZGVwZW5kcz0iZXh0ZW5zaW9ucy5jb21waWxlIj4KICAgICAgIDxlY2hvIG1lc3NhZ2U9IkpVbml0IG91dHB1dCBiZWluZyBzZW50IHRvIGJ1aWxkL3Rlc3Qvb3V0cHV0L2RydC1leHRlbnNpb25zLnR4dCIvPgogICAgICAgPGp1bml0IGZvcms9InllcyIgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyIgc2hvd291dHB1dD0ieWVzIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KQEAgLTEyNSw0NyArMTI5LDU3IEBACiAKICAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLnNpbXBsZUJlYW5zIiB1bmxlc3M9InNpbXBsZUJlYW5zLm5vdFJlcXVpcmVkIiBkZXBlbmRzPSJzaW1wbGVCZWFucy5jaGVjayI+CiAgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGVyY2VzSW1wbC5qYXIiLz4KICAgICAgICAgPC9jbGFzc3BhdGg+CiAgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9maXhlZEF0dHJCZWFuLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL2ZpeGVkQXR0ckJlYW4vcG8ueHNkIi8+CiAgICAgICA8L2phdmE+CiAKICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIvPgogICAgICAgICA8L2NsYXNzcGF0aD4KICAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2F2ZXJhZ2VDYXNlLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlL3BvLnhzZCIvPgogICAgICAgPC9qYXZhPgogCiAgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGVyY2VzSW1wbC5qYXIiLz4KICAgICAgICAgPC9jbGFzc3BhdGg+CiAgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9tdWx0SW50ZXJmYWNlcy5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9wby54c2QiLz4KICAgICAgIDwvamF2YT4KIAogICAgICAgPCEtLSAqKlByZS9Qb3N0IEhhbmRsZXJzIC0tPgogICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbC1hcGlzLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvcmVhZE9ubHlCZWFuLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9wby54c2QiLz4KICAgICAgIDwvamF2YT4KIAogICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbC1hcGlzLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvVmFsdWVSZXN0cmljdGlvbi5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL2NvbXBhbnkueHNkIi8+CiAgICAgICA8L2phdmE+CkBAIC0xODEsNTYgKzE5NSw2OCBAQAogICAgICAgPC9qYXZhYz4KIAogICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbC1hcGlzLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZXh0ZW5zaW9ucy5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UiLz4KICAgICAgIDwvamF2YT4KIAogICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbC1hcGlzLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZml4ZWRBdHRyQmVhbi5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9maXhlZEF0dHJCZWFuIi8+CiAgICAgICA8L2phdmE+CiAKICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIvPgogICAgICAgICA8L2NsYXNzcGF0aD4KICAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2F2ZXJhZ2VDYXNlLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlIi8+CiAgICAgICA8L2phdmE+CiAKICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIvPgogICAgICAgICA8L2NsYXNzcGF0aD4KICAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL211bHRJbnRlcmZhY2VzLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL211bHRJbnRlcmZhY2VzIi8+CiAgICAgICA8L2phdmE+CiAgICAgICA8IS0tUHJlIFBvc3QgRmVhdHVyZSAtLT4KIAogICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbC1hcGlzLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hlcmNlc0ltcGwuamFyIi8+CiAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvcmVhZE9ubHlCZWFuLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbiIvPgogICAgICAgPC9qYXZhPgogCiAgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGVyY2VzSW1wbC5qYXIiLz4KICAgICAgICAgPC9jbGFzc3BhdGg+CiAgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9WYWx1ZVJlc3RyaWN0aW9uLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24iLz4KICAgICAgIDwvamF2YT4KQEAgLTI3OCw3ICszMDQsNyBAQAogICAgIDwhLS0gY29tcGFyZSB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGphciB0byB0aGUgY29udGVudHMgb2YgdGhlIHNlY29uZCBqYXIgLS0+CiAgICAgPGFudGNhbGwgdGFyZ2V0PSJ6aXBjb21wYXJlLmNsYXNzZXMiIGluaGVyaXRBbGw9ImZhbHNlIi8+CiAgICAgPGphdmEgY2xhc3NuYW1lPSJ6aXBjb21wYXJlLlppcENvbXBhcmUiCi0gICAgICAgICAgY2xhc3NwYXRoPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIKKyAgICAgICAgICBjbGFzc3BhdGg9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy96aXBjb21wYXJlOmJ1aWxkL2NsYXNzZXMvY29tbW9uIgogICAgICAgICAgIGZvcms9InRydWUiCiAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiPgogICAgICAgPGFyZyBsaW5lPSJidWlsZC9hci94YmVhbi5qYXIgYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+CkBAIC0zMDMsMTAgKzMyOSwxMSBAQAogCiAgIDwhLS0gemlwY29tcGFyZSAoZm9yIGNoZWNraW5nIGJvb3RzdHJhcCkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAotICA8dGFyZ2V0IG5hbWU9InppcGNvbXBhcmUuY2xhc3NlcyI+CisgIDx0YXJnZXQgbmFtZT0iemlwY29tcGFyZS5jbGFzc2VzIiBkZXBlbmRzPSJjb21tb24uY2xhc3NlcyI+CiAgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiLz4KICAgICA8amF2YWMgc3JjZGlyPSJzcmMvemlwY29tcGFyZSIKICAgICAgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiCisgICAgICAgICAgIGNsYXNzcGF0aD0iYnVpbGQvY2xhc3Nlcy9jb21tb24iCiAgICAgICAgICAgIGRlYnVnPSJvbiIvPgogICA8L3RhcmdldD4KIApAQCAtMzE1LDYgKzM0Miw3IEBACiAgIDxwYXRoIGlkPSJ0ZXN0LmNvbXBpbGUucGF0aCI+CiAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJleHRlcm5hbC9saWIvanVuaXQuamFyIi8+CiAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2VyaWNzY2hlbWEuamFyIi8+CiAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciIvPgpAQCAtMzI4LDYgKzM1Niw3IEBACiAKICAgPHBhdGggaWQ9InRlc3QucnVuLnBhdGgiPgogICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CiAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJleHRlcm5hbC9saWIvanVuaXQuamFyIi8+CiAgIDwvcGF0aD4KIApAQCAtMzQwLDcgKzM2OSw3IEBACiAgICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9kcnQiCiAgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL2RydCIKICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIHNvdXJjZT0iMS4zIgogICAgICAgIGRlYnVnPSJvbiIvPgogICA8L3RhcmdldD4KIApAQCAtMzUyLDYgKzM4MSw4IEBACiAKICAgPHBhdGggaWQ9InNjb21wLnJ1bi5wYXRoIj4KICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94YmVhbi5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIvPgogICA8L3BhdGg+CiAKICAgPHRhcmdldCBuYW1lPSJzdHNzY2hlbWEuY2hlY2siPgpAQCAtMzYzLDcgKzM5NCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJzdHNzY2hlbWEuamFyIiBkZXBlbmRzPSJzdHNzY2hlbWEuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9InN0c3NjaGVtYS5ub3RSZXF1aXJlZCI+CiAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL3N0c3NjaGVtYS5qYXIgdGVzdC9zcmMvc3Rzc2NoZW1hIi8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTM3MiwxMSArNDAzLDEyIEBACiAKICAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBzdHNzY2hlbWEuamFyIj4KICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy9zb2FwdGVzdCIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NvYXB0ZXN0IiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy9zb2FwdGVzdCIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NvYXB0ZXN0IiBzb3VyY2U9IjEuMyIgZGVidWc9Im9uIj4KICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2pkb20uamFyIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIi8+CiAgICAgICA8L2NsYXNzcGF0aD4KICAgICA8L2phdmFjPgpAQCAtMzk1LDcgKzQyNyw3IEBACiAgICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9lcmljdGVzdCIKICAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZXJpY3Rlc3QiCiAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNvbXBpbGUucGF0aCIKLSAgICAgICBzb3VyY2U9IjEuNCIKKyAgICAgICBzb3VyY2U9IjEuMyIKICAgICAgICBkZWJ1Zz0ib24iLz4KICAgPC90YXJnZXQ+CiAKQEAgLTQxMSw3ICs0NDMsNyBAQAogICAgICAgIHNyY2Rpcj0idGVzdC9zcmMvcmFuZG9tIgogICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9yYW5kb20iCiAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNvbXBpbGUucGF0aCIKLSAgICAgICBzb3VyY2U9IjEuNCIKKyAgICAgICBzb3VyY2U9IjEuMyIKICAgICAgICBkZWJ1Zz0ib24iLz4KICAgPC90YXJnZXQ+CiAKQEAgLTQyMyw3ICs0NTUsNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0idGVzdHN0b3JlLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMiPgogICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0c3RvcmUiLz4KLSAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy90ZXN0c3RvcmUiIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0c3RvcmUiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgIDxqYXZhYyBzcmNkaXI9InRlc3Qvc3JjL3Rlc3RzdG9yZSIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3Rlc3RzdG9yZSIgc291cmNlPSIxLjMiIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9zaW1wbGV0eXBlcyIvPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy94bWxjb21wIi8+CkBAIC00NTAsNyArNDgyLDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9InNpbXBsZXR5cGVzLmphciIgZGVwZW5kcz0ic2ltcGxldHlwZXMuY2hlY2ssIGRpcnMiIHVubGVzcz0ic2ltcGxldHlwZS5ub3RSZXF1aXJlZCI+CiAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgPGFyZyBsaW5lPSItbmFtZSBzY2hlbWEudGVzdC5zaW1wbGUgLW91dCBidWlsZC9wcml2YXRlL2xpYi9zaW1wbGV0eXBlcy5qYXIgdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIi8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTQ2Niw3ICs0OTgsNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0iZWFzeXBvLmphciIgZGVwZW5kcz0iZWFzeXBvLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJlYXN5cG8ubm90UmVxdWlyZWQiPgogICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9lYXN5cG8uamFyIHRlc3Qvc3JjL2Vhc3lwbyIvPgogICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CkBAIC00ODAsNyArNTEyLDcgQEAKICAgPC90YXJnZXQ+CiAgIDx0YXJnZXQgbmFtZT0ibnVtZXJhbHMuamFyIiBkZXBlbmRzPSJudW1lcmFscy5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0ibnVtZXJhbHMubm90UmVxdWlyZWQiPgogICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9udW1lcmFscy5qYXIgdGVzdC9zcmMvbnVtZXJhbHMiLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpAQCAtNDk2LDcgKzUyOCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJzY2hlbWFzLmphciIgZGVwZW5kcz0ic2NoZW1hcy5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0ic2NoZW1hcy5ub3RSZXF1aXJlZCI+CiAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIHRlc3Qvc3JjL3NjaGVtYXMiLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpAQCAtNTEyLDcgKzU0NCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJlcmljc2NoZW1hLmphciIgZGVwZW5kcz0iZXJpY3NjaGVtYS5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZXJpY3NjaGVtYS5ub3RSZXF1aXJlZCI+CiAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgPGFyZyBsaW5lPSItc3JjIGJ1aWxkL3ByaXZhdGUvc3JjIC1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZXJpY3NjaGVtYS5qYXIgdGVzdC9zcmMvZXJpY3NjaGVtYSIvPgogICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CkBAIC01MjgsNyArNTYwLDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9ImVudW10ZXN0LmphciIgZGVwZW5kcz0iZW51bXRlc3QuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9ImVudW10ZXN0Lm5vdFJlcXVpcmVkIj4KICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZW51bXRlc3QuamFyIHRlc3Qvc3JjL2VudW10ZXN0Ii8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTU0NCw3ICs1NzYsNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0ieHN0eXBlcy5qYXIiIGRlcGVuZHM9InhzdHlwZXMuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9InhzdHlwZXMubm90UmVxdWlyZWQiPgogICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciB0ZXN0L3NyYy94c3R5cGVzIi8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTU1NywxMCArNTg5LDEwIEBACiAgICAgPHByb3BlcnR5IG5hbWU9ImRvY3MuZGlyIiB2YWx1ZT0iYnVpbGQvZG9jcyIvPgogICAgIDxkZWxldGUgZGlyPSIke2RvY3MuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7ZG9jcy5kaXJ9Ii8+Ci0gICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSIqIiBzb3VyY2VwYXRoPSJzcmMveG1scHVibGljIiBjbGFzc3BhdGg9IiR7amF2YWRvYy5wYXRofSIgZGVzdGRpcj0iJHtkb2NzLmRpcn0vcmVmZXJlbmNlIiB3aW5kb3d0aXRsZT0iWE1MQmVhbnMgRG9jdW1lbnRhdGlvbiIgc291cmNlPSIxLjQiIHN0eWxlc2hlZXRmaWxlPSJkb2NzL3N0eWxlc2hlZXQuY3NzIj4KKyAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9IioiIHNvdXJjZXBhdGg9InNyYy94bWxwdWJsaWMiIGNsYXNzcGF0aD0iJHtqYXZhZG9jLnBhdGh9IiBkZXN0ZGlyPSIke2RvY3MuZGlyfS9yZWZlcmVuY2UiIHdpbmRvd3RpdGxlPSJYTUxCZWFucyBEb2N1bWVudGF0aW9uIiBzb3VyY2U9IjEuMyIgc3R5bGVzaGVldGZpbGU9ImRvY3Mvc3R5bGVzaGVldC5jc3MiPgogICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zL2RvY3MvcmVmZXJlbmNlL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS8iLz4KLSAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS8xLjQvZG9jcy9hcGkvIi8+CisgICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zLjEvZG9jcy9hcGkvIi8+CisgICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvMS4zL2RvY3MvYXBpLyIvPgogICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2FwaURvY3MvIi8+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgpAQCAtNTgzLDcgKzYxNSw3IEBACiAgICAgICBzcmNkaXI9InRlc3Qvc3JjL3N0cmVhbXRlc3QiCiAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdCIKICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jb21waWxlLnBhdGgiCi0gICAgICBzb3VyY2U9IjEuNCIKKyAgICAgIHNvdXJjZT0iMS4zIgogICAgICAgZGVidWc9Im9uIi8+CiAgIDwvdGFyZ2V0PgogCkBAIC02MDAsNyArNjMyLDcgQEAKICAgICA8amF2YSBjbGFzc25hbWU9InN0cmVhbXRlc3QuWG1sU3RyZWFtQ29uZm9ybWFuY2UiCiAgICAgICAgICAgY2xhc3NwYXRocmVmPSJydW4uc3RyZWFtY29uZi5wYXRoIgogICAgICAgICAgIGZvcms9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICA8IS0tYXJnIGxpbmU9InRlc3QvY2FzZXMvc3RyZWFtY29uZi9zbWFsbC54bWwiIC8tLT4KICAgICAgIDxhcmcgbGluZT0idGVzdC9jYXNlcy9zdHJlYW1jb25mL2R0ZC54bWwiIC8+CiAgICAgPC9qYXZhPgpAQCAtNjMxLDYgKzY2Myw4IEBACiAKICAgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIi8+CiAgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiIGZpbGU9ImJ1aWxkL2FyL3hiZWFuLmphciIvPgorICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIiBmaWxlPSJleHRlcm5hbC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiIGZpbGU9ImV4dGVybmFsL2xpYi94ZXJjZXNJbXBsLmphciIvPgogICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIiBmaWxlPSJleHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIiLz4KICAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2xpYiIgZmlsZT0iYnVpbGQvbGliL3hiZWFuX3hwYXRoLmphciIvPgogCkBAIC03MDEsNyArNzM1LDcgQEAKICAgPCEtLSBwcmV2aW91c2x5IGluIHhiZWFuLnhtbCAtLT4KIAogICA8dGFyZ2V0IG5hbWU9InhiZWFuLmphciIKLSAgICAgICAgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmNsYXNzZXMsIHR5cGVzdG9yZS5jbGFzc2VzLAorICAgICAgICBkZXBlbmRzPSJkaXJzLCB4bWwtYXBpcy5qYXIsIHhlcmNlc0ltcGwuamFyLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsCiAgICAgICAgICAgICAgICAgIGNvbW1vbi5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCB4bWxjb21wLmNsYXNzZXMsCiAgICAgICAgICAgICAgICAgIHhtbHN0b3JlLmNsYXNzZXMsCiAgICAgICAgICAgICAgICAgIG9sZHhiZWFuLmphciwgeHNkc2NoZW1hLmNsYXNzZXMsCkBAIC03MzYsNyArNzcwLDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9InhtbHB1YmxpYy5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxwdWJsaWMiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1scHVibGljIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIgc291cmNlPSIxLjMiIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KICAgICAgIDwvY2xhc3NwYXRoPgpAQCAtNzU2LDcgKzc5MCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJ0eXBlc3RvcmUuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmNsYXNzZXMsIGNvbW1vbi5jbGFzc2VzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy90eXBlc3RvcmUiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvdHlwZXN0b3JlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIgc291cmNlPSIxLjMiIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgpAQCAtNzcwLDExICs4MDQsMTQgQEAKIAogICA8dGFyZ2V0IG5hbWU9ImNvbW1vbi5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuamFyLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIj4KICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy9jb21tb24iIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvY29tbW9uIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICA8amF2YWMgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iIHNvdXJjZT0iMS4zIiBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CiAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgIDxzcmMgcGF0aD0ic3JjL2NvbW1vbiIvPgorICAgICAgPHNyYyBwYXRoPSJzcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4Ii8+CiAgICAgPC9qYXZhYz4KIAogICA8L3RhcmdldD4KQEAgLTc4Myw3ICs4MjAsNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0idHlwZWltcGwuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgcmVwYWNrYWdlLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcywgeHNkc2NoZW1hLmNsYXNzZXMsIGNvbmZpZ3NjaGVtYS5jbGFzc2VzLCB0b29sc2NoZW1hLmNsYXNzZXMiPgogICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiLz4KLSAgICA8amF2YWMgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgPGphdmFjIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiIHNvdXJjZT0iMS4zIiBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KQEAgLTc5Myw2ICs4MzAsNyBAQAogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KICAgICAgIDwvY2xhc3NwYXRoPgogCiAgICAgICAgIDxzcmMgcGF0aD0ic3JjL3R5cGVpbXBsIi8+CkBAIC04MTYsNyArODU0LDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9InhtbGNvbXAuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgcmVwYWNrYWdlLmNsYXNzZXMsIHR5cGVpbXBsLmNsYXNzZXMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcyI+CiAgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxjb21wIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGNvbXAiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGNvbXAiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIgc291cmNlPSIxLjMiIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgpAQCAtODI3LDYgKzg2NSw3IEBACiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KICAgICAgIDwvY2xhc3NwYXRoPgogICAgIDwvamF2YWM+CiAKQEAgLTgzNywxMiArODc2LDEzIEBACiAgIDx0YXJnZXQgbmFtZT0ieG1sc3RvcmUuY2xhc3NlcyIKICAgICAgICAgZGVwZW5kcz0iZGlycywgY29tbW9uLmNsYXNzZXMsIHR5cGVzdG9yZS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcyI+CiAgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIvPgotICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxzdG9yZSIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbHN0b3JlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbHN0b3JlIiBzb3VyY2U9IjEuMyIgZGVidWc9Im9uIj4KICAgICAgIDxjbGFzc3BhdGggaWQ9InhtbHN0b3JlLmNvbXBpbGUucGF0aCI+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgogICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWwtYXBpcy5qYXIiLz4KICAgICAgIDwvY2xhc3NwYXRoPgogICAgIDwvamF2YWM+CiAKQEAgLTg1OCw2ICs4OTgsOCBAQAogCiAgIDxwYXRoIGlkPSJib290c3RyYXAucnVuLnBhdGgiPgogICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGVyY2VzSW1wbC5qYXIiLz4KICAgPC9wYXRoPgogCiAgIDxwYXRoIGlkPSJib290c3RyYXAuY29tcGlsZS5wYXRoIj4KQEAgLTg4NSw3ICs5MjcsNyBAQAogICAgIDxkZWxldGUgZGlyPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgogICAgIDxkZWxldGUgZGlyPSJidWlsZC9zcmMveHNkc2NoZW1hIi8+CiAgICAgPGphdmEgY2xhc3NuYW1lPSIke2Jvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9ImJvb3RzdHJhcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRHhtbGJlYW5zLmVhIi8+CiAgICAgICA8YXJnIGxpbmU9IiR7cmVwYWNrYWdlX2FyZ30gLW5hbWUgc1hNTFNDSEVNQSAtY3AgJHt4c2RzY2hlbWEuY29tcGlsZS5wYXRofSAtc3Jjb25seSAtZCBidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSAtc3JjIGJ1aWxkL3NyYy94c2RzY2hlbWEgc3JjL3hzZHNjaGVtYS9zY2hlbWEiLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpAQCAtOTA3LDcgKzk0OSw3IEBACiAgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+CiAgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy94bWxzY2hlbWEiLz4KICAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MTEFORyAtZCBidWlsZC9jbGFzc2VzL3htbHNjaGVtYSAtc3JjIGJ1aWxkL3NyYy94bWxzY2hlbWEgLXNyY29ubHkgc3JjL3htbHNjaGVtYS9zY2hlbWEiLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpAQCAtOTE2LDcgKzk1OCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJ4bWxjb25maWcuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmphciwgY29uZmlnc2NoZW1hLmNsYXNzZXMiPgogICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIi8+Ci0gICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGNvbmZpZyIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxjb25maWciIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxjb25maWciIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIiBzb3VyY2U9IjEuMyIgZGVidWc9Im9uIj4KICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgpAQCAtOTQxLDcgKzk4Myw3IEBACiAgIDx0YXJnZXQgbmFtZT0iY29uZmlnc2NoZW1hLmNsYXNzZXMiIGRlcGVuZHM9ImNvbmZpZ3NjaGVtYS5jaGVjaywgeG1scHVibGljLmNsYXNzZXMsIG9sZHhiZWFuLmphciIgdW5sZXNzPSJjb25maWdzY2hlbWEubm90UmVxdWlyZWQiPgogICAgIDxkZWxldGUgZGlyPSJidWlsZC9jbGFzc2VzL2NvbmZpZ3NjaGVtYSIvPgogICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtib290c3RyYXBfc2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJib290c3RyYXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLUR4bWxiZWFucy5lYSIvPgogICAgICAgPGFyZyBsaW5lPSIke3JlcGFja2FnZV9hcmd9IC1uYW1lIHNYTUxDT05GSUcgLXNyY29ubHkgLXNyYyBidWlsZC9zcmMvY29uZmlnc2NoZW1hIC1kIGJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hIHNyYy9jb25maWdzY2hlbWEvc2NoZW1hIi8+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTk2Myw3ICsxMDA1LDcgQEAKICAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy90b29sc2NoZW1hIi8+CiAgICAgPG1rZGlyIGRpcj0iYnVpbGQvc3JjL3Rvb2xzY2hlbWEiLz4KICAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EeG1sYmVhbnMuZWEiLz4KICAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MVE9PTFMgLXNyY29ubHkgLXNyYyBidWlsZC9zcmMvdG9vbHNjaGVtYSAtZCBidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEgc3JjL3Rvb2xzY2hlbWEiLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpAQCAtOTgyLDYgKzEwMjQsNyBAQAogICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtyZXBsYWNlbWVudH0iLz4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICA8L2phdmE+CiAgICAgPC90YXJnZXQ+CkBAIC0xMDE3LDYgKzEwNjAsNyBAQAogICAgICAgICA8amF2YSBjbGFzc25hbWU9InJlcGFja2FnZS5SZXBhY2thZ2UiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgogICAgICAgICAgICAgPGFyZyBsaW5lPSIke25ld19yZXBhY2thZ2VfYXJnfSIvPgogICAgICAgICA8L2phdmE+CkBAIC0xMDQ0LDcgKzEwODgsMzQgQEAKIAogICAgIDx0YXJnZXQgbmFtZT0icmVwYWNrYWdlLmNsYXNzZXMiPgogICAgICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgotICAgICAgICA8amF2YWMgc3JjZGlyPSJzcmMvcmVwYWNrYWdlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiIvPgorICAgICAgICA8amF2YWMgc3JjZGlyPSJzcmMvcmVwYWNrYWdlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIgc291cmNlPSIxLjMiIGRlYnVnPSJvbiIgY2xhc3NwYXRoPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgorICAgIDwvdGFyZ2V0PgorCisKKyAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLnhtbC1hcGlzLmphciI+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InhtbC1hcGlzLmphci5leGlzdHMiPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJidWlsZC9saWIveG1sLWFwaXMuamFyIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ4bWwtYXBpcy5qYXIiIGRlcGVuZHM9ImNoZWNrLnhtbC1hcGlzLmphciwgZGlycyIgdW5sZXNzPSJ4bWwtYXBpcy5qYXIuZXhpc3RzIj4KKyAgICAgICAgPGdldCBkZXN0PSJleHRlcm5hbC9saWIveG1sLWFwaXMtMS4wLmIyLmphciIKKyAgICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWwtYXBpcy9qYXJzL3htbC1hcGlzLTEuMC5iMi5qYXIiCisgICAgICAgICAgICB2ZXJib3NlPSJ0cnVlIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSJleHRlcm5hbC9saWIveG1sLWFwaXMtMS4wLmIyLmphciIgdG9maWxlPSJidWlsZC9saWIveG1sLWFwaXMuamFyIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjaGVjay54ZXJjZXNJbXBsLmphciI+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InhlcmNlc0ltcGwuamFyLmV4aXN0cyI+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIvPgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ieGVyY2VzSW1wbC5qYXIiIGRlcGVuZHM9ImNoZWNrLnhlcmNlc0ltcGwuamFyLCBkaXJzIiB1bmxlc3M9InhlcmNlc0ltcGwuamFyLmV4aXN0cyI+CisgICAgICAgIDxnZXQgZGVzdD0iZXh0ZXJuYWwvbGliL3hlcmNlc0ltcGwtMi42LjIuamFyIgorICAgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LmliaWJsaW8ub3JnL21hdmVuL3hlcmNlcy9qYXJzL3hlcmNlc0ltcGwtMi42LjIuamFyIgorICAgICAgICAgICAgdmVyYm9zZT0idHJ1ZSIgdXNldGltZXN0YW1wPSJ0cnVlIiBpZ25vcmVlcnJvcnM9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iZXh0ZXJuYWwvbGliL3hlcmNlc0ltcGwtMi42LjIuamFyIiB0b2ZpbGU9ImJ1aWxkL2xpYi94ZXJjZXNJbXBsLmphciIgLz4KICAgICA8L3RhcmdldD4KIAogICAgPHRhcmdldCBuYW1lPSJjaGVjay5qYXhlbi5qYXIiPgpAQCAtMTA1NCw3ICsxMTI1LDcgQEAKICAgIDwvdGFyZ2V0PgogCiAgICA8dGFyZ2V0IG5hbWU9ImpheGVuLmphciIgZGVwZW5kcz0iY2hlY2suamF4ZW4uamFyLCBkaXJzIiB1bmxlc3M9ImpheGVuLmphci5leGlzdHMiPgotICAgICA8IS0tZ2V0IGRlc3Q9ImJ1aWxkL2xpYi9qYXhlbi5qYXIiCisgICAgIDwhLS1nZXQgZGVzdD0iZXh0ZXJuYWwvbGliL2pheGVuLmphciIKICAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciIKICAgICAgICAgICB2ZXJib3NlPSJ0cnVlIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIvIC0tPgogICAgICA8Y29weSBmaWxlPSJleHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIiIHRvZmlsZT0iYnVpbGQvbGliL2pheGVuLmphciIgLz4KQEAgLTEwNjgsNyArMTEzOSw3IEBACiAgICAgICAgc3JjZGlyPSJzcmMveHBhdGgiCiAgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3hwYXRoIgogICAgICAgIGNsYXNzcGF0aHJlZj0ieHBhdGguY29tcGlsZS5wYXRoIgotICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIHNvdXJjZT0iMS4zIgogICAgICAgIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoIGlkPSJ4cGF0aC5jb21waWxlLnBhdGgiPgogICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KQEAgLTEwOTAsNyArMTE2MSw3IEBACiAgICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy94cGF0aCIKICAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHhwYXRoIgogICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdHhwYXRoLmNvbXBpbGUucGF0aCIKLSAgICAgICBzb3VyY2U9IjEuNCIKKyAgICAgICBzb3VyY2U9IjEuMyIKICAgICAgICBkZWJ1Zz0ib24iPgogICAgICAgPGNsYXNzcGF0aCBpZD0idGVzdHhwYXRoLmNvbXBpbGUucGF0aCI+CiAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveG1scHVibGljLmphciIvPgpAQCAtMTEwOSw3ICsxMTgwLDYgQEAKICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94YmVhbl94cGF0aC5qYXIiLz4KICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiLz4KICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgPGp2bWFyZyB2YWx1ZT0iLWRhIi8+CiAgICAgICA8YXJnIGxpbmU9J3Rlc3QvY2FzZXMveHBhdGgvbXVjaF9hZG8ueG1sICJQTEFZL0FDVC9TQ0VORS9TUEVFQ0gvU1BFQUtFUiInLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphciBiL3YxL2V4dGVybmFsL2xpYi9qdW5pdC5qYXIKaW5kZXggNmVlNDNiYi4uNjc0ZDcxZSAxMDA2NDQKLS0tIGEvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphcgorKysgYi92MS9leHRlcm5hbC9saWIvanVuaXQuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxL2V4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIgYi92MS9leHRlcm5hbC9saWIvb2xkeGJlYW4uamFyCmluZGV4IGFlODFiMjIuLjQ2MGRkMzMgMTAwNjQ0Ci0tLSBhL3YxL2V4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIKKysrIGIvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCmluZGV4IDUxZmY4YWYuLjc1YmJkZjYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CisKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKQEAgLTM4LDIwICs0MCwyMyBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYWRkTWFwcGluZyAoCiAgICAgICAgIFN0cmluZyBqYXZhLCBTdHJpbmcgaWFuYSwgYm9vbGVhbiBpc0RlZmF1bHQgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0ICFfaWFuYV90b19qYXZhLmNvbnRhaW5zS2V5KCBpYW5hICk7Ci0gICAgICAgIGFzc2VydCBqYXZhLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBqYXZhICk7Ci0gICAgICAgIGFzc2VydCBpYW5hLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBpYW5hICk7Ci0gICAgICAgIAorICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghX2lhbmFfdG9famF2YS5jb250YWluc0tleSggaWFuYSApKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoamF2YS5lcXVhbHNJZ25vcmVDYXNlKCBqYXZhICkpOworICAgICAgICB9CisKICAgICAgICAgX2lhbmFfdG9famF2YS5wdXQoIGlhbmEsIGphdmEgKTsKIAogICAgICAgICBpZiAoaXNEZWZhdWx0KQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIV9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGphdmEgKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIV9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGphdmEgKSk7CiAgICAgICAgICAgICBfamF2YV90b19pYW5hLnB1dCggamF2YSwgaWFuYSApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBjb21wbGV0ZU1hcHBpbmdzICggKQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgY29tcGxldGVNYXBwaW5ncyAoICkKICAgICB7CiAgICAgICAgIEhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKCk7CiAKQEAgLTYxLDEwICs2Niw4IEBACiAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBtLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKICAgICAgICAgewogICAgICAgICAgICAgT2JqZWN0IGsgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydCBfamF2YV90b19pYW5hLmNvbnRhaW5zS2V5KCBrICk6IGs7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGsgKSwgay50b1N0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHN0YXRpYwpAQCAtMzk1LDYgKzM5OCw2IEBACiAgICAgICAgIGFkZE1hcHBpbmcoICJVTklDT0RFTElUVExFIiwgIlVURi0xNkxFIiwgICAgICAgICAgICAgICB0cnVlICApOwogICAgICAgICBhZGRNYXBwaW5nKCAiVVRGOCIsICAgICAgICAgICJVVEYtOCIsICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKIAotICAgICAgICBhc3NlcnQgY29tcGxldGVNYXBwaW5ncygpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykgY29tcGxldGVNYXBwaW5ncygpOwogICAgIH07CiB9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2VuZXJpY1htbElucHV0U3RyZWFtLmphdmEKaW5kZXggMjgwNGI3ZS4uMGJmMjM4MCAxMDA2NDQKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dlbmVyaWNYbWxJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HZW5lcmljWG1sSW5wdXRTdHJlYW0uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFhNTElucHV0U3RyZWFtCiB7CkBAIC03NCw3ICs3NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoIFhNTFN0cmVhbUV4Y2VwdGlvbiBlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIF9tYXN0ZXIuX2luaXRpYWxpemVkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JT1V0aWwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JT1V0aWwuamF2YQppbmRleCBmZTc5Y2EwLi5hY2Q5MzM1IDEwMDY0NAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSU9VdGlsLmphdmEKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhCkBAIC0xOSwzNSArMTksMTUgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBJT1V0aWwKIHsKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy9pZiBib3RoIGFyZSBmaWxlIHN0cmVhbXMsIHVzZSBjaGFubmVsIElPCi0gICAgICAgIGlmICgob3V0cHV0IGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgJiYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwgdGFyZ2V0ID0gKChGaWxlT3V0cHV0U3RyZWFtKSBvdXRwdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCBzb3VyY2UgPSAoKEZpbGVJbnB1dFN0cmVhbSkgaW5wdXQpLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UudHJhbnNmZXJUbygwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IC8qIGZhaWxvdmVyIHRvIGJ5dGUgc3RyZWFtIHZlcnNpb24gKi8gfQotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07CiAgICAgICAgIHdoaWxlICh0cnVlKQogICAgICAgICB7CkBAIC02MSwyOCArNDEsMTcgQEAKICAgICAgICAgdHJ5IHsgb3V0cHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoVVJJIGlucHV0LCBVUkkgb3V0cHV0KQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5Q29tcGxldGVseShVUkwgaW5wdXQsIFVSTCBvdXRwdXQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGlucHV0KTsKLSAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBub3RBRmlsZSkKLSAgICAgICAgICAgIHt9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUob3V0cHV0KTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gaW5wdXQub3BlblN0cmVhbSgpOworCisgICAgICAgICAgICBGaWxlIG91dCA9IG5ldyBGaWxlKG91dHB1dC5nZXRQYXRoKCkpOwogICAgICAgICAgICAgRmlsZSBkaXIgPSBvdXQuZ2V0UGFyZW50RmlsZSgpOwogICAgICAgICAgICAgZGlyLm1rZGlycygpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbiA9IGlucHV0LnRvVVJMKCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGluLCBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCkBAIC05MSw0ICs2MCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBVUkwgZmlsZVRvVVJMKEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlDb25zdHJhaW50LmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlDb25zdHJhaW50LmphdmEKaW5kZXggZTRhZjgwMy4uOTAxMTRiYyAxMDA2NDQKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lkZW50aXR5Q29uc3RyYWludC5qYXZhCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eUNvbnN0cmFpbnQuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLio7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5TZXF1ZW5jZWRIYXNoU2V0OworCiBpbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgpAQCAtMTE3LDcgKzExOSw4IEBACiAKICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBldmVudCAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShldmVudCAhPSBudWxsKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKAogICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckN1cnNvciggbXNnLCBldmVudC5nZXRMb2NhdGlvbkFzQ3Vyc29yKCkgKSApOwpAQCAtMTU0LDggKzE1Nyw5IEBACiAgICAgICovCiAgICAgc3RhdGljIFNjaGVtYVR5cGUgZ2V0U2ltcGxlVHlwZShTY2hlbWFUeXBlIHN0KSAKICAgICB7Ci0gICAgICAgIGFzc2VydCBzdC5pc1NpbXBsZVR5cGUoKSB8fCBzdC5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQgOiAKLSAgICAgICAgICAgIHN0ICsgIiBkb2VzIG5vdCBoYXZlIHNpbXBsZSBjb250ZW50LiI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzdC5pc1NpbXBsZVR5cGUoKSB8fCBzdC5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgc3QgKyAiIGRvZXMgbm90IGhhdmUgc2ltcGxlIGNvbnRlbnQuIik7CiAKICAgICAgICAgd2hpbGUgKCEgc3QuaXNTaW1wbGVUeXBlKCkgKQogICAgICAgICAgICAgc3QgPSBzdC5nZXRCYXNlVHlwZSgpOwpAQCAtMTg4LDcgKzE5Miw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgU2VsZWN0b3JTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZSB7CiAgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBfY29uc3RyYWludDsKLSAgICAgICAgU2V0IF92YWx1ZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgICAgICBTZXQgX3ZhbHVlcyA9IG5ldyBTZXF1ZW5jZWRIYXNoU2V0KCk7CiAgICAgICAgIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQgX2NvbnRleHQ7CiAKICAgICAgICAgU2VsZWN0b3JTdGF0ZShTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgY29uc3RyYWludCwgRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgewpAQCAtNDIzLDcgKzQyNyw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgSWRTdGF0ZSBleHRlbmRzIENvbnN0cmFpbnRTdGF0ZQogICAgIHsKLSAgICAgICAgU2V0IF92YWx1ZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgICAgICBTZXQgX3ZhbHVlcyA9IG5ldyBTZXF1ZW5jZWRIYXNoU2V0KCk7CiAKICAgICAgICAgSWRTdGF0ZSgpIHsgfQogCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlNYXAuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9JZGVudGl0eU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmEzNDIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlNYXAuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm9lIFdhbG5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCisgKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgWFN0cmVhbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKKyAqIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWQorICogV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgSkRLMS40IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXAsIGJ1dCBpbiBKREsxLjMgYXMgd2VsbC4KKyAqIDxwLz4KKyAqIE1vZGlmaWVkIHZlcnNpb24gb2YgT2JqZWN0SWREaWN0aW9uYXJ5IGZyb20gWFN0cmVhbS4KKyAqLworcHVibGljIGNsYXNzIElkZW50aXR5TWFwIGltcGxlbWVudHMgTWFwCit7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwIG1hcDsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleVdyYXBwZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG9iajsKKworICAgICAgICBwdWJsaWMgS2V5V3JhcHBlcihPYmplY3Qgb2JqKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm9iaiA9IG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvYmogPT0gKChLZXlXcmFwcGVyKW90aGVyKS5vYmo7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIElkZW50aXR5TWFwKCkKKyAgICB7CisgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkobmV3IEtleVdyYXBwZXIoa2V5KSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gbWFwLmdldChuZXcgS2V5V3JhcHBlcihrZXkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbWFwLnB1dChuZXcgS2V5V3JhcHBlcihrZXkpLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAucmVtb3ZlKG5ldyBLZXlXcmFwcGVyKGtleSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkKKyAgICB7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hcC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQga2V5U2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAudmFsdWVzKCk7CisgICAgfQorCisgICAgcHVibGljIFNldCBlbnRyeVNldCgpCisgICAgeworICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05hbWVVdGlsLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQppbmRleCAzOTNmZjRkLi42YzFkYTkwIDEwMDY0NAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQpAQCAtNDk1LDcgKzQ5NSw3IEBACiAgICAgICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKIAogICAgICAgICBpZiAoIGkgPj0gMCAmJiB1cmkuc3Vic3RyaW5nKDAsIGkpLmVxdWFscygiamF2YSIpKQotICAgICAgICAgICAgcmVzdWx0ID0gIEFycmF5cy5hc0xpc3QodXJpLnN1YnN0cmluZyhpICsgMSkuc3BsaXQoIlxcLiIpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5cy5hc0xpc3QoU3RyaW5nVXRpbHMuc3BsaXQodXJpLnN1YnN0cmluZyhpICsgMSksICcuJykpOwogCiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05ldFV0aWxzLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmV0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL05ldFV0aWxzLmphdmEKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYS0KKyB0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCisgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0CisgICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQorICAgIGRldmVsb3BlZCAgYnkgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAgICBBbHRlcm5hdGVseSwgdGhpcyAgYWNrbm93bGVkZ21lbnQgbWF5ICBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgIGlmCisgICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKworIDQuIFRoZSBuYW1lcyAiQXBhY2hlIENvY29vbiIgYW5kICAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QgIG5vdCAgYmUKKyAgICB1c2VkIHRvICBlbmRvcnNlIG9yIHByb21vdGUgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICAgIGFwYWNoZUBhcGFjaGUub3JnLgorCisgNS4gUHJvZHVjdHMgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgIGJlIGNhbGxlZCAiQXBhY2hlIiwgbm9yIG1heQorICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKKyAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyAgRk9SIEEgUEFSVElDVUxBUiAgUFVSUE9TRSBBUkUgIERJU0NMQUlNRUQuICBJTiBOTyAgRVZFTlQgU0hBTEwgIFRIRQorIEFQQUNIRSBTT0ZUV0FSRSAgRk9VTkRBVElPTiAgT1IgSVRTIENPTlRSSUJVVE9SUyAgQkUgTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgREFNQUdFUyAoSU5DTFUtCisgRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCAgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworIE9GIFVTRSwgREFUQSwgT1IgIFBST0ZJVFM7IE9SIEJVU0lORVNTICBJTlRFUlJVUFRJT04pICBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyBBTlkgIFRIRU9SWSBPRiBMSUFCSUxJVFksICBXSEVUSEVSICBJTiBDT05UUkFDVCwgIFNUUklDVCBMSUFCSUxJVFksICBPUiBUT1JUCisgKElOQ0xVRElORyAgTkVHTElHRU5DRSBPUiAgT1RIRVJXSVNFKSBBUklTSU5HIElOICBBTlkgV0FZIE9VVCBPRiBUSEUgIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyBUaGlzIHNvZnR3YXJlICBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlICBieSBtYW55IGluZGl2aWR1YWxzCisgb24gIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlICBGb3VuZGF0aW9uIGFuZCB3YXMgIG9yaWdpbmFsbHkgY3JlYXRlZCBieQorIFN0ZWZhbm8gTWF6em9jY2hpICA8c3RlZmFub0BhcGFjaGUub3JnPi4gRm9yIG1vcmUgIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUKKyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKworKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiA8Y29kZT5GaWxlPC9jb2RlPiwgPGNvZGU+VVJMPC9jb2RlPiBhbmQgZmlsZW5hbWUKKyAqIHV0aWxpdHkgbWV0aG9kcworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnN0ZWZhbm9AYXBhY2hlLm9yZyI+U3RlZmFubyBNYXp6b2NjaGk8L2E+CisgKiBAdmVyc2lvbiBDVlMgJElkOiBOZXRVdGlscy5qYXZhLHYgMS4xLjIuMSAyMDA0LzA2LzE5IDAzOjA3OjM5IGRhdmVyZW15IEV4cCAkCisgKi8KKworcHVibGljIGNsYXNzIE5ldFV0aWxzIHsKKworICAgIC8qKgorICAgICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNhZmUgY2hhcmFjdGVycyBzZXQgYXMgZGVmaW5lZCBieSBSRkMgMTczOAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJpdFNldCBzYWZlQ2hhcmFjdGVyczsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGFkZWNpbWFsID0KKyAgICB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnfTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHNhZmVDaGFyYWN0ZXJzID0gbmV3IEJpdFNldCgyNTYpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgLy8gJ2xvd2FscGhhJyBydWxlCisgICAgICAgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykgeworICAgICAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KGkpOworICAgICAgICB9CisgICAgICAgIC8vICdoaWFscGhhJyBydWxlCisgICAgICAgIGZvciAoaSA9ICdBJzsgaSA8PSAnWic7IGkrKykgeworICAgICAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KGkpOworICAgICAgICB9CisgICAgICAgIC8vICdkaWdpdCcgcnVsZQorICAgICAgICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyBpKyspIHsKKyAgICAgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldChpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICdzYWZlJyBydWxlCisgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldCgnJCcpOworICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJy0nKTsKKyAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KCdfJyk7CisgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldCgnLicpOworICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJysnKTsKKworICAgICAgICAvLyAnZXh0cmEnIHJ1bGUKKyAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KCchJyk7CisgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldCgnKicpOworICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJ1wnJyk7CisgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldCgnKCcpOworICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJyknKTsKKyAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KCcsJyk7CisKKyAgICAgICAgLy8gc3BlY2lhbCBjaGFyYWN0ZXJzIGNvbW1vbiB0byBodHRwOiBmaWxlOiBhbmQgZnRwOiBVUkxzICgnZnNlZ21lbnQnIGFuZCAnaHNlZ21lbnQnIHJ1bGVzKQorICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJy8nKTsKKyAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KCc6Jyk7CisgICAgICAgIHNhZmVDaGFyYWN0ZXJzLnNldCgnQCcpOworICAgICAgICBzYWZlQ2hhcmFjdGVycy5zZXQoJyYnKTsKKyAgICAgICAgc2FmZUNoYXJhY3RlcnMuc2V0KCc9Jyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIGEgcGF0aC4KKyAgICAgKgorICAgICAqIDxwPkludGVycHJldHMgJVhYICh3aGVyZSBYWCBpcyBoZXhhZGVjaW1hbCBudW1iZXIpIGFzIFVURi04IGVuY29kZWQgYnl0ZXMuCisgICAgICogPHA+VGhlIHZhbGlkaXR5IG9mIHRoZSBpbnB1dCBwYXRoIGlzIG5vdCBjaGVja2VkIChpLmUuIGNoYXJhY3RlcnMgdGhhdCB3ZXJlIG5vdCBlbmNvZGVkIHdpbGwKKyAgICAgKiBub3QgYmUgcmVwb3J0ZWQgYXMgZXJyb3JzKS4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gVVJMRGVjb2Rlci5kZWNvZGUgaW4gdGhhdCBpdCBhbHdheXMgdXNlcyBVVEYtOCAod2hpbGUgVVJMRGVjb2RlcgorICAgICAqIHVzZXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcsIG9mdGVuIElTTy04ODU5LTEpLCBhbmQgZG9lc24ndCB0cmFuc2xhdGUgKyBjaGFyYWN0ZXJzIHRvIHNwYWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGRlY29kZQorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHRyYW5zbGF0ZWRQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgYnl0ZVtdIGVuY29kZWRjaGFycyA9IG5ldyBieXRlW3BhdGgubGVuZ3RoKCkgLyAzXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGVuY29kZWRjaGFyc0xlbmd0aCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAocGF0aC5jaGFyQXQoaSkgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBwcm9jZXNzIGFsbCBjb25zZWN1dGl2ZSAlLWVuY29kZWQgY2hhcmFjdGVycyBpbiBvbmUgZ28sIGJlY2F1c2UgdGhleSByZXByZXNlbnQKKyAgICAgICAgICAgICAgICAvLyBhbiBVVEYtOCBlbmNvZGVkIHN0cmluZywgYW5kIGluIFVURi04IG9uZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgYXMgbXVsdGlwbGUgYnl0ZXMKKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBwYXRoLmNoYXJBdChpKSA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAyIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgeCA9IChieXRlKUludGVnZXIucGFyc2VJbnQocGF0aC5zdWJzdHJpbmcoaSArIDEsIGkgKyAzKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRjaGFyc1tlbmNvZGVkY2hhcnNMZW5ndGhdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmV0VXRpbHMuZGVjb2RlUGF0aDogaWxsZWdhbCBoZXggY2hhcmFjdGVycyBpbiBwYXR0ZXJuICUiICsgcGF0aC5zdWJzdHJpbmcoaSArIDEsIGkgKyAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkY2hhcnNMZW5ndGgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldFV0aWxzLmRlY29kZVBhdGg6ICUgY2hhcmFjdGVyIHNob3VsZCBiZSBmb2xsb3dlZCBieSAyIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zbGF0ZWRQYXJ0ID0gbmV3IFN0cmluZyhlbmNvZGVkY2hhcnMsIDAsIGVuY29kZWRjaGFyc0xlbmd0aCwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRQYXRoLmFwcGVuZCh0cmFuc2xhdGVkUGFydCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXR1YXRpb24gdGhhdCBVVEYtOCBpcyBub3Qgc3VwcG9ydGVkIGlzIHF1aXRlIHRoZW9yZXRpY2FsLCBzbyB0aHJvdyBhIHJ1bnRpbWUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9ibGVtIGluIGRlY29kZVBhdGg6IFVURi04IGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kZWRjaGFyc0xlbmd0aCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGEgbm9ybWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRQYXRoLmFwcGVuZChwYXRoLmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVkUGF0aC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZSBhIHBhdGggYXMgcmVxdWlyZWQgYnkgdGhlIFVSTCBzcGVjaWZpY2F0aW4gKDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE3MzgudHh0Ij4KKyAgICAgKiBSRkMgMTczODwvYT4pLiBUaGlzIGRpZmZlcnMgZnJvbSA8Y29kZT5qYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZSgpPC9jb2RlPiB3aGljaCBlbmNvZGVzIGFjY29yZGluZworICAgICAqIHRvIHRoZSA8Y29kZT54LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+IE1JTUUgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gZW5jb2RlCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBwYXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgIC8vIHRha2VuIGZyb20gb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5EZWZhdWx0U2VydmxldCA7KQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RlOiBUaGlzIGNvZGUgcG9ydGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gVVJMRW5jb2Rlci5lbmNvZGUuCisgICAgICAgICAqIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZ5IHRvIHRoZSBVUkxFbmNvZGVyIHdoaWNoCisgICAgICAgICAqIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGVuY29kZWQuIEhlcmUsICcgJyBzaG91bGQgYmUgZW5jb2RlZCBhcyAiJTIwIgorICAgICAgICAgKiBhbmQgJy8nIHNob3VsZG4ndCBiZSBlbmNvZGVkLgorICAgICAgICAgKi8KKworICAgICAgICBpbnQgbWF4Qnl0ZXNQZXJDaGFyID0gMTA7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXdyaXR0ZW5QYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0obWF4Qnl0ZXNQZXJDaGFyKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgIlVURjgiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaW50IGMgPSBwYXRoLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChzYWZlQ2hhcmFjdGVycy5nZXQoYykpIHsKKyAgICAgICAgICAgICAgICByZXdyaXR0ZW5QYXRoLmFwcGVuZCgoY2hhciljKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBidWYucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ5dGVbXSBiYSA9IGJ1Zi50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmEubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBlYWNoIGJ5dGUgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBieXRlIHRvRW5jb2RlID0gYmFbal07CisgICAgICAgICAgICAgICAgICAgIHJld3JpdHRlblBhdGguYXBwZW5kKCclJyk7CisgICAgICAgICAgICAgICAgICAgIGludCBsb3cgPSAodG9FbmNvZGUgJiAweDBmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2ggPSAoKHRvRW5jb2RlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIHJld3JpdHRlblBhdGguYXBwZW5kKGhleGFkZWNpbWFsW2hpZ2hdKTsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0dGVuUGF0aC5hcHBlbmQoaGV4YWRlY2ltYWxbbG93XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJld3JpdHRlblBhdGgudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBnaXZlbiByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgdXJpKSB7CisgICAgICAgIGludCBpID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChpID4gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICB9CisgICAgICAgIGkgPSB1cmkuaW5kZXhPZignOicpOworICAgICAgICByZXR1cm4gKGkgPiAtMSkgPyB1cmkuc3Vic3RyaW5nKGkgKyAxLCB1cmkubGVuZ3RoKCkpIDogIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHBhdGggYW5kIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBhIGZpbGVuYW1lIHJldHVybmluZyBvbmx5IGl0cworICAgICAqIGV4dGVuc2lvbiAgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBmaWxlbmFtZQorICAgICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIGV4dGVuc2lvbiAod2l0aCBzdGFydGluZyBkb3QhKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVuc2lvbihTdHJpbmcgdXJpKSB7CisgICAgICAgIGludCBkb3QgPSB1cmkubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdCA+IC0xKSB7CisgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKGRvdCk7CisgICAgICAgICAgICBpbnQgc2xhc2ggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA+IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBzaGFycCA9IHVyaS5sYXN0SW5kZXhPZignIycpOworICAgICAgICAgICAgICAgIGlmIChzaGFycCA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVyaSBzdGFydHMgd2l0aCBkb3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpLnN1YnN0cmluZygwLCBzaGFycCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hcmsgPSB1cmkubGFzdEluZGV4T2YoJz8nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmsgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXJpIHN0YXJ0cyB3aXRoIGRvdCBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpLnN1YnN0cmluZygwLCBtYXJrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFic29sdXRpemUgYSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoIG9uIHRoZSBnaXZlbiBhYnNvbHV0ZSBiYXNlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgYWJzb2x1dGUgYmFzZSBwYXRoCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoCisgICAgICogQHJldHVybiBUaGUgYWJzb2x1dGl6ZWQgcmVzb3VyY2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFic29sdXRpemUoU3RyaW5nIHBhdGgsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gQmFzZSBwYXRoIGlzIGVtcHR5CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBSZXNvdXJjZSBwYXRoIGlzIGVtcHR5CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNvdXJjZS5jaGFyQXQoMCkgPT0gJy8nKSB7CisgICAgICAgICAgICAvLyBSZXNvdXJjZSBwYXRoIGlzIGFscmVhZHkgYWJzb2x1dGUKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsZW5ndGggPSBwYXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgYm9vbGVhbiBzbGFzaCA9IChwYXRoLmNoYXJBdChsZW5ndGgpID09ICcvJyk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGIuYXBwZW5kKHBhdGgpOworICAgICAgICBpZiAoIXNsYXNoKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgnLycpOworICAgICAgICB9CisgICAgICAgIGIuYXBwZW5kKHJlc291cmNlKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxhdGl2aXplIGFuIGFic29sdXRlIHJlc291cmNlIG9uIGEgZ2l2ZW4gYWJzb2x1dGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBhYnNvbHV0ZSBwYXRoCisgICAgICogQHBhcmFtIGFic29sdXRlUmVzb3VyY2UgVGhlIGFic29sdXRlIHJlc291cmNlCisgICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBwYXRoLCBTdHJpbmcgYWJzb2x1dGVSZXNvdXJjZSkgeworICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUmVzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0aC5jaGFyQXQocGF0aC5sZW5ndGgoKSAtIDEpICE9ICcvJykgeworICAgICAgICAgICAgcGF0aCArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWJzb2x1dGVSZXNvdXJjZS5zdGFydHNXaXRoKHBhdGgpKSB7CisgICAgICAgICAgICAvLyByZXNvdXJjZSBpcyBkaXJlY3QgZGVzY2VuZGFudAorICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUmVzb3VyY2Uuc3Vic3RyaW5nKHBhdGgubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVzb3VyY2UgaXMgbm90IGRpcmVjdCBkZXNjZW5kYW50CisgICAgICAgICAgICBpbnQgaW5kZXggPSBTdHJpbmdVdGlscy5tYXRjaFN0cmluZ3MocGF0aCwgYWJzb2x1dGVSZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHBhdGguY2hhckF0KGluZGV4LTEpICE9ICcvJykgeworICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBwYXRoRGlmZiA9IHBhdGguc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZSA9IGFic29sdXRlUmVzb3VyY2Uuc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIGludCBsZXZlbHMgPSBTdHJpbmdVdGlscy5jb3VudChwYXRoRGlmZiwgJy8nKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIuLi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIuYXBwZW5kKHJlc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSB1cmkgY29udGFpbmluZyAuLi8gYW5kIC4vIHBhdGhzLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIHBhdGggdG8gbm9ybWFsaXplCisgICAgICogQHJldHVybiBUaGUgbm9ybWFsaXplZCB1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSkgeworICAgICAgICBTdHJpbmdbXSBkaXJ0eSA9IFN0cmluZ1V0aWxzLnNwbGl0KHVyaSwgJy8nKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGRpcnR5Lmxlbmd0aDsKKyAgICAgICAgU3RyaW5nW10gY2xlYW4gPSBuZXcgU3RyaW5nW2xlbmd0aF07CisKKyAgICAgICAgYm9vbGVhbiBwYXRoOworICAgICAgICBib29sZWFuIGZpbmlzaGVkOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgcGF0aCA9IGZhbHNlOworICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyAoaSA8IGxlbmd0aCkgJiYgKGRpcnR5W2ldICE9IG51bGwpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIi4iLmVxdWFscyhkaXJ0eVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLi4iLmVxdWFscyhkaXJ0eVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5baisrXSA9IGRpcnR5W2ldOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCkgZmluaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGkrMSA8IGxlbmd0aCkgJiYgKCIuLiIuZXF1YWxzKGRpcnR5W2krMV0pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5baisrXSA9IGRpcnR5W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlydHkgPSBjbGVhbjsKKyAgICAgICAgICAgICAgICBjbGVhbiA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcih1cmkubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgKGkgPCBsZW5ndGgpICYmIChjbGVhbltpXSAhPSBudWxsKTsgaSsrKSB7CisgICAgICAgICAgICBiLmFwcGVuZChjbGVhbltpXSk7CisgICAgICAgICAgICBpZiAoKGkrMSA8IGxlbmd0aCkgJiYgKGNsZWFuW2krMV0gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHBhcmFtZXRlcnMgZnJvbSBhIHVyaS4KKyAgICAgKiBSZXN1bHRpbmcgTWFwIHdpbGwgaGF2ZSBlaXRoZXIgU3RyaW5nIGZvciBzaW5nbGUgdmFsdWUgYXR0cmlidXRlcywKKyAgICAgKiBvciBTdHJpbmcgYXJyYXlzIGZvciBtdWx0aXZhbHVlIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgcGF0aCB0byBkZXBhcmFtZXRlcml6ZS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbWFwIHRoYXQgY29sbGVjdHMgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGVhbmVkIHVyaQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcGFyYW1ldGVyaXplKFN0cmluZyB1cmksIE1hcCBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGludCBpID0gdXJpLmxhc3RJbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gdXJpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gcGFyYW1zID0gU3RyaW5nVXRpbHMuc3BsaXQodXJpLnN1YnN0cmluZyhpICsgMSksICcmJyk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBTdHJpbmcgcCA9IHBhcmFtc1tqXTsKKyAgICAgICAgICAgIGludCBrID0gcC5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoayA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwLnN1YnN0cmluZygwLCBrKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHAuc3Vic3RyaW5nKGsgKyAxKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZXMgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gdjEgPSAoU3RyaW5nW10pdmFsdWVzOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHYyID0gbmV3IFN0cmluZ1t2MS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHYxLCAwLCB2MiwgMCwgdjEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2Mlt2MS5sZW5ndGhdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgdjIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChuYW1lLCBuZXcgU3RyaW5nW117dmFsdWVzLnRvU3RyaW5nKCksIHZhbHVlfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcoMCwgaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHBhcmFtZXRlcnMgc3RvcmVkIGluIHRoZSBNYXAgdG8gdGhlIHVyaSBzdHJpbmcuCisgICAgICogTWFwIGNhbiBjb250YWluIE9iamVjdCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHN0cmluZywKKyAgICAgKiBvciBPYmplY3QgYXJyYXlzLCB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgbXVsdGl2YWx1ZSBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIHRvIGFkZCBwYXJhbWV0ZXJzIGludG8KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbWFwIGNvbnRhaW5pbmcgcGFyYW1ldGVycyB0byBiZSBhZGRlZAorICAgICAqIEByZXR1cm4gVGhlIHVyaSB3aXRoIGFkZGVkIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJhbWV0ZXJpemUoU3RyaW5nIHVyaSwgTWFwIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih1cmkpOworICAgICAgICBpZiAodXJpLmluZGV4T2YoJz8nKSA9PSAtMSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnJicpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcGFyYW1ldGVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdmFsdWUgPSAoT2JqZWN0W10pZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnJicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWVbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnPScpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcmJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGF1dGhvcmlzYXRpb24gZGV0YWlscyBmcm9tIGEgVVJJCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQXV0aG9yaXNhdGlvbihTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmICh1cmkuaW5kZXhPZigiQCIpIT0tMSAmJiAodXJpLnN0YXJ0c1dpdGgoImZ0cDovLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJodHRwOi8vIikpKSB7CisgICAgICAgICAgICByZXR1cm4gdXJpLnN1YnN0cmluZygwLCB1cmkuaW5kZXhPZigiOiIpKzIpK3VyaS5zdWJzdHJpbmcodXJpLmluZGV4T2YoIkAiKSsxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1FOYW1lSGVscGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQppbmRleCBjNmI4NTJmLi5hYTAyZDExIDEwMDY0NAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogcHVibGljIGNsYXNzIFFOYW1lSGVscGVyCiB7CkBAIC0xNTUsNyArMTU2LDggQEAKICAgICAgICAgICAgICAgICBpbnB1dEJ5dGVzID0gbmV3IGJ5dGVbMF07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gbWQuZGlnZXN0KGlucHV0Qnl0ZXMpOwotICAgICAgICAgICAgYXNzZXJ0KGRpZ2VzdC5sZW5ndGggPT0gMjApOyAvLyBTSEExIDE2MCBiaXRzID09IDIwIGJ5dGVzCisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGRpZ2VzdC5sZW5ndGggPT0gMjApOyAvLyBTSEExIDE2MCBiaXRzID09IDIwIGJ5dGVzCiAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCJVUklfU0hBXzFfIik7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpZ2VzdC5sZW5ndGg7IGorKykKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TZXF1ZW5jZWRIYXNoTWFwLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU2VxdWVuY2VkSGFzaE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzNjMzMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU2VxdWVuY2VkSGFzaE1hcC5qYXZhCkBAIC0wLDAgKzEsMTAwNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCisgKg0KKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsNCisNCitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsNCitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQoraW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsNCisNCisvLyBmcm9tIGNvbW1vbnMtY29sbGVjdGlvbg0KKy8qKg0KKyAqICBBIG1hcCBvZiBvYmplY3RzIHdob3NlIG1hcHBpbmcgZW50cmllcyBhcmUgc2VxdWVuY2VkIGJhc2VkIG9uIHRoZSBvcmRlciBpbg0KKyAqICB3aGljaCB0aGV5IHdlcmUgYWRkZWQuICBUaGlzIGRhdGEgc3RydWN0dXJlIGhhcyBmYXN0IDxJPk8oMSk8L0k+IHNlYXJjaA0KKyAqICB0aW1lLCBkZWxldGlvbiB0aW1lLCBhbmQgaW5zZXJ0aW9uIHRpbWUuDQorICoNCisgKiAgPFA+QWx0aG91Z2ggdGhpcyBtYXAgaXMgc2VxdWVuY2VkLCBpdCBjYW5ub3QgaW1wbGVtZW50IHtAbGluaw0KKyAqICBqYXZhLnV0aWwuTGlzdH0gYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgaW50ZXJmYWNlIGRlZmluaXRpb25zLiAgVGhlIHJlbW92ZQ0KKyAqICBtZXRob2RzIGluIExpc3QgYW5kIE1hcCBoYXZlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIChzZWU6IHtAbGluaw0KKyAqICBqYXZhLnV0aWwuTGlzdCNyZW1vdmUoT2JqZWN0KX0gYW5kIHtAbGluayBqYXZhLnV0aWwuTWFwI3JlbW92ZShPYmplY3QpfSkuDQorICoNCisgKiAgPFA+VGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUuICBXaGVuIGEgdGhyZWFkIHNhZmUgaW1wbGVtZW50YXRpb24gaXMNCisgKiAgcmVxdWlyZWQsIHVzZSB7QGxpbmsgQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKE1hcCl9IGFzIGl0IGlzIGRvY3VtZW50ZWQsDQorICogIG9yIHVzZSBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gY29udHJvbHMuDQorICoNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptYXNAYXBhY2hlLm9yZyI+TWljaGFlbCBBLiBTbWl0aDwvQT4NCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpkbHJAY29sbGFiLm5ldCI+RGFuaWVsIFJhbGw8L2E+DQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86aHBzQGludGVybWV0YS5kZSI+SGVubmluZyBQLiBTY2htaWVkZWhhdXNlbjwvYT4NCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVuY2VkSGFzaE1hcCBpbXBsZW1lbnRzIE1hcCwgQ2xvbmVhYmxlLCBFeHRlcm5hbGl6YWJsZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiAge0BsaW5rIGphdmEudXRpbC5NYXAuRW50cnl9IHRoYXQgZG91YmxlcyBhcyBhIG5vZGUgaW4gdGhlIGxpbmtlZCBsaXN0DQorICAgICAqICBvZiBzZXF1ZW5jZWQgbWFwcGluZ3MuDQorICAgICAqKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBNYXAuRW50cnkgew0KKyAgICAgICAgLy8gTm90ZTogVGhpcyBjbGFzcyBjYW5ub3QgZWFzaWx5IGJlIG1hZGUgY2xvbmFibGUuICBXaGlsZSB0aGUgYWN0dWFsDQorICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBhIGNsb25lIHdvdWxkIGJlIHNpbXBsZSwgZGVmaW5pbmcgdGhlIHNlbWFudGljcyBpcw0KKyAgICAgICAgLy8gZGlmZmljdWx0LiAgSWYgYSBzaGFsbG93IGNsb25lIGlzIGltcGxlbWVudGVkLCB0aGVuIGVudHJ5Lm5leHQucHJldiAhPQ0KKyAgICAgICAgLy8gZW50cnksIHdoaWNoIGlzIHVuaW50dWl0aXZlIGFuZCBwcm9iYWJseSBicmVha3MgYWxsIHNvcnRzIG9mIGFzc3VtcHRpb25zDQorICAgICAgICAvLyBpbiBjb2RlIHRoYXQgdXNlcyB0aGlzIGltcGxlbWVudGF0aW9uLiAgSWYgYSBkZWVwIGNsb25lIGlzDQorICAgICAgICAvLyBpbXBsZW1lbnRhdGVkLCB0aGVuIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBsaW5rZWQgbGlzdCBpcyBjeWNsaWNhbCAoYXMgaXMNCisgICAgICAgIC8vIHRoZSBjYXNlIHdpdGggU2VxdWVuY2VkSGFzaE1hcCk/ICBJdCdzIGltcG9zc2libGUgdG8ga25vdyBpbiB0aGUgY2xvbmUNCisgICAgICAgIC8vIHdoZW4gdG8gc3RvcCBjbG9uaW5nLCBhbmQgdGh1cyB5b3UgZW5kIHVwIGluIGEgcmVjdXJzaXZlIGxvb3AsDQorICAgICAgICAvLyBjb250aW51b3VzbHkgY2xvbmluZyB0aGUgIm5leHQiIGluIHRoZSBsaXN0Lg0KKw0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qga2V5Ow0KKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7DQorDQorICAgICAgICAvLyBwYWNrYWdlIHByaXZhdGUgdG8gYWxsb3cgdGhlIFNlcXVlbmNlZEhhc2hNYXAgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlDQorICAgICAgICAvLyB0aGVtLg0KKyAgICAgICAgRW50cnkgbmV4dCA9IG51bGw7DQorICAgICAgICBFbnRyeSBwcmV2ID0gbnVsbDsNCisNCisgICAgICAgIHB1YmxpYyBFbnRyeShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsNCisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsNCisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBwZXIgTWFwLkVudHJ5LmdldEtleSgpDQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsNCisgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBwZXIgTWFwLkVudHJ5LmdldFZhbHVlKCkNCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBwZXIgTWFwLkVudHJ5LnNldFZhbHVlKCkNCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7DQorICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsNCisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRlZCBwZXIgYXBpIGRvY3MgZm9yIE1hcC5FbnRyeS5oYXNoQ29kZSgpDQorICAgICAgICAgICAgcmV0dXJuICgoZ2V0S2V5KCkgPT0gbnVsbCA/IDAgOiBnZXRLZXkoKS5oYXNoQ29kZSgpKSBeDQorICAgICAgICAgICAgICAgICAgICAoZ2V0VmFsdWUoKSA9PSBudWxsID8gMCA6IGdldFZhbHVlKCkuaGFzaENvZGUoKSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpIHJldHVybiBmYWxzZTsNCisNCisgICAgICAgICAgICBNYXAuRW50cnkgb3RoZXIgPSAoTWFwLkVudHJ5KW9iajsNCisNCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRlZCBwZXIgYXBpIGRvY3MgZm9yIE1hcC5FbnRyeS5lcXVhbHMoT2JqZWN0KQ0KKyAgICAgICAgICAgIHJldHVybiAoKGdldEtleSgpID09IG51bGwgPw0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCA6DQorICAgICAgICAgICAgICAgICAgICBnZXRLZXkoKS5lcXVhbHMob3RoZXIuZ2V0S2V5KCkpKSAmJg0KKyAgICAgICAgICAgICAgICAgICAgKGdldFZhbHVlKCkgPT0gbnVsbCA/DQorICAgICAgICAgICAgICAgICAgICBvdGhlci5nZXRWYWx1ZSgpID09IG51bGwgOg0KKyAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0VmFsdWUoKSkpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICAgICAgcmV0dXJuICJbIiArIGdldEtleSgpICsgIj0iICsgZ2V0VmFsdWUoKSArICJdIjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIENvbnN0cnVjdCBhbiBlbXB0eSBzZW50aW5lbCB1c2VkIHRvIGhvbGQgdGhlIGhlYWQgKHNlbnRpbmVsLm5leHQpIGFuZCB0aGUNCisgICAgICogIHRhaWwgKHNlbnRpbmVsLnByZXYpIG9mIHRoZSBsaXN0LiAgVGhlIHNlbnRpbmFsIGhhcyBhIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAqICBrZXkgYW5kIHZhbHVlLg0KKyAgICAgKiovDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVudHJ5IGNyZWF0ZVNlbnRpbmVsKCkgew0KKyAgICAgICAgRW50cnkgcyA9IG5ldyBFbnRyeShudWxsLCBudWxsKTsNCisgICAgICAgIHMucHJldiA9IHM7DQorICAgICAgICBzLm5leHQgPSBzOw0KKyAgICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBTZW50aW5lbCB1c2VkIHRvIGhvbGQgdGhlIGhlYWQgYW5kIHRhaWwgb2YgdGhlIGxpc3Qgb2YgZW50cmllcy4NCisgICAgICoqLw0KKyAgICBwcml2YXRlIEVudHJ5IHNlbnRpbmVsOw0KKw0KKyAgICAvKioNCisgICAgICogIE1hcCBvZiBrZXlzIHRvIGVudHJpZXMNCisgICAgICoqLw0KKyAgICBwcml2YXRlIEhhc2hNYXAgZW50cmllczsNCisNCisgICAgLyoqDQorICAgICAqICBIb2xkcyB0aGUgbnVtYmVyIG9mIG1vZGlmaWNhdGlvbnMgdGhhdCBoYXZlIG9jY3VycmVkIHRvIHRoZSBtYXAsDQorICAgICAqICBleGNsdWRpbmcgbW9kaWZpY2F0aW9ucyBtYWRlIHRocm91Z2ggYSBjb2xsZWN0aW9uIHZpZXcncyBpdGVyYXRvcg0KKyAgICAgKiAgKGUuZy4gZW50cnlTZXQoKS5pdGVyYXRvcigpLnJlbW92ZSgpKS4gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYQ0KKyAgICAgKiAgZmFpbC1mYXN0IGJlaGF2aW9yIHdpdGggdGhlIGl0ZXJhdG9ycy4NCisgICAgICoqLw0KKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIG1vZENvdW50ID0gMDsNCisNCisgICAgLyoqDQorICAgICAqICBDb25zdHJ1Y3QgYSBuZXcgc2VxdWVuY2VkIGhhc2ggbWFwIHdpdGggZGVmYXVsdCBpbml0aWFsIHNpemUgYW5kIGxvYWQNCisgICAgICogIGZhY3Rvci4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgU2VxdWVuY2VkSGFzaE1hcCgpIHsNCisgICAgICAgIHNlbnRpbmVsID0gY3JlYXRlU2VudGluZWwoKTsNCisgICAgICAgIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgQ29uc3RydWN0IGEgbmV3IHNlcXVlbmNlZCBoYXNoIG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBzaXplIGFuZA0KKyAgICAgKiAgZGVmYXVsdCBsb2FkIGZhY3Rvci4NCisgICAgICoNCisgICAgICogIEBwYXJhbSBpbml0aWFsU2l6ZSB0aGUgaW5pdGlhbCBzaXplIGZvciB0aGUgaGFzaCB0YWJsZQ0KKyAgICAgKg0KKyAgICAgKiAgQHNlZSBIYXNoTWFwI0hhc2hNYXAoaW50KQ0KKyAgICAgKiovDQorICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKGludCBpbml0aWFsU2l6ZSkgew0KKyAgICAgICAgc2VudGluZWwgPSBjcmVhdGVTZW50aW5lbCgpOw0KKyAgICAgICAgZW50cmllcyA9IG5ldyBIYXNoTWFwKGluaXRpYWxTaXplKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgc2l6ZSBhbmQNCisgICAgICogIGxvYWQgZmFjdG9yLg0KKyAgICAgKg0KKyAgICAgKiAgQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlDQorICAgICAqDQorICAgICAqICBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLg0KKyAgICAgKg0KKyAgICAgKiAgQHNlZSBIYXNoTWFwI0hhc2hNYXAoaW50LGZsb2F0KQ0KKyAgICAgKiovDQorICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKGludCBpbml0aWFsU2l6ZSwgZmxvYXQgbG9hZEZhY3Rvcikgew0KKyAgICAgICAgc2VudGluZWwgPSBjcmVhdGVTZW50aW5lbCgpOw0KKyAgICAgICAgZW50cmllcyA9IG5ldyBIYXNoTWFwKGluaXRpYWxTaXplLCBsb2FkRmFjdG9yKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgaGFzaCBtYXAgYW5kIGFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZQ0KKyAgICAgKiAgc3BlY2lmaWVkIG1hcC4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgbWFwcGluZ3MgaW4gdGhlIHNwZWNpZmllZCBtYXAgYXJlDQorICAgICAqICBhZGRlZCBpcyBkZWZpbmVkIGJ5IHtAbGluayAjcHV0QWxsKE1hcCl9Lg0KKyAgICAgKiovDQorICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoTWFwKE1hcCBtKSB7DQorICAgICAgICB0aGlzKCk7DQorICAgICAgICBwdXRBbGwobSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBSZW1vdmVzIGFuIGludGVybmFsIGVudHJ5IGZyb20gdGhlIGxpbmtlZCBsaXN0LiAgVGhpcyBkb2VzIG5vdCByZW1vdmUNCisgICAgICogIGl0IGZyb20gdGhlIHVuZGVybHlpbmcgbWFwLg0KKyAgICAgKiovDQorICAgIHByaXZhdGUgdm9pZCByZW1vdmVFbnRyeShFbnRyeSBlbnRyeSkgew0KKyAgICAgICAgZW50cnkubmV4dC5wcmV2ID0gZW50cnkucHJldjsNCisgICAgICAgIGVudHJ5LnByZXYubmV4dCA9IGVudHJ5Lm5leHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBJbnNlcnRzIGEgbmV3IGludGVybmFsIGVudHJ5IHRvIHRoZSB0YWlsIG9mIHRoZSBsaW5rZWQgbGlzdC4gIFRoaXMgZG9lcw0KKyAgICAgKiAgbm90IGFkZCB0aGUgZW50cnkgdG8gdGhlIHVuZGVybHlpbmcgbWFwLg0KKyAgICAgKiovDQorICAgIHByaXZhdGUgdm9pZCBpbnNlcnRFbnRyeShFbnRyeSBlbnRyeSkgew0KKyAgICAgICAgZW50cnkubmV4dCA9IHNlbnRpbmVsOw0KKyAgICAgICAgZW50cnkucHJldiA9IHNlbnRpbmVsLnByZXY7DQorICAgICAgICBzZW50aW5lbC5wcmV2Lm5leHQgPSBlbnRyeTsNCisgICAgICAgIHNlbnRpbmVsLnByZXYgPSBlbnRyeTsNCisgICAgfQ0KKw0KKyAgICAvLyBwZXIgTWFwLnNpemUoKQ0KKw0KKyAgICAvKioNCisgICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNzaXplKCl9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgICAgLy8gdXNlIHRoZSB1bmRlcmx5aW5nIE1hcCdzIHNpemUgc2luY2Ugc2l6ZSBpcyBub3QgbWFpbnRhaW5lZCBoZXJlLg0KKyAgICAgICAgcmV0dXJuIGVudHJpZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2lzRW1wdHkoKX0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgLy8gZm9yIHF1aWNrIGNoZWNrIHdoZXRoZXIgdGhlIG1hcCBpcyBlbnRyeSwgd2UgY2FuIGNoZWNrIHRoZSBsaW5rZWQgbGlzdA0KKyAgICAgICAgLy8gYW5kIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIGluIGl0Lg0KKyAgICAgICAgcmV0dXJuIHNlbnRpbmVsLm5leHQgPT0gc2VudGluZWw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjY29udGFpbnNLZXkoT2JqZWN0KX0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7DQorICAgICAgICAvLyBwYXNzIG9uIHRvIHVuZGVybHlpbmcgbWFwIGltcGxlbWVudGF0aW9uDQorICAgICAgICByZXR1cm4gZW50cmllcy5jb250YWluc0tleShrZXkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2NvbnRhaW5zVmFsdWUoT2JqZWN0KX0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgLy8gdW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IGp1c3QgcGFzcyB0aGlzIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgbWFwDQorICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSBtYXBwaW5nIGtleXMgdG8gZW50cmllcywgbm90IGtleXMgdG8gdmFsdWVzLiAgVGhlDQorICAgICAgICAvLyB1bmRlcmx5aW5nIG1hcCBkb2Vzbid0IGhhdmUgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGFueXdheSwgc28gdGhpcw0KKyAgICAgICAgLy8gaXNuJ3QgYSBiaWcgZGVhbC4NCisNCisgICAgICAgIC8vIGRvIG51bGwgY29tcGFyaXNvbiBvdXRzaWRlIGxvb3Agc28gd2Ugb25seSBuZWVkIHRvIGRvIGl0IG9uY2UuICBUaGlzDQorICAgICAgICAvLyBwcm92aWRlcyBhIHRpZ2h0ZXIsIG1vcmUgZWZmaWNpZW50IGxvb3AgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xpZ2h0DQorICAgICAgICAvLyBjb2RlIGR1cGxpY2F0aW9uLg0KKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICBmb3IgKEVudHJ5IHBvcyA9IHNlbnRpbmVsLm5leHQ7IHBvcyAhPSBzZW50aW5lbDsgcG9zID0gcG9zLm5leHQpIHsNCisgICAgICAgICAgICAgICAgaWYgKHBvcy5nZXRWYWx1ZSgpID09IG51bGwpIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIGZvciAoRW50cnkgcG9zID0gc2VudGluZWwubmV4dDsgcG9zICE9IHNlbnRpbmVsOyBwb3MgPSBwb3MubmV4dCkgew0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHBvcy5nZXRWYWx1ZSgpKSkgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2dldChPYmplY3QpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBvKSB7DQorICAgICAgICAvLyBmaW5kIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleSBvYmplY3QNCisgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWVudHJpZXMuZ2V0KG8pOw0KKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBSZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgIm9sZGVzdCIgbWFwcGluZy4gIFRoYXQgaXMsIHJldHVybiB0aGUgTWFwLkVudHJ5DQorICAgICAqICBmb3IgdGhlIGtleS12YWx1ZSBwYWlyIHRoYXQgd2FzIGZpcnN0IHB1dCBpbnRvIHRoZSBtYXAgd2hlbiBjb21wYXJlZCB0bw0KKyAgICAgKiAgYWxsIHRoZSBvdGhlciBwYWlyaW5ncyBpbiB0aGUgbWFwLiAgVGhpcyBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHVzaW5nDQorICAgICAqICA8Y29kZT5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpPC9jb2RlPiwgYnV0IHRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuDQorICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uDQorICAgICAqDQorICAgICAqICBAcmV0dXJuIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgc2VxdWVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQ0KKyAgICAgKiAgbWFwIGlzIGVtcHR5Lg0KKyAgICAgKiovDQorICAgIHB1YmxpYyBNYXAuRW50cnkgZ2V0Rmlyc3QoKSB7DQorICAgICAgICAvLyBzZW50aW5lbC5uZXh0IHBvaW50cyB0byB0aGUgImZpcnN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgaGVhZA0KKyAgICAgICAgLy8gb2YgdGhlIGxpc3QsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGVudHJ5IHdlIG5lZWQgdG8gcmV0dXJuLiAgV2UgbXVzdCB0ZXN0DQorICAgICAgICAvLyBmb3IgYW4gZW1wdHkgbGlzdCB0aG91Z2ggYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgc2VudGluZWwhDQorICAgICAgICByZXR1cm4gKGlzRW1wdHkoKSkgPyBudWxsIDogc2VudGluZWwubmV4dDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIFJldHVybiB0aGUga2V5IGZvciB0aGUgIm9sZGVzdCIgbWFwcGluZy4gIFRoYXQgaXMsIHJldHVybiB0aGUga2V5IGZvciB0aGUNCisgICAgICogIG1hcHBpbmcgdGhhdCB3YXMgZmlyc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvIGFsbCB0aGUgb3RoZXINCisgICAgICogIG9iamVjdHMgaW4gdGhlIG1hcC4gIFRoaXMgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0byB1c2luZw0KKyAgICAgKiAgPGNvZGU+Z2V0Rmlyc3QoKS5nZXRLZXkoKTwvY29kZT4sIGJ1dCB0aGlzIG1ldGhvZCBwcm92aWRlcyBhIHNsaWdodGx5DQorICAgICAqICBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24uDQorICAgICAqDQorICAgICAqICBAcmV0dXJuIFRoZSBmaXJzdCBrZXkgaW4gdGhlIHNlcXVlbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUNCisgICAgICogIG1hcCBpcyBlbXB0eS4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpcnN0S2V5KCkgew0KKyAgICAgICAgLy8gc2VudGluZWwubmV4dCBwb2ludHMgdG8gdGhlICJmaXJzdCIgZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgLS0gdGhlIGhlYWQNCisgICAgICAgIC8vIG9mIHRoZSBsaXN0IC0tIGFuZCB0aGUgcmVxdWlzaXRlIGtleSBpcyByZXR1cm5lZCBmcm9tIGl0LiAgQW4gZW1wdHkgbGlzdA0KKyAgICAgICAgLy8gZG9lcyBub3QgbmVlZCB0byBiZSB0ZXN0ZWQuICBJbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCBpcyBlbXB0eSwNCisgICAgICAgIC8vIHNlbnRpbmVsLm5leHQgd2lsbCBwb2ludCB0byB0aGUgc2VudGluZWwgaXRzZWxmIHdoaWNoIGhhcyBhIG51bGwga2V5LA0KKyAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhDQorICAgICAgICAvLyBuaWNlIGNvbnZpZW50IHdheSB0byBhdm9pZCB0ZXN0IGZvciBhbiBlbXB0eSBsaXN0KQ0KKyAgICAgICAgcmV0dXJuIHNlbnRpbmVsLm5leHQuZ2V0S2V5KCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgIm9sZGVzdCIgbWFwcGluZy4gIFRoYXQgaXMsIHJldHVybiB0aGUgdmFsdWUgZm9yDQorICAgICAqICB0aGUgbWFwcGluZyB0aGF0IHdhcyBmaXJzdCBwdXQgaW50byB0aGUgbWFwIHdoZW4gY29tcGFyZWQgdG8gYWxsIHRoZQ0KKyAgICAgKiAgb3RoZXIgb2JqZWN0cyBpbiB0aGUgbWFwLiAgVGhpcyBiZWhhdmlvciBpcyBlcXVpdmFsZW50IHRvIHVzaW5nDQorICAgICAqICA8Y29kZT5nZXRGaXJzdCgpLmdldFZhbHVlKCk8L2NvZGU+LCBidXQgdGhpcyBtZXRob2QgcHJvdmlkZXMgYSBzbGlnaHRseQ0KKyAgICAgKiAgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLg0KKyAgICAgKg0KKyAgICAgKiAgQHJldHVybiBUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIHNlcXVlbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUNCisgICAgICogIG1hcCBpcyBlbXB0eS4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpcnN0VmFsdWUoKSB7DQorICAgICAgICAvLyBzZW50aW5lbC5uZXh0IHBvaW50cyB0byB0aGUgImZpcnN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgaGVhZA0KKyAgICAgICAgLy8gb2YgdGhlIGxpc3QgLS0gYW5kIHRoZSByZXF1aXNpdGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBpdC4gIEFuIGVtcHR5DQorICAgICAgICAvLyBsaXN0IGRvZXMgbm90IG5lZWQgdG8gYmUgdGVzdGVkLiAgSW4gY2FzZXMgd2hlcmUgdGhlIGxpc3QgaXMgZW1wdHksDQorICAgICAgICAvLyBzZW50aW5lbC5uZXh0IHdpbGwgcG9pbnQgdG8gdGhlIHNlbnRpbmVsIGl0c2VsZiB3aGljaCBoYXMgYSBudWxsIHZhbHVlLA0KKyAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhDQorICAgICAgICAvLyBuaWNlIGNvbnZpZW50IHdheSB0byBhdm9pZCB0ZXN0IGZvciBhbiBlbXB0eSBsaXN0KQ0KKyAgICAgICAgcmV0dXJuIHNlbnRpbmVsLm5leHQuZ2V0VmFsdWUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIFJldHVybiB0aGUgZW50cnkgZm9yIHRoZSAibmV3ZXN0IiBtYXBwaW5nLiAgVGhhdCBpcywgcmV0dXJuIHRoZSBNYXAuRW50cnkNCisgICAgICogIGZvciB0aGUga2V5LXZhbHVlIHBhaXIgdGhhdCB3YXMgZmlyc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvDQorICAgICAqICBhbGwgdGhlIG90aGVyIHBhaXJpbmdzIGluIHRoZSBtYXAuICBUaGUgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0bzoNCisgICAgICoNCisgICAgICogIDxwcmU+DQorICAgICAqICAgIE9iamVjdCBvYmogPSBudWxsOw0KKyAgICAgKiAgICBJdGVyYXRvciBpdGVyID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOw0KKyAgICAgKiAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgew0KKyAgICAgKiAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOw0KKyAgICAgKiAgICB9DQorICAgICAqICAgIHJldHVybiAoTWFwLkVudHJ5KW9iajsNCisgICAgICogIDwvcHJlPg0KKyAgICAgKg0KKyAgICAgKiAgSG93ZXZlciwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGVuc3VyZXMgYW4gTygxKSBsb29rdXAgb2YgdGhlDQorICAgICAqICBsYXN0IGtleSByYXRoZXIgdGhhbiBPKG4pLg0KKyAgICAgKg0KKyAgICAgKiAgQHJldHVybiBUaGUgbGFzdCBlbnRyeSBpbiB0aGUgc2VxdWVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXANCisgICAgICogIGlzIGVtcHR5Lg0KKyAgICAgKiovDQorICAgIHB1YmxpYyBNYXAuRW50cnkgZ2V0TGFzdCgpIHsNCisgICAgICAgIC8vIHNlbnRpbmVsLnByZXYgcG9pbnRzIHRvIHRoZSAibGFzdCIgZWxlbWVudCBvZiB0aGUgc2VxdWVuY2UgLS0gdGhlIHRhaWwNCisgICAgICAgIC8vIG9mIHRoZSBsaXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBlbnRyeSB3ZSBuZWVkIHRvIHJldHVybi4gIFdlIG11c3QgdGVzdA0KKyAgICAgICAgLy8gZm9yIGFuIGVtcHR5IGxpc3QgdGhvdWdoIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIHNlbnRpbmVsIQ0KKyAgICAgICAgcmV0dXJuIChpc0VtcHR5KCkpID8gbnVsbCA6IHNlbnRpbmVsLnByZXY7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBSZXR1cm4gdGhlIGtleSBmb3IgdGhlICJuZXdlc3QiIG1hcHBpbmcuICBUaGF0IGlzLCByZXR1cm4gdGhlIGtleSBmb3IgdGhlDQorICAgICAqICBtYXBwaW5nIHRoYXQgd2FzIGxhc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvIGFsbCB0aGUgb3RoZXINCisgICAgICogIG9iamVjdHMgaW4gdGhlIG1hcC4gIFRoaXMgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0byB1c2luZw0KKyAgICAgKiAgPGNvZGU+Z2V0TGFzdCgpLmdldEtleSgpPC9jb2RlPiwgYnV0IHRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgc2xpZ2h0bHkNCisgICAgICogIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbi4NCisgICAgICoNCisgICAgICogIEByZXR1cm4gVGhlIGxhc3Qga2V5IGluIHRoZSBzZXF1ZW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1hcCBpcw0KKyAgICAgKiAgZW1wdHkuDQorICAgICAqKi8NCisgICAgcHVibGljIE9iamVjdCBnZXRMYXN0S2V5KCkgew0KKyAgICAgICAgLy8gc2VudGluZWwucHJldiBwb2ludHMgdG8gdGhlICJsYXN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgdGFpbA0KKyAgICAgICAgLy8gb2YgdGhlIGxpc3QgLS0gYW5kIHRoZSByZXF1aXNpdGUga2V5IGlzIHJldHVybmVkIGZyb20gaXQuICBBbiBlbXB0eSBsaXN0DQorICAgICAgICAvLyBkb2VzIG5vdCBuZWVkIHRvIGJlIHRlc3RlZC4gIEluIGNhc2VzIHdoZXJlIHRoZSBsaXN0IGlzIGVtcHR5LA0KKyAgICAgICAgLy8gc2VudGluZWwucHJldiB3aWxsIHBvaW50IHRvIHRoZSBzZW50aW5lbCBpdHNlbGYgd2hpY2ggaGFzIGEgbnVsbCBrZXksDQorICAgICAgICAvLyB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd291bGQgd2FudCB0byByZXR1cm4gaWYgdGhlIGxpc3QgaXMgZW1wdHkgKGENCisgICAgICAgIC8vIG5pY2UgY29udmllbnQgd2F5IHRvIGF2b2lkIHRlc3QgZm9yIGFuIGVtcHR5IGxpc3QpDQorICAgICAgICByZXR1cm4gc2VudGluZWwucHJldi5nZXRLZXkoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSAibmV3ZXN0IiBtYXBwaW5nLiAgVGhhdCBpcywgcmV0dXJuIHRoZSB2YWx1ZSBmb3INCisgICAgICogIHRoZSBtYXBwaW5nIHRoYXQgd2FzIGxhc3QgcHV0IGludG8gdGhlIG1hcCB3aGVuIGNvbXBhcmVkIHRvIGFsbCB0aGUgb3RoZXINCisgICAgICogIG9iamVjdHMgaW4gdGhlIG1hcC4gIFRoaXMgYmVoYXZpb3IgaXMgZXF1aXZhbGVudCB0byB1c2luZw0KKyAgICAgKiAgPGNvZGU+Z2V0TGFzdCgpLmdldFZhbHVlKCk8L2NvZGU+LCBidXQgdGhpcyBtZXRob2QgcHJvdmlkZXMgYSBzbGlnaHRseQ0KKyAgICAgKiAgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLg0KKyAgICAgKg0KKyAgICAgKiAgQHJldHVybiBUaGUgbGFzdCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXANCisgICAgICogIGlzIGVtcHR5Lg0KKyAgICAgKiovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdFZhbHVlKCkgew0KKyAgICAgICAgLy8gc2VudGluZWwucHJldiBwb2ludHMgdG8gdGhlICJsYXN0IiBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZSAtLSB0aGUgdGFpbA0KKyAgICAgICAgLy8gb2YgdGhlIGxpc3QgLS0gYW5kIHRoZSByZXF1aXNpdGUgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSBpdC4gIEFuIGVtcHR5DQorICAgICAgICAvLyBsaXN0IGRvZXMgbm90IG5lZWQgdG8gYmUgdGVzdGVkLiAgSW4gY2FzZXMgd2hlcmUgdGhlIGxpc3QgaXMgZW1wdHksDQorICAgICAgICAvLyBzZW50aW5lbC5wcmV2IHdpbGwgcG9pbnQgdG8gdGhlIHNlbnRpbmVsIGl0c2VsZiB3aGljaCBoYXMgYSBudWxsIHZhbHVlLA0KKyAgICAgICAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGlzIGVtcHR5IChhDQorICAgICAgICAvLyBuaWNlIGNvbnZpZW50IHdheSB0byBhdm9pZCB0ZXN0IGZvciBhbiBlbXB0eSBsaXN0KQ0KKyAgICAgICAgcmV0dXJuIHNlbnRpbmVsLnByZXYuZ2V0VmFsdWUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNwdXQoT2JqZWN0LCBPYmplY3QpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgbW9kQ291bnQrKzsNCisNCisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IG51bGw7DQorDQorICAgICAgICAvLyBsb29rdXAgdGhlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGtleQ0KKyAgICAgICAgRW50cnkgZSA9IChFbnRyeSllbnRyaWVzLmdldChrZXkpOw0KKw0KKyAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGl0IGFscmVhZHkgZXhpc3RzDQorICAgICAgICBpZiAoZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gbGlzdCBzbyB0aGUgZW50cnkgZ2V0cyAibW92ZWQiIHRvIHRoZSBlbmQgb2YgbGlzdA0KKyAgICAgICAgICAgIHJlbW92ZUVudHJ5KGUpOw0KKw0KKyAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWx1ZSBpbiBtYXANCisgICAgICAgICAgICBvbGRWYWx1ZSA9IGUuc2V0VmFsdWUodmFsdWUpOw0KKw0KKyAgICAgICAgICAgIC8vIE5vdGU6IFdlIGRvIG5vdCB1cGRhdGUgdGhlIGtleSBoZXJlIGJlY2F1c2UgaXRzIHVubmVjZXNzYXJ5LiAgV2Ugb25seQ0KKyAgICAgICAgICAgIC8vIGRvIGNvbXBhcmlzb25zIHVzaW5nIGVxdWFscyhPYmplY3QpIGFuZCB3ZSBrbm93IHRoZSBzcGVjaWZpZWQga2V5IGFuZA0KKyAgICAgICAgICAgIC8vIHRoYXQgaW4gdGhlIG1hcCBhcmUgZXF1YWwgaW4gdGhhdCBzZW5zZS4gIFRoaXMgbWF5IGNhdXNlIGEgcHJvYmxlbSBpZg0KKyAgICAgICAgICAgIC8vIHNvbWVvbmUgZG9lcyBub3QgaW1wbGVtZW50IHRoZWlyIGhhc2hDb2RlKCkgYW5kL29yIGVxdWFscyhPYmplY3QpDQorICAgICAgICAgICAgLy8gbWV0aG9kIHByb3Blcmx5IGFuZCB0aGVuIHVzZSBpdCBhcyBhIGtleSBpbiB0aGlzIG1hcC4NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkNCisgICAgICAgICAgICBlID0gbmV3IEVudHJ5KGtleSwgdmFsdWUpOw0KKyAgICAgICAgICAgIGVudHJpZXMucHV0KGtleSwgZSk7DQorICAgICAgICB9DQorICAgICAgICAvLyBhc3NlcnQoZW50cnkgaW4gbWFwLCBidXQgbm90IGxpc3QpDQorDQorICAgICAgICAvLyBhZGQgdG8gbGlzdA0KKyAgICAgICAgaW5zZXJ0RW50cnkoZSk7DQorDQorICAgICAgICByZXR1cm4gb2xkVmFsdWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAjcmVtb3ZlKE9iamVjdCl9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgew0KKyAgICAgICAgRW50cnkgZSA9IHJlbW92ZUltcGwoa2V5KTsNCisgICAgICAgIHJldHVybiAoZSA9PSBudWxsKSA/IG51bGwgOiBlLmdldFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBGdWxseSByZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgbWFwLCByZXR1cm5pbmcgdGhlIG9sZCBlbnRyeSBvciBudWxsIGlmDQorICAgICAqICB0aGVyZSB3YXMgbm8gc3VjaCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Lg0KKyAgICAgKiovDQorICAgIHByaXZhdGUgRW50cnkgcmVtb3ZlSW1wbChPYmplY3Qga2V5KSB7DQorICAgICAgICBFbnRyeSBlID0gKEVudHJ5KWVudHJpZXMucmVtb3ZlKGtleSk7DQorICAgICAgICBpZiAoZSA9PSBudWxsKSByZXR1cm4gbnVsbDsNCisgICAgICAgIG1vZENvdW50Kys7DQorICAgICAgICByZW1vdmVFbnRyeShlKTsNCisgICAgICAgIHJldHVybiBlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgQWRkcyBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgbWFwLCByZXBsYWNpbmcgYW55DQorICAgICAqICBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgKGFzIHBlciB7QGxpbmsgTWFwI3B1dEFsbChNYXApfSkuICBUaGUgb3JkZXINCisgICAgICogIGluIHdoaWNoIHRoZSBlbnRyaWVzIGFyZSBhZGRlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZA0KKyAgICAgKiAgZnJvbSB7QGxpbmsgTWFwI2VudHJ5U2V0KCl9IGZvciB0aGUgc3BlY2lmaWVkIG1hcC4NCisgICAgICoNCisgICAgICogIEBwYXJhbSB0IHRoZSBtYXBwaW5ncyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIG1hcC4NCisgICAgICoNCisgICAgICogIEBleGNlcHRpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsNCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsNCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXRlci5uZXh0KCk7DQorICAgICAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNjbGVhcigpfS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KKyAgICAgICAgbW9kQ291bnQrKzsNCisNCisgICAgICAgIC8vIHJlbW92ZSBhbGwgZnJvbSB0aGUgdW5kZXJseWluZyBtYXANCisgICAgICAgIGVudHJpZXMuY2xlYXIoKTsNCisNCisgICAgICAgIC8vIGFuZCB0aGUgbGlzdA0KKyAgICAgICAgc2VudGluZWwubmV4dCA9IHNlbnRpbmVsOw0KKyAgICAgICAgc2VudGluZWwucHJldiA9IHNlbnRpbmVsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI2VxdWFscyhPYmplY3QpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7DQorDQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNYXApKSByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICByZXR1cm4gZW50cnlTZXQoKS5lcXVhbHMoKChNYXApb2JqKS5lbnRyeVNldCgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNoYXNoQ29kZSgpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gZW50cnlTZXQoKS5oYXNoQ29kZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgUHJvdmlkZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudHJpZXMgd2l0aGluIHRoZSBtYXAuICBUaGUNCisgICAgICogIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIG1heSBjaGFuZ2Ugd2l0aCBkaWZmZXJlbnQgcmVsZWFzZXMsIHNvIHRoaXMNCisgICAgICogIG1ldGhvZCBpcyBzdWl0YWJsZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuICBJZiBhIHNwZWNpZmljIGZvcm1hdCBpcw0KKyAgICAgKiAgcmVxdWlyZWQsIHVzZSB7QGxpbmsgI2VudHJ5U2V0KCl9LntAbGluayBTZXQjaXRlcmF0b3IoKSBpdGVyYXRvcigpfSBhbmQNCisgICAgICogIGl0ZXJhdGUgb3ZlciB0aGUgZW50cmllcyBpbiB0aGUgbWFwIGZvcm1hdHRpbmcgdGhlbSBhcyBhcHByb3ByaWF0ZS4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsNCisgICAgICAgIGZvciAoRW50cnkgcG9zID0gc2VudGluZWwubmV4dDsgcG9zICE9IHNlbnRpbmVsOyBwb3MgPSBwb3MubmV4dCkgew0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocG9zLmdldEtleSgpKTsNCisgICAgICAgICAgICBidWYuYXBwZW5kKCc9Jyk7DQorICAgICAgICAgICAgYnVmLmFwcGVuZChwb3MuZ2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgaWYgKHBvcy5uZXh0ICE9IHNlbnRpbmVsKSB7DQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJywnKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBidWYuYXBwZW5kKCddJyk7DQorDQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBJbXBsZW1lbnRzIHtAbGluayBNYXAja2V5U2V0KCl9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIFNldCBrZXlTZXQoKSB7DQorICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0U2V0KCkgew0KKw0KKyAgICAgICAgICAgIC8vIHJlcXVpcmVkIGltcGxzDQorICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9yZGVyZWRJdGVyYXRvcihLRVkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsNCisgICAgICAgICAgICAgICAgRW50cnkgZSA9IFNlcXVlbmNlZEhhc2hNYXAudGhpcy5yZW1vdmVJbXBsKG8pOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gKGUgIT0gbnVsbCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIG1vcmUgZWZmaWNpZW50IGltcGxzIHRoYW4gYWJzdHJhY3Qgc2V0DQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgICAgICAgICAgIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuc2l6ZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmlzRW1wdHkoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jb250YWluc0tleShvKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiAgSW1wbGVtZW50cyB7QGxpbmsgTWFwI3ZhbHVlcygpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsNCisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RDb2xsZWN0aW9uKCkgew0KKyAgICAgICAgICAgIC8vIHJlcXVpcmVkIGltcGwNCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3JkZXJlZEl0ZXJhdG9yKFZBTFVFKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgICAgICAgICAvLyBkbyBudWxsIGNvbXBhcmlzb24gb3V0c2lkZSBsb29wIHNvIHdlIG9ubHkgbmVlZCB0byBkbyBpdCBvbmNlLiAgVGhpcw0KKyAgICAgICAgICAgICAgICAvLyBwcm92aWRlcyBhIHRpZ2h0ZXIsIG1vcmUgZWZmaWNpZW50IGxvb3AgYXQgdGhlIGV4cGVuc2Ugb2Ygc2xpZ2h0DQorICAgICAgICAgICAgICAgIC8vIGNvZGUgZHVwbGljYXRpb24uDQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5IHBvcyA9IHNlbnRpbmVsLm5leHQ7IHBvcyAhPSBzZW50aW5lbDsgcG9zID0gcG9zLm5leHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMucmVtb3ZlSW1wbChwb3MuZ2V0S2V5KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5IHBvcyA9IHNlbnRpbmVsLm5leHQ7IHBvcyAhPSBzZW50aW5lbDsgcG9zID0gcG9zLm5leHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHBvcy5nZXRWYWx1ZSgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMucmVtb3ZlSW1wbChwb3MuZ2V0S2V5KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBtb3JlIGVmZmljaWVudCBpbXBscyB0aGFuIGFic3RyYWN0IGNvbGxlY3Rpb24NCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCisgICAgICAgICAgICAgICAgU2VxdWVuY2VkSGFzaE1hcC50aGlzLmNsZWFyKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5zaXplKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuaXNFbXB0eSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgbykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmNvbnRhaW5zVmFsdWUobyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIEltcGxlbWVudHMge0BsaW5rIE1hcCNlbnRyeVNldCgpfS4NCisgICAgICovDQorICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7DQorICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0U2V0KCkgew0KKyAgICAgICAgICAgIC8vIGhlbHBlcg0KKyAgICAgICAgICAgIHByaXZhdGUgRW50cnkgZmluZEVudHJ5KE9iamVjdCBvKSB7DQorICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgcmV0dXJuIG51bGw7DQorDQorICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSlvOw0KKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSllbnRyaWVzLmdldChlLmdldEtleSgpKTsNCisgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkuZXF1YWxzKGUpKQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gcmVxdWlyZWQgaW1wbA0KKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcmRlcmVkSXRlcmF0b3IoRU5UUlkpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsNCisgICAgICAgICAgICAgICAgRW50cnkgZSA9IGZpbmRFbnRyeShvKTsNCisgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOw0KKw0KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLnJlbW92ZUltcGwoZS5nZXRLZXkoKSkgIT0gbnVsbDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gbW9yZSBlZmZpY2llbnQgaW1wbHMgdGhhbiBhYnN0cmFjdCBjb2xsZWN0aW9uDQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgICAgICAgICAgIFNlcXVlbmNlZEhhc2hNYXAudGhpcy5jbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZWRIYXNoTWFwLnRoaXMuc2l6ZSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VkSGFzaE1hcC50aGlzLmlzRW1wdHkoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRFbnRyeShvKSAhPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH07DQorICAgIH0NCisNCisgICAgLy8gY29uc3RhbnRzIHRvIGRlZmluZSB3aGF0IHRoZSBpdGVyYXRvciBzaG91bGQgcmV0dXJuIG9uICJuZXh0Ig0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZID0gMDsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOVFJZID0gMjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfTUFTSyA9IDB4ODAwMDAwMDA7DQorDQorICAgIHByaXZhdGUgY2xhc3MgT3JkZXJlZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3Igew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiAgSG9sZHMgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGUgaXRlcmF0b3IuICBUaGUgdmFsdWUNCisgICAgICAgICAqICBzaG91bGQgYmUgZWl0aGVyIHtAbGluayAjS0VZfSwge0BsaW5rICNWQUxVRX0sIG9yIHtAbGluayAjRU5UUll9LiAgVG8NCisgICAgICAgICAqICBzYXZlIGEgdGlueSBiaXQgb2YgbWVtb3J5LCB0aGlzIGZpZWxkIGlzIGFsc28gdXNlZCBhcyBhIG1hcmtlciBmb3Igd2hlbg0KKyAgICAgICAgICogIHJlbW92ZSBoYXMgYmVlbiBjYWxsZWQgb24gdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHByZXZlbnQgYSBzZWNvbmQgcmVtb3ZlDQorICAgICAgICAgKiAgb24gdGhlIHNhbWUgZWxlbWVudC4gIEVzc2llbnRpYWxseSwgaWYgdGhpcyB2YWx1ZSBpcyBuZWdhdGl2ZSAoaS5lLiB0aGUNCisgICAgICAgICAqICBiaXQgc3BlY2lmaWVkIGJ5IHtAbGluayAjUkVNT1ZFRF9NQVNLfSBpcyBzZXQpLCB0aGUgY3VycmVudCBwb3NpdGlvbg0KKyAgICAgICAgICogIGhhcyBiZWVuIHJlbW92ZWQuICBJZiBwb3NpdGl2ZSwgcmVtb3ZlIGNhbiBzdGlsbCBiZSBjYWxsZWQuDQorICAgICAgICAgKiovDQorICAgICAgICBwcml2YXRlIGludCByZXR1cm5UeXBlOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiAgSG9sZHMgdGhlICJjdXJyZW50IiBwb3NpdGlvbiBpbiB0aGUgaXRlcmF0b3IuICBXaGVuIHBvcy5uZXh0IGlzIHRoZQ0KKyAgICAgICAgICogIHNlbnRpbmVsLCB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpc3QuDQorICAgICAgICAgKiovDQorICAgICAgICBwcml2YXRlIEVudHJ5IHBvcyA9IHNlbnRpbmVsOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiAgSG9sZHMgdGhlIGV4cGVjdGVkIG1vZGlmaWNhdGlvbiBjb3VudC4gIElmIHRoZSBhY3R1YWwgbW9kaWZpY2F0aW9uDQorICAgICAgICAgKiAgY291bnQgb2YgdGhlIG1hcCBkaWZmZXJzIGZyb20gdGhpcyB2YWx1ZSwgdGhlbiBhIGNvbmN1cnJlbnQNCisgICAgICAgICAqICBtb2RpZmljYXRpb24gaGFzIG9jY3VycmVkLg0KKyAgICAgICAgICoqLw0KKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBleHBlY3RlZE1vZENvdW50ID0gbW9kQ291bnQ7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqICBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb3ZlciB0aGUgc2VxdWVuY2VkIGVsZW1lbnRzIGluIHRoZSBvcmRlciBpbiB3aGljaA0KKyAgICAgICAgICogIHRoZXkgd2VyZSBhZGRlZC4gIFRoZSB7QGxpbmsgI25leHQoKX0gbWV0aG9kIHJldHVybnMgdGhlIHR5cGUgc3BlY2lmaWVkDQorICAgICAgICAgKiAgYnkgPGNvZGU+cmV0dXJuVHlwZTwvY29kZT4gd2hpY2ggbXVzdCBiZSBlaXRoZXIge0BsaW5rICNLRVl9LCB7QGxpbmsNCisgICAgICAgICAqICAjVkFMVUV9LCBvciB7QGxpbmsgI0VOVFJZfS4NCisgICAgICAgICAqKi8NCisgICAgICAgIHB1YmxpYyBPcmRlcmVkSXRlcmF0b3IoaW50IHJldHVyblR5cGUpIHsNCisgICAgICAgICAgICAvLy8vIFNpbmNlIHRoaXMgaXMgYSBwcml2YXRlIGlubmVyIGNsYXNzLCBub3RoaW5nIGVsc2Ugc2hvdWxkIGhhdmUNCisgICAgICAgICAgICAvLy8vIGFjY2VzcyB0byB0aGUgY29uc3RydWN0b3IuICBTaW5jZSB3ZSBrbm93IHRoZSByZXN0IG9mIHRoZSBvdXRlcg0KKyAgICAgICAgICAgIC8vLy8gY2xhc3MgdXNlcyB0aGUgaXRlcmF0b3IgY29ycmVjdGx5LCB3ZSBjYW4gbGVhdmUgb2YgdGhlIGZvbGxvd2luZw0KKyAgICAgICAgICAgIC8vLy8gY2hlY2s6DQorICAgICAgICAgICAgLy9pZihyZXR1cm5UeXBlID49IDAgJiYgcmV0dXJuVHlwZSA8PSAyKSB7DQorICAgICAgICAgICAgLy8gIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgaXRlcmF0b3IgdHlwZSIpOw0KKyAgICAgICAgICAgIC8vfQ0KKw0KKyAgICAgICAgICAgIC8vIFNldCB0aGUgInJlbW92ZWQiIGJpdCBzbyB0aGF0IHRoZSBpdGVyYXRvciBzdGFydHMgaW4gYSBzdGF0ZSB3aGVyZQ0KKyAgICAgICAgICAgIC8vICJuZXh0IiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgInJlbW92ZSIgd2lsbCBzdWNjZWVkLg0KKyAgICAgICAgICAgIHRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGUgfCBSRU1PVkVEX01BU0s7DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqICBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYW55IGFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdG9yIHRvIGJlDQorICAgICAgICAgKiAgcmV0dXJuZWQuDQorICAgICAgICAgKg0KKyAgICAgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgbGVmdCB0byBiZQ0KKyAgICAgICAgICogIHJldHVybmVkIGZyb20gdGhlIGl0ZXJhdG9yOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KKyAgICAgICAgICoqLw0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsNCisgICAgICAgICAgICByZXR1cm4gcG9zLm5leHQgIT0gc2VudGluZWw7DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqICBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IuDQorICAgICAgICAgKg0KKyAgICAgICAgICogIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvci4NCisgICAgICAgICAqDQorICAgICAgICAgKiAgQGV4Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzIGluIHRoZQ0KKyAgICAgICAgICogIGl0ZXJhdG9yLg0KKyAgICAgICAgICoNCisgICAgICAgICAqICBAZXhjZXB0aW9uIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgYSBtb2RpZmljYXRpb24gb2NjdXJzIGluDQorICAgICAgICAgKiAgdGhlIHVuZGVybHlpbmcgbWFwLg0KKyAgICAgICAgICoqLw0KKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgew0KKyAgICAgICAgICAgIGlmIChtb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwb3MubmV4dCA9PSBzZW50aW5lbCkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBjbGVhciB0aGUgInJlbW92ZWQiIGZsYWcNCisgICAgICAgICAgICByZXR1cm5UeXBlID0gcmV0dXJuVHlwZSAmIH5SRU1PVkVEX01BU0s7DQorDQorICAgICAgICAgICAgcG9zID0gcG9zLm5leHQ7DQorICAgICAgICAgICAgc3dpdGNoIChyZXR1cm5UeXBlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgS0VZOg0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcy5nZXRLZXkoKTsNCisgICAgICAgICAgICAgICAgY2FzZSBWQUxVRToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3MuZ2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgY2FzZSBFTlRSWToNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3M7DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuDQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImJhZCBpdGVyYXRvciB0eXBlOiAiICsgcmV0dXJuVHlwZSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiAgUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIHtAbGluayAjbmV4dCgpfSBtZXRob2QgZnJvbQ0KKyAgICAgICAgICogIHRoZSBzZXF1ZW5jZWQgbWFwLg0KKyAgICAgICAgICoNCisgICAgICAgICAqICBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpc24ndCBhICJsYXN0IGVsZW1lbnQiIHRvIGJlDQorICAgICAgICAgKiAgcmVtb3ZlZC4gIFRoYXQgaXMsIGlmIHtAbGluayAjbmV4dCgpfSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIG9yIGlmDQorICAgICAgICAgKiAge0BsaW5rICNyZW1vdmUoKX0gd2FzIGFscmVhZHkgY2FsbGVkIG9uIHRoZSBlbGVtZW50Lg0KKyAgICAgICAgICoNCisgICAgICAgICAqICBAZXhjZXB0aW9uIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgYSBtb2RpZmljYXRpb24gb2NjdXJzIGluDQorICAgICAgICAgKiAgdGhlIHVuZGVybHlpbmcgbWFwLg0KKyAgICAgICAgICoqLw0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KKyAgICAgICAgICAgIGlmICgocmV0dXJuVHlwZSAmIFJFTU9WRURfTUFTSykgIT0gMCkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZW1vdmUoKSBtdXN0IGZvbGxvdyBuZXh0KCkiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1vZENvdW50ICE9IGV4cGVjdGVkTW9kQ291bnQpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgU2VxdWVuY2VkSGFzaE1hcC50aGlzLnJlbW92ZUltcGwocG9zLmdldEtleSgpKTsNCisNCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGV4cGVjdGVkIG1vZCBjb3VudCBmb3IgdGhlIHJlbW92ZSBvcGVyYXRpb24NCisgICAgICAgICAgICBleHBlY3RlZE1vZENvdW50Kys7DQorDQorICAgICAgICAgICAgLy8gc2V0IHRoZSByZW1vdmVkIGZsYWcNCisgICAgICAgICAgICByZXR1cm5UeXBlID0gcmV0dXJuVHlwZSB8IFJFTU9WRURfTUFTSzsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvLyBBUElzIG1haW50YWluZWQgZnJvbSBwcmV2aW91cyB2ZXJzaW9uIG9mIFNlcXVlbmNlZEhhc2hNYXAgZm9yIGJhY2t3YXJkcw0KKyAgICAvLyBjb21wYXRpYmlsaXR5DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgb2JqZWN0LCBwcmVzZXJ2aW5nIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUNCisgICAgICogYnkgY29weWluZyBvbmx5IHJlZmVyZW5jZXMuICBUaGUga2V5cyBhbmQgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdA0KKyAgICAgKiA8Y29kZT5jbG9uZSgpPC9jb2RlPidkLiAgVGhlIGNsb25lZCBvYmplY3QgbWFpbnRhaW5zIHRoZSBzYW1lIHNlcXVlbmNlLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS4NCisgICAgICoNCisgICAgICogQGV4Y2VwdGlvbiBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBjbG9uZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGENCisgICAgICogc3ViY2xhc3MuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIHllcywgY2FsbGluZyBzdXBlci5jbG9uZSgpIHNpbGx5IHNpbmNlIHdlJ3JlIGp1c3QgYmxvd2luZyBhd2F5IGFsbA0KKyAgICAgICAgLy8gdGhlIHN0dWZmIHRoYXQgc3VwZXIgbWlnaHQgYmUgZG9pbmcgYW55d2F5LCBidXQgZm9yIG1vdGl2YXRpb25zIG9uDQorICAgICAgICAvLyB0aGlzLCBzZWU6DQorICAgICAgICAvLyBodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTAxLTE5OTkvanctMDEtb2JqZWN0Lmh0bWwNCisgICAgICAgIFNlcXVlbmNlZEhhc2hNYXAgbWFwID0gKFNlcXVlbmNlZEhhc2hNYXApc3VwZXIuY2xvbmUoKTsNCisNCisgICAgICAgIC8vIGNyZWF0ZSBuZXcsIGVtcHR5IHNlbnRpbmVsDQorICAgICAgICBtYXAuc2VudGluZWwgPSBjcmVhdGVTZW50aW5lbCgpOw0KKw0KKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3LCBlbXB0eSBlbnRyeSBtYXANCisgICAgICAgIC8vIG5vdGU6IHRoaXMgZG9lcyBub3QgcHJlc2VydmUgdGhlIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLg0KKyAgICAgICAgbWFwLmVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOw0KKw0KKyAgICAgICAgLy8gYWRkIGFsbCB0aGUgbWFwcGluZ3MNCisgICAgICAgIG1hcC5wdXRBbGwodGhpcyk7DQorDQorICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QganVzdCBjbG9uZSB0aGUgaGFzaG1hcCBhbmQgc2VudGluZWwgYmVjYXVzZSB3ZSBtdXN0DQorICAgICAgICAvLyBkdXBsaWNhdGUgb3VyIGludGVybmFsIHN0cnVjdHVyZXMuICBDbG9uaW5nIHRob3NlIHR3byB3aWxsIG5vdCBjbG9uZSBhbGwNCisgICAgICAgIC8vIHRoZSBvdGhlciBlbnRyaWVzIHRoZXkgcmVmZXJlbmNlLCBhbmQgc28gdGhlIGNsb25lZCBoYXNoIG1hcCB3aWxsIG5vdCBiZQ0KKyAgICAgICAgLy8gYWJsZSB0byBtYWludGFpbiBpbnRlcm5hbCBjb25zaXN0ZW5jeSBiZWNhdXNlIHRoZXJlIGFyZSB0d28gb2JqZWN0cyB3aXRoDQorICAgICAgICAvLyB0aGUgc2FtZSBlbnRyaWVzLiAgU2VlIGRpc2N1c3Npb24gaW4gdGhlIEVudHJ5IGltcGxlbWVudGF0aW9uIG9uIHdoeSB3ZQ0KKyAgICAgICAgLy8gY2Fubm90IGltcGxlbWVudCBhIGNsb25lIG9mIHRoZSBFbnRyeSAoYW5kIHRodXMgd2h5IHdlIG5lZWQgdG8gcmVjcmVhdGUNCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcpLg0KKw0KKyAgICAgICAgcmV0dXJuIG1hcDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogIFJldHVybnMgdGhlIE1hcC5FbnRyeSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4DQorICAgICAqDQorICAgICAqICBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzDQorICAgICAqICA8Y29kZT4mbHQ7IDA8L2NvZGU+IG9yIDxjb2RlPiZndDs8L2NvZGU+IHRoZSBzaXplIG9mIHRoZSBtYXAuDQorICAgICAqKi8NCisgICAgcHJpdmF0ZSBNYXAuRW50cnkgZ2V0RW50cnkoaW50IGluZGV4KSB7DQorICAgICAgICBFbnRyeSBwb3MgPSBzZW50aW5lbDsNCisNCisgICAgICAgIGlmIChpbmRleCA8IDApIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4ICsgIiA8IDAiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGxvb3AgdG8gb25lIGJlZm9yZSB0aGUgcG9zaXRpb24NCisgICAgICAgIGludCBpID0gLTE7DQorICAgICAgICB3aGlsZSAoaSA8IChpbmRleCAtIDEpICYmIHBvcy5uZXh0ICE9IHNlbnRpbmVsKSB7DQorICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgIHBvcyA9IHBvcy5uZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gcG9zLm5leHQgaXMgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbg0KKw0KKyAgICAgICAgLy8gaWYgc2VudGluZWwgaXMgbmV4dCwgcGFzdCBlbmQgb2YgbGlzdA0KKyAgICAgICAgaWYgKHBvcy5uZXh0ID09IHNlbnRpbmVsKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCArICIgPj0gIiArIChpICsgMSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHBvcy5uZXh0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBrZXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4NCisgICAgICoNCisgICAgICogIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaXMNCisgICAgICogIDxjb2RlPiZsdDsgMDwvY29kZT4gb3IgPGNvZGU+Jmd0OzwvY29kZT4gdGhlIHNpemUgb2YgdGhlIG1hcC4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGdldEVudHJ5KGluZGV4KS5nZXRLZXkoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4NCisgICAgICoNCisgICAgICogIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gaXMNCisgICAgICogIDxjb2RlPiZsdDsgMDwvY29kZT4gb3IgPGNvZGU+Jmd0OzwvY29kZT4gdGhlIHNpemUgb2YgdGhlIG1hcC4NCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gZ2V0RW50cnkoaW5kZXgpLmdldFZhbHVlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQga2V5Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBpbmRleE9mKE9iamVjdCBrZXkpIHsNCisgICAgICAgIEVudHJ5IGUgPSAoRW50cnkpZW50cmllcy5nZXQoa2V5KTsNCisgICAgICAgIGludCBwb3MgPSAwOw0KKyAgICAgICAgd2hpbGUgKGUucHJldiAhPSBzZW50aW5lbCkgew0KKyAgICAgICAgICAgIHBvcysrOw0KKyAgICAgICAgICAgIGUgPSBlLnByZXY7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcG9zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIGEga2V5IGl0ZXJhdG9yLg0KKyAgICAgKi8NCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgew0KKyAgICAgICAgcmV0dXJuIGtleVNldCgpLml0ZXJhdG9yKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBrZXkuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBrZXkpIHsNCisgICAgICAgIC8vIGtleXMgaW4gYSBtYXAgYXJlIGd1YXJ1bnRlZWQgdG8gYmUgdW5pcXVlDQorICAgICAgICByZXR1cm4gaW5kZXhPZihrZXkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIGEgTGlzdCB2aWV3IG9mIHRoZSBrZXlzIHJhdGhlciB0aGFuIGEgc2V0IHZpZXcuICBUaGUgcmV0dXJuZWQNCisgICAgICogbGlzdCBpcyB1bm1vZGlmaWFibGUuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgY2hhbmdlcyB0byB0aGUgdmFsdWVzIG9mDQorICAgICAqIHRoZSBsaXN0ICh1c2luZyB7QGxpbmsgamF2YS51dGlsLkxpc3RJdGVyYXRvciNzZXQoT2JqZWN0KX0pIHdpbGwNCisgICAgICogZWZmZWN0aXZlbHkgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBsaXN0IGFuZCByZWluc2VydCB0aGF0IHZhbHVlIGF0DQorICAgICAqIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHdoaWNoIGlzIGFuIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3Qgb2YgY2hhbmdpbmcgdGhlDQorICAgICAqIHZhbHVlIG9mIGEgbGlzdC4gIFRoaXMgb2NjdXJzIGJlY2F1c2UgY2hhbmdpbmcgdGhlIGtleSwgY2hhbmdlcyB3aGVuIHRoZQ0KKyAgICAgKiBtYXBwaW5nIGlzIGFkZGVkIHRvIHRoZSBtYXAgYW5kIHRodXMgd2hlcmUgaXQgYXBwZWFycyBpbiB0aGUgbGlzdC4NCisgICAgICoNCisgICAgICogPFA+QW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBtZXRob2QgaXMgdG8gdXNlIHtAbGluayAja2V5U2V0KCl9DQorICAgICAqDQorICAgICAqIEBzZWUgI2tleVNldCgpDQorICAgICAqIEByZXR1cm4gVGhlIG9yZGVyZWQgbGlzdCBvZiBrZXlzLg0KKyAgICAgKi8NCisgICAgcHVibGljIExpc3Qgc2VxdWVuY2UoKSB7DQorICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KHNpemUoKSk7DQorICAgICAgICBJdGVyYXRvciBpdGVyID0ga2V5U2V0KCkuaXRlcmF0b3IoKTsNCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KKyAgICAgICAgICAgIGwuYWRkKGl0ZXIubmV4dCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGwpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguDQorICAgICAqDQorICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byByZW1vdmUuDQorICAgICAqIEByZXR1cm4gICAgICBUaGUgcHJldmlvdXMgdmFsdWUgY29yZXNzcG9uZGluZyB0aGUgPGNvZGU+a2V5PC9jb2RlPiwgb3INCisgICAgICogICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZXhpc3RlZC4NCisgICAgICoNCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBpcw0KKyAgICAgKiA8Y29kZT4mbHQ7IDA8L2NvZGU+IG9yIDxjb2RlPiZndDs8L2NvZGU+IHRoZSBzaXplIG9mIHRoZSBtYXAuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiByZW1vdmUoZ2V0KGluZGV4KSk7DQorICAgIH0NCisNCisgICAgLy8gcGVyIEV4dGVybmFsaXphYmxlLnJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCkNCisNCisgICAgLyoqDQorICAgICAqICBEZXNlcmlhbGl6ZXMgdGhpcyBtYXAgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLg0KKyAgICAgKg0KKyAgICAgKiAgQHBhcmFtIGluIHRoZSBzdHJlYW0gdG8gZGVzZXJpYWxpemUgZnJvbQ0KKyAgICAgKiAgQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIHJhaXNlcyBpdA0KKyAgICAgKiAgQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gcmFpc2VzIGl0DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4pDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCisgICAgICAgIGludCBzaXplID0gaW4ucmVhZEludCgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgICAgICAgICBPYmplY3Qga2V5ID0gaW4ucmVhZE9iamVjdCgpOw0KKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsNCisgICAgICAgICAgICBwdXQoa2V5LCB2YWx1ZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqICBTZXJpYWxpemVzIHRoaXMgbWFwIHRvIHRoZSBnaXZlbiBzdHJlYW0uDQorICAgICAqDQorICAgICAqICBAcGFyYW0gb3V0ICB0aGUgc3RyZWFtIHRvIHNlcmlhbGl6ZSB0bw0KKyAgICAgKiAgQHRocm93cyBJT0V4Y2VwdGlvbiAgaWYgdGhlIHN0cmVhbSByYWlzZXMgaXQNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIG91dC53cml0ZUludChzaXplKCkpOw0KKyAgICAgICAgZm9yIChFbnRyeSBwb3MgPSBzZW50aW5lbC5uZXh0OyBwb3MgIT0gc2VudGluZWw7IHBvcyA9IHBvcy5uZXh0KSB7DQorICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHBvcy5nZXRLZXkoKSk7DQorICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHBvcy5nZXRWYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvLyBhZGQgYSBzZXJpYWwgdmVyc2lvbiB1aWQsIHNvIHRoYXQgaWYgd2UgY2hhbmdlIHRoaW5ncyBpbiB0aGUgZnV0dXJlDQorICAgIC8vIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGZvcm1hdCwgd2UgY2FuIHN0aWxsIGRlc2VyaWFsaXplIHByb3Blcmx5Lg0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzgwNTUyNDg3ODg4MTAyOTMwTDsNCisNCit9DQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NlcXVlbmNlZEhhc2hTZXQuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TZXF1ZW5jZWRIYXNoU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiYWU1MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TZXF1ZW5jZWRIYXNoU2V0LmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgSkRLMS40IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0LCBidXQgaW4gSkRLMS4zIGFzIHdlbGwuCisgKiBCYWNrZWQgYnkgU2VxdWVuY2VkSGFzaE1hcCB0byBwcmVzZXJ2ZSBpdGVyYXRpb24gb3JkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZWRIYXNoU2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgaW1wbGVtZW50cyBTZXQsCisgICAgQ2xvbmVhYmxlIC8qLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSAqLworeworICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcXVlbmNlZEhhc2hNYXAgbWFwOworCisgICAgLy8gRHVtbXkgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhJU1RTID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgc2VxdWVuY2VkIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2VkSGFzaFNldCgpCisgICAgeworICAgICAgICBtYXAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgc2VxdWVuY2VkIHNldCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VxdWVuY2VkSGFzaFNldChDb2xsZWN0aW9uIGMpCisgICAgeworICAgICAgICBtYXAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcChjLnNpemUoKSk7CisgICAgICAgIGFkZEFsbChjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBzZXF1ZW5jZWQgc2V0IHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIHRoZSBzcGVjaWZpZWQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBpbml0aWFsU2l6ZSAgICAgICB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBoYXNoIG1hcC4KKyAgICAgKiBAcGFyYW0gICAgICBsb2FkRmFjdG9yICAgICAgICB0aGUgbG9hZCBmYWN0b3Igb2YgdGhlIGhhc2ggbWFwLgorICAgICAqLworICAgIHB1YmxpYyBTZXF1ZW5jZWRIYXNoU2V0KGludCBpbml0aWFsU2l6ZSwgZmxvYXQgbG9hZEZhY3RvcikKKyAgICB7CisgICAgICAgIG1hcCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKGluaXRpYWxTaXplLCBsb2FkRmFjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBzZXF1ZW5jZWQgc2V0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHNpemUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBpbml0aWFsU2l6ZSAgIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGhhc2ggdGFibGUuCisgICAgICovCisgICAgcHVibGljIFNlcXVlbmNlZEhhc2hTZXQoaW50IGluaXRpYWxTaXplKQorICAgIHsKKyAgICAgICAgbWFwID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoaW5pdGlhbFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZWxlbWVudHMgaW4gdGhpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzZXQgKGl0cyBjYXJkaW5hbGl0eSkuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHNldCBjb250YWlucyBubyBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXAuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHNldCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pCisgICAgeworICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoaXMgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hcC5wdXQobywgRVhJU1RTKT09bnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IGZyb20gdGhpcyBzZXQgaWYgaXQgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pCisgICAgeworICAgICAgICByZXR1cm4gbWFwLnJlbW92ZShvKT09RVhJU1RTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkKKyAgICB7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcXVlbmNlZEhhc2hTZXQgc2V0ID0gKFNlcXVlbmNlZEhhc2hTZXQpc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgc2V0Lm1hcCA9IChTZXF1ZW5jZWRIYXNoTWFwKW1hcC5jbG9uZSgpOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyA8dHQ+U2VxdWVuY2VkSGFzaFNldDwvdHQ+IGluc3RhbmNlIHRvIGEgc3RyZWFtLgorICAgICAqCisgICAgICogQHNlcmlhbERhdGEgVGhlIHNpemUgb2YgdGhlIGJhY2tpbmcgPHR0PlNlcXVlbmNlZEhhc2hNYXA8L3R0PiBpbnN0YW5jZQorICAgICAqICAgICAgICAgICAgIChpbnQpLCBhbmQgaXRzIGxvYWQgZmFjdG9yIChmbG9hdCkgYXJlIGVtaXR0ZWQsIGZvbGxvd2VkIGJ5CisgICAgICogICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIHNldCAodGhlIG51bWJlciBvZiBlbGVtZW50cyBpdCBjb250YWlucykKKyAgICAgKiAgICAgICAgICAgICAoaW50KSwgZm9sbG93ZWQgYnkgYWxsIG9mIGl0cyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGluCisgICAgICogICAgICAgICAgICAgbm8gcGFydGljdWxhciBvcmRlci4KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCisgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBXcml0ZSBvdXQgYW55IGhpZGRlbiBzZXJpYWxpemF0aW9uIG1hZ2ljCisgICAgICAgIHMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IHNpemUKKyAgICAgICAgcy53cml0ZUludChtYXAuc2l6ZSgpKTsKKworICAgICAgICAvLyBXcml0ZSBvdXQgYWxsIGVsZW1lbnRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCisgICAgICAgIGZvciAoSXRlcmF0b3IgaT1tYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHMud3JpdGVPYmplY3QoaS5uZXh0KCkpOworICAgIH0KKyAgICAgKi8KKworICAgIC8qCisgICAgICogUmVjb25zdGl0dXRlIHRoZSA8dHQ+SGFzaFNldDwvdHQ+IGluc3RhbmNlIGZyb20gYSBzdHJlYW0gKHRoYXQgaXMsCisgICAgICogZGVzZXJpYWxpemUgaXQpLgorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCisgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVhZCBpbiBhbnkgaGlkZGVuIHNlcmlhbGl6YXRpb24gbWFnaWMKKyAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOworCisgICAgICAgIC8vIFJlYWQgaW4gSGFzaE1hcCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IgYW5kIGNyZWF0ZSBiYWNraW5nIEhhc2hNYXAKKyAgICAgICAgLy9pbnQgY2FwYWNpdHkgPSBzLnJlYWRJbnQoKTsKKyAgICAgICAgLy9mbG9hdCBsb2FkRmFjdG9yID0gcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgLy9tYXAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcChjYXBhY2l0eSwgbG9hZEZhY3Rvcik7CisKKyAgICAgICAgLy8gUmVhZCBpbiBzaXplCisgICAgICAgIGludCBzaXplID0gcy5yZWFkSW50KCk7CisgICAgICAgIG1hcCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKHNpemUpOworCisgICAgICAgIC8vIFJlYWQgaW4gYWxsIGVsZW1lbnRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0IGUgPSBzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIG1hcC5wdXQoZSwgRVhJU1RTKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicmVhZE9iamVjdCBpbiBTZXF1ZW5jZWRIYXNoU2V0Iik7CisgICAgfQorICAgICAqLworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDYxMWFmOTIuLmZiNGU5OWQgMTAwNjQ0Ci0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YQorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbElucHV0U3RyZWFtLmphdmEKQEAgLTE1LDEzICsxNSwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiBwdWJsaWMgY2xhc3MgU25pZmZlZFhtbElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbQogewpAQCAtMTM1LDE3ICsxMzYsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQlVHQlVHIGluIEpESzogQ2hhcnNldC5mb3JOYW1lIGlzIG5vdCB0aHJlYWRzYWZlLCBzbyB3ZSdsbCBwcmltZSBpdAotICAgIC8vIHdpdGggdGhlIGNvbW1vbiBjaGFyc2V0cy4KLQotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkxID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkyID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTYiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MyA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2QkUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2TEUiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NSA9IENoYXJzZXQuZm9yTmFtZSgiSVNPLTg4NTktMSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk2ID0gQ2hhcnNldC5mb3JOYW1lKCJVUy1BU0NJSSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk3ID0gQ2hhcnNldC5mb3JOYW1lKCJDcDEyNTIiKTsKLQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgc25pZmZGb3JYbWxEZWNsKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewpAQCAtMTU1LDkgKzE0NSw3IEBACiAgICAgICAgICAgICBieXRlW10gYnl0ZWJ1ZiA9IG5ldyBieXRlW01BWF9TTklGRkVEX0JZVEVTXTsKICAgICAgICAgICAgIGludCBieXRlbGltaXQgPSByZWFkQXNNdWNoQXNQb3NzaWJsZShieXRlYnVmLCAwLCBNQVhfU05JRkZFRF9CWVRFUyk7CiAKLSAgICAgICAgICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZS4KLSAgICAgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlYnVmLCAwLCBieXRlbGltaXQpLCBjaGFyc2V0KTsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVidWYsIDAsIGJ5dGVsaW1pdCksIGVuY29kaW5nKTsKICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltieXRlbGltaXRdOwogICAgICAgICAgICAgaW50IGxpbWl0ID0gMDsKICAgICAgICAgICAgIHdoaWxlIChsaW1pdCA8IGJ5dGVsaW1pdCkKQEAgLTIwNSw3ICsxOTMsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpcnN0SW5kZXhPZihTdHJpbmcgcywgY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCkKICAgICB7Ci0gICAgICAgIGFzc2VydChzLmxlbmd0aCgpID4gMCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmxlbmd0aCgpID4gMCk7CiAgICAgICAgIGNoYXJbXSBsb29rRm9yID0gcy50b0NoYXJBcnJheSgpOwogCiAgICAgICAgIGNoYXIgZmlyc3RjaGFyID0gbG9va0ZvclswXTsKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbFJlYWRlci5qYXZhCmluZGV4IGI0OTc4MTQuLjlhOGYzNzEgMTAwNjQ0Ci0tLSBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxSZWFkZXIuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIHB1YmxpYyBjbGFzcyBTbmlmZmVkWG1sUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIKIHsKQEAgLTQ0LDE3ICs0Myw2IEBACiAgICAgICAgIHJldHVybiB0b3RhbDsKICAgICB9CiAKLSAgICAvLyBCVUdCVUcgaW4gSkRLOiBDaGFyc2V0LmZvck5hbWUgaXMgbm90IHRocmVhZHNhZmUsIHNvIHdlJ2xsIHByaW1lIGl0Ci0gICAgLy8gd2l0aCB0aGUgY29tbW9uIGNoYXJzZXRzLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTEgPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTIgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNiIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXkzID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTZCRSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk0ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTZMRSIpOwotICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgZHVtbXk1ID0gQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTYgPSBDaGFyc2V0LmZvck5hbWUoIlVTLUFTQ0lJIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTcgPSBDaGFyc2V0LmZvck5hbWUoIkNwMTI1MiIpOwotCiAKICAgICBwcml2YXRlIFN0cmluZyBzbmlmZkZvclhtbERlY2woKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTg2MjYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQorIHRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiAgc291cmNlIGNvZGUgbXVzdCAgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgIG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZiBhbnksIG11c3QKKyAgICBpbmNsdWRlICB0aGUgZm9sbG93aW5nICBhY2tub3dsZWRnbWVudDogICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgIHNvZnR3YXJlCisgICAgZGV2ZWxvcGVkICBieSB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICAgIEFsdGVybmF0ZWx5LCB0aGlzICBhY2tub3dsZWRnbWVudCBtYXkgIGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCAgaWYKKyAgICBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorCisgNC4gVGhlIG5hbWVzICJBcGFjaGUgQ29jb29uIiBhbmQgICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdCAgbm90ICBiZQorICAgIHVzZWQgdG8gIGVuZG9yc2Ugb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgICAgYXBhY2hlQGFwYWNoZS5vcmcuCisKKyA1LiBQcm9kdWN0cyAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCAgYmUgY2FsbGVkICJBcGFjaGUiLCBub3IgbWF5CisgICAgIkFwYWNoZSIgYXBwZWFyICBpbiB0aGVpciBuYW1lLCAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gIG9mIHRoZQorICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTICBGT1IgQSBQQVJUSUNVTEFSICBQVVJQT1NFIEFSRSAgRElTQ0xBSU1FRC4gIElOIE5PICBFVkVOVCBTSEFMTCAgVEhFCisgQVBBQ0hFIFNPRlRXQVJFICBGT1VOREFUSU9OICBPUiBJVFMgQ09OVFJJQlVUT1JTICBCRSBMSUFCTEUgRk9SICBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICBEQU1BR0VTIChJTkNMVS0KKyBESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UICBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgT0YgVVNFLCBEQVRBLCBPUiAgUFJPRklUUzsgT1IgQlVTSU5FU1MgIElOVEVSUlVQVElPTikgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorIEFOWSAgVEhFT1JZIE9GIExJQUJJTElUWSwgIFdIRVRIRVIgIElOIENPTlRSQUNULCAgU1RSSUNUIExJQUJJTElUWSwgIE9SIFRPUlQKKyAoSU5DTFVESU5HICBORUdMSUdFTkNFIE9SICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gIEFOWSBXQVkgT1VUIE9GIFRIRSAgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIFRoaXMgc29mdHdhcmUgIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpZHVhbHMKKyBvbiAgYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgIEZvdW5kYXRpb24gYW5kIHdhcyAgb3JpZ2luYWxseSBjcmVhdGVkIGJ5CisgU3RlZmFubyBNYXp6b2NjaGkgIDxzdGVmYW5vQGFwYWNoZS5vcmc+LiBGb3IgbW9yZSAgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZQorIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorCisqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5NYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBoYW5kbGluZyB1dGlsaXR5IG1ldGhvZHMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmljYXJkb0BhcGFjaGUub3JnIj5SaWNhcmRvIFJvY2hhPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c3RlZmFub0BhcGFjaGUub3JnIj5TdGVmYW5vIE1henpvY2NoaTwvYT4KKyAqIEB2ZXJzaW9uIFN0cmluZ1V0aWxzLmphdmEsdiAxLjEgMjAwMy8wMy8wOSAwMDowOTo0MworICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVXRpbHMgeworCisgICAgLyoqCisgICAgICogQ291bnRzIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBjaGFyIGluIHRoZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkCisgICAgICogQHBhcmFtIGMgdGhlIGNoYXIgdG8gYmUgY291bnRlZAorICAgICAqIEByZXR1cm4gdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50KFN0cmluZyBzdHIsIGNoYXIgYykgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09IGMpIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXMgdHdvIHN0cmluZ3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYSBUaGUgZmlyc3Qgc3RyaW5nCisgICAgICogQHBhcmFtIGIgVGhlIHNlY29uZCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgdHdvIHN0cmluZ3Mgc3RvcCBtYXRjaGluZyBzdGFydGluZyBmcm9tIDAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBtYXRjaFN0cmluZ3MoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgICAgIGludCBpOworICAgICAgICBjaGFyW10gY2EgPSBhLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBjYiA9IGIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgaW50IGxlbiA9ICggY2EubGVuZ3RoIDwgY2IubGVuZ3RoICkgPyBjYS5sZW5ndGggOiBjYi5sZW5ndGg7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2FbaV0gIT0gY2JbaV0pIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc291cmNlLCBTdHJpbmcgcGF0dGVybikKKyAgICB7CisgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHBhdHRlcm4pOworICAgICAgICByZXR1cm4gcmUubWF0Y2hlcyhzb3VyY2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3BsaXRzIGEgc3RyaW5nIGJ5IHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIHBhc3NlZCBpbi4gIEZhc3RlciB0aGFuIHVzaW5nIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHNvdXJjZSwgY2hhciBkZWxpbSkKKyAgICB7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDMpOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbiAmJiBkZWxpbSA9PSBzb3VyY2UuY2hhckF0KHBvcykpCisgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICBpZiAocG9zID49IGxlbikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbiAmJiBkZWxpbSAhPSBzb3VyY2UuY2hhckF0KHBvcykpCisgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICByZXN1bHQuYWRkKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQsIHBvcykpOworICAgICAgICB9CisKKyAgICAgICAgLy9JZiBubyBkZWxpbWl0ZXIgZm91bmQsIHJldHVybiB0aGUgd2hvbGUgc3RyaW5nCisgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXN1bHQuYWRkKHNvdXJjZSk7CisKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCZWhhdmVzIGV4YWN0bHkgbGlrZSBKREsgMS40IFN0cmluZy5zcGxpdCgpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVsaW1QYXR0ZXJuKQorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMyk7CisgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKGRlbGltUGF0dGVybik7CisgICAgICAgIE1hdGNoIG1hdGNoZXIgPSBuZXcgTWF0Y2goKTsKKworICAgICAgICBpZiAocmUubWF0Y2hlcyhzb3VyY2UsIG1hdGNoZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ3JvdXBzID0gbWF0Y2hlci5nZXROdW1iZXJPZkdyb3VwcygpOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LCBtYXRjaGVyLmdldEJlZ2lubmluZyhpKSkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWF0Y2hlci5nZXRFbmQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYWRkKHNvdXJjZS5zdWJzdHJpbmcoc3RhcnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSWYgbm8gZGVsaW1pdGVyIGZvdW5kLCByZXR1cm4gdGhlIHdob2xlIHN0cmluZworICAgICAgICAgICAgcmVzdWx0LmFkZChzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGluIHRoZSB0YXJnZXQgU3RyaW5nQnVmZmVyIHVzaW5nIHRoZSBNYXRjaCBwYXJhbWV0ZXIuCisgICAgICogSXQgYXNzdW1lcyB0aGF0IHRoZSBwYXR0ZXJuIGRvZXNuJ3QgaGF2ZSBuZXN0ZWQgY2FwdHVyZWQgZ3JvdXBzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlQWxsKE1hdGNoIG1hdGNoZXIsIFN0cmluZ0J1ZmZlciB0YXJnZXQsIFN0cmluZyByZXBsYWNlKQorICAgIHsKKyAgICAgICAgaW50IGdyb3VwcyA9IG1hdGNoZXIuZ2V0TnVtYmVyT2ZHcm91cHMoKTsKKyAgICAgICAgaWYgKGdyb3VwcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspCisgICAgICAgICAgICB0YXJnZXQucmVwbGFjZShtYXRjaGVyLmdldEJlZ2lubmluZyhpKSwgbWF0Y2hlci5nZXRFbmQoaSksIHJlcGxhY2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmVoYXZlcyBleGFjdGx5IGxpa2UgSkRLIDEuNCdzIFN0cmluZy5yZXBsYWNlQWxsKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyBzb3VyY2UsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZSkKKyAgICB7CisgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHBhdHRlcm4pOworICAgICAgICBNYXRjaCBtYXRjaGVyID0gbmV3IE1hdGNoKCk7CisKKyAgICAgICAgaWYgKHJlLm1hdGNoZXMoc291cmNlLCBtYXRjaGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UpOworICAgICAgICAgICAgcmVwbGFjZUFsbChtYXRjaGVyLCBzYiwgcmVwbGFjZSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHNiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vbm90aGluZyB0byByZXBsYWNlCisgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQppbmRleCBkZDdhNTM4Li5mMjEwMzc5IDEwMDY0NAotLS0gYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7CiAKIHB1YmxpYyBjbGFzcyBYUGF0aApAQCAtODAsNyArODEsOCBAQAogICAgICAgICAKICAgICAgICAgcHVibGljIGZpbmFsIGludCBlbGVtZW50ICggUU5hbWUgbmFtZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBuYW1lICE9IG51bGwgKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgX3N0YWNrLmFkZCggbmFtZSApOwogICAgICAgICAgICAgCkBAIC0xMzAsNyArMTMyLDggQEAKIAogICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGJhY2t0cmFjayAoICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSAoIF9jdXJyICE9IG51bGwgKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX2hhc0JhY2t0cmFjaykKICAgICAgICAgICAgICAgICB7CkBAIC0xMzgsNyArMTQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGFzc2VydCAhX2N1cnIuX2RlZXA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUgKCAhX2N1cnIuX2RlZXAgKTsKIAogICAgICAgICAgICAgICAgIF9jdXJyID0gX2N1cnIuX3ByZXY7CiAKQEAgLTE1OCw4ICsxNjIsMTEgQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgaW50IHN0YXJ0ICggKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfY3VyciAhPSBudWxsOwotICAgICAgICAgICAgICAgIGFzc2VydCBfY3Vyci5fcHJldiA9PSBudWxsOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSAoIF9jdXJyICE9IG51bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSAoIF9jdXJyLl9wcmV2ID09IG51bGwgKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX25hbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKQEAgLTE4MCw3ICsxODcsOCBAQAogICAgICAgICAgICAgICAgIGlmIChfY3VyciA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICAgICAgICAgIGFzc2VydCBfY3Vyci5fbmFtZSAhPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlICggX2N1cnIuX25hbWUgIT0gbnVsbCApOwogCiAgICAgICAgICAgICAgICAgaWYgKCFfY3Vyci5fYXR0ciAmJiBfY3Vyci5tYXRjaCggbmFtZSApKQogICAgICAgICAgICAgICAgIHsKQEAgLTI2Niw5ICsyNzQsMTAgQEAKICAgICB7CiAgICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCAoIE1hcCBuYW1lc3BhY2VzLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlICgKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApICk7CiAKICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVZhciA9PSBudWxsKQogICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhciA9ICIkdGhpcyI7CkBAIC0zMzEsNyArMzQwLDggQEAKIAogICAgICAgICB2b2lkIGFkdmFuY2UgKCBpbnQgY291bnQgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY291bnQgPj0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUgKCBjb3VudCA+PSAwICk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIHdoaWxlICggY291bnQtLSA+IDAgKQogICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKQEAgLTQzMSw3ICs0NDEsOCBAQAogICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlICggcy5sZW5ndGgoKSA+IDAgKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CiAKQEAgLTQ1MCw5ICs0NjEsMTIgQEAKIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW5pemUgKCBTdHJpbmcgczEsIFN0cmluZyBzMiApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzMS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgczIubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlICggczEubGVuZ3RoKCkgPiAwICk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSAoIHMyLmxlbmd0aCgpID4gMCApOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKQEAgLTQ3OCwxMCArNDkyLDEzIEBACiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMxLCBTdHJpbmcgczIsIFN0cmluZyBzMyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzMS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgczIubGVuZ3RoKCkgPiAwOwotICAgICAgICAgICAgYXNzZXJ0IHMzLmxlbmd0aCgpID4gMDsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSAoIHMxLmxlbmd0aCgpID4gMCApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUgKCBzMi5sZW5ndGgoKSA+IDAgKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlICggczMubGVuZ3RoKCkgPiAwICk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwogCiAgICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQpAQCAtNzgwLDggKzc5Nyw4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgb2YgYSBkZWVwIHNlZ21lbnQgYWx3YXlzIGJhY2t0cmFja3MgdG8gaXRzZWxmCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuX2RlZXA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUgKCBzLl9kZWVwICk7CiAKICAgICAgICAgICAgICAgICBzLl9oYXNCYWNrdHJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIHMuX2JhY2t0cmFjayA9IHM7CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRW5jb2RpbmdTbmlmZmVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRW5jb2RpbmdTbmlmZmVyLmphdmEKaW5kZXggNjE0YmJmZS4uZDJjMDIyZCAxMDA2NDQKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVuY29kaW5nU25pZmZlci5qYXZhCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YQpAQCAtMTUsNiArMTUsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworCiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwpAQCAtNTUsNyArNTcsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTbmlmZmVkWG1sSW5wdXRTdHJlYW0gc25pZmZlZCA9IG5ldyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0oX3N0cmVhbSk7CiAgICAgICAgICAgICBfeG1sZW5jb2RpbmcgPSBzbmlmZmVkLmdldFhtbEVuY29kaW5nKCk7Ci0gICAgICAgICAgICBhc3NlcnQoX3htbGVuY29kaW5nICE9IG51bGwpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfeG1sZW5jb2RpbmcgIT0gbnVsbCk7CiAgICAgICAgICAgICBfc3RyZWFtID0gc25pZmZlZDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEKaW5kZXggZWFlODhhYy4uN2I1YmIwZiAxMDA2NDQKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yUHJpbnRlci5qYXZhCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvclByaW50ZXIuamF2YQpAQCAtMjAsMTcgKzIwLDE3IEBACiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIHB1YmxpYyBjbGFzcyBYbWxFcnJvclByaW50ZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KIHsKICAgICBwcml2YXRlIGJvb2xlYW4gX25vaXN5OwotICAgIHByaXZhdGUgVVJJIF9iYXNlVVJJOworICAgIHByaXZhdGUgVVJMIF9iYXNlVVJMOwogCi0gICAgcHVibGljIFhtbEVycm9yUHJpbnRlcihib29sZWFuIG5vaXN5LCBVUkkgYmFzZVVSSSkKKyAgICBwdWJsaWMgWG1sRXJyb3JQcmludGVyKGJvb2xlYW4gbm9pc3ksIFVSTCBiYXNlVVJMKQogICAgIHsKICAgICAgICAgX25vaXN5ID0gbm9pc3k7Ci0gICAgICAgIF9iYXNlVVJJID0gYmFzZVVSSTsKKyAgICAgICAgX2Jhc2VVUkwgPSBiYXNlVVJMOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKQEAgLTQwLDkgKzQwLDkgQEAKICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IChYbWxFcnJvcilvOwogICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SIHx8CiAgICAgICAgICAgICAgICAgZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVyci50b1N0cmluZyhfYmFzZVVSTCkpOwogICAgICAgICAgICAgZWxzZSBpZiAoX25vaXN5KQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnIudG9TdHJpbmcoX2Jhc2VVUkkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyLnRvU3RyaW5nKF9iYXNlVVJMKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0IGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL3JlYWRtZS50eHQKaW5kZXggZWEyNTE0My4uZjQ1NDBkOCAxMDA2NDQKLS0tIGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL3JlYWRtZS50eHQKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL3JlYWRtZS50eHQKQEAgLTEsNSArMSw1IEBACiBUaGVyZSBhcmUgaXNvbGF0ZWQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdGFrZW4gZnJvbSB0aGUgQXBhY2hlCi1YZXJjZXMtSiAyLjAgcHJvamVjdAorWGVyY2VzLUogMi4wIHByb2plY3QsIENvY29vbiAyLjEgcHJvamVjdCwgQ29tbW9ucyBjb2xsZWN0aW9ucwogCiBJdCBjb250YWlucyB2ZXJ5IG1pbm9yIG1vZGlmaWNhdGlvbnMgaW5jbHVkaW5nIGEgY2hhbmdlIGluIG5hbWVzcGFjZS4KIApkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvRWRpdEJ1aWxkU2NyaXB0LmphdmEgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQppbmRleCA2ZGYxNmU4Li5hN2EwYmVlIDEwMDY0NAotLS0gYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQorKysgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogCiAgICAgICAgIFN0cmluZyB0b2tlblN0ciA9ICI8cHJvcGVydHkgbmFtZT1cIiIgKyBhcmdzWyAxIF0gKyAiXCIgdmFsdWU9XCIiOwogICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgaSA9IHNiLmluZGV4T2YoIHRva2VuU3RyICk7CisgICAgICAgIGludCBpID0gbmV3IFN0cmluZyhzYikuaW5kZXhPZiggdG9rZW5TdHIgKTsKIAogICAgICAgICBpZiAoaSA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2FuJ3QgZmluZCB0b2tlbjogIiArIHRva2VuU3RyICk7CmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCmluZGV4IDIxMTVlNWQuLjMxYmY1MTggMTAwNjQ0Ci0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCisrKyBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCkBAIC0xNSw5ICsxNSwxMiBAQAogCiBwYWNrYWdlIHJlcGFja2FnZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguTWF0Y2g7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5TdHJpbmdVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKIAogcHVibGljIGNsYXNzIFJlcGFja2FnZQogewpAQCAtMjUsMzcgKzI4LDM3IEBACiAgICAgewogICAgICAgICBuZXcgUmVwYWNrYWdlKCkucmVwYWNrYWdlKCBhcmdzICk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyIHx8ICFhcmdzWzBdLmVxdWFscyggIi1yZXBhY2thZ2UiICkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVzYWdlOiByZXBhY2thZ2UgLXJlcGFja2FnZSBbc3BlY10iICk7Ci0gICAgICAgIAorCiAgICAgICAgIF9yZXBhY2thZ2VyID0gbmV3IFJlcGFja2FnZXIoIGFyZ3NbIDEgXSApOwogCiAgICAgICAgIF9mcm9tUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRGcm9tUGFja2FnZXMoKTsKICAgICAgICAgX3RvUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRUb1BhY2thZ2VzKCk7Ci0gICAgICAgIAorCiAgICAgICAgIF9wYWNrYWdlUGF0dGVybiA9Ci0gICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoICJeXFxzKnBhY2thZ2VcXHMrKCg/Olxcd3xcXC4pKilcXHMqOyIsIFBhdHRlcm4uTVVMVElMSU5FICk7Ci0gICAgICAgIAorICAgICAgICAgICAgbmV3IFJlZ3VsYXJFeHByZXNzaW9uKCAiXlxccypwYWNrYWdlXFxzKygoPzpcXHd8XFwuKSopXFxzKjsiLCAibSIpOworCiAgICAgICAgIF9tb3ZlQWxvbmdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgX21vdmVkRGlycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAorCiAgICAgICAgIEZpbGUgY3VycmVudERpciAgID0gbmV3IEZpbGUoICIuIiApOwogICAgICAgICBGaWxlIGJ1aWxkRGlyICAgICA9IG5ldyBGaWxlKCBjdXJyZW50RGlyLCAiYnVpbGQiICk7CiAgICAgICAgIEZpbGUgcmVwYWNrYWdlRGlyID0gbmV3IEZpbGUoIGJ1aWxkRGlyLCAicmVwYWNrYWdlIiApOwogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkRlbGV0aW5nIHJlcGFja2FnZSBkaXIgLi4uIiApOwotICAgICAgICAKKwogICAgICAgICByZWN1cnNpdmVEZWxldGUoIHJlcGFja2FnZURpciApOwogCiAgICAgICAgIHJlcGFja2FnZURpci5ta2RpcnMoKTsKLSAgICAgICAgCisKICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwogCiAgICAgICAgIGZpbGxGaWxlcyggZmlsZXMsIGN1cnJlbnREaXIgKTsKLSAgICAgICAgCisKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUmVwYWNrYWdpbmcgIiArIGZpbGVzLnNpemUoKSArICIgZmlsZXMgLi4uIiApOwogCiAgICAgICAgIGludCBwcmVmaXhMZW5ndGggPSBjdXJyZW50RGlyLmdldENhbm9uaWNhbFBhdGgoKS5sZW5ndGgoKTsKQEAgLTcxLDcgKzc0LDcgQEAKIAogICAgICAgICAgICAgcmVwYWNrYWdlRmlsZSggbmFtZSApOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmlzaE1vdmluZ0ZpbGVzKCk7CiAgICAgfQogCkBAIC05Miw3ICs5NSw3IEBACiAgICAgewogICAgICAgICBfbW92ZUFsb25nRmlsZXMuYWRkKG5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGZpbmlzaE1vdmluZ0ZpbGVzICggKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC0xMDAsMTIgKzEwMywxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwogICAgICAgICAgICAgU3RyaW5nIHRvTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgU3RyaW5nIHNyY0RpciA9IFJlcGFja2FnZXIuZGlyRm9yUGF0aCggbmFtZSApOwogICAgICAgICAgICAgU3RyaW5nIHRvRGlyID0gKFN0cmluZykgX21vdmVkRGlycy5nZXQoIHNyY0RpciApOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh0b0RpciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRvTmFtZSA9IG5ldyBGaWxlKCB0b0RpciwgbmV3IEZpbGUoIG5hbWUgKS5nZXROYW1lKCkgKS50b1N0cmluZygpOyAKKyAgICAgICAgICAgICAgICB0b05hbWUgPSBuZXcgRmlsZSggdG9EaXIsIG5ldyBGaWxlKCBuYW1lICkuZ2V0TmFtZSgpICkudG9TdHJpbmcoKTsKIAogICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoICIuaHRtbCIgKSkKICAgICAgICAgICAgICAgICByZXBhY2thZ2VOb25KYXZhRmlsZSggbmFtZSwgdG9OYW1lICk7CkBAIC0xMjAsMzkgKzEyMyw0MSBAQAogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICkgKTsKIAogICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7Ci0gICAgICAgIAorCiAgICAgICAgIHdyaXRlRmlsZSggbmV3IEZpbGUoIF90YXJnZXRCYXNlLCBuYW1lICksIHNiICk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlTm9uSmF2YUZpbGUgKCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUgKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIHNvdXJjZU5hbWUgKSApOwogCiAgICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKLSAgICAgICAgCisKICAgICAgICAgd3JpdGVGaWxlKCBuZXcgRmlsZSggX3RhcmdldEJhc2UsIHRhcmdldE5hbWUgKSwgc2IgKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2VKYXZhRmlsZSAoIFN0cmluZyBuYW1lICkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSByZWFkRmlsZSggbmV3IEZpbGUoIF9zb3VyY2VCYXNlLCBuYW1lICkgKTsKIAotICAgICAgICBNYXRjaGVyIHBhY2thZ2VNYXRjaGVyID0gX3BhY2thZ2VQYXR0ZXJuLm1hdGNoZXIoIHNiICk7CisgICAgICAgIE1hdGNoIHBhY2thZ2VNYXRjaGVyID0gbmV3IE1hdGNoKCk7CiAKLSAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVyLmZpbmQoKSkKKyAgICAgICAgaWYgKF9wYWNrYWdlUGF0dGVybi5tYXRjaGVzKHNiLnRvU3RyaW5nKCksIHBhY2thZ2VNYXRjaGVyKSkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHBhY2thZ2VNYXRjaGVyLmdyb3VwKCAxICk7Ci0gICAgICAgICAgICBpbnQgcGtnU3RhcnQgPSBwYWNrYWdlTWF0Y2hlci5zdGFydCggMSApOwotICAgICAgICAgICAgaW50IHBrZ0VuZCA9IHBhY2thZ2VNYXRjaGVyLmVuZCggMSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXIuZmluZCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVHdvIHBhY2thZ2Ugc3BlY2lmaWNhdGlvbnMgZm91bmQ6ICIgKyBuYW1lICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgZmlsZVBhdGggPSBSZXBhY2thZ2VyLnNwbGl0UGF0aCggbmFtZSwgRmlsZS5zZXBhcmF0b3JDaGFyICk7CisgICAgICAgICAgICBTdHJpbmcgcGtnID0gcGFja2FnZU1hdGNoZXIuZ2V0Q2FwdHVyZWRUZXh0KCAxICk7CisgICAgICAgICAgICBpbnQgcGtnU3RhcnQgPSBwYWNrYWdlTWF0Y2hlci5nZXRCZWdpbm5pbmcoIDEgKTsKKyAgICAgICAgICAgIGludCBwa2dFbmQgPSBwYWNrYWdlTWF0Y2hlci5nZXRFbmQoIDEgKTsKKworICAgICAgICAgICAgLy9ncm91cCAwIGlzIHRoZSB3aG9sZSBwYWNrYWdlIHN0YXRlbWVudCwgMSBpcyBwYWNrYWdlIG5hbWUKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTWF0Y2hlci5nZXROdW1iZXJPZkdyb3VwcygpID4gMikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk1vcmUgdGhhbiBvbmUgcGFja2FnZSBzcGVjaWZpY2F0aW9ucyBmb3VuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiwgbnVtR3JvdXBzPSIgKyBwYWNrYWdlTWF0Y2hlci5nZXROdW1iZXJPZkdyb3VwcygpICk7CisKKyAgICAgICAgICAgIExpc3QgZmlsZVBhdGggPSBBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLnNwbGl0KCBuYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIgKSk7CiAgICAgICAgICAgICBTdHJpbmcgc3JjRGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gU29ydCB0aGUgcmVwYWNrYWdlIHNwZWMgc28gdGhhdCBsb25nZXIgZnJvbSdzIGFyZSBmaXJzdCB0byBtYXRjaAogICAgICAgICAgICAgLy8gbG9uZ2VzdCBwYWNrYWdlIGZpcnN0CiAKQEAgLTE3OCw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgTGlzdCBwa2dQYXRoID0gUmVwYWNrYWdlci5zcGxpdFBhdGgoIHBrZywgJy4nICk7CisgICAgICAgICAgICBMaXN0IHBrZ1BhdGggPSBBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLnNwbGl0KCBwa2csICcuJyApKTsKIAogICAgICAgICAgICAgaW50IGYgPSBmaWxlUGF0aC5zaXplKCkgLSAyOwogCkBAIC0xOTAsNyArMTk1LDcgQEAKIAogICAgICAgICAgICAgTGlzdCBjaGFuZ2VUbyA9IG51bGw7CiAgICAgICAgICAgICBMaXN0IGNoYW5nZUZyb20gPSBudWxsOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZyb206CiAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2Zyb21QYWNrYWdlcy5zaXplKCkgOyBpICsrICkKICAgICAgICAgICAgIHsKQEAgLTIyMSwxMSArMjI2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gIi4iOwogICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBGaWxlLnNlcGFyYXRvckNoYXI7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgbmV3UGtnICs9IGNoYW5nZVRvLmdldCggaSApOwogICAgICAgICAgICAgICAgICAgICBuZXdOYW1lICs9IGNoYW5nZVRvLmdldCggaSApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gZmlsZVBhdGguc2l6ZSgpIC0gcGtnUGF0aC5zaXplKCkgLSAyIDsgaSA+PSAwIDsgaS0tICkKICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSApICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgbmV3TmFtZTsKIApAQCAtMjQxLDcgKzI0Niw3IEBACiAKICAgICAgICAgICAgICAgICBuYW1lID0gbmV3TmFtZTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3RGlyID0gUmVwYWNrYWdlci5kaXJGb3JQYXRoKCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBpZiAoIXNyY0Rpci5lcXVhbHMobmV3RGlyKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIF9tb3ZlZERpcnMucHV0KHNyY0RpciwgbmV3RGlyKTsKQEAgLTI1MCw3ICsyNTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOwotICAgICAgICAKKwogICAgICAgICB3cml0ZUZpbGUoIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgbmFtZSApLCBzYiApOwogICAgIH0KIApAQCAtMjU4LDcgKzI2Myw3IEBACiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgZi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIAorCiAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOwogICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOwogICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKQEAgLTI2OSw3ICsyNzQsNyBAQAogICAgICAgICB3LmNsb3NlKCk7CiAgICAgICAgIG91dC5jbG9zZSgpOwogICAgIH0KLSAgICAKKwogICAgIFN0cmluZ0J1ZmZlciByZWFkRmlsZSAoIEZpbGUgZiApCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKQEAgLTI4NSwyMCArMjkwLDIwIEBACiAKICAgICAgICAgcmV0dXJuIHcuZ2V0QnVmZmVyKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgY29weUZpbGUgKCBGaWxlIGZyb20sIEZpbGUgdG8gKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHRvLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgCisKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZnJvbSApOwogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0byApOwogCiAgICAgICAgIGNvcHkoIGluLCBvdXQgKTsKLSAgICAgICAgCisKICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgY29weSAoIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0ICkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGUgWyAxMDI0ICogMTYgXTsKQEAgLTMxMyw3ICszMTgsNyBAQAogICAgICAgICAgICAgb3V0LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGNvcHkgKCBSZWFkZXIgciwgV3JpdGVyIHcgKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhciBbIDEwMjQgKiAxNiBdOwpAQCAtMzI4LDcgKzMzMyw3IEBACiAgICAgICAgICAgICB3LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGZpbGxGaWxlcyAoIEFycmF5TGlzdCBmaWxlcywgRmlsZSBmaWxlICkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkKQEAgLTM0MSw3ICszNDYsNyBAQAogCiAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHMoICJidWlsZCIgKSkKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCisKICAgICAgICAgLy8gRXhjbHVkZSBDVlMgZGlyZWN0b3JpZXMKICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyggIkNWUyIgKSkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM3MywxMSArMzc4LDExIEBACiAKICAgICBwcml2YXRlIExpc3QgX2Zyb21QYWNrYWdlczsKICAgICBwcml2YXRlIExpc3QgX3RvUGFja2FnZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYXR0ZXJuIF9wYWNrYWdlUGF0dGVybjsKKworICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gX3BhY2thZ2VQYXR0ZXJuOwogCiAgICAgcHJpdmF0ZSBSZXBhY2thZ2VyIF9yZXBhY2thZ2VyOwotICAgIAorCiAgICAgcHJpdmF0ZSBNYXAgX21vdmVkRGlyczsKICAgICBwcml2YXRlIExpc3QgX21vdmVBbG9uZ0ZpbGVzOwogfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhIGIvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhCmluZGV4IDM5NDczZGQuLjMwMTU3OGIgMTAwNjQ0Ci0tLSBhL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZXIuamF2YQorKysgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2VyLmphdmEKQEAgLTE1LDEwICsxNSwxMiBAQAogCiBwYWNrYWdlIHJlcGFja2FnZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4Lk1hdGNoOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKKwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiBwdWJsaWMgY2xhc3MgUmVwYWNrYWdlcgpAQCAtMjcsMjYgKzI5LDI2IEBACiAgICAgewogICAgICAgICBfZnJvbVBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBfdG9QYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmVwYWNrYWdlcyA9IHNwbGl0UGF0aCggcmVwYWNrYWdlU3BlY3MsICc7JyApOworCisgICAgICAgIFN0cmluZ1tdIHJlcGFja2FnZXMgPSBTdHJpbmdVdGlscy5zcGxpdCggcmVwYWNrYWdlU3BlY3MsICc7JyApOwogCiAgICAgICAgIC8vIFNvcnQgdGhlIHJlcGFja2FnZSBzcGVjIHNvIHRoYXQgbG9uZ2VyIGZyb20ncyBhcmUgZmlyc3QgdG8gbWF0Y2gKICAgICAgICAgLy8gbG9uZ2VzdCBwYWNrYWdlIGZpcnN0Ci0gICAgICAgIAorCiAgICAgICAgIGZvciAoIDsgOyApCiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2xlYW4gc3dhcHBlZCA9IGZhbHNlOwogCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgcmVwYWNrYWdlcy5zaXplKCkgOyBpKysgKQorICAgICAgICAgICAgZm9yICggaW50IGkgPSAxIDsgaSA8IHJlcGFja2FnZXMubGVuZ3RoIDsgaSsrICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzEgPSAoU3RyaW5nKSByZXBhY2thZ2VzLmdldCggaSAtIDEgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlYzIgPSAoU3RyaW5nKSByZXBhY2thZ2VzLmdldCggaSApOwotICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMSA9IHJlcGFja2FnZXNbIGkgLSAxIF07CisgICAgICAgICAgICAgICAgU3RyaW5nIHNwZWMyID0gcmVwYWNrYWdlc1sgaSBdOworCiAgICAgICAgICAgICAgICAgaWYgKHNwZWMxLmluZGV4T2YoICc6JyApIDwgc3BlYzIuaW5kZXhPZiggJzonICkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VzLnNldCggaSAtIDEsIHNwZWMyICk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXMuc2V0KCBpLCBzcGVjMSApOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmVwYWNrYWdlc1sgaSAtIDEgXSA9IHNwZWMyOworICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VzWyBpIF0gPSBzcGVjMTsKKwogICAgICAgICAgICAgICAgICAgICBzd2FwcGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC01NSwxMCArNTcsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCByZXBhY2thZ2VzLnNpemUoKSA7IGkrKyApCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCByZXBhY2thZ2VzLmxlbmd0aCA7IGkrKyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjID0gKFN0cmluZykgcmVwYWNrYWdlcy5nZXQoIGkgKTsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHNwZWMgPSByZXBhY2thZ2VzWyBpIF07CisKICAgICAgICAgICAgIGludCBqID0gc3BlYy5pbmRleE9mKCAnOicgKTsKIAogICAgICAgICAgICAgaWYgKGogPCAwIHx8IHNwZWMuaW5kZXhPZiggJzonLCBqICsgMSApID49IDApCkBAIC02NywxMSArNjksMTEgQEAKICAgICAgICAgICAgIFN0cmluZyBmcm9tID0gc3BlYy5zdWJzdHJpbmcoIDAsIGogKTsKICAgICAgICAgICAgIFN0cmluZyB0byA9IHNwZWMuc3Vic3RyaW5nKCBqICsgMSApOwogCi0gICAgICAgICAgICBfZnJvbVBhY2thZ2VzLmFkZCggUmVwYWNrYWdlci5zcGxpdFBhdGgoIGZyb20sICcuJyApICk7Ci0gICAgICAgICAgICBfdG9QYWNrYWdlcy5hZGQoIFJlcGFja2FnZXIuc3BsaXRQYXRoKCB0bywgJy4nICkgKTsKKyAgICAgICAgICAgIF9mcm9tUGFja2FnZXMuYWRkKCBTdHJpbmdVdGlscy5zcGxpdCggZnJvbSwgJy4nICkgKTsKKyAgICAgICAgICAgIF90b1BhY2thZ2VzLmFkZCggU3RyaW5nVXRpbHMuc3BsaXQoIHRvLCAnLicgKSApOwogICAgICAgICB9CiAKLSAgICAgICAgX2Zyb21NYXRjaGVycyA9IG5ldyBNYXRjaGVyIFsgX2Zyb21QYWNrYWdlcy5zaXplKCkgKiAyIF07CisgICAgICAgIF9mcm9tUGF0dGVybnMgPSBuZXcgUmVndWxhckV4cHJlc3Npb24gWyBfZnJvbVBhY2thZ2VzLnNpemUoKSAqIDIgXTsKICAgICAgICAgX3RvUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZyBbIF9mcm9tUGFja2FnZXMuc2l6ZSgpICogMiBdOwogCiAgICAgICAgIGFkZFBhdHRlcm5zKCAnLicsIDAgKTsKQEAgLTg2LDcgKzg4LDcgQEAKICAgICAgICAgICAgIExpc3QgdG8gPSAoTGlzdCkgX3RvUGFja2FnZXMuZ2V0KCBpICk7CiAKICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZm9yICggaW50IGogPSAwIDsgaiA8IGZyb20uc2l6ZSgpIDsgaisrICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoaiA+IDApCkBAIC05NCw5ICs5Niw5IEBACiAKICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9IGZyb20uZ2V0KCBqICk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgU3RyaW5nIHRvUGFja2FnZSA9ICIiOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCB0by5zaXplKCkgOyBqKysgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChqID4gMCkKQEAgLTEwNSwyMSArMTA3LDIwIEBACiAgICAgICAgICAgICAgICAgdG9QYWNrYWdlICs9IHRvLmdldCggaiApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBfZnJvbU1hdGNoZXJzWyBvZmYgKyBpIF0gPSBQYXR0ZXJuLmNvbXBpbGUoIHBhdHRlcm4gKS5tYXRjaGVyKCBudWxsICk7CisgICAgICAgICAgICBfZnJvbVBhdHRlcm5zWyBvZmYgKyBpIF0gPSBuZXcgUmVndWxhckV4cHJlc3Npb24oIHBhdHRlcm4gKTsKICAgICAgICAgICAgIF90b1BhY2thZ2VOYW1lc1sgb2ZmICsgaSBdID0gdG9QYWNrYWdlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nQnVmZmVyIHNiICkKICAgICB7Ci0gICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbU1hdGNoZXJzLmxlbmd0aCA7IGkrKyApCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbVBhdHRlcm5zLmxlbmd0aCA7IGkrKyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IChNYXRjaGVyKSBfZnJvbU1hdGNoZXJzWyBpIF07CisgICAgICAgICAgICBNYXRjaCBtYXRjaGVyID0gbmV3IE1hdGNoKCk7CisgICAgICAgICAgICBib29sZWFuIG1hdGNoZXMgPSBfZnJvbVBhdHRlcm5zWyBpIF0ubWF0Y2hlcyhzYi50b1N0cmluZygpKTsKIAotICAgICAgICAgICAgbWF0Y2hlci5yZXNldCggc2IgKTsKLQotICAgICAgICAgICAgd2hpbGUgKCBtYXRjaGVyLmZpbmQoKSApCi0gICAgICAgICAgICAgICAgc2IucmVwbGFjZSggbWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpLCBfdG9QYWNrYWdlTmFtZXNbIGkgXSApOworICAgICAgICAgICAgaWYgKG1hdGNoZXMpCisgICAgICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVwbGFjZUFsbChtYXRjaGVyLCBzYiwgX3RvUGFja2FnZU5hbWVzWyBpIF0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzIsMjkgKzEzMyw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gX3RvUGFja2FnZXM7CiAgICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IHNwbGl0UGF0aCAoIFN0cmluZyBwYXRoLCBjaGFyIHNlcGFyYXRvciApCi0gICAgewotICAgICAgICBBcnJheUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoIDsgOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpID0gcGF0aC5pbmRleE9mKCBzZXBhcmF0b3IgKTsKIAotICAgICAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aC5zdWJzdHJpbmcoIDAsIGkgKSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoIGkgKyAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aCApOwotCi0gICAgICAgIHJldHVybiBjb21wb25lbnRzOwotICAgIH0KLSAgICAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJGb3JQYXRoICggU3RyaW5nIHBhdGggKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudCgpOwpAQCAtMTYyLDcgKzE0MSw3IEBACiAKICAgICBwcml2YXRlIExpc3QgX2Zyb21QYWNrYWdlczsKICAgICBwcml2YXRlIExpc3QgX3RvUGFja2FnZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXRjaGVyW10gX2Zyb21NYXRjaGVyczsKKworICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb25bXSBfZnJvbVBhdHRlcm5zOwogICAgIHByaXZhdGUgU3RyaW5nW10gIF90b1BhY2thZ2VOYW1lczsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9CdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uamF2YQppbmRleCA4ZjUzYTI2Li5jMzhkOTQ0IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9CdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CkBAIC01OTIsNyArNTkzLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKIAogICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgogICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfVFlQRTsgYnJlYWs7CkBAIC03MDIsNyArNzA0LDggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFIHx8IGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTik7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlIChidGMgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUgfHwgYnRjID09IFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOKTsKICAgICAgICAgfQogICAgICAgICByZXN1bHQuc2V0QmFzZVR5cGVSZWYoYmFzZSA9PSBudWxsID8gbnVsbCA6IGJhc2UuZ2V0UmVmKCkpOwogICAgICAgICByZXN1bHQuc2V0QmFzZURlcHRoKGJhc2UgPT0gbnVsbCA/IDAgOiAoKFNjaGVtYVR5cGVJbXBsKWJhc2UpLmdldEJhc2VEZXB0aCgpICsgMSk7CkBAIC03MjcsNyArNzMwLDggQEAKICAgICAgICAgc3dpdGNoIChidGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKIAogICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRToKICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKQEAgLTg4OCw3ICs4OTIsOCBAQAogICAgICAgICBzd2l0Y2ggKGJ0YykKICAgICAgICAgewogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKIAogICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVFlQRToKICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU46CkBAIC0xMDAyLDcgKzEwMDcsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24gcCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgeyBwID0gb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uLmZvclBhdHRlcm4ocGF0dGVybik7IH0KLSAgICAgICAgICAgIGNhdGNoIChvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUGFyc2VFeGNlcHRpb24gZSkgeyBhc3NlcnQgZmFsc2U7IH0KKyAgICAgICAgICAgIGNhdGNoIChvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUGFyc2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7IGlmIChYbWxCZWFucy5BU1NFUlRTKSBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsgfQogICAgICAgICAgICAgcmVzdWx0LnNldFBhdHRlcm5zKG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSB7cH0pOwogICAgICAgICB9CiAgICAgICAgIHJlc3VsdC5zZXRQYXR0ZXJuRmFjZXQoaGFzUGF0dGVybik7CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCmluZGV4IDk3M2ZlMTQuLmJiOGM0MGUgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwCiB7CkBAIC00Myw3ICs0NCw4IEBACiAKICAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbiwgWG1sT2JqZWN0IHgpCiAgICAgewotICAgICAgICBhc3NlcnQgX25hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscyggX25hbWUgKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9uYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIF9uYW1lICkpOwogCiAgICAgICAgIF9uYW1lID0gbmFtZTsKICAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQppbmRleCBmMWZlYmJhLi5kNzQxMDE0IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKKwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGltcGxlbWVudHMgU2NoZW1hQXR0cmlidXRlTW9kZWwKIHsKQEAgLTMzLDE0ICszNCwxNCBAQAogCiAgICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpCiAgICAgewotICAgICAgICBhdHRyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgYXR0ck1hcCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIHdjU2V0ID0gbnVsbDsKICAgICAgICAgd2NQcm9jZXNzID0gTk9ORTsKICAgICB9CiAKICAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNhbSkKICAgICB7Ci0gICAgICAgIGF0dHJNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBhdHRyTWFwID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKICAgICAgICAgaWYgKHNhbSA9PSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICB3Y1NldCA9IG51bGw7CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsRWxlbWVudEltcGwuamF2YQppbmRleCAwMmRiMjg5Li5jNzVlM2Y3IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEVsZW1lbnRJbXBsLmphdmEKQEAgLTE5LDE2ICsxOSwxOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlNlcXVlbmNlZEhhc2hTZXQ7CisKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogcHVibGljIGNsYXNzIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbAogICAgICAgICBpbXBsZW1lbnRzIFNjaGVtYUdsb2JhbEVsZW1lbnQKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZVtdIEVNUFRZX1FOQU1FX0FSUkFZID0gbmV3IFFOYW1lWzBdOwotICAgIHByaXZhdGUgU2V0IF9zZ01lbWJlcnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgIHByaXZhdGUgU2V0IF9zZ01lbWJlcnMgPSBuZXcgU2VxdWVuY2VkSGFzaFNldCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxFeHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbFJlc3Q7CiAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5qYXZhCmluZGV4IGYwNzMzNjcuLjBjNGIwNGYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhQYXRoOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC01Nyw3ICs1OCw4IEBACiAgICAgICAgICAgICAgICAgcCA9IF9zZWxlY3RvclBhdGg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJGYWlsZWQgdG8gY29tcGlsZSB4cGF0aC4gU2hvdWxkIGJlIGNhdWdodCBieSBjb21waWxlciAiICsgZTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTczLDEyICs3NSwxNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yKFN0cmluZyBzZWxlY3RvcikgewotICAgICAgICBhc3NlcnQgc2VsZWN0b3IgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNlbGVjdG9yICE9IG51bGwpOwogICAgICAgICBfc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZHMoU3RyaW5nW10gZmllbGRzKSB7Ci0gICAgICAgIGFzc2VydCBmaWVsZHMgIT0gbnVsbCAmJiBmaWVsZHMubGVuZ3RoID4gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZpZWxkcyAhPSBudWxsICYmIGZpZWxkcy5sZW5ndGggPiAwKTsKICAgICAgICAgX2ZpZWxkcyA9IGZpZWxkczsKICAgICB9CiAKQEAgLTk2LDcgKzEwMCw4IEBACiAgICAgICAgICAgICAgICAgcCA9IF9maWVsZFBhdGhzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiRmFpbGVkIHRvIGNvbXBpbGUgeHBhdGguIFNob3VsZCBiZSBjYXVnaHQgYnkgY29tcGlsZXIgIiArIGU7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjEsNyArMTI2LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50Q2F0ZWdvcnkoaW50IHR5cGUpIHsKLSAgICAgICAgYXNzZXJ0IHR5cGUgPj0gQ0NfS0VZICYmIHR5cGUgPD0gQ0NfVU5JUVVFOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodHlwZSA+PSBDQ19LRVkgJiYgdHlwZSA8PSBDQ19VTklRVUUpOwogICAgICAgICBfdHlwZSA9IHR5cGU7CiAgICAgfQogCkBAIC0xMzAsNyArMTM2LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKG5hbWUgIT0gbnVsbCk7CiAgICAgICAgIF9uYW1lID0gbmFtZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYU1vZGVsR3JvdXBJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhCmluZGV4IGZjMjFjNDcuLjBjODJlYzcgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYU1vZGVsR3JvdXBJbXBsLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC00Myw3ICs0NCw4IEBACiAKICAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbiwgWG1sT2JqZWN0IHgpCiAgICAgewotICAgICAgICBhc3NlcnQgX25hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscyggX25hbWUgKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9uYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIF9uYW1lICkpOwogICAgICAgICAKICAgICAgICAgX25hbWUgPSBuYW1lOwogICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVDb2RlUHJpbnRlci5qYXZhCmluZGV4IDBjZTQ3ZDkuLjFmMzEzYTcgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVDb2RlUHJpbnRlci5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVDb2RlUHJpbnRlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIAogLyoqCkBAIC0yNjEsOCArMjYyLDggQEAKICAgICAgICAgZW1pdCgieyIpOwogICAgICAgICBpbmRlbnQoKTsKICAgICAgICAgZW1pdCgidHJ5IHsgcmV0dXJuIChvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW0pQ2xhc3MuZm9yTmFtZShcIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUltcGxcIiwgdHJ1ZSwgIiArIHNob3J0TmFtZSArICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBDbGFzcy5jbGFzcyB9KS5uZXdJbnN0YW5jZShuZXcgamF2YS5sYW5nLk9iamVjdFtdIHsgIiArIHNob3J0TmFtZSArICIuY2xhc3MgfSk7IH0iKTsKLSAgICAgICAgZW1pdCgiY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBsb2FkIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5TY2hlbWFUeXBlU3lzdGVtSW1wbDogbWFrZSBzdXJlIHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoLlwiLCBlKTsgfSIpOwotICAgICAgICBlbWl0KCJjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDb3VsZCBub3QgaW5zdGFudGlhdGUgU2NoZW1hVHlwZVN5c3RlbUltcGwgKFwiICsgZS50b1N0cmluZygpICsgXCIpOiBpcyB0aGUgdmVyc2lvbiBvZiB4YmVhbi5qYXIgY29ycmVjdD9cIiwgZSk7IH0iKTsKKyAgICAgICAgZW1pdCgiY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGxvYWQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLlNjaGVtYVR5cGVTeXN0ZW1JbXBsOiBtYWtlIHN1cmUgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGguXCIsIGUpOyB9Iik7CisgICAgICAgIGVtaXQoImNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uKFwiQ291bGQgbm90IGluc3RhbnRpYXRlIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIChcIiArIGUudG9TdHJpbmcoKSArIFwiKTogaXMgdGhlIHZlcnNpb24gb2YgeGJlYW4uamFyIGNvcnJlY3Q/XCIsIGUpOyB9Iik7CiAgICAgICAgIG91dGRlbnQoKTsKICAgICAgICAgZW1pdCgifSIpOwogICAgICAgICBvdXRkZW50KCk7CkBAIC00NzMsOSArNDc0LDEwIEBACiAgICAgICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MIGF0dHJpYnV0ZSB0eXBlLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKIAotICAgICAgICAgICAgYXNzZXJ0KCB0aGVuYW1lICE9IG51bGwgKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHRoZW5hbWUgIT0gbnVsbCApOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBlbWl0KCIgKiBMb2NhbG5hbWU6ICIgKyB0aGVuYW1lLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgICAgIGVtaXQoIiAqIE5hbWVzcGFjZTogIiArIHRoZW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwpAQCAtODkzLDcgKzg5NSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLmxhbmcuT2JqZWN0IjsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDc5LDcgKzEwODIsOCBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0RGVjaW1hbFNpemUoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEZWNpbWFsSG9sZGVyRXgiOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKQEAgLTExMTAsNyArMTExNCw4IEBACiAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgogICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhR0R1cmF0aW9uSG9sZGVyRXgiOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBwcmltaXRpdmUgdHlwZSI7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJ1bnJlY29nbml6ZWQgcHJpbWl0aXZlIHR5cGUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KQEAgLTExMzUsNyArMTE0MCw4IEBACiAKICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6CiAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmb3IgcmVzdHJpY3Rpb25zCi0gICAgICAgICAgICAgICAgYXNzZXJ0KCEgc1R5cGUuaXNCdWlsdGluVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghIHNUeXBlLmlzQnVpbHRpblR5cGUoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEF0b21pY1Jlc3RyaWN0aW9uVHlwZShzVHlwZSk7CiAKICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgpAQCAtMTY0OCw3ICsxNjU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHh0eXBlKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGFzc2VydCBzZXRJZGVudGlmaWVyICE9IG51bGwgJiYgaWRlbnRpZmllciAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc2V0SWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIgIT0gbnVsbCk7CiAKICAgICAgICAgZW1pdCh4dHlwZSArICIgdGFyZ2V0ID0gbnVsbDsiKTsKIApAQCAtMTY3OSw3ICsxNjg2LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAiQmFkIGJlaGF2aW91ciB0eXBlOiAiICsgbnVsbEJlaGF2aW91cjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIkJhZCBiZWhhdmlvdXIgdHlwZTogIiArIG51bGxCZWhhdmlvdXIpOwogICAgICAgICB9CiAKICAgICAgICAgZW5kQmxvY2soKTsKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlSW1wbC5qYXZhCmluZGV4IDRlZDQ4NjguLmI5MjI1MGUgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUltcGwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlNlcXVlbmNlZEhhc2hTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbmZpZy5FeHRlbnNpb25Ib2xkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwpAQCAtMzcsNiArMzgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEudXRpbC4qOwpAQCAtNzU0LDcgKzc1Niw3IEBACiAgICAgICAgIC8vIEFkZCBlbnRyaWVzIGZvciBlYWNoIGVsZW1lbnQgcHJvcGVydHkgZm9yIHN1YnN0aXR1dGlvbiBncm91cCBtZW1iZXJzCiAgICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgIT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgX3ZhbGlkU3Vic3RpdHV0aW9ucyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgICAgICAgICBfdmFsaWRTdWJzdGl0dXRpb25zID0gbmV3IFNlcXVlbmNlZEhhc2hTZXQoKTsKICAgICAgICAgICAgIENvbGxlY3Rpb24gZWx0UHJvcHMgPSBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCk7CiAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWx0UHJvcHMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKICAgICAgICAgICAgIHsKQEAgLTEwODgsOCArMTA5MCw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUZsYXRVbmlvbk1vZGVsKCkKICAgICB7Ci0gICAgICAgIFNldCBjb25zdGl0dWVudE1lbWJlclR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLSAgICAgICAgU2V0IGFsbFN1YlR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMgPSBuZXcgU2VxdWVuY2VkSGFzaFNldCgpOworICAgICAgICBTZXQgYWxsU3ViVHlwZXMgPSBuZXcgU2VxdWVuY2VkSGFzaFNldCgpOwogICAgICAgICBTY2hlbWFUeXBlIGNvbW1vbkJhc2VUeXBlID0gbnVsbDsKIAogICAgICAgICBhbGxTdWJUeXBlcy5hZGQodGhpcyk7CkBAIC0xMTE4LDcgKzExMjAsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG1JbXBsLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODkxLDcgKzE4OTQsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgc0ltcGwxID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsMS5nZXRCYXNlVHlwZSgpOwogICAgICAgICAgICAgc0ltcGwyID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsMi5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0KHNJbXBsMSAhPSBudWxsICYmIHNJbXBsMiAhPSBudWxsKTsgLy8gbXVzdCBtZWV0IGF0IGFueVR5cGUKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc0ltcGwxICE9IG51bGwgJiYgc0ltcGwyICE9IG51bGwpOyAvLyBtdXN0IG1lZXQgYXQgYW55VHlwZQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW1wbDE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckJhc2UuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEKaW5kZXggN2I3YzI0OS4uNDA5NDczOCAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckJhc2UuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uTmV0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsaWRhdG9yLlZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbTsKIApAQCAtMjYsMTEgKzI4LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmFjdG9yeUhvb2s7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC04NiwxMyArOTAsMTMgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICBYbWxSdW50aW1lRXhjZXB0aW9uIGlzZSA9IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSApOwogICAgICAgICAgICAgaXNlLmluaXRDYXVzZSggZSApOwogICAgICAgICAgICAgdGhyb3cgaXNlOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQogICAgICAgICB7Ci0gICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIFhtbFJ1bnRpbWVFeGNlcHRpb24gaXNlID0gbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpICk7CiAgICAgICAgICAgICBpc2UuaW5pdENhdXNlKCBlICk7CiAgICAgICAgICAgICB0aHJvdyBpc2U7CiAgICAgICAgIH0KQEAgLTExNCw3ICsxMTgsOCBAQAogICAgICAgICBpZiAocmVmID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU2NoZW1hVHlwZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xMjQsNyArMTI5LDggQEAKICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOwotICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocmVzdWx0ICE9IG51bGwpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM0LDcgKzE0MCw4IEBACiAgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IHJlZi5nZXQoKTsKLSAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTE0NCw3ICsxNTEsOCBAQAogICAgICAgICBpZiAocmVmID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU2NoZW1hTW9kZWxHcm91cCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xNTQsNyArMTYyLDggQEAKICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIHJlc3VsdCA9IHJlZi5nZXQoKTsKLSAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTE2NCw3ICsxNzMsOCBAQAogICAgICAgICBpZiAocmVmID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xNzQsNyArMTg0LDggQEAKICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSByZXN1bHQgPSByZWYuZ2V0KCk7Ci0gICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0yMTQsMTMgKzIyNSwxMyBAQAogICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCBmaWxlLnRvVVJJKCkubm9ybWFsaXplKCkudG9TdHJpbmcoKSApOworICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIE5ldFV0aWxzLm5vcm1hbGl6ZShJT1V0aWwuZmlsZVRvVVJMKGZpbGUpLnRvU3RyaW5nKCkpICk7CiAgICAgICAgIH0KIAogICAgICAgICBlbHNlIGlmICghIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUpKQogICAgICAgICB7CiAgICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoIG9wdGlvbnMgKTsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCBmaWxlLnRvVVJJKCkubm9ybWFsaXplKCkudG9TdHJpbmcoKSApOworICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIE5ldFV0aWxzLm5vcm1hbGl6ZShJT1V0aWwuZmlsZVRvVVJMKGZpbGUpLnRvU3RyaW5nKCkpICk7CiAgICAgICAgIH0KIAogICAgICAgICBJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICk7CkBAIC0yNTksOCArMjcwLDggQEAKIAogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJBcGFjaGUgWE1MQmVhbnMvMS4wLjMiKTsKLSAgICAgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOworICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkFwYWNoZSBYTUxCZWFucy8xLjAuMyIpOworICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qIik7CiAgICAgICAgICAgICAgICAgaWYgKGNvbm4gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pY29ubjsKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVySW1wbC5qYXZhCmluZGV4IGE0ODBjMWEuLjllYjllNDIgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJJbXBsLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQpAQCAtMjMsOCArMjMsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSWRlbnRpdHlNYXA7CiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0zNCw3ICszNiw2IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKIAogcHVibGljIGNsYXNzIFNjaGVtYVR5cGVMb2FkZXJJbXBsIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlckJhc2UKIHsKQEAgLTExOCw3ICsxMTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YkxvYWRlckxpc3QKICAgICB7CiAgICAgICAgIHByaXZhdGUgTGlzdCB0aGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwcml2YXRlIE1hcCBzZWVuID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcCBzZWVuID0gbmV3IElkZW50aXR5TWFwKCk7CiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZChTY2hlbWFUeXBlTG9hZGVyIGxvYWRlcikKICAgICAgICAgewpAQCAtMzA1LDcgKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kVHlwZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCwgIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0Iik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX3R5cGVDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKQEAgLTMyOSw3ICszMzEsOCBAQAogICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMudHlwZUZvckNsYXNzbmFtZShjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgdHlwZSAiICsgY2xhc3NuYW1lICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsLCAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCB0eXBlICIgKyBjbGFzc25hbWUgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfY2xhc3NuYW1lQ2FjaGUucHV0KGNsYXNzbmFtZSwgcmVzdWx0KTsKQEAgLTM1MSw3ICszNTQsOCBAQAogICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZERvY3VtZW50VHlwZVJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IGNvbnRhaW4gZG9jdW1lbnQgdHlwZSI7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCwgIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgY29udGFpbiBkb2N1bWVudCB0eXBlIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX2RvY3VtZW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CkBAIC0zNzMsNyArMzc3LDggQEAKICAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRBdHRyaWJ1dGVUeXBlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCBjb250YWluIGF0dHJpYnV0ZSB0eXBlIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsLCAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IGNvbnRhaW4gYXR0cmlidXRlIHR5cGUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CkBAIC0zOTUsNyArNDAwLDggQEAKICAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRFbGVtZW50UmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlc3VsdCAhPSBudWxsLCAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfZWxlbWVudENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwpAQCAtNDE3LDcgKzQyMyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlUmVmKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocmVzdWx0ICE9IG51bGwsICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0Iik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX2F0dHJpYnV0ZUNhY2hlLnB1dChuYW1lLCByZXN1bHQpOwpAQCAtNDM5LDcgKzQ0Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kTW9kZWxHcm91cFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIG1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocmVzdWx0ICE9IG51bGwsICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIG1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfbW9kZWxHcm91cENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwpAQCAtNDYxLDcgKzQ2OSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCwgIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCByZXR1cm4gaXQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfYXR0cmlidXRlR3JvdXBDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKQEAgLTQ4Myw3ICs0OTIsOCBAQAogICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZElkZW50aXR5Q29uc3RyYWludFJlZihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGlkZW50aXR5IGNvbnN0cmFpbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCwgIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgaWRlbnRpdHkgY29uc3RyYWludCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0Iik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX2lkQ29uc3RyYWludENhY2hlLnB1dChuYW1lLCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQppbmRleCA4YzljZjc5Li4wZGZiOWEwIDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLm5ldC5VUkk7CiAKIGltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKIGltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OwpAQCAtNDUsNyArNDQsNyBAQAogICAgICAgICBwcml2YXRlIFhtbE9wdGlvbnMgb3B0aW9uczsKICAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhaXplOwotICAgICAgICBwcml2YXRlIFVSSSBiYXNlVVJJOworICAgICAgICBwcml2YXRlIFN0cmluZyBiYXNlVVJJOwogICAgICAgICBwcml2YXRlIE1hcCBzb3VyY2VzVG9Db3B5TWFwOwogCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCkBAIC0xMTgsMTIgKzExNywxMiBAQAogICAgICAgICAgICAgdGhpcy5qYXZhaXplID0gamF2YWl6ZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVSSSgpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBiYXNlVVJJOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZVVSSShVUkkgYmFzZVVSSSkKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZVVSSShTdHJpbmcgYmFzZVVSSSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5iYXNlVVJJID0gYmFzZVVSSTsKICAgICAgICAgfQpAQCAtMTQ2LDcgKzE0NSw3IEBACiAgICAgCiAgICAgLyogcGFja2FnZSEhISAqLyBzdGF0aWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgY29tcGlsZUltcGwoCiAgICAgICAgIFN0cmluZyBuYW1lLCBTY2hlbWFbXSBzY2hlbWFzLCBDb25maWdbXSBjb25maWdzLAotICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbywgWG1sT3B0aW9ucyBvcHRpb25zLCBDb2xsZWN0aW9uIG91dHNpZGVFcnJvcnMsIGJvb2xlYW4gamF2YWl6ZSwgVVJJIGJhc2VVUkksIE1hcCBzb3VyY2VzVG9Db3B5TWFwKQorICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbywgWG1sT3B0aW9ucyBvcHRpb25zLCBDb2xsZWN0aW9uIG91dHNpZGVFcnJvcnMsIGJvb2xlYW4gamF2YWl6ZSwgU3RyaW5nIGJhc2VVUkksIE1hcCBzb3VyY2VzVG9Db3B5TWFwKQogICAgIHsKICAgICAgICAgaWYgKGxpbmtUbyA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzdXBwbHkgbGlua1RvIik7CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUltcGwuamF2YQppbmRleCAzMjI3YWZjLi45YjYxMTE4IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtSW1wbC5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEKQEAgLTYxLDggKzYxLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU2NoZW1hV1NETEFycmF5VHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlNlcXVlbmNlZEhhc2hTZXQ7CisKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50OwogaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CkBAIC0zODMsNyArMzg5LDcgQEAKICAgICBwcml2YXRlIE1hcCBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoKQogICAgIHsKICAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRvY3VtZW50VHlwZXMoKSkpOwogICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXR0cmlidXRlVHlwZXMoKSkpOwogICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2xvYmFsVHlwZXMoKSkpOwpAQCAtNDA0LDcgKzQxMCw3IEBACiAKICAgICBwcml2YXRlIE1hcCBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoTWFwIHR5cGVzQnlDbGFzc25hbWUpCiAgICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzQnlDbGFzc25hbWUua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CkBAIC00MTUsNyArNDIxLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZENvbXBvbmVudFJlZk1hcChTY2hlbWFDb21wb25lbnRbXSBjb21wb25lbnRzKQogICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICByZXN1bHQucHV0KGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpLCBjb21wb25lbnRzW2ldLmdldENvbXBvbmVudFJlZigpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQyMyw3ICs0MjksNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkRG9jdW1lbnRNYXAoU2NoZW1hVHlwZVtdIHR5cGVzKQogICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgcmVzdWx0LnB1dCh0eXBlc1tpXS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCksIHR5cGVzW2ldLmdldFJlZigpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQzMSw3ICs0MzcsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlVHlwZU1hcChTY2hlbWFUeXBlW10gdHlwZXMpCiAgICAgewotICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICByZXN1bHQucHV0KHR5cGVzW2ldLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCksIHR5cGVzW2ldLmdldFJlZigpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTUzNyw3ICs1NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KF9jbGFzc2xvYWRlciA9PSBudWxsKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9jbGFzc2xvYWRlciA9PSBudWxsKTsKICAgICAgICAgX2xvY2FsSGFuZGxlcyA9IG5ldyBIYW5kbGVQb29sKCk7CiAgICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKGdsb2JhbEVsZW1lbnRzKTsKICAgICAgICAgX2dsb2JhbEF0dHJpYnV0ZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChnbG9iYWxBdHRyaWJ1dGVzKTsKQEAgLTU1MCw3ICs1NTcsOCBAQAogCiAgICAgcHVibGljIHZvaWQgbG9hZEZyb21TdHNjU3RhdGUoU3RzY1N0YXRlIHN0YXRlKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KF9jbGFzc2xvYWRlciA9PSBudWxsKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9jbGFzc2xvYWRlciA9PSBudWxsKTsKICAgICAgICAgX2xvY2FsSGFuZGxlcyA9IG5ldyBIYW5kbGVQb29sKCk7CiAgICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmdsb2JhbEVsZW1lbnRzKCkpOwogICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLmdsb2JhbEF0dHJpYnV0ZXMoKSk7CkBAIC02NTYsOCArNjY0LDggQEAKIAogICAgIGNsYXNzIEhhbmRsZVBvb2wKICAgICB7Ci0gICAgICAgIHByaXZhdGUgTWFwIF9oYW5kbGVzVG9SZWZzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBNYXAgX2NvbXBvbmVudHNUb0hhbmRsZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOyAvLyBwb3B1bGF0ZWQgb24gd3JpdGUKKyAgICAgICAgcHJpdmF0ZSBNYXAgX2hhbmRsZXNUb1JlZnMgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcCBfY29tcG9uZW50c1RvSGFuZGxlcyA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7IC8vIHBvcHVsYXRlZCBvbiB3cml0ZQogICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3N0YXJ0ZWQ7CiAKICAgICAgICAgLyoqCkBAIC04MjAsNyArODI4LDcgQEAKICAgICAgICAgdm9pZCBzdGFydFdyaXRlTW9kZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIF9zdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9oYW5kbGVzVG9SZWZzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpaS5uZXh0KCk7CkBAIC0xNTA1LDcgKzE1MTMsOCBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUZpZWxkIHNmID0gdHlwZS5nZXRDb250YWluZXJGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChzZiAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc2YgIT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2YuaXNBdHRyaWJ1dGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hSXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc2YuZ2V0TmFtZSgpKSk7CkBAIC0xNTE5LDcgKzE1MjgsOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIGhhbmRsZSBmb3IgY29tcG9uZW50ICIgKyBjb21wLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfSEFORExFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTg3MCw3ICsxODgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXR0ck1vZGVsLnNldFdpbGRjYXJkUHJvY2VzcyhyZWFkU2hvcnQoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIFByb3BlcnR5IFRhYmxlCi0gICAgICAgICAgICAgICAgICAgIE1hcCBhdHRyUHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgICAgIE1hcCBhdHRyUHJvcGVydGllcyA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgIHNob3J0IGF0dHJQcm9wQ291bnQgPSByZWFkU2hvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyUHJvcENvdW50OyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTE4OTgsNyArMTkwOCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgUHJvcGVydHkgVGFibGUKIAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVByb3BlcnRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVByb3BlcnRpZXMgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZWxlbVByb3BDb3VudCA9IHJlYWRTaG9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtUHJvcENvdW50OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC0yMjA0LDcgKzIyMTQsOCBAQAogICAgICAgICB2b2lkIHJlYWRFeHRlbnNpb25zTGlzdCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgYXNzZXJ0IGNvdW50ID09IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNvdW50ID09IDApOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgICB7CkBAIC0yMjI5LDcgKzIyNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjI0MSw3ICsyMjUyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI0OTMsNyArMjUwNCw3IEBACiAgICAgICAgICAgICBpZiAoIXByb3AuaXNBdHRyaWJ1dGUoKSAmJiBhdExlYXN0KDIsIDE3LCAwKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzaG9ydCBzaXplID0gcmVhZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgTGlua2VkSGFzaFNldCBxbmFtZXMgPSBuZXcgTGlua2VkSGFzaFNldChzaXplKTsKKyAgICAgICAgICAgICAgICBTZXF1ZW5jZWRIYXNoU2V0IHFuYW1lcyA9IG5ldyBTZXF1ZW5jZWRIYXNoU2V0KCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2l6ZSA7IGkrKykKICAgICAgICAgICAgICAgICAgICAgcW5hbWVzLmFkZChyZWFkUU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgcHJvcC5zZXRBY2NlcHRlZE5hbWVzKHFuYW1lcyk7CkBAIC0yNTYyLDcgKzI1NzMsOCBAQAogICAgICAgICAgICAgc3dpdGNoIChidGMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgY2FzZSAtMToKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKaW5kZXggOGJiZGI0MC4uMDk4MTRkNSAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTMyOCw3ICszMjksOCBAQAogICAgICAgICAgICAgbWlubWF4OiBzd2l0Y2ggKF90b3AuX2N1clBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKIAogICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CiAgICAgICAgICAgICAgICAgICAgIGlmICghX3RvcC5fY3VyUGFydC5jYW5TdGFydFdpdGhFbGVtZW50KGVsdE5hbWUpKQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDaGVja2VyLmphdmEKaW5kZXggMzQ0ZGFlYy4uNmUzOWJkNiAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ2hlY2tlci5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CkBAIC0yNzksNyArMjgwLDggQEAKICAgICAgICAgICAgICAgICAgICAgLy8gNS4zIC4uLiB0aGVuIHRoZSBwYXJ0aWNsZSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24gaXRzZWxmIG11c3QgYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBvZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0KICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsID0gYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCk7CiAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCA9IHNUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYmFzZU1vZGVsICE9IG51bGwgJiYgZGVyaXZlZE1vZGVsICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYmFzZU1vZGVsICE9IG51bGwgJiYgZGVyaXZlZE1vZGVsICE9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsID09IG51bGwgfHwgZGVyaXZlZE1vZGVsID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiTnVsbCBtb2RlbHMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBFTVBUWV9DT05URU5UOiAiICsgYmFzZVR5cGUgKyAiICgiICsgYmFzZU1vZGVsICsgIiksICIgKyBzVHlwZSArICIgKCIgKyBkZXJpdmVkTW9kZWwgKyAiKSIpOwpAQCAtMzQ2LDcgKzM0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgpAQCAtMzY3LDcgKzM3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIikpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgpAQCAtMzkwLDcgKzM5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VVbm9yZGVyZWQoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIikpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgpAQCAtNDEzLDcgKzQxOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG1hcEFuZFN1bShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBEZXJpdmVkIFR5cGUiKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKQEAgLTQzNywxMSArNDQzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2UoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsIFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIikpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgQmFzZSBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBCYXNlIFR5cGUiKSk7CiAKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUxLDggKzQ1OSwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXBBbmRTdW0oU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgIHsKICAgICAgICAgLy8gbWFwQW5kU3VtIGlzIGNhbGwgaWYgYmFzZTogQ0hPSUNFLCBkZXJpdmVkOiBTRVFVRU5DRQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRTsKLSAgICAgICAgYXNzZXJ0IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBtYXBBbmRTdW1WYWxpZCA9IHRydWU7CiAgICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoU2VxdWVuY2U6Q2hvaWNlIC0tIE1hcEFuZFN1bSkKICAgICAgICAgLy8gRm9yIGEgc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgY2hvaWNlIGdyb3VwIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nCkBAIC01NDUsOSArNTU2LDEwIEBACiAgICAgICAgIC8vIGJhc2U6IEFMTCwgZGVyaXZlZDogRUxFTUVOVAogICAgICAgICAvLyBiYXNlOiBDSE9JQ0UsIGRlcml2ZWQ6IEVMRU1FTlQKICAgICAgICAgLy8gYmFzZTogU0VRVUVOQ0UsIGRlcml2ZWQ6IEVMRU1FTlQKLSAgICAgICAgYXNzZXJ0IChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQorICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCiAgICAgICAgICAgICAgICAgfHwgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCi0gICAgICAgICAgICAgICAgfHwgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7CisgICAgICAgICAgICAgICAgfHwgKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkpOwogICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKEVsdDpBbGwvQ2hvaWNlL1NlcXVlbmNlIC0tIFJlY3Vyc2VBc0lmR3JvdXApCiAKICAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgZ3JvdXAgcGFydGljbGUKQEAgLTU3MSw3ICs1ODMsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlTGF4KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7CiAgICAgICAgIC8vIHJlY3Vyc2VMYXggaXMgY2FsbGVkIGlmIGJhc2U6IENIT0lDRSwgZGVyaXZlZDogQ0hPSUNFCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UpOwogICAgICAgICBib29sZWFuIHJlY3Vyc2VMYXhWYWxpZCA9IHRydWU7CiAgICAgICAgIC8vU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChDaG9pY2U6Q2hvaWNlIC0tIFJlY3Vyc2VMYXgpCiAgICAgICAgIC8vIEZvciBhIGNob2ljZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW5vdGhlciBjaG9pY2UgZ3JvdXAgcGFydGljbGUgYWxsIG9mIHRoZQpAQCAtNjI3LDcgKzY0MCw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2VVbm9yZGVyZWQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewogICAgICAgICAvLyByZWN1cnNlVW5vcmRlciBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTEwgYW5kIGRlcml2ZWQ6IFNFUQotICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCAmJiBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CiAgICAgICAgIGJvb2xlYW4gcmVjdXJzZVVub3JkZXJlZFZhbGlkID0gdHJ1ZTsKICAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChTZXF1ZW5jZTpBbGwgLS0gUmVjdXJzZVVub3JkZXJlZCkKICAgICAgICAgLy8gRm9yIGEgc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGFuIGFsbCBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlCkBAIC04MjgsMTAgKzg0MiwxMyBAQAogICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IEFMTAogICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IENIT0lDRQogICAgICAgICAvLyBiYXNlOiBBTlksIGRlcml2ZWQ6IFNFUVVFTkNFCi0gICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQ7Ci0gICAgICAgIGFzc2VydCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCkKLSAgICAgICAgICAgICAgICB8fCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSkKLSAgICAgICAgICAgICAgICB8fCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQorICAgICAgICAgICAgICAgICAgICB8fCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFKSk7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gdHJ1ZTsKICAgICAgICAgLy8gRm9yIGEgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgogICAgICAgICAvLyAxIEV2ZXJ5IG1lbWJlciBvZiB0aGUge3BhcnRpY2xlc30gb2YgdGhlIGdyb3VwIGlzIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgd2lsZGNhcmQgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgpAQCAtMTE4OSw4ICsxMjA2LDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5zU3Vic2V0KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKICAgICAgICAgLy8gbnNTdWJzZXQgaXMgY2FsbGVkIHdoZW4gYmFzZTogQU5ZLCBkZXJpdmVkOiBBTlkKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKLSAgICAgICAgYXNzZXJ0IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIG5zU3Vic2V0ID0gZmFsc2U7CiAgICAgICAgIC8vIEZvciBhIHdpbGRjYXJkIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhbm90aGVyIHdpbGRjYXJkIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKICAgICAgICAgLy8gMSBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBtdXN0IGJlIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgpAQCAtMTIxNCw3ICsxMjM0LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnNDb21wYXQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgewogICAgICAgICAvLyBuc0NvbXBhdCBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTlksIGRlcml2ZWQ6IEVMRU1FTlQKLSAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCk7CiAgICAgICAgIGJvb2xlYW4gbnNDb21wYXQgPSBmYWxzZTsKICAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgd2lsZGNhcmQgcGFydGljbGUgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgogICAgICAgICAvLyAxIFRoZSBlbGVtZW50IGRlY2xhcmF0aW9uJ3Mge3RhcmdldCBuYW1lc3BhY2V9IGlzILd2YWxpZLcgd2l0aCByZXNwZWN0IHRvIHRoZSB3aWxkY2FyZCdzIHtuYW1lc3BhY2UgY29uc3RyYWludH0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ29tcGxleFR5cGVSZXNvbHZlci5qYXZhCmluZGV4IDJmMDAzODQuLjc5NzExZjcgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuamF2YQpAQCAtMzksNiArMzksOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldFNwZWNpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlNlcXVlbmNlZEhhc2hNYXA7CiAKIHB1YmxpYyBjbGFzcyBTdHNjQ29tcGxleFR5cGVSZXNvbHZlcgogewpAQCAtMjg5LDcgKzI5MSw3IEBACiAgICAgICAgIGludCBwYXJ0aWNsZUNvZGUgPSB0cmFuc2xhdGVQYXJ0aWNsZUNvZGUocGFyc2VHcm91cCk7CiAKICAgICAgICAgLy8gdXNlZCB0byBlbnN1cmUgY29uc2lzdGVuY3kgKGRvZXNuJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHJlc3VsdCkKLSAgICAgICAgTWFwIGVsZW1lbnRNb2RlbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogCiAgICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcwogICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSB0cmFuc2xhdGVDb250ZW50TW9kZWwoc0ltcGwsIHBhcnNlR3JvdXAsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBwYXJ0aWNsZUNvZGUsIGFub255bW91c1R5cGVzLCBlbGVtZW50TW9kZWwsIGZhbHNlLCBudWxsKTsKQEAgLTM5Myw3ICszOTUsNyBAQAogICAgICAgICBpbnQgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcpOwogCiAgICAgICAgIC8vIHVzZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChkb2Vzbid0IGJlY29tZSBwYXJ0IG9mIHRoZSByZXN1bHQpCi0gICAgICAgIE1hcCBlbGVtZW50TW9kZWwgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBNYXAgZWxlbWVudE1vZGVsID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKIAogICAgICAgICAvLyBidWlsZCBjb250ZW50IG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKICAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsID0gdHJhbnNsYXRlQ29udGVudE1vZGVsKApAQCAtMTEwOCw3ICsxMTEwLDggQEAKIAogICAgICAgICAvLyBlbWl0REJHKCJUcmFuc2xhdGluZyBjb250ZW50IG1vZGVsIGZvciAiICsgb3V0ZXJUeXBlKTsKICAgICAgICAgLy8gaW5kZW50REJHKCk7Ci0gICAgICAgIGFzc2VydChwYXJ0aWNsZUNvZGUgIT0gMCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwYXJ0aWNsZUNvZGUgIT0gMCk7CiAKICAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbiA9IGZhbHNlOwogICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VyczsKQEAgLTEyNDEsNyArMTI0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzQzLDcgKzEzNDcsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICAKQEAgLTE0MDgsNyArMTQxMyw3IEBACiAKICAgICBzdGF0aWMgTWFwIGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsLCBTY2hlbWFUeXBlIG93bmVyKQogICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJ1c2VzID0gYXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJ1c2VzLmxlbmd0aDsgaSsrKQpAQCAtMTQ0MSwxNCArMTQ0NiwxNSBAQAogICAgICAgICAgICAgICAgIG1vZGVsID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gYnVpbGQgbW9kZWwgZm9yIGNoaWxkcmVuCi0gICAgICAgICAgICBtb2RlbCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgICBtb2RlbCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCkBAIC0xNDY4LDcgKzE0NzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgdmVyaWZpZWQgaW4gYW4gZWFybGllciBzdGVwCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydChvUHJvcC5nZXRUeXBlKCkuZXF1YWxzKGlQcm9wLmdldFR5cGUoKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUob1Byb3AuZ2V0VHlwZSgpLmVxdWFscyhpUHJvcC5nZXRUeXBlKCkpKTsKIAogICAgICAgICAgICAgICAgICAgICBtZXJnZVByb3BlcnRpZXMob1Byb3AsIGlQcm9wLCBhc1NlcXVlbmNlKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSW1wb3J0ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCmluZGV4IDYyYzM4YTMuLjEyNGUzYWEgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCkBAIC0zMCw4ICszMCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQzLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTQyLDQ5ICsxNDEsMTIgQEAKIAogICAgICAgICAvLyBsb29rcyBsaWtlIGEgVVJMPwogICAgICAgICBpbnQgY29sb24gPSBwYXRoLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKGNvbG9uID4gMSAmJiBwYXRoLnN1YnN0cmluZygwLCBjb2xvbikubWF0Y2hlcygiXlxcdyskIikpCisgICAgICAgIGlmIChjb2xvbiA+IDEgJiYgU3RyaW5nVXRpbHMubWF0Y2hlcyhwYXRoLnN1YnN0cmluZygwLCBjb2xvbiksICJeXFx3KyQiKSkKICAgICAgICAgICAgIHJldHVybiBwYXRoOwogCiAgICAgICAgIHJldHVybiBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgcGFyc2VVUkkoU3RyaW5nIHMpCi0gICAgewotICAgICAgICBpZiAocyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gc3ludGF4KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy93b3JrYXJvdW5kIGZvciBTdW4gYnVnICMgNDcyMzcyNgotICAgIHByaXZhdGUgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBTdHJpbmcgY2hpbGQpCi0gICAgewotICAgICAgICBVUkkgcnVyaSA9IGJhc2UucmVzb2x2ZShjaGlsZCk7Ci0gICAgICAgIAotICAgICAgICAvL2ZpeCB1cCBub3JtYWxpemF0aW9uIGJ1ZwotICAgICAgICBpZiAoImZpbGUiLmVxdWFscyhydXJpLmdldFNjaGVtZSgpKSAmJiAhIGNoaWxkLmVxdWFscyhydXJpKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJhc2UuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikgJiYgIXJ1cmkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiLy8vIi5jb25jYXQocnVyaS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcnVyaSA9IG5ldyBVUkkoImZpbGUiLCBudWxsLCBwYXRoLCBydXJpLmdldFF1ZXJ5KCksIHJ1cmkuZ2V0RnJhZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzKQotICAgICAgICAgICAgICAgIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ1cmk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3dubG9hZFRhYmxlCiAgICAgewogICAgICAgICAvKioKQEAgLTI4MCwxMCArMjQyLDI2IEBACiAgICAgICAgICAgICAvLyBubyBsb2NhdGlvbiBVUkwgcHJvdmlkZWQ/ICBUaGVuIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgICAgICBpZiAobG9jYXRpb25VUkwgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBGaXJzdCByZXNvbHZlIHJlbGF0aXZlIFVSTHMgd2l0aCByZXNwZWN0IHRvIGJhc2UgVVJMIGZvciBkb2MKLSAgICAgICAgICAgIFVSSSBiYXNlVVJJID0gcGFyc2VVUkkoYmFzZVVSTEZvckRvYyhyZWZlcmVuY2VkQnkpKTsKLSAgICAgICAgICAgIFN0cmluZyBhYnNvbHV0ZVVSTCA9IGJhc2VVUkkgPT0gbnVsbCA/IGxvY2F0aW9uVVJMIDogcmVzb2x2ZShiYXNlVVJJLCBsb2NhdGlvblVSTCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VVUkwgPSBuZXcgVVJMKGJhc2VVUkxGb3JEb2MocmVmZXJlbmNlZEJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIFN0cmluZyBhYnNvbHV0ZVVSTCA9IGxvY2F0aW9uVVJMOworICAgICAgICAgICAgaWYgKGJhc2VVUkwgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFic29sdXRlVVJMID0gbmV3IFVSTChiYXNlVVJMLCBsb2NhdGlvblVSTCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsgfQorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBwcm9iZSAxOiBucyt1cmwgLSBwZXJmZWN0IG1hdGNoCiAgICAgICAgICAgICBpZiAoYWJzb2x1dGVVUkwgIT0gbnVsbCAmJiB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NKYXZhaXplci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEKaW5kZXggNjM4NzE3MS4uZDUxODU4NiAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0phdmFpemVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuSW50ZXJmYWNlRXh0ZW5zaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuRXh0ZW5zaW9uSG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiAKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwpAQCAtMTQ4LDExICsxNDksMTEgQEAKICAgICB7CiAgICAgICAgIGlmIChzSW1wbC5pc0phdmFpemVkKCkpCiAgICAgICAgICAgICByZXR1cm47Ci0KKyAgICAgICAgCiAgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VUeXBlID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsLmdldEJhc2VUeXBlKCk7CiAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQogICAgICAgICAgICAgc2tpcEphdmFpemluZ1R5cGUoYmFzZVR5cGUpOwotCisgICAgICAgIAogICAgICAgICBzSW1wbC5zdGFydEphdmFpemluZygpOwogICAgICAgICBzZWNvbmRQYXNzUHJvY2Vzc1R5cGUoc0ltcGwpOwogICAgICAgICBzSW1wbC5maW5pc2hKYXZhaXppbmcoKTsKQEAgLTMzOCw3ICszMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgamF2YW5hbWUgPSAiSXRlbSI7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJXZWlyZCB0eXBlICIgKyBzSW1wbC50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiV2VpcmQgdHlwZSAiICsgc0ltcGwudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJCYXNlIjsgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTAxLDcgKzUwMyw4IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhlTmFtZSA9IGJhc2VQcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoIXVzZWROYW1lcy5jb250YWlucyh0aGVOYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIXVzZWROYW1lcy5jb250YWlucyh0aGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgdXNlZE5hbWVzLmFkZCh0aGVOYW1lKTsKICAgICAgICAgICAgIH0KIApAQCAtNjU1LDcgKzY1OCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJ1bnJlY29nbml6ZWQgY29kZSAiICsgc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAidW5yZWNvZ25pemVkIGNvZGUgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSk7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5yZWNvZ25pemVkIGNvZGUgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSArICIgb2YgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXROYW1lKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTI0LDggKzkyOCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgU2NoZW1hRmllbGQgc0VsdCA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCk7Ci0gICAgICAgIGFzc2VydChzRWx0ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoc1R5cGUuZ2V0T3V0ZXJUeXBlKCkgPT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNFbHQgIT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNUeXBlLmdldE91dGVyVHlwZSgpID09IG51bGwpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBzRWx0LmdldE5hbWUoKTsKICAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKaW5kZXggNTg2OGQ4Yi4uY2FmZDY0MCAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogCkBAIC05Myw3ICs5NCw4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVzb2x2ZVN1YnN0aXR1dGlvbkdyb3VwKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzRG9jdW1lbnRUeXBlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzSW1wbC5pc0RvY3VtZW50VHlwZSgpKTsKIAogICAgICAgICBpZiAoc0ltcGwuaXNTR1Jlc29sdmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEzOSw3ICsxNDEsOCBAQAogICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAgPSBTdHNjU3RhdGUuZ2V0KCkuZmluZERvY3VtZW50VHlwZSgKICAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCBzdWJzdGl0dXRpb25Hcm91cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7CiAKLSAgICAgICAgICAgIGFzc2VydCBzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsIDogIkNvdWxkIG5vdCBmaW5kIGRvY3VtZW50IHR5cGUgZm9yOiAiICsgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCwgIkNvdWxkIG5vdCBmaW5kIGRvY3VtZW50IHR5cGUgZm9yOiAiICsgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSk7CiAKICAgICAgICAgICAgIGlmICghIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCkgKQogICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsgLy8gY3ljbGljIGRlcGVuZGVuY3kgLSBubyBzdWJzdCBncm91cApAQCAtMTUzLDEwICsxNTYsMTEgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlRG9jdW1lbnRUeXBlICggU2NoZW1hVHlwZUltcGwgc0ltcGwgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzUmVzb2x2aW5nKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnQgc0ltcGwuaXNEb2N1bWVudFR5cGUoKTsKLSAgICAgICAgCisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNJbXBsLmlzUmVzb2x2aW5nKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzSW1wbC5pc0RvY3VtZW50VHlwZSgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgZ2xvYmFsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQgdHlwZQogICAgICAgICAvLyBhbmQgY29uc3RydWN0IGEgY29udGVudCBtb2RlbCB3aGljaCBhbGxvd3MganVzdCB0aGF0IGVsZW1lbnQKQEAgLTIxNiwxMCArMjIwLDEyIEBACiAgICAgCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVBdHRyaWJ1dGVUeXBlICggU2NoZW1hVHlwZUltcGwgc0ltcGwgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHNJbXBsLmlzUmVzb2x2aW5nKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNJbXBsLmlzUmVzb2x2aW5nKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzSW1wbC5pc0F0dHJpYnV0ZVR5cGUoKSk7CisgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCk7Ci0gICAgICAgIAogICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAogICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZSA9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU2ltcGxlVHlwZVJlc29sdmVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU2ltcGxlVHlwZVJlc29sdmVyLmphdmEKaW5kZXggMGY2ODAzYi4uYzdkMzIzYyAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRCeXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiBpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS4qOwogCiBwdWJsaWMgY2xhc3MgU3RzY1NpbXBsZVR5cGVSZXNvbHZlcgpAQCAtNTUsNyArNTYsOCBAQAogICAgIHsKICAgICAgICAgU2ltcGxlVHlwZSBwYXJzZVN0ID0gKFNpbXBsZVR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKICAgICAgICAgCi0gICAgICAgIGFzc2VydCBzSW1wbC5pc1NpbXBsZVR5cGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNJbXBsLmlzU2ltcGxlVHlwZSgpKTsKIAogICAgICAgICAvLyBWZXJpZnk6IGhhdmUgbGlzdCwgdW5pb24sIG9yIHJlc3RyaWN0aW9uLCBidXQgbm90IG1vcmUgdGhhbiBvbmUKICAgICAgICAgaW50IGNvdW50ID0KQEAgLTIyNCw3ICsyMjYsOCBAQAogICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihpdGVtSW1wbC5nZXRSZWYoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldFJlZigpKTsKICAgICAgICAgfQogCkBAIC01ODYsNyArNTg5LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC02MDQsNyArNjA4LDggQEAKICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgogICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTdGF0ZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEKaW5kZXggNDY1ZTVmMy4uM2JiZDAyMyAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1N0YXRlLmphdmEKQEAgLTE1LDggKzE1LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOwogCi1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLio7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbmZpZy5TY2hlbWFDb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbmZpZy5FeHRlbnNpb25Ib2xkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CkBAIC0zMywxMCArMzIsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFN0cmluZ0ltcGw7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKIAogaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogCkBAIC02MiwyMSArNjEsMjEgQEAKIAogICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlciBfaW1wb3J0aW5nTG9hZGVyOwogCi0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzICAgICAgICA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzICAgICAgICA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIAotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxUeXBlcyAgICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxFbGVtZW50cyAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9nbG9iYWxBdHRyaWJ1dGVzICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwcyAgICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cHMgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudFR5cGVzICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVUeXBlcyAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByaXZhdGUgTWFwIF90eXBlc0J5Q2xhc3NuYW1lICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9nbG9iYWxUeXBlcyAgICAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9nbG9iYWxFbGVtZW50cyAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9nbG9iYWxBdHRyaWJ1dGVzICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwcyAgICAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cHMgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudFR5cGVzICAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVUeXBlcyAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF90eXBlc0J5Q2xhc3NuYW1lICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgIHByaXZhdGUgTWFwIF9taXNzcGVsbGVkTmFtZXMgICAgPSBuZXcgSGFzaE1hcCgpOwogICAgIHByaXZhdGUgU2V0IF9wcm9jZXNzaW5nR3JvdXBzICAgPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgTWFwIF9pZENvbnN0cmFpbnRzICAgICAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9pZENvbnN0cmFpbnRzICAgICAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgIHByaXZhdGUgU2V0IF9uYW1lc3BhY2VzICAgICAgICAgPSBuZXcgSGFzaFNldCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBfbm9VcGE7CiAgICAgcHJpdmF0ZSBib29sZWFuIF9ub1B2cjsKQEAgLTE2MSw3ICsxNjAsNyBAQAogICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCiAgICAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAotICAgICAgICAgICAgICBsb2NhdGlvbi50b1VSSSgpLnRvU3RyaW5nKCksIDAsIDAsIDApOworICAgICAgICAgICAgICBJT1V0aWwuZmlsZVRvVVJMKGxvY2F0aW9uKS50b1N0cmluZygpLCAwLCAwLCAwKTsKICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZXJyKTsKICAgICB9CiAKQEAgLTI0Myw4ICsyNDIsOCBAQAogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHVyaS5nZXRTY2hlbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIik7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKQEAgLTczNCwxMyArNzMzLDE1IEBACiAKICAgICB2b2lkIHN0YXJ0UHJvY2Vzc2luZyhPYmplY3Qgb2JqKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KCFfcHJvY2Vzc2luZ0dyb3Vwcy5jb250YWlucyhvYmopKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFfcHJvY2Vzc2luZ0dyb3Vwcy5jb250YWlucyhvYmopKTsKICAgICAgICAgX3Byb2Nlc3NpbmdHcm91cHMuYWRkKG9iaik7CiAgICAgfQogCiAgICAgdm9pZCBmaW5pc2hQcm9jZXNzaW5nKE9iamVjdCBvYmopCiAgICAgewotICAgICAgICBhc3NlcnQoX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKSk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfcHJvY2Vzc2luZ0dyb3Vwcy5jb250YWlucyhvYmopKTsKICAgICAgICAgX3Byb2Nlc3NpbmdHcm91cHMucmVtb3ZlKG9iaik7CiAgICAgfQogCkBAIC04ODAsNyArODgxLDggQEAKICAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiSWRlbnRpdHkgY29uc3RyYWludCAnIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiJyBub3QgZm91bmQuIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIkRlZmluaXRpb24gIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC05ODQsNyArOTg2LDcgQEAKICAgICAvKioKICAgICAgKiBUaGUgYmFzZSBVUkkgdG8gdXNlIGZvciBuaWNlIGZpbGVuYW1lcyB3aGVuIHNhdmluZyBzb3VyY2VzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoVVJJIHVyaSkKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVXJpKFN0cmluZyB1cmkpCiAgICAgewogICAgICAgICBfYmFzZVVSSSA9IHVyaTsKICAgICB9CkBAIC0xMDE1LDI0ICsxMDE3LDE4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBVUkw/CiAgICAgICAgICAgICBpbnQgY29sb24gPSB1cmkuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGNvbG9uIDw9IDEgfHwgIXVyaS5zdWJzdHJpbmcoMCwgY29sb24pLm1hdGNoZXMoIl5cXHcrJCIpKQorICAgICAgICAgICAgaWYgKGNvbG9uIDw9IDEgfHwgIVN0cmluZ1V0aWxzLm1hdGNoZXModXJpLnN1YnN0cmluZygwLCBjb2xvbiksICJeXFx3KyQiKSkKICAgICAgICAgICAgICAgICB1cmkgPSBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyB1cmkucmVwbGFjZSgnXFwnLCAnLycpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbm93IHJlbGF0aXZpemUgYWdhaW5zdCB0aGF0Li4uCiAgICAgICAgIGlmIChfYmFzZVVSSSAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgcmVsYXRpdmUgPSBfYmFzZVVSSS5yZWxhdGl2aXplKG5ldyBVUkkodXJpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZS5pc0Fic29sdXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gcmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZSA9IE5ldFV0aWxzLnJlbGF0aXZpemUoX2Jhc2VVUkksIHVyaSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmUuY2hhckF0KDApICE9ICcvJykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXJpID0gcmVsYXRpdmU7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmICghZm9yU2F2ZWRGaWxlbmFtZSkKQEAgLTEwNzUsNiArMTA3MSw2IEBACiAgICAgfQogCiAgICAgTWFwIF9zb3VyY2VGb3JVcmkgPSBuZXcgSGFzaE1hcCgpOwotICAgIFVSSSBfYmFzZVVSSSA9IFVSSS5jcmVhdGUoUFJPSkVDVF9VUkxfUFJFRklYICsgIi8iKTsKKyAgICBTdHJpbmcgX2Jhc2VVUkkgPSBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyI7CiAgICAgU2NoZW1hVHlwZUxvYWRlciBfczRzbG9hZGVyID0gWG1sQmVhbnMudHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKFNjaGVtYURvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwogfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NUcmFuc2xhdG9yLmphdmEKaW5kZXggYzQ2MmY3Ni4uNmUyNzY1MSAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjVHJhbnNsYXRvci5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIApAQCAtNTA2LDcgKzUwNyw4IEBACiAgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZQogICAgICAgICAgICAgfQogICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQoeHNkRWx0IGluc3RhbmNlb2YgTG9jYWxFbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoeHNkRWx0IGluc3RhbmNlb2YgTG9jYWxFbGVtZW50KTsKICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVmZXJlbmNlZCA9IHN0YXRlLmZpbmRHbG9iYWxFbGVtZW50KHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7CiAgICAgICAgICAgICBpZiAocmVmZXJlbmNlZCA9PSBudWxsKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0uamF2YQppbmRleCAxYTlhYzNhLi4yZTkxNmMzIDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0uamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0uamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0zMzQsNyArMzM1LDggQEAKICAgICB7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS50aGlzLl9leGNlcHRpb24gPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLnRoaXMuX2V4Y2VwdGlvbiA9PSBudWxsKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLnRoaXMuX2V4Y2VwdGlvbiA9IAogICAgICAgICAgICAgICAgIG5ldyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uKCAoWG1sRXJyb3IpbyApOwpAQCAtMzU2LDcgKzM1OCw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIG5leHRFdmVudCAoIGludCBraW5kICkKICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgYXNzZXJ0IF9leGNlcHRpb24gPT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9leGNlcHRpb24gPT0gbnVsbCk7CiAgICAgICAgIAogICAgICAgICBfdmFsaWRhdG9yLm5leHRFdmVudCgga2luZCwgdGhpcyApOwogCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCmluZGV4IDc1NTE3ODQuLjFjZDI4NWYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CkBAIC0xMjAsNyArMTIxLDggQEAKIAogICAgICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGV2ZW50ICE9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZXZlbnQgIT0gbnVsbCk7CiAKICAgICAgICAgICAgICAgICBfZXJyb3JMaXN0ZW5lci5hZGQoCiAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckN1cnNvciggbXNnLCBzZXZlcml0eSwgZXZlbnQuZ2V0TG9jYXRpb25Bc0N1cnNvcigpICkgKTsKQEAgLTE3OCw5ICsxODAsOSBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAga2luZCA9PSBCRUdJTiB8fCBraW5kID09IEFUVFIgfHwKLSAgICAgICAgICAgICAgICAgICAga2luZCA9PSBFTkQgfHwga2luZCA9PSBURVhUIHx8IGtpbmQgPT0gRU5EQVRUUlM7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBraW5kID09IEJFR0lOIHx8IGtpbmQgPT0gQVRUUiB8fAorICAgICAgICAgICAgICAgICAgICBraW5kID09IEVORCB8fCBraW5kID09IFRFWFQgfHwga2luZCA9PSBFTkRBVFRSUyk7CiAKICAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQogICAgICAgICAgICAgewpAQCAtMjEzLDcgKzIxNSw4IEBACiAKICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBldmVudC5nZXROYW1lKCk7CiAKLSAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKG5hbWUgIT0gbnVsbCk7CiAKICAgICAgICAgICAgIHN0YXRlLl9pc0VtcHR5ID0gZmFsc2U7CiAKQEAgLTI4NSw4ICsyODgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjdXJyZW50UGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCk7CiAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50IHBhcnRpY2xlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUKICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZXZlbnQsIHRoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIHN1YnN0aXR1dGUgZm9yCkBAIC0zMDUsNyArMzA4LDggQEAKIAogICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IG5ld0ZpZWxkID0gX2dsb2JhbFR5cGVzLmZpbmRFbGVtZW50KG5hbWUpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBuZXdGaWVsZCAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobmV3RmllbGQgIT0gbnVsbCk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZpZWxkICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTMyMiw3ICszMjYsOCBAQAogICAgICAgICAgICAgZWxlbWVudFR5cGUgPSBlbGVtZW50RmllbGQuZ2V0VHlwZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IGVsZW1lbnRUeXBlICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShlbGVtZW50VHlwZSAhPSBudWxsKTsKIAogICAgICAgICAvLwogICAgICAgICAvLyB0aGUgbm8tdHlwZSBpcyBhbHdheXMgaW52YWxpZCAoZXZlbiBpZiB0aGVyZSBpcyBhbiB4c2k6dHlwZSkKQEAgLTYyMSw3ICs2MjYsOCBAQAogICAgICAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5MQVgpCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBhc3NlcnQgd2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLlNUUklDVDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLlNUUklDVCk7CiAKICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAogICAgICAgICAgICAgICAgIGV2ZW50LApAQCAtODM4LDcgKzg0NCw4IEBACiAKICAgICAgICAgU2NoZW1hUGFydGljbGUgY3VycmVudFBhcnRpY2xlICggKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3Zpc2l0b3IgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3Zpc2l0b3IgIT0gbnVsbCk7CiAgICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IuY3VycmVudFBhcnRpY2xlKCk7CiAgICAgICAgIH0KIApAQCAtOTcwLDcgKzk3Nyw4IEBACiAgICAgICAgIGlmICghdHlwZS5pc1NpbXBsZVR5cGUoKSAmJgogICAgICAgICAgICAgICAgIHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgIC8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGEgc2ltcGxlIHR5cGUiICk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICB9CkBAIC0xMDYwLDcgKzEwNjgsOCBAQAogICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkgJiYKICAgICAgICAgICAgICAgICB0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBhIHNpbXBsZSB0eXBlIiApOwogICAgICAgICB9CiAKQEAgLTEwODMsNyArMTA5Miw4IEBACiAgICAgewogICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgb25seSBhbiBhdG9taWMgdHlwZSB0byB2YWxpZGF0ZQogCi0gICAgICAgIGFzc2VydCB0eXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkFUT01JQzsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDKTsKIAogICAgICAgICAvLyBSZWNvcmQgdGhlIGN1cnJlbnQgZXJyb3Igc3RhdGUgdG8gc2VlIGlmIGFueSBuZXcgZXJyb3JzIGFyZSBtYWRlCiAgICAgICAgIGludCBlcnJvclN0YXRlID0gX2Vycm9yU3RhdGU7CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YQppbmRleCA4Y2UwOWQxLi5iMjFmNjA3IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlci5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKIApAQCAtNDIsNyArNDMsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgc2V0X0JpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwocykpOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSAvL2pkayAxLjMgZG9lc24ndCBhbHdheXMgY2hlY2sgbGVuZ3RoCiAgICAgICAgIHsKICAgICAgICAgICAgIF92b29yVmMuaW52YWxpZCgiSW52YWxpZCBEZWNpbWFsIik7CiAgICAgICAgIH0KQEAgLTE1Niw3ICsxNTcsOCBAQAogICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIEJpZ0RlY2ltYWwuaGFzaENvZGUoKQogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZGVjaW1hbEhhc2hDb2RlKCkgewotICAgICAgICBhc3NlcnQgX3ZhbHVlLnNjYWxlKCkgPiAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3ZhbHVlLnNjYWxlKCkgPiAwKTsKIAogICAgICAgICAvLyBHZXQgZGVjaW1hbCB2YWx1ZSBhcyBzdHJpbmcsIGFuZCBzdHJpcCBvZmYgemVyb2VzIG9uIHRoZSByaWdodAogICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBfdmFsdWUudG9TdHJpbmcoKTsKQEAgLTE2NCw3ICsxNjYsOCBAQAogICAgICAgICBmb3IgKGkgPSBzdHJWYWx1ZS5sZW5ndGgoKSAtIDEgOyBpID49IDAgOyBpIC0tKQogICAgICAgICAgICAgaWYgKHN0clZhbHVlLmNoYXJBdChpKSAhPSAnMCcpIGJyZWFrOwogCi0gICAgICAgIGFzc2VydCBzdHJWYWx1ZS5pbmRleE9mKCcuJykgPCBpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc3RyVmFsdWUuaW5kZXhPZignLicpIDwgaSk7CiAKICAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW5vbmljYWxpemVkIHN0cmluZyBoYXNoY29kZQogICAgICAgICByZXR1cm4gc3RyVmFsdWUuc3Vic3RyaW5nKDAsIGkgKyAxKS5oYXNoQ29kZSgpOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXJFeC5qYXZhCmluZGV4IDNlZWFhZjkuLmNjZDM4NDggMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyRXguamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRGVjaW1hbEhvbGRlckV4LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHYgPSBuZXcgQmlnRGVjaW1hbChzKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgLy9qZGsgMS4zIGRvZXNuJ3QgYWx3YXlzIGNoZWNrIGxlbmd0aAogICAgICAgICB7CiAgICAgICAgICAgICBfdm9vclZjLmludmFsaWQoIkludmFsaWQgRGVjaW1hbCIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEYXRlSG9sZGVyRXguamF2YQppbmRleCBkNzgwNDNjLi42MDhmMTY1IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CiAKQEAgLTE2NSw3ICsxNjYsOCBAQAogICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXRZZWFyKCk7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKaW5kZXggYTA3OTMyYi4uNDEwYTc1NyAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKQEAgLTc3LDcgKzc4LDggQEAKICAgICAgICAgCiAgICAgICAgIFN0cmluZyBwcmVmaXggPSBuc20uZmluZF9wcmVmaXhfZm9yX25zdXJpKCBuYW1lc3BhY2UsIG51bGwgKTsKIAotICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwcmVmaXggIT0gbnVsbCk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxQYXJ0OwogICAgIH0KQEAgLTE1MSw3ICsxNTMsOCBAQAogICAgIC8vIEJVR0JVRyAtIGhhdmluZyBwcmVmaXggaGVyZSBtYXkgbm90IHdvcmsKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfUU5hbWUoUU5hbWUgbmFtZSkKICAgICB7Ci0gICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShuYW1lICE9IG51bGwpOwogICAgICAgICAKICAgICAgICAgLy8gU3luYyBmb3JjZSBvZiBjcmVhdGlvbiBvZiBuYW1lc2FwY2UgbWFwcGluZyAuLgogICAgICAgICAKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZUNvbnRleHQuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL05hbWVzcGFjZUNvbnRleHQuamF2YQppbmRleCA3NWI1NjA4Li4xYmFlNjkzIDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VDb250ZXh0LmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTM3LDcgKzEzOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJlZml4UmVzb2x2ZXIpX29iaikuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJJbXByb3Blcmx5IGluaXRpYWxpemVkIE5hbWVzcGFjZUNvbnRleHQuIjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIkltcHJvcGVybHkgaW5pdGlhbGl6ZWQgTmFtZXNwYWNlQ29udGV4dC4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKaW5kZXggNjUzYTU5Mi4uYTVkYWFhMCAxMDA2NDQKLS0tIGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKQEAgLTQ3LDcgKzQ3LDggQEAKIAogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldF9TdHJpbmcoU3RyaW5nIHYpCiAgICAgewotICAgICAgICBhc3NlcnQgX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKTsKIAogICAgICAgICBpZiAoX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgJiYKICAgICAgICAgICAgICAgICAhX3NjaGVtYVR5cGUuaXNOb1R5cGUoKSkKQEAgLTYxLDkgKzYyLDEwIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgc2V0X3RleHQoU3RyaW5nIHN0cikKICAgICB7Ci0gICAgICAgIGFzc2VydAorICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoCiAgICAgICAgICAgICBfc2NoZW1hVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCB8fAotICAgICAgICAgICAgICAgIF9zY2hlbWFUeXBlLmlzTm9UeXBlKCk7CisgICAgICAgICAgICAgICAgX3NjaGVtYVR5cGUuaXNOb1R5cGUoKSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlX2Zyb21fY29tcGxleF9jb250ZW50KCkKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE9iamVjdEJhc2UuamF2YQppbmRleCA5MzhkYjk1Li5mM2ZlMWQyIDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxPYmplY3RCYXNlLmphdmEKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sT2JqZWN0QmFzZS5qYXZhCkBAIC00OTQsOSArNDk0LDEyIEBACiAgICAgfQogCiAgICAgewotICAgICAgICBhc3NlcnQgVHlwZVN0b3JlLk5JTExBQkxFICAgPT0gMTsKLSAgICAgICAgYXNzZXJ0IFR5cGVTdG9yZS5IQVNERUZBVUxUID09IDI7Ci0gICAgICAgIGFzc2VydCBUeXBlU3RvcmUuRklYRUQgICAgICA9PSA0OworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShUeXBlU3RvcmUuTklMTEFCTEUgICA9PSAxKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoVHlwZVN0b3JlLkhBU0RFRkFVTFQgPT0gMik7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFR5cGVTdG9yZS5GSVhFRCAgICAgID09IDQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMTEFCTEUgICAgICAgID0gVHlwZVN0b3JlLk5JTExBQkxFOwpAQCAtNzEwLDcgKzcxMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgaW52YWxpZGF0ZV92YWx1ZSgpCiAgICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwogICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxVRV9EQVRFRDsKICAgICB9CiAKQEAgLTcyOCw3ICs3MzIsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfbmlsdmFsdWUoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRDsKICAgICB9CiAKQEAgLTc0MSw3ICs3NDYsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfZWxlbWVudF9vcmRlcigpCiAgICAgewotICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOwogICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxVRV9EQVRFRCB8IEZMQUdfTklMX0RBVEVEIHwgRkxBR19FTEVNRU5UX0RBVEVEOwogICAgIH0KIApAQCAtNzUxLDcgKzc1Nyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFR5cGVTdG9yZSBnZXRfc3RvcmUoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKICAgICAgICAgcmV0dXJuIChUeXBlU3RvcmUpX3RleHRzb3VyY2U7CiAgICAgfQogCkBAIC03NjcsOCArNzc0LDExIEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBidWlsZF90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKLSAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1ZBTFVFX0RBVEVEKSA9PSAwKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKChfZmxhZ3MgJiAoRkxBR19OSUwgfCBGTEFHX0lTREVGQVVMVCkpICE9IDApCiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIHJldHVybiBjb21wdXRlX3RleHQoCkBAIC03ODEsOCArNzkxLDExIEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYnVpbGRfbmlsKCkKICAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKF9mbGFncyAmIEZMQUdfVkFMVUVfREFURUQpID09IDApOworICAgICAgICB9CiAgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19OSUwpICE9IDA7CiAgICAgfQogCkBAIC04MDYsNyArODE5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCkKICAgICB7Ci0gICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7CiAgICAgICAgIF9mbGFncyB8PSBGTEFHU19EQVRFRCB8IEZMQUdfT1JQSEFORUQ7CiAgICAgICAgIC8vIGRvIE5PVCBudWxsIG91dCBfdGV4dHNvdXJjZSwgYmVjYXVzZSB3ZSBuZWVkIGl0IG5vbi1udWxsIGZvciBzeW5jaHJvbml6YXRpb24KICAgICB9CkBAIC04NzYsNyArODkwLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChRTmFtZSBlbHROYW1lKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KF9pc0NvbXBsZXhDb250ZW50KCkpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2lzQ29tcGxleENvbnRlbnQoKSk7CiAgICAgICAgIGlmICghX2lzQ29tcGxleENvbnRlbnQoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKIApAQCAtODkyLDcgKzkwNyw4IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdGV4dChRTmFtZSBhdHRyTmFtZSkKICAgICB7Ci0gICAgICAgIGFzc2VydChfaXNDb21wbGV4VHlwZSgpKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9pc0NvbXBsZXhUeXBlKCkpOwogICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAKQEAgLTExNjEsNyArMTE3Nyw4IEBACiAgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfT1JQSEFORUQpICE9IDApCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uKCk7CiAKLSAgICAgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKIAogICAgICAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOwogCkBAIC0xNjE5LDcgKzE2MzYsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIHYgPSAoWG1sQW55U2ltcGxlVHlwZSlvYmo7CiAgICAgICAgICAgICBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSA9ICgoU2ltcGxlVmFsdWUpdikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnQoaW5zdGFuY2VUeXBlICE9IG51bGwpIDogIk5pbCBjYXNlIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5IjsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpbnN0YW5jZVR5cGUgIT0gbnVsbCwgIk5pbCBjYXNlIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5Iik7CiAKICAgICAgICAgICAgIC8vIGhhbmRsZSBsaXN0cwogICAgICAgICAgICAgaWYgKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQpAQCAtMTYzNiwxMSArMTY1NCwxMyBAQAogICAgICAgICAgICAgLy8gaGFuZGxlIGF0b21pYyB0eXBlcwogICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUMpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUMpOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdGFuY2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogImVuY291bnRlcmVkIG5vbnByaW1pdGl2ZSB0eXBlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIik7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRTogIFRoaXMgaXMgaGFuZGxlZCBiZWxvdy4uLgogICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgZXZlbnR1YWxseSB3YW50IHRvIGhhbmRsZSBpdCB3aXRoIGEgdHJlZWNvcHksIHNvCiAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgd2Ugc2hvdWxkIGJyZWFrIGhlcmUuCkBAIC0xNzI5LDcgKzE3NDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiaW52YWxpZCBudW1lcmljIGJpdCBjb3VudCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKQEAgLTE4OTgsNyArMTkxOSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KQogICAgICAgICB7IHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZih2KSk7IH0KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfY2hhcihjaGFyIHYpCi0gICAgICAgIHsgc2V0X1N0cmluZyhDaGFyYWN0ZXIudG9TdHJpbmcodikpOyB9CisgICAgICAgIHsgc2V0X1N0cmluZyhuZXcgU3RyaW5nKG5ldyBjaGFyW10ge3Z9KSk7IH0KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKICAgICAgICAgeyBzZXRfQmlnRGVjaW1hbChuZXcgQmlnRGVjaW1hbCh2KSk7IH0KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KQpAQCAtMTkzOCw3ICsxOTU5LDkgQEAKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wYXJhYmxlX3ZhbHVlX3NwYWNlcyhTY2hlbWFUeXBlIHQxLCBTY2hlbWFUeXBlIHQyKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KHQxLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OICYmIHQyLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHQxLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OCisgICAgICAgICAgICAgICAgICAgICYmIHQyLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKTsKIAogICAgICAgICBpZiAoIXQxLmlzU2ltcGxlVHlwZSgpICYmICF0Mi5pc1NpbXBsZVR5cGUoKSkKICAgICAgICAgICAgIHJldHVybiAodDEuZ2V0Q29udGVudFR5cGUoKSA9PSB0Mi5nZXRDb250ZW50VHlwZSgpKTsKQEAgLTIzNzYsOSArMjM5OSwxMyBAQAogICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKFhtbEJlYW5zLnR5cGVGb3JDbGFzcyhfeGJlYW5DbGFzcykpOwogICAgICAgICAgICAgICAgIF9pbXBsID0gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSh4bWxUZXh0LCBudWxsLCBvcHRzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIGNhdGNoKFhtbEV4Y2VwdGlvbiB4ZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pKG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkuaW5pdENhdXNlKGUpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbih4ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oY25mZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjUzOCw3ICsyNTY1LDggQEAKICAgICAgICAgICAgIHJldHVybiBvYmo7CiAKICAgICAgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUgPSAoKFNpbXBsZVZhbHVlKW9iaikuaW5zdGFuY2VUeXBlKCk7Ci0gICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUgIT0gbnVsbCkgOiAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlIjsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGluc3RhbmNlVHlwZSAhPSBudWxsLCAiTmlsIGNhc2Ugc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFib3ZlIik7CiAKICAgICAgICAgLy8gaGFuZGxlIGxpc3RzCiAgICAgICAgIGlmIChpbnN0YW5jZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKQEAgLTI1ODQsNyArMjYxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKIAogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJpbnZhbGlkIG51bWVyaWMgYml0IGNvdW50Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAogICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOwpAQCAtMjYwNyw3ICsyNjM2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRDYWxlbmRhclZhbHVlKCk7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJlbmNvdW50ZXJlZCBub25wcmltaXRpdmUgdHlwZS4iOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiZW5jb3VudGVyZWQgbm9ucHJpbWl0aXZlIHR5cGUuIik7CiAgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKIAogICAgICAgICAgICAgLy8gTkI6IGZvciBzdHJpbmcgZW51bXMgd2UganVzdCBkbyBqYXZhLmxhbmcuU3RyaW5nCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbmlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCmluZGV4IDMyNjQ4MDguLjNkOGM5MTcgMTAwNjQ0Ci0tLSBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCkBAIC0zMCw2ICszMCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFJ1bnRpbWVFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CkBAIC05Myw3ICs5NSw4IEBACiAKICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0eXBlcywgdHJ5aW5nIHRvIGNyZWF0ZSBhIHR5cGUKICAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBfc2NoZW1hVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0KG1lbWJlcnMgIT0gbnVsbCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShtZW1iZXJzICE9IG51bGwpOwogCiAgICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7CiAgICAgICAgIC8vIGJvb2xlYW4gd2Fzc3RyaWN0ID0gc2V0X3N0cmljdCh0cnVlKTsgLy8gdGVsbCB0eXBlcyB0byBjb21wbGFpbiBmZXJ2ZXJlbnRseSBhYm91dCBlcnJvcnMKQEAgLTEyNyw4ICsxMzAsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVHJvdWJsZXNvbWUgdW5pb24gZXhjZXB0aW9uIGNhdXNlZCBieSB1bmV4cGVjdGVkICIgKyBlLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0KGZhbHNlKSA6ICJVbmV4cGVjdGVkICIgKyBlOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigiVHJvdWJsZXNvbWUgdW5pb24gZXhjZXB0aW9uIGNhdXNlZCBieSB1bmV4cGVjdGVkICIgKyBlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgKFhtbEJlYW5zLkFTU0VSVFMpIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJVbmV4cGVjdGVkICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzM3LDcgKzM0MCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2dpY2FsX292ZXJsYXAoU2NoZW1hVHlwZSB0eXBlLCBpbnQgamF2YWNvZGUpCiAgICAgewogICAgICAgICAvLyBub24tdW5pb24gdHlwZXMgYmVjYXVzZSBpdCdzIGJlaW5nIGFwcGxpZWQgb24gaXJyZWR1Y2libGUgdW5pb24gbWVtYmVycyEKLSAgICAgICAgYXNzZXJ0KHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7CiAKICAgICAgICAgaWYgKGphdmFjb2RlIDw9IFNjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTikKICAgICAgICAgewpAQCAtNDE4LDcgKzQyMiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQoZmFsc2UpIDogIm1pc3NpbmcgY2FzZSI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIm1pc3NpbmcgY2FzZSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC00MjksNyArNDM0LDggQEAKICAgICBwcml2YXRlIHZvaWQgc2V0X3ByaW1pdGl2ZShpbnQgdHlwZWNvZGUsIE9iamVjdCB2YWwpCiAgICAgewogICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVycyA9IF9zY2hlbWFUeXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpOwotICAgICAgICBhc3NlcnQobWVtYmVycyAhPSBudWxsKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKG1lbWJlcnMgIT0gbnVsbCk7CiAKICAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKGhhc19zdG9yZSgpKQpAQCAtNDU4LDcgKzQ2NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIlVuZXhwZWN0ZWQgIiArIGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiVW5leHBlY3RlZCAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YQppbmRleCBjZmE0YjNlLi43MzI0NTU4IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKQEAgLTE1LDcgKzE1LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOwogCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBYbWxSdW50aW1lRXhjZXB0aW9uCiB7CiAgICAgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gKCApCiAgICAgewpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQppbmRleCAzZjY4M2Q3Li41MGUwOGU4IDEwMDY0NAotLS0gYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5TdHJpbmdVdGlsczsKIAogcHVibGljIGZpbmFsIGNsYXNzIFNPQVBBcnJheVR5cGUKIHsKQEAgLTE1NCw3ICsxNTUsNyBAQAogICAgICAgICAgICAgX3R5cGUgPSBuYW1lOwogICAgICAgICAgICAgX3JhbmtzID0gRU1QVFlfSU5UX0FSUkFZOwogICAgICAgICAgICAgZGltZW5zaW9ucyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoZGltZW5zaW9ucywgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkaW1TdHJpbmdzID0gZGltZW5zaW9ucy5zcGxpdCgiICIpOworICAgICAgICAgICAgU3RyaW5nW10gZGltU3RyaW5ncyA9IFN0cmluZ1V0aWxzLnNwbGl0KGRpbWVuc2lvbnMsICcgJyk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbVN0cmluZ3MubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGRpbVN0cmluZyA9IGRpbVN0cmluZ3NbaV07CkBAIC0zNDYsNyArMzQ3LDcgQEAKICAgICB7CiAgICAgICAgIGludCBbXSByYW5rcyA9IEVNUFRZX0lOVF9BUlJBWTsKICAgICAgICAgYXJyYXlTaXplID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShhcnJheVNpemUsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOwotICAgICAgICBTdHJpbmdbXSBkaW1TdHJpbmdzID0gYXJyYXlTaXplLnNwbGl0KCIgIik7CisgICAgICAgIFN0cmluZ1tdIGRpbVN0cmluZ3MgPSBTdHJpbmdVdGlscy5zcGxpdChhcnJheVNpemUsICcgJyk7CiAgICAgICAgIGludFtdIGRpbWVuc2lvbnMgPSBuZXcgaW50W2RpbVN0cmluZ3MubGVuZ3RoXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1TdHJpbmdzLmxlbmd0aDsgaSsrKQogICAgICAgICB7CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEKaW5kZXggYmY3MWQ4OS4uZTU4MGQ1MiAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0Jhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpAQCAtMTcsNyArMTcsOSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uTmV0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi54c2Rvd25sb2FkLkRvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkRvd25sb2FkZWRTY2hlbWFzOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54bWxiZWFuLnhzZG93bmxvYWQuRG93bmxvYWRlZFNjaGVtYUVudHJ5OwpAQCAtMzEsMTAgKzMzLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKQEAgLTcyLDcgKzczLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgeHNkb3dubG9hZC54bWw6IHBsZWFzZSBmaXggb3IgZGVsZXRlIHRoaXMgZmlsZSIpKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIlByb2JsZW0gcmVhZGluZyB4c2Rvd25sb2FkLnhtbDogcGxlYXNlIGZpeCBvciBkZWxldGUgdGhpcyBmaWxlIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKF9pbXBvcnRzRG9jID09IG51bGwpCkBAIC04NSw3ICs4Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzYxLDcgKzM2Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAKICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gc3RyID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGlucHV0LCBzaGEpOwpAQCAtNTA0LDkgKzUwNSw5IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIHVuaXF1ZUZpbGVuYW1lRm9yVVJJKFN0cmluZyBzY2hlbWFMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24KKyAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVGaWxlbmFtZUZvclVSSShTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgbG9jYWxGaWxlbmFtZSA9IG5ldyBVUkkoIHNjaGVtYUxvY2F0aW9uICkuZ2V0UmF3UGF0aCgpOworICAgICAgICBTdHJpbmcgbG9jYWxGaWxlbmFtZSA9IE5ldFV0aWxzLmRlY29kZVBhdGgobmV3IFVSTChzY2hlbWFMb2NhdGlvbikuZ2V0UGF0aCgpKTsKICAgICAgICAgaW50IGkgPSBsb2NhbEZpbGVuYW1lLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgIGlmIChpID49IDApCiAgICAgICAgICAgICBsb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZS5zdWJzdHJpbmcoaSArIDEpOwpAQCAtNTU0LDggKzU1NSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCBzY2hlbWFMb2NhdGlvbiApOwogICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJBcGFjaGUgWE1MQmVhbnMvMS4wLjMiKTsKLSAgICAgICAgICAgIGNvbm4uYWRkUmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qIik7CisgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJBcGFjaGUgWE1MQmVhbnMvMS4wLjMiKTsKKyAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qIik7CiAgICAgICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBpbnB1dCA9IGRpZ2VzdElucHV0U3RyZWFtKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSk7CiAgICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoaW5wdXQsIGJ1ZmZlcik7CiAgICAgICAgICAgICBkaWdlc3QgPSBIZXhCaW4uYnl0ZXNUb1N0cmluZyhpbnB1dC5nZXRNZXNzYWdlRGlnZXN0KCkuZGlnZXN0KCkpOwpAQCAtNTk2LDcgKzU5Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRhcmdldEZpbGVuYW1lID0gdW5pcXVlRmlsZW5hbWVGb3JVUkkoc2NoZW1hTG9jYXRpb24pOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKKyAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB3YXJuaW5nKCJJbnZhbGlkIFVSSSAnIiArIHNjaGVtYUxvY2F0aW9uICsgIic6IiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKaW5kZXggNzJmZGE4OC4uZWI2N2M0ZCAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YQorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db2RlR2VuVXRpbC5qYXZhCkBAIC0xNSw2ICsxNSw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU3RyaW5nVXRpbHM7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTI1LDkgKzI4LDkgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBDb2RlR2VuVXRpbAogewpAQCAtMzYsMjYgKzM5LDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT01QSUxFUiA9ICJqYXZhYyI7CiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9KQVIgPSAiamFyIjsKIAotICAgIC8vd29ya2Fyb3VuZCBmb3IgU3VuIGJ1ZyAjIDQ3MjM3MjYKLSAgICBwdWJsaWMgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBVUkkgY2hpbGQpCisgICAgcHVibGljIHN0YXRpYyBVUkwgcmVzb2x2ZShVUkwgYmFzZSwgU3RyaW5nIGNoaWxkKQogICAgIHsKLSAgICAgICAgVVJJIHJ1cmkgPSBiYXNlLnJlc29sdmUoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy9maXggdXAgbm9ybWFsaXphdGlvbiBidWcKLSAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHMocnVyaS5nZXRTY2hlbWUoKSkgJiYgISBjaGlsZC5lcXVhbHMocnVyaSkpCisgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmFzZS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSAmJiAhcnVyaS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLy8iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICIvLy8iLmNvbmNhdChydXJpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydXJpID0gbmV3IFVSSSgiZmlsZSIsIG51bGwsIHBhdGgsIHJ1cmkuZ2V0UXVlcnkoKSwgcnVyaS5nZXRGcmFnbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIHVyaXMpCi0gICAgICAgICAgICAgICAge30KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKGJhc2UsIGNoaWxkKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVyaTsKKyAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICBzdGF0aWMgdm9pZCBhZGRBbGxKYXZhRmlsZXMoTGlzdCBzcmNGaWxlcywgTGlzdCBhcmdzKQpAQCAtODksNyArODIsNyBAQAogCiAgICAgICAgIC8vIGJpemFycmUuICBqYXZhYyBleHBlY3RzIGJhY2tzbGFzaCBlc2NhcGluZyBpZiB3ZSBxdW90ZSB0aGUgY2xhc3NwYXRoCiAgICAgICAgIC8vIGJpemFycmUgYWxzby4gIHJlcGxhY2VBbGwgZXhwZWN0cyByZXBsYWNlbWVudCBiYWNrc2xhc2hlcyB0byBiZSBkb3VibGUgZXNjYXBlZC4KLSAgICAgICAgcmV0dXJuICJcIiIgKyBmaWxlbmFtZS5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIikgKyAiXCIiOworICAgICAgICByZXR1cm4gIlwiIiArIFN0cmluZ1V0aWxzLnJlcGxhY2VBbGwoZmlsZW5hbWUsICJcXFxcIiwgIlxcXFxcXFxcIikgKyAiXCIiOwogICAgIH0KIAogICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBxdW90ZU5vRXNjYXBlRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQpAQCAtMTI1LDcgKzExOCw4IEBACiAgICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKIAogICAgICAgICBGaWxlIGphdmFjID0gZmluZEphdmFUb29sKGphdmFjUGF0aCA9PSBudWxsID8gREVGQVVMVF9DT01QSUxFUiA6IGphdmFjUGF0aCk7Ci0gICAgICAgIGFzc2VydCAoamF2YWMuZXhpc3RzKCkpIDogImNvbXBpbGVyIG5vdCBmb3VuZCAiICsgamF2YWM7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShqYXZhYy5leGlzdHMoKSwgImNvbXBpbGVyIG5vdCBmb3VuZCAiICsgamF2YWMpOwogICAgICAgICBhcmdzLmFkZChqYXZhYy5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKICAgICAgICAgaWYgKG91dGRpciA9PSBudWxsKQpAQCAtMTY0LDkgKzE1OCw2IEBACiAgICAgICAgICAgICBhcmdzLmFkZChxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKGNsYXNzUGF0aC50b1N0cmluZygpKSk7CiAgICAgICAgIH0KIAotICAgICAgICBhcmdzLmFkZCgiLXNvdXJjZSIpOwotICAgICAgICBhcmdzLmFkZCgiMS40Iik7Ci0KICAgICAgICAgYXJncy5hZGQoZGVidWcgPyAiLWciIDogIi1nOm5vbmUiKTsKIAogICAgICAgICBpZiAodmVyYm9zZSkKQEAgLTI0Niw3ICsyMzcsNiBAQAogICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiJ2phdmFjJyBpcyByZXF1aXJlZCBvbiB0aGUgcGF0aC4iKTsKIAogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRDYXVzZSgpKTsKICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNjAsNyArMjUwLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIEZpbGVbXSBzeXN0ZW1DbGFzc3BhdGgoKQogICAgIHsKICAgICAgICAgTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nW10gc3lzdGVtY3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgIFN0cmluZ1tdIHN5c3RlbWNwID0gU3RyaW5nVXRpbHMuc3BsaXQoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSwgRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3lzdGVtY3AubGVuZ3RoOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGNwLmFkZChuZXcgRmlsZShzeXN0ZW1jcFtpXSkpOwpAQCAtMjc4LDcgKzI2OCw4IEBACiAgICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKIAogICAgICAgICBGaWxlIGphciA9IGZpbmRKYXZhVG9vbChqYXJQYXRoID09IG51bGwgPyBERUZBVUxUX0pBUiA6IGphclBhdGgpOwotICAgICAgICBhc3NlcnQgKGphci5leGlzdHMoKSkgOiAiamFyIG5vdCBmb3VuZCAiICsgamFyOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoamFyLmV4aXN0cygpLCAiamFyIG5vdCBmb3VuZCAiICsgamFyKTsKICAgICAgICAgYXJncy5hZGQoamFyLmdldEFic29sdXRlUGF0aCgpKTsKIAogICAgICAgICBhcmdzLmFkZCgiY2YiICsgKHZlcmJvc2UgPyAidiIgOiAiIikpOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvbW1hbmRMaW5lLmphdmEKaW5kZXggMTA1YzU3Mi4uMjYzMzA3MyAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29tbWFuZExpbmUuamF2YQorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhCkBAIC0xNiwyMyArMTYsMjMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5ldFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIAogcHVibGljIGNsYXNzIENvbW1hbmRMaW5lCiB7CiAgICAgcHVibGljIENvbW1hbmRMaW5lKFN0cmluZ1tdIGFyZ3MsIENvbGxlY3Rpb24gc2NoZW1lKQogICAgIHsKLSAgICAgICAgX29wdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBfb3B0aW9ucyA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIEFycmF5TGlzdCBlbmRhcmdzID0gbmV3IEFycmF5TGlzdCgpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKQEAgLTEyNSwxMCArMTI1LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSBjdXJyVXJpID0gZmlsZXNbaV0udG9VUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgVVJMIGN1cnJVcmkgPSBJT1V0aWwuZmlsZVRvVVJMKGZpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgdXAgb24gdGhlIGJhc2VkaXIuIFRoZXJlIG1heSBiZSBub25lCi0gICAgICAgICAgICAgICAgICAgIGlmIChfYmFzZURpciAhPSBudWxsICYmIF9iYXNlRGlyLnRvVVJJKCkucmVsYXRpdml6ZShjdXJyVXJpKS5lcXVhbHMoY3VyclVyaSkpCisgICAgICAgICAgICAgICAgICAgIGlmIChfYmFzZURpciAhPSBudWxsICYmIGN1cnJVcmkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgTmV0VXRpbHMucmVsYXRpdml6ZShJT1V0aWwuZmlsZVRvVVJMKF9iYXNlRGlyKS5nZXRQYXRoKCksIGN1cnJVcmkuZ2V0UGF0aCgpKSkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIF9iYXNlRGlyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmFzZURpciA9IHRydWU7CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9GYWN0b3JJbXBvcnRzLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9GYWN0b3JJbXBvcnRzLmphdmEKaW5kZXggMDQwOTA1Mi4uYWNlYjNhMyAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRmFjdG9ySW1wb3J0cy5qYXZhCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0ZhY3RvckltcG9ydHMuamF2YQpAQCAtMzMsMTEgKzMzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5OZXRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiAKQEAgLTMxMiwyMSArMzEzLDIzIEBACiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBvdXRwdXRGaWxlRm9yKEZpbGUgZmlsZSwgRmlsZSBiYXNlRGlyLCBGaWxlIG91dGRpcikKICAgICB7Ci0gICAgICAgIFVSSSBiYXNlID0gYmFzZURpci5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICBVUkkgYWJzID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOwotICAgICAgICBVUkkgcmVsID0gYmFzZS5yZWxhdGl2aXplKGFicyk7Ci0gICAgICAgIGlmIChyZWwuaXNBYnNvbHV0ZSgpKQorICAgICAgICBiYXNlRGlyID0gYmFzZURpci5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgZmlsZSA9IGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7CisKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBJT1V0aWwuZmlsZVRvVVJMKGJhc2VEaXIpLmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFicyA9IElPVXRpbC5maWxlVG9VUkwoZmlsZSkuZ2V0UGF0aCgpOworCisgICAgICAgIFN0cmluZyByZWwgPSBOZXRVdGlscy5yZWxhdGl2aXplKGJhc2UsIGFicyk7CisgICAgICAgIGlmIChyZWwuZXF1YWxzKGFicykpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IHJlbGF0aXZpemUgIiArIGZpbGUpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFVSSSBvdXRiYXNlID0gb3V0ZGlyLnRvVVJJKCk7Ci0gICAgICAgIFVSSSBvdXQgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG91dGJhc2UsIHJlbCk7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShvdXQpOworCisgICAgICAgIHJldHVybiBuZXcgRmlsZShvdXRkaXIsIHJlbCk7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIFVSSSBjb21tb25BbmNlc3RvcihVUkkgZmlyc3QsIFVSSSBzZWNvbmQpCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbW1vbkFuY2VzdG9yKFVSTCBmaXJzdCwgVVJMIHNlY29uZCkKICAgICB7CiAgICAgICAgIFN0cmluZyBmaXJzdFN0ciA9IGZpcnN0LnRvU3RyaW5nKCk7CiAgICAgICAgIFN0cmluZyBzZWNvbmRTdHIgPSBzZWNvbmQudG9TdHJpbmcoKTsKQEAgLTM0NCw0MSArMzQ3LDM3IEBACiAgICAgICAgICAgICBpID0gZmlyc3RTdHIubGFzdEluZGV4T2YoJy8nLCBpKTsKICAgICAgICAgaWYgKGkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSShmaXJzdFN0ci5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlyc3RTdHIuc3Vic3RyaW5nKDAsIGkpOwogICAgIH0KICAgICAKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVsYXRpdmVVUklGb3IoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KQogICAgIHsKLSAgICAgICAgVVJJIGJhc2UgPSBzb3VyY2UuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgVVJJIGFicyA9IHRhcmdldC5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOworICAgICAgICBVUkwgYmFzZSA9IElPVXRpbC5maWxlVG9VUkwoc291cmNlLmdldEFic29sdXRlRmlsZSgpKTsKKyAgICAgICAgVVJMIGFicyA9IElPVXRpbC5maWxlVG9VUkwodGFyZ2V0LmdldEFic29sdXRlRmlsZSgpKTsKICAgICAgICAgLy8gZmluZCBjb21tb24gc3Vic3RyaW5nLi4uCi0gICAgICAgIFVSSSBjb21tb25CYXNlID0gY29tbW9uQW5jZXN0b3IoYmFzZSwgYWJzKTsKKyAgICAgICAgU3RyaW5nIGNvbW1vbkJhc2UgPSBjb21tb25BbmNlc3RvcihiYXNlLCBhYnMpOwogICAgICAgICBpZiAoY29tbW9uQmFzZSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGFicy50b1N0cmluZygpOwotICAgICAgICAKLSAgICAgICAgVVJJIGJhc2VyZWwgPSBjb21tb25CYXNlLnJlbGF0aXZpemUoYmFzZSk7Ci0gICAgICAgIFVSSSB0YXJnZXRyZWwgPSBjb21tb25CYXNlLnJlbGF0aXZpemUoYWJzKTsKLSAgICAgICAgaWYgKGJhc2VyZWwuaXNBYnNvbHV0ZSgpIHx8IHRhcmdldHJlbC5pc0Fic29sdXRlKCkpCisKKyAgICAgICAgU3RyaW5nIGJhc2VyZWwgPSBOZXRVdGlscy5yZWxhdGl2aXplKGNvbW1vbkJhc2UsIGJhc2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldHJlbCA9IE5ldFV0aWxzLnJlbGF0aXZpemUoY29tbW9uQmFzZSwgYWJzLmdldFBhdGgoKSk7CisKKyAgICAgICAgaWYgKGJhc2VyZWwuY2hhckF0KDApID09ICcvJyB8fCB0YXJnZXRyZWwuY2hhckF0KDApID09ICcvJykKICAgICAgICAgICAgIHJldHVybiBhYnMudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgIFN0cmluZyBzb3VyY2VSZWwgPSBiYXNlcmVsLnRvU3RyaW5nKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUmVsLmxlbmd0aCgpOykKICAgICAgICAgewogICAgICAgICAgICAgaSA9IHNvdXJjZVJlbC5pbmRleE9mKCcvJywgaSk7CiAgICAgICAgICAgICBpZiAoaSA8IDApCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwcmVmaXggKz0gIi4uLyI7CisgICAgICAgICAgICBwcmVmaXguYXBwZW5kKCIuLi8iKTsKICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4ICsgdGFyZ2V0cmVsLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBwcmVmaXguYXBwZW5kKHRhcmdldHJlbCkudG9TdHJpbmcoKTsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjb21tb25GaWxlRm9yKFN0cmluZyBjb21tb25OYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBpbnQgaSwgRmlsZSBvdXRkaXIpCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEKaW5kZXggZDI2Mzc0YS4uZDhiZTRmYyAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29kZUdlbmVyYXRvci5qYXZhCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKIAogaW1wb3J0IGphdmEuaW8uKjsKQEAgLTIxNyw3ICsyMTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9ICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBKYXhiQ29kZUdlbmVyYXRvcjogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgICAgICBYbWxSdW50aW1lRXhjZXB0aW9uIGUyID0gIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBKYXhiQ29kZUdlbmVyYXRvcjogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKTsKICAgICAgICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7CiAgICAgICAgICAgICAgICAgdGhyb3cgZTI7CiAgICAgICAgICAgICB9CkBAIC0yMzIsMTMgKzIzNCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgWG1sUnVudGltZUV4Y2VwdGlvbiBlMiA9IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIGUyLmluaXRDYXVzZShlKTsKICAgICAgICAgICAgIHRocm93IGUyOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgWG1sUnVudGltZUV4Y2VwdGlvbiBlMiA9IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIGUyLmluaXRDYXVzZShlKTsKICAgICAgICAgICAgIHRocm93IGUyOwogICAgICAgICB9CkBAIC0yNDgsNyArMjUwLDggQEAKICAgICB7CiAgICAgICAgIEZpbGUgbmV3ZGlyID0gKHN1YmRpciA9PSBudWxsKSA/IHJvb3RkaXIgOiBuZXcgRmlsZShyb290ZGlyLCBzdWJkaXIpOwogICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSAobmV3ZGlyLmV4aXN0cygpICYmIG5ld2Rpci5pc0RpcmVjdG9yeSgpKSB8fCBuZXdkaXIubWtkaXJzKCk7Ci0gICAgICAgIGFzc2VydChjcmVhdGVkKSA6ICJDb3VsZCBub3QgY3JlYXRlICIgKyBuZXdkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjcmVhdGVkLCAiQ291bGQgbm90IGNyZWF0ZSAiICsgbmV3ZGlyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgcmV0dXJuIG5ld2RpcjsKICAgICB9CiAKQEAgLTI3MCw3ICsyNzMsOCBAQAogICAgICAgICAgICAgaWYgKCF0bXBTcmNEaXIuZXhpc3RzKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gdG1wU3JjRGlyLm1rZGlycygpOwotICAgICAgICAgICAgICAgIGFzc2VydCBjcmVhdGVkIDogIkNvdWxkIG5vdCBjcmVhdGUgIiArIHRtcFNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjcmVhdGVkLCAiQ291bGQgbm90IGNyZWF0ZSAiICsgdG1wU3JjRGlyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvbXBpbGVyLmphdmEKaW5kZXggMzNkYzEwMC4uMDVjMzI0NSAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YQorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlci5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvclByaW50ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbExpc3RJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CkBAIC0zNSw3ICszNyw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIAogaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CiAKQEAgLTIwMSw3ICsyMDMsNyBAQAogICAgICAgICBTdHJpbmcgY3BTdHJpbmcgPSBjbC5nZXRPcHQoImNwIik7CiAgICAgICAgIGlmIChjcFN0cmluZyAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjcHBhcnRzID0gY3BTdHJpbmcuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNwcGFydHMgPSBTdHJpbmdVdGlscy5zcGxpdChjcFN0cmluZywgRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7CiAgICAgICAgICAgICBMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3BwYXJ0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICBjcExpc3QuYWRkKG5ldyBGaWxlKGNwcGFydHNbaV0pKTsKQEAgLTIyOSw5ICsyMzEsOSBAQAogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgIH0KICAgICAgICAgRmlsZSBiYXNlRGlyID0gY2wuZ2V0QmFzZURpcigpOwotICAgICAgICBVUkkgYmFzZVVSSSA9IGJhc2VEaXIgPT0gbnVsbCA/IG51bGwgOiBiYXNlRGlyLnRvVVJJKCk7CisgICAgICAgIFVSTCBiYXNlVVJMID0gYmFzZURpciA9PSBudWxsID8gbnVsbCA6IElPVXRpbC5maWxlVG9VUkwoYmFzZURpcik7CiAKLSAgICAgICAgWG1sRXJyb3JQcmludGVyIGVyciA9IG5ldyBYbWxFcnJvclByaW50ZXIodmVyYm9zZSwgYmFzZVVSSSk7CisgICAgICAgIFhtbEVycm9yUHJpbnRlciBlcnIgPSBuZXcgWG1sRXJyb3JQcmludGVyKHZlcmJvc2UsIGJhc2VVUkwpOwogCiAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoKTsKICAgICAgICAgcGFyYW1zLnNldEJhc2VEaXIoYmFzZURpcik7CkBAIC03MDMsOSArNzA1LDkgQEAKIAogICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbyA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG51bGwsIGNwUmVzb3VyY2VMb2FkZXIsIG51bGwpOwogCi0gICAgICAgIFVSSSBiYXNlVVJJID0gbnVsbDsKKyAgICAgICAgVVJMIGJhc2VVUkwgPSBudWxsOwogICAgICAgICBpZiAoYmFzZURpciAhPSBudWxsKQotICAgICAgICAgICAgYmFzZVVSSSA9IGJhc2VEaXIudG9VUkkoKTsKKyAgICAgICAgICAgIGJhc2VVUkwgPSBJT1V0aWwuZmlsZVRvVVJMKGJhc2VEaXIpOwogCiAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCk7CiAgICAgICAgIGlmIChkb3dubG9hZCkKQEAgLTcyNyw3ICs3MjksNyBAQAogICAgICAgICBwYXJhbXMuc2V0T3B0aW9ucyhvcHRzKTsKICAgICAgICAgcGFyYW1zLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0ZW5lcik7CiAgICAgICAgIHBhcmFtcy5zZXRKYXZhaXplKHRydWUpOwotICAgICAgICBwYXJhbXMuc2V0QmFzZVVSSShiYXNlVVJJKTsKKyAgICAgICAgcGFyYW1zLnNldEJhc2VVUkkoYmFzZVVSTCA9PSBudWxsID8gbnVsbCA6IGJhc2VVUkwudG9TdHJpbmcoKSk7CiAgICAgICAgIHBhcmFtcy5zZXRTb3VyY2VzVG9Db3B5TWFwKHNvdXJjZXNUb0NvcHlNYXApOwogICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKTsKICAgICB9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEKaW5kZXggZDc4Y2JjZS4uOGYyYTk1ZiAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29weS5qYXZhCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvcHkuamF2YQpAQCAtMjEsMTIgKzIxLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuRGVmaW5pdGlvbnNEb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5USW1wb3J0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKIAotaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC00NywxMyArNDYsMTIgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIFVSSSBzb3VyY2UgPSBudWxsOwotICAgICAgICBVUkkgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgVVJMIHNvdXJjZSA9IG51bGw7CisgICAgICAgIFVSTCB0YXJnZXQgPSBudWxsOwogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBzb3VyY2UgPSBuZXcgVVJJKGFyZ3NbMF0pOwotICAgICAgICAgICAgc291cmNlLnRvVVJMKCk7IC8vIHRvIHRyaWdnZXIgZXhjZXB0aW9uCisgICAgICAgICAgICBzb3VyY2UgPSBuZXcgVVJMKGFyZ3NbMF0pOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewpAQCAtNjUsMTAgKzYzLDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVSSSBkaXIgPSBuZXcgRmlsZSgiLiIpLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpOworICAgICAgICAgICAgICAgIFVSTCBkaXIgPSBuZXcgRmlsZSgiLiIpLmdldENhbm9uaWNhbEZpbGUoKS50b1VSTCgpOwogICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0UGFydCA9IHNvdXJjZS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgbGFzdFBhcnQgPSBsYXN0UGFydC5zdWJzdHJpbmcobGFzdFBhcnQubGFzdEluZGV4T2YoJy8nKSArIDEpOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IENvZGVHZW5VdGlsLnJlc29sdmUoZGlyLCBVUkkuY3JlYXRlKGxhc3RQYXJ0KSk7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShkaXIsIGxhc3RQYXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKQEAgLTgwLDEwICs3OCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBVUkkoYXJnc1sxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0YXJnZXQuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpCisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFVSTChhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQpAQCAtOTUsNyArOTEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEZpbGUodGFyZ2V0KS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEZpbGUoYXJnc1sxXSkuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJMKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7CkBAIC0xMTMsOCArMTA5LDggQEAKICAgICB7CiAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHVyaU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQogICAgICAgICB7Ci0gICAgICAgICAgICBVUkkgc291cmNlID0gKFVSSSlpLm5leHQoKTsKLSAgICAgICAgICAgIFVSSSB0YXJnZXQgPSAoVVJJKXVyaU1hcC5nZXQoc291cmNlKTsKKyAgICAgICAgICAgIFVSTCBzb3VyY2UgPSAoVVJMKWkubmV4dCgpOworICAgICAgICAgICAgVVJMIHRhcmdldCA9IChVUkwpdXJpTWFwLmdldChzb3VyY2UpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KHNvdXJjZSwgdGFyZ2V0KTsKQEAgLTEyNiwyNSArMTIyLDI1IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3Rkb3V0KQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3BpZWQgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3BpZWQgIiArIHNvdXJjZSArICIgLT4gIiArIHRhcmdldCk7CiAgICAgICAgIH0KICAgICB9CiAKIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgc2NoZW1hIG9yIHdzZGwgYXQgdGhlIHNvdXJjZSBVUkkgdG8gdGhlIHRhcmdldCBVUkksIGFsb25nCi0gICAgICogd2l0aCBhbnkgcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoZSB0YXJnZXQgVVJJIHNob3VsZCBiZSBhIGZpbGUgVVJJLgorICAgICAqIENvcGllcyB0aGUgc2NoZW1hIG9yIHdzZGwgYXQgdGhlIHNvdXJjZSBVUkwgdG8gdGhlIHRhcmdldCBVUkwsIGFsb25nCisgICAgICogd2l0aCBhbnkgcmVsYXRpdmUgcmVmZXJlbmNlcy4gIFRoZSB0YXJnZXQgVVJMIHNob3VsZCBiZSBhIGZpbGUgVVJMLgogICAgICAqIElmIGRvQ29weSBpcyBmYWxzZSwgdGhlIGZpbGUgY29waWVzIGFyZSBub3QgYWN0dWFsbHkgZG9uZTsgdGhlIG1hcAogICAgICAqIHJldHVybmVkIGp1c3QgZGVzY3JpYmVzIHRoZSBjb3BpZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gZG9uZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgYW4gYXJiaXRyYXJ5IFVSSSBkZXNjcmliaW5nIGEgc291cmNlIFNjaGVtYSBvciBXU0RMCi0gICAgICogQHBhcmFtIHRhcmdldCBhIGZpbGUgVVJJIGRlc2NyaWJpbmcgYSB0YXJnZXQgZmlsZW5hbWUKLSAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGFsbCB0aGUgc291cmNlL3RhcmdldCBVUklzIG5lZWRlZCB0byBjb3B5CisgICAgICogQHBhcmFtIHNvdXJjZSBhbiBhcmJpdHJhcnkgVVJMIGRlc2NyaWJpbmcgYSBzb3VyY2UgU2NoZW1hIG9yIFdTREwKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IGEgZmlsZSBVUkwgZGVzY3JpYmluZyBhIHRhcmdldCBmaWxlbmFtZQorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgYWxsIHRoZSBzb3VyY2UvdGFyZ2V0IFVSTHMgbmVlZGVkIHRvIGNvcHkKICAgICAgKiB0aGUgZmlsZSBhbG9uZyB3aXRoIGFsbCBpdHMgcmVsYXRpdmUgcmVmZXJlbnRzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpbmRBbGxSZWxhdGl2ZShVUkkgc291cmNlLCBVUkkgdGFyZ2V0KQorICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpbmRBbGxSZWxhdGl2ZShVUkwgc291cmNlLCBVUkwgdGFyZ2V0KQogICAgIHsKLSAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICByZXN1bHQucHV0KHNvdXJjZSwgdGFyZ2V0KTsKIAogICAgICAgICBMaW5rZWRMaXN0IHByb2Nlc3MgPSBuZXcgTGlua2VkTGlzdCgpOwpAQCAtMTUyLDEyICsxNDgsMTIgQEAKIAogICAgICAgICB3aGlsZSAoIXByb2Nlc3MuaXNFbXB0eSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBVUkkgbmV4dFNvdXJjZSA9IChVUkkpcHJvY2Vzcy5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgVVJJIG5leHRUYXJnZXQgPSAoVVJJKXJlc3VsdC5nZXQobmV4dFNvdXJjZSk7CisgICAgICAgICAgICBVUkwgbmV4dFNvdXJjZSA9IChVUkwpcHJvY2Vzcy5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgVVJMIG5leHRUYXJnZXQgPSAoVVJMKXJlc3VsdC5nZXQobmV4dFNvdXJjZSk7CiAgICAgICAgICAgICBNYXAgbmV4dFJlc3VsdHMgPSBmaW5kUmVsYXRpdmVJbk9uZShuZXh0U291cmNlLCBuZXh0VGFyZ2V0KTsKICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5leHRSZXN1bHRzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIG5ld1NvdXJjZSA9IChVUkkpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgVVJMIG5ld1NvdXJjZSA9IChVUkwpaS5uZXh0KCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb250YWluc0tleShuZXdTb3VyY2UpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5ld1NvdXJjZSwgbmV4dFJlc3VsdHMuZ2V0KG5ld1NvdXJjZSkpOwpAQCAtMTczLDE2ICsxNjksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiIAogICAgICAgICAgICAgKSk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgZmluZFJlbGF0aXZlSW5PbmUoVVJJIHNvdXJjZSwgVVJJIHRhcmdldCkKKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgZmluZFJlbGF0aXZlSW5PbmUoVVJMIHNvdXJjZSwgVVJMIHRhcmdldCkKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgc291cmNlVVJMID0gc291cmNlLnRvVVJMKCk7Ci0gICAgICAgICAgICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNvdXJjZVVSTCwgbG9hZE9wdGlvbnMpOworICAgICAgICAgICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShzb3VyY2UsIGxvYWRPcHRpb25zKTsKICAgICAgICAgICAgIFhtbEN1cnNvciB4Y3VyID0geG9iai5uZXdDdXJzb3IoKTsKICAgICAgICAgICAgIHhjdXIudG9GaXJzdENoaWxkKCk7CiAKLSAgICAgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAKICAgICAgICAgICAgIGlmICh4b2JqIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQpCiAgICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsICgoU2NoZW1hRG9jdW1lbnQpeG9iaikuZ2V0U2NoZW1hKCkpOwpAQCAtMTk3LDI2ICsxOTIsMzMgQEAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE5ld01hcHBpbmcoTWFwIHJlc3VsdCwgVVJJIG9yaWdTb3VyY2UsIFVSSSBvcmlnVGFyZ2V0LCBTdHJpbmcgbGl0ZXJhbFVSSSkKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE5ld01hcHBpbmcoTWFwIHJlc3VsdCwgVVJMIG9yaWdTb3VyY2UsIFVSTCBvcmlnVGFyZ2V0LCBTdHJpbmcgbGl0ZXJhbFVSTCkKICAgICB7CisgICAgICAgIGlmIChsaXRlcmFsVVJMID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGl0ZXJhbFVSSSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIFVSSSBuZXdSZWxhdGl2ZSA9IG5ldyBVUkkobGl0ZXJhbFVSSSk7Ci0gICAgICAgICAgICBpZiAobmV3UmVsYXRpdmUuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIFVSSSBuZXdTb3VyY2UgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG9yaWdTb3VyY2UsIG5ld1JlbGF0aXZlKTsKLSAgICAgICAgICAgIFVSSSBuZXdUYXJnZXQgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG9yaWdUYXJnZXQsIG5ld1JlbGF0aXZlKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3U291cmNlLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChsaXRlcmFsVVJMKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCisgICAgICAgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVyaSBzeW50YXggcHJvYmxlbT8gZG8gbm90aGluZyBzaWxlbnRseS4KKyAgICAgICAgICAgIHVybCA9IG51bGw7CiAgICAgICAgIH0KKworICAgICAgICAvL2lmIHRoZSBzdHJpbmcgY2FuIGJlIHBhcnNlZCBpbnRvIGEgVVJMLCBpdCdzIGFic29sdXRlCisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBVUkwgbmV3U291cmNlID0gQ29kZUdlblV0aWwucmVzb2x2ZShvcmlnU291cmNlLCBsaXRlcmFsVVJMKTsKKyAgICAgICAgVVJMIG5ld1RhcmdldCA9IENvZGVHZW5VdGlsLnJlc29sdmUob3JpZ1RhcmdldCwgbGl0ZXJhbFVSTCk7CisKKyAgICAgICAgaWYgKG5ld1NvdXJjZSAhPSBudWxsICYmIG5ld1RhcmdldCAhPSBudWxsKQorICAgICAgICAgICAgcmVzdWx0LnB1dChuZXdTb3VyY2UsIG5ld1RhcmdldCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRNYXBwaW5nc0Zyb21TY2hlbWEoTWFwIHJlc3VsdCwgVVJJIHNvdXJjZSwgVVJJIHRhcmdldCwgU2NoZW1hRG9jdW1lbnQuU2NoZW1hIHNjaGVtYSkKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcHBpbmdzRnJvbVNjaGVtYShNYXAgcmVzdWx0LCBVUkwgc291cmNlLCBVUkwgdGFyZ2V0LCBTY2hlbWFEb2N1bWVudC5TY2hlbWEgc2NoZW1hKQogICAgIHsKICAgICAgICAgSW1wb3J0RG9jdW1lbnQuSW1wb3J0W10gaW1wb3J0cyA9IHNjaGVtYS5nZXRJbXBvcnRBcnJheSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCkBAIC0yMjcsNyArMjI5LDcgQEAKICAgICAgICAgICAgIHB1dE5ld01hcHBpbmcocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgaW5jbHVkZXNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRNYXBwaW5nc0Zyb21Xc2RsKE1hcCByZXN1bHQsIFVSSSBzb3VyY2UsIFVSSSB0YXJnZXQsIERlZmluaXRpb25zRG9jdW1lbnQuRGVmaW5pdGlvbnMgd2RvYykKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcHBpbmdzRnJvbVdzZGwoTWFwIHJlc3VsdCwgVVJMIHNvdXJjZSwgVVJMIHRhcmdldCwgRGVmaW5pdGlvbnNEb2N1bWVudC5EZWZpbml0aW9ucyB3ZG9jKQogICAgIHsKICAgICAgICAgWG1sT2JqZWN0W10gdHlwZXMgPSB3ZG9jLmdldFR5cGVzQXJyYXkoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW4uamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW4uamF2YQppbmRleCA5MGE1ZTA3Li44MTRkN2IxIDEwMDY0NAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YTUxCZWFuLmphdmEKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhCkBAIC0yOSw3ICsyOSw4IEBACiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CiAKQEAgLTY2OSwxNCArNjcwLDE0IEBACiAgICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBVUkkgdXJpRnJvbUZpbGUoRmlsZSBmKQorICAgIHByaXZhdGUgVVJMIHVybEZyb21GaWxlKEZpbGUgZikKICAgICB7CiAgICAgICAgIGlmIChmID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGYuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvVVJJKCk7CisgICAgICAgICAgICByZXR1cm4gZi5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkwoKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKQEAgLTY4NCwxOSArNjg1LDI3IEBACiAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsZW5hbWUgaXMgImF1eCIsICJscHQxIiwgZXRjLiBJdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eQogICAgICAgICAgICAgLy8gdG8gZGVhbCB3aXRoIHRob3NlIGNhc2VzIGNvcnJlY3RseSwgdXN1YWxseSBieSBjYWxsaW5nIEZpbGVTdmMuaW52YWxpZFBhdGhDaGVjaygpCiAgICAgICAgICAgICAvLyBNZXNzYWdlU3ZjLmdldCgpLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIHJldHVybiBmLmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nKG11ZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGNsYXNzIEVycm9yTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCiAgICAgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gX25vaXN5OwotICAgICAgICBwcml2YXRlIFVSSSBfYmFzZVVSSTsKKyAgICAgICAgcHJpdmF0ZSBVUkwgX2Jhc2VVUkw7CiAKICAgICAgICAgcHVibGljIEVycm9yTG9nZ2VyKGJvb2xlYW4gbm9pc3kpCiAgICAgICAgIHsKICAgICAgICAgICAgIF9ub2lzeSA9IG5vaXN5OwotICAgICAgICAgICAgX2Jhc2VVUkkgPSB1cmlGcm9tRmlsZShwcm9qZWN0LmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICBfYmFzZVVSTCA9IHVybEZyb21GaWxlKHByb2plY3QuZ2V0QmFzZURpcigpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKQEAgLTcwNSwxMSArNzE0LDExIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gKFhtbEVycm9yKW87CiAgICAgICAgICAgICAgICAgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGVyci50b1N0cmluZyhfYmFzZVVSTCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgICAgICAgICAgICAgbG9nKGVyci50b1N0cmluZyhfYmFzZVVSSSksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJMKSwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX25vaXN5KQotICAgICAgICAgICAgICAgICAgICBsb2coZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkwpLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWFNUQ1Rlc3Rlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWFNUQ1Rlc3Rlci5qYXZhCmluZGV4IDc5ZGNlOWIuLjY3ODAyZmEgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hTVENUZXN0ZXIuamF2YQorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YU1RDVGVzdGVyLmphdmEKQEAgLTE5LDYgKzE5LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguTWF0Y2g7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuVGVzdHNEb2N1bWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuRmlsZURlc2M7CiAKQEAgLTMxLDI3ICszNSwyNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIAogcHVibGljIGNsYXNzIFhTVENUZXN0ZXIKIHsKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgCisKICAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKICAgICAgICAgYm9vbGVhbiBzaG93cGFzcyA9IChjbC5nZXRPcHQoInNob3dwYXNzIikgIT0gbnVsbCk7CiAgICAgICAgIEZpbGVbXSBhbGxGaWxlcyA9IGNsLmdldEZpbGVzKCk7CiAgICAgICAgIENvbGxlY3Rpb24gbHRnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIEhhcm5lc3MgaGFybmVzcyA9IG5ldyBYTUxCZWFuWFNUQ0hhcm5lc3MoKTsKLSAgICAgICAgCisKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGaWxlcy5sZW5ndGg7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGFsbEZpbGVzW2ldLmdldE5hbWUoKS5pbmRleE9mKCJMVEciKSA+PSAwKQogICAgICAgICAgICAgICAgIGx0Z0ZpbGVzLmFkZChhbGxGaWxlc1tpXSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgRmlsZSByZXN1bHRzRmlsZSA9IG5ldyBGaWxlKCJvdXQuaHRtbCIpOwogICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIocmVzdWx0c0ZpbGUpKTsKICAgICAgICAgd3JpdGVyLnByaW50bG4oIjxodG1sPiIpOwpAQCAtMTI0LDE3ICsxMjcsMTcgQEAKICAgICAgICAgd3JpdGVyLnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zPlN1bW1hcnk6ICIgKyBmYWlsdXJlcyArICIgZmFpbHVyZXMgb3V0IG9mICIgKyBjYXNlcyArICIgY2FzZXMgcnVuLjwvdGQ+PC90cj4iKTsKICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7CiAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICAKKwogICAgICAgICBsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgcnVuIHRlc3RzOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIExhdW5jaCByZXN1bHRzCiAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndpbmRvd3MiKSA+PSAwKQogICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygiY21kIC9jIHN0YXJ0IGlleHBsb3JlIFwiIiArIHJlc3VsdHNGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyBvdXRwdXQgdG8gIiArIHJlc3VsdHNGaWxlKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYXNlCiAgICAgewogICAgICAgICBwcml2YXRlIEZpbGUgbHRnRmlsZTsKQEAgLTE5OCw3ICsyMDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJ2RXhwZWN0ZWQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYXNlUmVzdWx0CiAgICAgewogICAgICAgICBwcml2YXRlIFRlc3RDYXNlIHRlc3RDYXNlOwpAQCAtMjUyLDM4ICsyNTUsMzggQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5pdk1lc3NhZ2VzLmFkZEFsbChpdk1lc3NhZ2VzKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDcmFzaChib29sZWFuIGNyYXNoKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmNyYXNoID0gY3Jhc2g7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDcmFzaCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBjcmFzaDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdWNjZWVkZWQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gIWNyYXNoICYmIChpc0l2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkpICYmIChpc1N2QWN0dWFsKCkgPT0gdGVzdENhc2UuaXNTdkV4cGVjdGVkKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSGFybmVzcwogICAgIHsKICAgICAgICAgcHVibGljIHZvaWQgcnVuVGVzdENhc2UoVGVzdENhc2VSZXN1bHQgcmVzdWx0KTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlSFRNTExpbmsoRmlsZSBmaWxlLCBib29sZWFuIHZhbHVlKQogICAgIHsKICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiAiJm5ic3A7IjsKLSAgICAgICAgVVJJIHVyaSA9IGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKLSAgICAgICAgcmV0dXJuICI8YSBocmVmPVwiIiArIHVyaSArICJcIiB0YXJnZXQ9X2JsYW5rPiIgKyBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSArICI8L2E+IjsKKyAgICAgICAgVVJMIHVyaSA9IElPVXRpbC5maWxlVG9VUkwoZmlsZSk7CisgICAgICAgIHJldHVybiAiPGEgaHJlZj1cIiIgKyB1cmkgKyAiXCIgdGFyZ2V0PV9ibGFuaz4iICsgdmFsdWUgKyAiPC9hPiI7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gbGVhZGluZ1NwYWNlID0gUGF0dGVybi5jb21waWxlKCJeXFxzKyIsIFBhdHRlcm4uTVVMVElMSU5FKTsKLSAgICAKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlZ3VsYXJFeHByZXNzaW9uIGxlYWRpbmdTcGFjZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigiXlxccysiLCAibSIpOworCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUhUTUxEZXNjcmlwdGlvbihUZXN0Q2FzZSB0ZXN0Q2FzZSkKICAgICB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKQEAgLTI5MSwyNSArMjk0LDM4IEBACiAgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCkKICAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gc2NoZW1hIik7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcXFxcXCIpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5yZXBsYWNlQWxsKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAiXFxcXCIsICJcXFxcXFxcXCIpKTsKIAogICAgICAgICBzYi5hcHBlbmQoIlwiLCBcIiIpOwogICAgICAgICBpZiAodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCkgPT0gbnVsbCkKICAgICAgICAgICAgIHNiLmFwcGVuZCgiYWJvdXQ6Tm8gaW5zdGFuY2UiKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2IuYXBwZW5kKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZUFsbCh0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAiXFxcXCIsICJcXFxcXFxcXCIpKTsKICAgICAgICAgc2IuYXBwZW5kKCJcIiknPjx4bXA+Iik7Ci0gICAgICAgIHNiLmFwcGVuZChsZWFkaW5nU3BhY2UubWF0Y2hlcih0ZXN0Q2FzZS5nZXREZXNjcmlwdGlvbigpKS5yZXBsYWNlQWxsKCIiKSArICIoIiArIHRlc3RDYXNlLmdldElkKCkgKyAiKSIpOworCisgICAgICAgIE1hdGNoIG0gPSBuZXcgTWF0Y2goKTsKKyAgICAgICAgU3RyaW5nIGRlc2MgPSB0ZXN0Q2FzZS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICBpZiAobGVhZGluZ1NwYWNlLm1hdGNoZXMoZGVzYywgbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYkRlc2MgPSBuZXcgU3RyaW5nQnVmZmVyKGRlc2MpOworICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVwbGFjZUFsbChtLCBzYkRlc2MsICIiKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgU3RyaW5nKHNiRGVzYyk7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoZGVzYyk7CisgICAgICAgIHNiLmFwcGVuZCggIigiKS5hcHBlbmQodGVzdENhc2UuZ2V0SWQoKSkuYXBwZW5kKCIpIik7CiAgICAgICAgIHNiLmFwcGVuZCgiPC94bXA+PC9hPiIpOwogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VtbWFyaXplUmVzdWx0QXNIVE1MVGFibGVSb3dzKFRlc3RDYXNlUmVzdWx0IHJlc3VsdCwgUHJpbnRXcml0ZXIgb3V0KQogICAgIHsKICAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSByZXN1bHQuZ2V0VGVzdENhc2UoKTsKICAgICAgICAgYm9vbGVhbiBzUmlnaHQgPSB0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCB8fCB0ZXN0Q2FzZS5pc1N2RXhwZWN0ZWQoKSA9PSByZXN1bHQuaXNTdkFjdHVhbCgpOwogICAgICAgICBib29sZWFuIGlSaWdodCA9IHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpID09IG51bGwgfHwgdGVzdENhc2UuaXNJdkV4cGVjdGVkKCkgPT0gcmVzdWx0LmlzSXZBY3R1YWwoKTsKLSAgICAgICAgCisKICAgICAgICAgb3V0LnByaW50bG4ocmVzdWx0LmlzQ3Jhc2goKSA/ICI8dHIgYmdjb2xvcj1ibGFjayBjb2xvcj13aGl0ZT4iIDogIjx0cj4iKTsKICAgICAgICAgb3V0LnByaW50bG4oIjx0ZCB2YWxpZ249dG9wPiIgKyBtYWtlSFRNTERlc2NyaXB0aW9uKHRlc3RDYXNlKSArICI8L3RkPiIpOwogICAgICAgICBTdHJpbmcgc0xpbmtzOwpAQCAtMzE3LDcgKzMzMyw3IEBACiAgICAgICAgICAgICBzTGlua3MgPSBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpLCByZXN1bHQuaXNTdkFjdHVhbCgpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc0xpbmtzID0gbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgcmVzdWx0LmlzU3ZBY3R1YWwoKSkgKyAiPGJyPiIgKyBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCksIHJlc3VsdC5pc1N2QWN0dWFsKCkpOwotICAgICAgICAKKwogICAgICAgICBvdXQucHJpbnRsbigoc1JpZ2h0ID8gIjx0ZCB2YWxpZ249dG9wPiIgOiByZXN1bHQuaXNTdkFjdHVhbCgpID8gIjx0ZCBiZ2NvbG9yPW9yYW5nZSB2YWxpZ249dG9wPiIgOiAiPHRkIGJnY29sb3I9cmVkIHZhbGlnbj10b3A+IikgKyBzTGlua3MgKyAiPC90ZD4iKTsKICAgICAgICAgb3V0LnByaW50bG4oKGlSaWdodCA/ICI8dGQgdmFsaWduPXRvcD4iIDogcmVzdWx0LmlzSXZBY3R1YWwoKSA/ICI8dGQgYmdjb2xvcj1vcmFuZ2UgdmFsaWduPXRvcD4iIDogIjx0ZCBiZ2NvbG9yPXJlZCB2YWxpZ249dG9wPiIpICsgbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpLCByZXN1bHQuaXNJdkFjdHVhbCgpKSArICI8L3RkPiIpOwogICAgICAgICBvdXQucHJpbnRsbigiPC90cj4iKTsKQEAgLTMzNCw3ICszNTAsNyBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oIjwveG1wPjwvdHI+PC90ZD4iKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgVGVzdENhc2VbXSBwYXJzZUxUR0ZpbGUoRmlsZSBsdGdGaWxlLCBDb2xsZWN0aW9uIG91dGVyRXJyb3JzKQogICAgIHsKICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC0zNDcsOSArMzYzLDkgQEAKICAgICAgICAgICAgIFRlc3RzRG9jdW1lbnQgZG9jID0gVGVzdHNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGx0Z0ZpbGUsIGx0Z09wdGlvbnMpOwogICAgICAgICAgICAgaWYgKCFkb2MudmFsaWRhdGUobHRnT3B0aW9ucykpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRG9jdW1lbnQgIiArIGx0Z0ZpbGUgKyAiIG5vdCB2YWxpZC4iKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuVGVzdENhc2VbXSB0ZXN0Q2FzZXMgPSBkb2MuZ2V0VGVzdHMoKS5nZXRUZXN0QXJyYXkoKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENhc2VzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgewpAQCAtMzcwLDcgKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJDYW4ndCByZWFkIGZpbGUgIiArIHRoZUZpbGUsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpbGVkZXNjc1tqXS5nZXRSb2xlKCkuaW50VmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWxlRGVzYy5Sb2xlLklOVF9JTlNUQU5DRToKQEAgLTM3OSwyMSArMzk1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5pbnN0YW5jZUZpbGUgPSB0aGVGaWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UuaXZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX1NDSEVNQToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FzZS5zY2hlbWFGaWxlICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1vcmUgdGhhbiBvbmUgc2NoZW1hIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnNjaGVtYUZpbGUgPSB0aGVGaWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2Uuc3ZFeHBlY3RlZCA9IGZpbGVkZXNjc1tqXS5nZXRWYWxpZGl0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX1JFU09VUkNFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXNlLnJlc291cmNlRmlsZSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNb3JlIHRoYW4gb25lIHJlc291cmNlIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnJlc291cmNlRmlsZSA9IHRoZUZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5ydkV4cGVjdGVkID0gZmlsZWRlc2NzW2pdLmdldFZhbGlkaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKFhtbEVycm9yLmZvck9iamVjdCgiVW5leHBlY3RlZCBmaWxlIHJvbGUiLCBmaWxlZGVzY3Nbal0pKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDExLDUgKzQyNyw1IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWHNiRHVtcGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQppbmRleCAwYzhkNWNhLi43ZjJkNWY1IDEwMDY0NAotLS0gYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQpAQCAtMzMsNiArMzMsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiBwdWJsaWMgY2xhc3MgWHNiRHVtcGVyCkBAIC0xMjMsNyArMTI1LDcgQEAKICAgICB2b2lkIGZsdXNoKCkgeyBTeXN0ZW0ub3V0LmZsdXNoKCk7IH0KICAgICB2b2lkIGVtaXQoU3RyaW5nIHN0cikgeyBTeXN0ZW0ub3V0LnByaW50bG4oX2luZGVudCArIHN0cik7IGZsdXNoKCk7IH0KICAgICB2b2lkIGVtaXQoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigpOyBmbHVzaCgpOyB9Ci0gICAgdm9pZCBlcnJvcihFeGNlcHRpb24gZSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsgZmx1c2goKTsgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCkgKTsgZTIuaW5pdENhdXNlKCBlICk7IHRocm93IGUyOyB9CisgICAgdm9pZCBlcnJvcihFeGNlcHRpb24gZSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsgZmx1c2goKTsgWG1sUnVudGltZUV4Y2VwdGlvbiBlMiA9IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOyB0aHJvdyBlMjsgfQogICAgIHZvaWQgZXJyb3IoU3RyaW5nIHN0cikgeyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsgZmx1c2goKTsgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggc3RyICk7IHRocm93IGUyOyB9CiAgICAgcHJpdmF0ZSBTdHJpbmcgX2luZGVudDsKICAgICB2b2lkIGluZGVudCgpIHsgX2luZGVudCArPSAiICAiOyB9CkBAIC0xMDY2LDcgKzEwNjgsOCBAQAogICAgICAgICBzd2l0Y2ggKGJ0YykKICAgICAgICAgewogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJuaWwiOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA5Myw3ICsxMDk2LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKHJlYWRCeXRlQXJyYXkoKSkpOwogICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAxOSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3ViU2VxdWVuY2UoMCwgMTYpICsgIi4uLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCAxNikgKyAiLi4uIjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvSW50ZXJmYWNlRXh0ZW5zaW9uLmphdmEgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvSW50ZXJmYWNlRXh0ZW5zaW9uLmphdmEKaW5kZXggMmNmNzg4Yy4uODk0YjBkOCAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL0ludGVyZmFjZUV4dGVuc2lvbi5qYXZhCisrKyBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9JbnRlcmZhY2VFeHRlbnNpb24uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5FeHRlbnNpb25jb25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKQEAgLTEwMCw3ICsxMDEsOCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTWV0aG9kcyhYbWxPYmplY3QgbG9jKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IF9kZWxlZ2F0ZVRvQ2xhc3MgIT0gbnVsbCA6ICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZGVsZWdhdGVUb0NsYXNzICE9IG51bGwsICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiIpOwogICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKIAogICAgICAgICBfaW50ZXJmYWNlTWV0aG9kcyA9IF9pbnRlcmZhY2UuZ2V0TWV0aG9kcygpOwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1ByZVBvc3RFeHRlbnNpb24uamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9QcmVQb3N0RXh0ZW5zaW9uLmphdmEKaW5kZXggNmRjNzk1ZS4uN2I4ZTEwZiAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1ByZVBvc3RFeHRlbnNpb24uamF2YQorKysgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvUHJlUG9zdEV4dGVuc2lvbi5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWc7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuRXh0ZW5zaW9uY29uZmlnOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKQEAgLTY0LDcgKzY1LDggQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBsb29rQWZ0ZXJQcmVBbmRQb3N0KFhtbE9iamVjdCBsb2MpCiAgICAgewotICAgICAgICBhc3NlcnQgX2RlbGVnYXRlVG9DbGFzcyE9bnVsbCA6ICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZGVsZWdhdGVUb0NsYXNzICE9IG51bGwsICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiIpOwogICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKIAogICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9TY2hlbWFDb25maWcuamF2YQppbmRleCBkZDMyNTVhLi4wMTk5MDE4IDEwMDY0NAotLS0gYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvU2NoZW1hQ29uZmlnLmphdmEKKysrIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1NjaGVtYUNvbmZpZy5qYXZhCkBAIC0yMiwxMSArMjIsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU3RzY1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKIAogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC01NCwxMCArNTQsMTAgQEAKICAgICAKICAgICBwcml2YXRlIFNjaGVtYUNvbmZpZyhDb25maWdbXSBjb25maWdzKQogICAgIHsKLSAgICAgICAgX3BhY2thZ2VNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBfcHJlZml4TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgX3N1ZmZpeE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIF9xbmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9wYWNrYWdlTWFwID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKKyAgICAgICAgX3ByZWZpeE1hcCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CisgICAgICAgIF9zdWZmaXhNYXAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOworICAgICAgICBfcW5hbWVNYXAgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICBfZXh0ZW5zaW9uSG9sZGVyID0gbmV3IEV4dGVuc2lvbkhvbGRlcigpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKaW5kZXggNTdmOTYyMC4uZmQ4OWRhZSAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5TaW1wbGVUaW1lWm9uZTsKIAogLyoqCiAgKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBHcmVnb3JpYW4gZGF0ZS4KQEAgLTQwLDcgKzQxLDcgQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBHRGF0ZSBpbXBsZW1lbnRzIEdEYXRlU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKKwogICAgIC8vIGZvciBmYXN0IGVxdWFsaXR5IGNvbXBhcmlzb24sIGhhc2hpbmcsIGFuZCBzZXJpYWxpemF0aW9uCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9jYW5vbmljYWxTdHJpbmc7CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9zdHJpbmc7CkBAIC01NiwxNSArNTcsMTUgQEAKICAgICBwcml2YXRlIGludCBfdHpzaWduOwogICAgIHByaXZhdGUgaW50IF90emg7CiAgICAgcHJpdmF0ZSBpbnQgX3R6bTsKLSAgICAKLSAgICAKKworCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBfemVybyA9IEJpZ0RlY2ltYWwudmFsdWVPZigwKTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIF9vbmUgPSBCaWdEZWNpbWFsLnZhbHVlT2YoMSk7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGUgYmFzZWQgb24gYSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBHRGF0ZShDaGFyU2VxdWVuY2Ugc3RyaW5nKQorICAgIHB1YmxpYyBHRGF0ZShTdHJpbmcgc3RyaW5nKQogICAgIHsKICAgICAgICAgLy8gZmlyc3QgdHJpbSBYTUwgd2hpdGVzcGFjZQogICAgICAgICBpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwpAQCAtMjQ3LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzID0gbmV3IEJpZ0RlY2ltYWwoc3RyaW5nLnN1YlNlcXVlbmNlKHN0YXJ0LCBsZW4pLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZnMgPSBuZXcgQmlnRGVjaW1hbChzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBsZW4pKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTM2NCw2ICszNjUsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgR0RhdGUoQ2FsZW5kYXIgY2FsZW5kYXIpCiAgICAgeworICAgICAgICBYbWxDYWxlbmRhciB4Q2FsID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBpc1hDID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGNhbGVuZGFyIGluc3RhbmNlb2YgWG1sQ2FsZW5kYXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlzWEMgPSB0cnVlOworICAgICAgICAgICAgeENhbCA9IChYbWxDYWxlbmRhcikgY2FsZW5kYXI7CisgICAgICAgIH0KKwogICAgICAgICAvLyB3ZSBtdXN0IHNjcmFwZSB0aGUgImlzU2V0IiBpbmZvcm1hdGlvbiBvdXQgYmVmb3JlIGFjY2Vzc2luZyBhbnl0aGluZwogICAgICAgICBib29sZWFuIGlzU2V0WWVhciA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLllFQVIpOwogICAgICAgICBib29sZWFuIGlzU2V0RXJhID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuRVJBKTsKQEAgLTM4MCw5ICszOTAsOSBAQAogCiAgICAgICAgIGlmIChpc1NldFllYXIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB5ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworICAgICAgICAgICAgaW50IHkgPSBpc1hDID8geENhbC5wZWVrKENhbGVuZGFyLllFQVIpIDogY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwogICAgICAgICAgICAgaWYgKGlzU2V0RXJhICYmIGNhbGVuZGFyIGluc3RhbmNlb2YgR3JlZ29yaWFuQ2FsZW5kYXIpCi0gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5FUkEpID09IEdyZWdvcmlhbkNhbGVuZGFyLkJDKQorICAgICAgICAgICAgICAgIGlmICgoaXNYQyA/IHhDYWwucGVlayhDYWxlbmRhci5FUkEpIDogY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkVSQSkpID09IEdyZWdvcmlhbkNhbGVuZGFyLkJDKQogICAgICAgICAgICAgICAgICAgICB5ID0gMSAtIHk7CiAgICAgICAgICAgICBfYml0cyB8PSBIQVNfWUVBUjsKICAgICAgICAgICAgIF9DWSA9IHk7CkBAIC0zOTAsMTIgKzQwMCwxMiBAQAogICAgICAgICBpZiAoaXNTZXRNb250aCkKICAgICAgICAgewogICAgICAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOwotICAgICAgICAgICAgX00gPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMTsgLy8gISFub3RlCisgICAgICAgICAgICBfTSA9IChpc1hDID8geENhbC5wZWVrKENhbGVuZGFyLk1PTlRIKSA6IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkpICsgMTsgLy8gISFub3RlCiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzU2V0RGF5KQogICAgICAgICB7CiAgICAgICAgICAgICBfYml0cyB8PSBIQVNfREFZOwotICAgICAgICAgICAgX0QgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgICAgIF9EID0gaXNYQyA/IHhDYWwucGVlayhDYWxlbmRhci5EQVlfT0ZfTU9OVEgpIDogY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBnb3RUaW1lID0gZmFsc2U7CiAKQEAgLTQwNiwzMCArNDE2LDM0IEBACiAKICAgICAgICAgaWYgKGlzU2V0SG91ck9mRGF5KQogICAgICAgICB7Ci0gICAgICAgICAgICBoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKKyAgICAgICAgICAgIGggPSBpc1hDID8geENhbC5wZWVrKENhbGVuZGFyLkhPVVJfT0ZfREFZKSA6IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CiAgICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChpc1NldEhvdXIgJiYgaXNTZXRBbVBtKQogICAgICAgICB7Ci0gICAgICAgICAgICBoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKSAqIDEyOworICAgICAgICAgICAgaWYgKGlzWEMpCisgICAgICAgICAgICAgICAgaCA9IHhDYWwucGVlayhDYWxlbmRhci5IT1VSKSArIHhDYWwucGVlayhDYWxlbmRhci5BTV9QTSkgKiAxMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVIpICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKSAqIDEyOwogICAgICAgICAgICAgZ290VGltZSA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTZXRNaW51dGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG0gPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICAgICAgICAgIG0gPSBpc1hDID8geENhbC5wZWVrKENhbGVuZGFyLk1JTlVURSkgOiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKICAgICAgICAgICAgIGdvdFRpbWUgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU2V0U2Vjb25kKQogICAgICAgICB7Ci0gICAgICAgICAgICBzID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7CisgICAgICAgICAgICBzID0gaXNYQyA/IHhDYWwucGVlayhDYWxlbmRhci5TRUNPTkQpIDogY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7CiAgICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1NldE1pbGxpcykKICAgICAgICAgewotICAgICAgICAgICAgZnMgPSBCaWdEZWNpbWFsLnZhbHVlT2YoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSwgMyk7CisgICAgICAgICAgICBmcyA9IEJpZ0RlY2ltYWwudmFsdWVPZihpc1hDID8geENhbC5wZWVrKENhbGVuZGFyLk1JTExJU0VDT05EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNhbGVuZGFyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksIDMpOwogICAgICAgICAgICAgZ290VGltZSA9IHRydWU7CiAgICAgICAgIH0KIApAQCAtNDQ0LDkgKzQ1OCwxMSBAQAogCiAgICAgICAgIGlmIChpc1NldFpvbmUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpOworICAgICAgICAgICAgaW50IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IGlzWEMgPyB4Q2FsLnBlZWsoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCk7CiAgICAgICAgICAgICBpZiAoaXNTZXREc3QpCi0gICAgICAgICAgICAgICAgem9uZU9mZnNldEluTWlsbGlzZWNvbmRzICs9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKKyAgICAgICAgICAgICAgICB6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgKz0gaXNYQyA/IHhDYWwucGVlayhDYWxlbmRhci5EU1RfT0ZGU0VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpOwogCiAgICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7CiAgICAgICAgICAgICBpZiAoem9uZU9mZnNldEluTWlsbGlzZWNvbmRzID09IDApCkBAIC01MzcsNyArNTUzLDcgQEAKICAgICAgICAgcmV0dXJuIChjaCAtICcwJyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHR3b0RpZ2l0KENoYXJTZXF1ZW5jZSBzdHIsIGludCBpbmRleCkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdHdvRGlnaXQoU3RyaW5nIHN0ciwgaW50IGluZGV4KQogICAgIHsKICAgICAgICAgY2hhciBjaDEgPSBzdHIuY2hhckF0KGluZGV4KTsKICAgICAgICAgY2hhciBjaDIgPSBzdHIuY2hhckF0KGluZGV4ICsgMSk7CkBAIC03NTgsNyArNzc0LDcgQEAKICAgICAgKiBjb250YWluZWQgaW4gdGhpcyBpbnN0YW5jZSwgb3IgMCBpZiB0aGUKICAgICAgKiBpbnN0YW5jZSBkb2Vzbid0IGNvbnRhaW4gaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byBhCiAgICAgICogU2NoZW1hIHR5cGUuCi0gICAgICogPHA+IAorICAgICAqIDxwPgogICAgICAqIFZhbHVlIHdpbGwgYmUgZXF1YWwgdG8KICAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfTk9UX0JVSUxUSU59LAogICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LApAQCAtODk5LDcgKzkxNSw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX3BhZFR3b0FwcGVuZChjaGFyW10gYiwgaW50IGksIGludCBuKQogICAgIHsKLSAgICAgICAgYXNzZXJ0KG4gPj0gMCAmJiBuIDwgMTAwKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKG4gPj0gMCAmJiBuIDwgMTAwKTsKICAgICAgICAgYltpXSA9IF90ZW5zRGlnaXRbbl07CiAgICAgICAgIGJbaSArIDFdID0gX29uZXNEaWdpdFtuXTsKICAgICAgICAgcmV0dXJuIGkgKyAyOwpAQCAtOTI2LDQzICs5NDMsNDUgQEAKICAgICAgICAgYltpICsgM10gPSBfb25lc0RpZ2l0W3JdOwogICAgICAgICByZXR1cm4gaSArIDQ7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmUgR01UWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05FX01JTlVURSA9IDYwICogMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05FX0hPVVIgPSA2MCAqIE9ORV9NSU5VVEU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmVbXSBNSU5VU1pPTkUgPQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAxOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA0OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDY6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA3OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wODowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDk6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTEwOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTI6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTEzOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xNDowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgwLCAiR01ULTAwOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xICogT05FX0hPVVIsICJHTVQtMDE6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoLTIgKiBPTkVfSE9VUiwgIkdNVC0wMjowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgtMyAqIE9ORV9IT1VSLCAiR01ULTAzOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC00ICogT05FX0hPVVIsICJHTVQtMDQ6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoLTUgKiBPTkVfSE9VUiwgIkdNVC0wNTowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgtNiAqIE9ORV9IT1VSLCAiR01ULTA2OjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC03ICogT05FX0hPVVIsICJHTVQtMDc6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoLTggKiBPTkVfSE9VUiwgIkdNVC0wODowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgtOSAqIE9ORV9IT1VSLCAiR01ULTA5OjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xMCAqIE9ORV9IT1VSLCAiR01ULTEwOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xMSAqIE9ORV9IT1VSLCAiR01ULTExOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xMiAqIE9ORV9IT1VSLCAiR01ULTEyOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xMyAqIE9ORV9IT1VSLCAiR01ULTEzOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKC0xNCAqIE9ORV9IT1VSLCAiR01ULTE0OjAwIikKICAgICAgICAgICAgIH07CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmVbXSBQTFVTWk9ORSA9CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMDowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDE6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzAyOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMzowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDQ6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA1OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDc6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA4OjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswOTowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTA6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzExOjAwIiksCi0gICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxMjowMCIpLAotICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTM6MDAiKSwKLSAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzE0OjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKDAsICJHTVQrMDA6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoMSAqIE9ORV9IT1VSLCAiR01UKzAxOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKDIgKiBPTkVfSE9VUiwgIkdNVCswMjowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgzICogT05FX0hPVVIsICJHTVQrMDM6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoNCAqIE9ORV9IT1VSLCAiR01UKzA0OjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKDUgKiBPTkVfSE9VUiwgIkdNVCswNTowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSg2ICogT05FX0hPVVIsICJHTVQrMDY6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoNyAqIE9ORV9IT1VSLCAiR01UKzA3OjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKDggKiBPTkVfSE9VUiwgIkdNVCswODowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSg5ICogT05FX0hPVVIsICJHTVQrMDk6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoMTAgKiBPTkVfSE9VUiwgIkdNVCsxMDowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgxMSAqIE9ORV9IT1VSLCAiR01UKzExOjAwIiksCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVRpbWVab25lKDEyICogT05FX0hPVVIsICJHTVQrMTI6MDAiKSwKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlVGltZVpvbmUoMTMgKiBPTkVfSE9VUiwgIkdNVCsxMzowMCIpLAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVUaW1lWm9uZSgxNCAqIE9ORV9IT1VSLCAiR01UKzE0OjAwIikKICAgICAgICAgICAgIH07CiAKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSB0aW1lWm9uZUZvckdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQpAQCAtOTc0LDE4ICs5OTMsMjEgQEAKICAgICAgICAgICAgIHJldHVybiBHTVRaT05FOwogICAgICAgICBpZiAoZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID09IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA8PSAxNCAmJiBkYXRlLmdldFRpbWVab25lSG91cigpID49IDApCiAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA8IDAgPyBNSU5VU1pPTkVbZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKV0gOiBQTFVTWk9ORVtkYXRlLmdldFRpbWVab25lSG91cigpXTsKLSAgICAgICAgCisKKyAgICAgICAgaW50IGggPSBkYXRlLmdldFRpbWVab25lSG91cigpLAorICAgICAgICAgICAgbSA9IGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSwKKyAgICAgICAgICAgIG9mZnNldCA9IGggKiBPTkVfSE9VUiArIG0gKiBPTkVfTUlOVVRFOwogICAgICAgICBjaGFyW10gemIgPSBuZXcgY2hhcls5XTsKICAgICAgICAgemJbMF0gPSAnRyc7CiAgICAgICAgIHpiWzFdID0gJ00nOwogICAgICAgICB6YlsyXSA9ICdUJzsKICAgICAgICAgemJbM10gPSAoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA8IDApID8gJy0nIDogJysnOwotICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA0LCBkYXRlLmdldFRpbWVab25lSG91cigpKTsKKyAgICAgICAgR0RhdGUuX3BhZFR3b0FwcGVuZCh6YiwgNCwgaCk7CiAgICAgICAgIHpiWzZdID0gJzonOwotICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA3LCBkYXRlLmdldFRpbWVab25lTWludXRlKCkpOwotICAgICAgICByZXR1cm4gVGltZVpvbmUuZ2V0VGltZVpvbmUobmV3IFN0cmluZyh6YikpOworICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA3LCBtKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUaW1lWm9uZSh6YlszXSA9PSAnKycgPyBvZmZzZXQgOiAtb2Zmc2V0LCBuZXcgU3RyaW5nKHpiKSk7CiAgICAgfQotICAgIAorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgU3RyaW5nIGZvcm1hdEdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBzcGVjKQogICAgIHsKICAgICAgICAgLy8gV2UndmUgdXNlZCBhIGNoYXJbXSByYXRoZXIgdGhhbiBhIFN0cmluZ0J1ZmZlciBmb3IgYSA0eCBzcGVlZHVwCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEKaW5kZXggZjU2NGM4MC4uMjZhYjYwOCAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZUJ1aWxkZXIuamF2YQpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogdW5pb24gb2YgdGhlIGxleGljYWwgc3BhY2VzIG9mIGFsbCB0aGUgc2NoZW1hCiAgICAgICogZGF0ZS90aW1lIHR5cGVzIChleGNlcHQgZm9yIGR1cmF0aW9uKS4KICAgICAgKi8KLSAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKENoYXJTZXF1ZW5jZSBzdHJpbmcpCisgICAgcHVibGljIEdEYXRlQnVpbGRlcihTdHJpbmcgc3RyaW5nKQogICAgIHsKICAgICAgICAgdGhpcyhuZXcgR0RhdGUoc3RyaW5nKSk7CiAgICAgfQpAQCAtODA4LDcgKzgwOCw4IEBACiAgICAgICAgICAgICAvLyBJbiBuZXcgbW9udGgsIGRheSBtYXkgbmVlZCB0byBiZSBwZWdnZWQgYmVmb3JlIHByb2NlZWRpbmcKICAgICAgICAgICAgIGlmIChoYXNEYXkoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQoX0QgPj0gMSk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX0QgPj0gMSk7CiAgICAgICAgICAgICAgICAgdGVtcCA9IF9tYXhEYXlJbk1vbnRoRm9yKF9DWSwgX00pOwogICAgICAgICAgICAgICAgIGlmIChfRCA+IHRlbXApCiAgICAgICAgICAgICAgICAgICAgIF9EID0gdGVtcDsKQEAgLTkzMyw3ICs5MzQsNyBAQAogICAgIHsKICAgICAgICAgLy8gRGVmYXVsdCB0aW1lem9uZQogICAgICAgICBUaW1lWm9uZSBkdHogPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIGludCBvZmZzZXQgPSBkdHouZ2V0T2Zmc2V0KGRhdGUuZ2V0VGltZSgpKTsKKyAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldChkdHosIGRhdGUpOwogICAgICAgICBpbnQgb2Zmc2V0c2lnbiA9IDE7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwKQogICAgICAgICB7CkBAIC0xMDE3LDYgKzEwMTgsMjAgQEAKICAgICAgICAgcmV0dXJuIGRhdGVGb3JHRGF0ZSh0aGlzKTsKICAgICB9CiAKKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBnZXRPZmZzZXQoVGltZVpvbmUgdHosIGxvbmcgdGltZSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXQodHosIG5ldyBEYXRlKHRpbWUpKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgZ2V0T2Zmc2V0KFRpbWVab25lIHR6LCBEYXRlIGRhdGUpCisgICAgeworICAgICAgICBpZiAodHouaW5EYXlsaWdodFRpbWUoZGF0ZSkpCisgICAgICAgICAgICByZXR1cm4gdHouZ2V0UmF3T2Zmc2V0KCkgKyAodHoudXNlRGF5bGlnaHRUaW1lKCkgPyAzNjAwMDAwIDogMCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHouZ2V0UmF3T2Zmc2V0KCk7CisgICAgfQorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGp1bGlhbkRhdGVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKICAgICB7CiAgICAgICAgIGlmICghZGF0ZS5oYXNEYXRlKCkpCkBAIC0xMDUwLDcgKzEwNjUsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIFRpbWVab25lIGRlZiA9IFRpbWVab25lLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBkZWYuZ2V0T2Zmc2V0KHRvMTk3ME1zKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBnZXRPZmZzZXQoZGVmLCB0bzE5NzBNcyk7CiAgICAgICAgICAgICB0bzE5NzBNcyAtPSBvZmZzZXQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhCmluZGV4IDJlMjA5NGQuLjllN2I4N2MgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb24uamF2YQorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgKiB1bmlvbiBvZiB0aGUgbGV4aWNhbCBzcGFjZXMgb2YgYWxsIHRoZSBzY2hlbWEKICAgICAgKiBkYXRlL3RpbWUgdHlwZXMgKGV4Y2VwdCBmb3IgZHVyYXRpb24pLgogICAgICAqLwotICAgIHB1YmxpYyBHRHVyYXRpb24oQ2hhclNlcXVlbmNlIHN0cikKKyAgICBwdWJsaWMgR0R1cmF0aW9uKFN0cmluZyBzdHIpCiAgICAgewogICAgICAgICAvLyBGb3JtOiAgICAgICAgLVBuWW5NbkRUbkhuTW5TCiAgICAgICAgIC8vICh3aGVyZSBlYWNoIG4gbWF5IGJlIHByZWNlZGVkIGJ5IGEgLSBmb3IgdXMsIGFuZCB0aGUgd2hvbGUgbWF5IGJlIC0pCkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICAgICAgICAgICAgICBpbnQgaSA9IHN0YXJ0OwogICAgICAgICAgICAgICAgIGRvIGkgKz0gMTsKICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBHRGF0ZS5pc0RpZ2l0KGNoID0gc3RyLmNoYXJBdChpKSkpOwotICAgICAgICAgICAgICAgIF9mcyA9IG5ldyBCaWdEZWNpbWFsKHN0ci5zdWJTZXF1ZW5jZShzdGFydCwgaSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgX2ZzID0gbmV3IEJpZ0RlY2ltYWwoc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgICAgICAgICAgIGlmIChpID49IGxlbiB8fCBjaCAhPSAnUycpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKICAgICAgICAgICAgICAgICBzdGFydCA9IGk7CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lQ2FjaGUuamF2YQppbmRleCBhZDU1ZjU5Li4xN2MwODdjIDEwMDY0NAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZUNhY2hlLmphdmEKQEAgLTM3LDggKzM3LDExIEBACiAgICAgICovIAogICAgIHB1YmxpYyBRTmFtZUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCiAgICAgewotICAgICAgICBhc3NlcnQgaW5pdGlhbENhcGFjaXR5ID4gMDsKLSAgICAgICAgYXNzZXJ0IGxvYWRGYWN0b3IgPiAwICYmIGxvYWRGYWN0b3IgPCAxOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpbml0aWFsQ2FwYWNpdHkgPiAwKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobG9hZEZhY3RvciA+IDAgJiYgbG9hZEZhY3RvciA8IDEpOworICAgICAgICB9CiAKICAgICAgICAgLy8gRmluZCBhIHBvd2VyIG9mIDIgPj0gaW5pdGlhbENhcGFjaXR5CiAgICAgICAgIGludCBjYXBhY2l0eSA9IDE2OwpAQCAtNzQsOCArNzcsOSBAQAogICAgICAgICAvKgogICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgbG9jYWxOYW1lKTsKICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0IGxvY2FsTmFtZSAhPSBudWxsOwotICAgICAgICAKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGxvY2FsTmFtZSAhPSBudWxsKTsKKwogICAgICAgICBpZiAodXJpID09IG51bGwpIHVyaSA9ICIiOwogCiAgICAgICAgIGludCBpbmRleCA9IGhhc2godXJpLCBsb2NhbE5hbWUpICYgaGFzaG1hc2s7CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhCmluZGV4IDk1ZmM1MzMuLjgwOGI2NDggMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhCkBAIC00MzcsNyArNDM3LDcgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKKyAgICAgICAgaW50IGluZGV4ID0gbmV3IFN0cmluZyhzYikubGFzdEluZGV4T2YoIiwgIik7CiAgICAgICAgIGlmIChpbmRleCA+IDApCiAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5kZXgpOwogICAgICAgICBzYi5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldEJ1aWxkZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldEJ1aWxkZXIuamF2YQppbmRleCA3MTRkZGY2Li42MTg5MzQ0IDEwMDY0NAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0QnVpbGRlci5qYXZhCkBAIC03MDcsNyArNzA3LDcgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKKyAgICAgICAgaW50IGluZGV4ID0gbmV3IFN0cmluZyhzYikubGFzdEluZGV4T2YoIiwgIik7CiAgICAgICAgIGlmIChpbmRleCA+IDApCiAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5kZXgpOwogICAgICAgICBzYi5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFDb21wb25lbnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFDb21wb25lbnQuamF2YQppbmRleCA4YzU0NGQzLi4yNTg4ODlhIDEwMDY0NAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUNvbXBvbmVudC5qYXZhCkBAIC03OSw3ICs3OSwxMiBAQAogICAgICAgICAgICAgeyBfc2NoZW1hQ29tcG9uZW50ID0gc2NoZW1hQ29tcG9uZW50OyB9CiAKICAgICAgICAgcHJvdGVjdGVkIFJlZihTY2hlbWFUeXBlU3lzdGVtIHNjaGVtYVR5cGVTeXN0ZW0sIFN0cmluZyBoYW5kbGUpCi0gICAgICAgICAgICB7IGFzc2VydChoYW5kbGUgIT0gbnVsbCk7IF9zY2hlbWFUeXBlU3lzdGVtID0gc2NoZW1hVHlwZVN5c3RlbTsgX2hhbmRsZSA9IGhhbmRsZTsgfQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGhhbmRsZSAhPSBudWxsKTsKKyAgICAgICAgICAgIF9zY2hlbWFUeXBlU3lzdGVtID0gc2NoZW1hVHlwZVN5c3RlbTsKKyAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7CisgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIFNjaGVtYUNvbXBvbmVudCBfc2NoZW1hQ29tcG9uZW50OwogICAgICAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW0gX3NjaGVtYVR5cGVTeXN0ZW07CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmVhbnMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhCmluZGV4IGQyN2Y3OGEuLjRmMGYzODggMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCZWFucy5qYXZhCkBAIC00MCw2ICs0MCwzMSBAQAogICAgICAgICB9OwogCiAgICAgLyoqCisgICAgICogQnkgZGVmYXVsdCwgYXNzZXJ0aW9ucyBhcmUgb2ZmLiAgVGhpcyBjYW4gYmUgdHVybmVkIG9uIGJ5IHNldHRpbmcgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5ICJ4bWxiZWFucy5lbmFibGVhc3NlcnRpb25zIiBvciAieG1sYmVhbnMuZWEiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBBU1NFUlRTID0gX2dldEFzc2VydGluZygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfZ2V0QXNzZXJ0aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW5zLmVhIikgIT0gbnVsbAorICAgICAgICAgICAgICAgfHwgU3lzdGVtLmdldFByb3BlcnR5KCJ4bWxiZWFucy5lc2EiKSAhPSBudWxsCisgICAgICAgICAgICAgICB8fCBTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW5zLmVuYWJsZWFzc2VydGlvbnMiKSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhc3NlcnRUcnVlKGJvb2xlYW4gdGVzdCwgU3RyaW5nIG1lc3NhZ2UpCisgICAgeworICAgICAgICBpZiAoQVNTRVJUUyAmJiAhdGVzdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UgPT0gbnVsbCA/ICJBc3NlcnRpb25FeGNlcHRpb24sIG5vIG1lc3NhZ2UuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkFzc2VydGlvbkV4Y2VwdGlvbjogIi5jb25jYXQobWVzc2FnZSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhc3NlcnRUcnVlKGJvb2xlYW4gdGVzdCkKKyAgICB7CisgICAgICAgIGFzc2VydFRydWUodGVzdCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHRocmVhZCBsb2NhbCBRTmFtZUNhY2hlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBRTmFtZUNhY2hlIGdldFFOYW1lQ2FjaGUgKCApCkBAIC03Miw4ICs5Nyw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGNhdXNlZEV4Y2VwdGlvbihSdW50aW1lRXhjZXB0aW9uIGUsIFRocm93YWJsZSBjYXVzZSkKICAgICB7Ci0gICAgICAgIGUuaW5pdENhdXNlKGNhdXNlKTsKLSAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIHJldHVybiBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCksIGNhdXNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBYbWxFeGNlcHRpb24gd3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgZSkKQEAgLTIyMiw3ICsyNDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0Miw3ICsyNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKSwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMwMSw3ICszMjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IHdyYXBwZWRFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIHRocm93IHdyYXBwZWRFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0zNTEsNyArMzc1LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtMzc1LDcgKzM5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDM1LDcgKzQ1OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbENhbGVuZGFyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YQppbmRleCAzOTJjZTI4Li4wZmIyMWU5IDEwMDY0NAotLS0gYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YQorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YQpAQCAtMjI4LDExICsyMjgsMTEgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiB0aW1lIGZpZWxkLgogICAgICAqIAotICAgICAqIFVubGlrZSB0aGUgR3JlZ29yaWFuQ2FsZW5kYXIgaW1wbGVtZW50YXRpb24sIHRoZSBnZXQoKSBkb2VzIG5vdAorICAgICAqIFVubGlrZSB0aGUgR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0KCksIHBlZWsoKSBkb2VzIG5vdAogICAgICAqIGZvcmNlIGEgY29tcGxldGUgb2YgYWxsIGZpZWxkcy4gIElmIHlvdSB3aXNoIHRvIGZvcmNlIGEgY29tcGxldGlvbgogICAgICAqIG9mIGFsbCB0aGUgZmllbGRzLCBjYWxsIGdldFRpbWUoKSBmaXJzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldChpbnQgZmllbGQpCisgICAgcHVibGljIGludCBwZWVrKGludCBmaWVsZCkKICAgICB7CiAgICAgICAgIGlmICghaXNTZXQoZmllbGQpIHx8IGlzVGltZVNldCkKICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXQoZmllbGQpOyAvLyBmb3JjZXMgYSBjb21wbGV0ZQpAQCAtMjUwLDggKzI1MCw4IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGludCBkZWZhdWx0WWVhciA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RFRkFVTFRfWUVBUiA9IDA7IAotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RFRkFVTFRfWUVBUiA9IDA7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHllYXIgdGhhdCBpcyB1c2VkIHdoZW4gbm8geWVhciBpcyBzcGVjaWZpZWQuCiAgICAgICovIApAQCAtMjg2LDEyICsyODYsMTggQEAKICAgICAvKioKICAgICAgKiBPdmVycmlkZXMgR3JlZ29yaWFuQ2FsZW5kYXIuY29tcHV0ZVRpbWUgdG8gYXBwbHkgYSBkaWZmZXJlbnQKICAgICAgKiBkZWZhdWx0IHllYXIuICAoSXQgbXVzdCBiZSBhIGxlYXAgeWVhci4pCi0gICAgICovIAorICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVUaW1lKCkKICAgICB7CiAgICAgICAgIGJvb2xlYW4gdW5zZXRZZWFyID0gIWlzU2V0KFlFQVIpOworICAgICAgICBib29sZWFuIHVuc2V0RXJhID0gIWlzU2V0KEVSQSk7CiAgICAgICAgIGlmICh1bnNldFllYXIpCiAgICAgICAgICAgICBzZXQoWUVBUiwgZ2V0RGVmYXVsdFllYXIoKSk7CisgICAgICAgIGlmIChpbnRlcm5hbEdldChZRUFSKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQoRVJBLCBCQyk7CisgICAgICAgICAgICBzZXQoWUVBUiwgMSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyLmNvbXB1dGVUaW1lKCk7CkBAIC0zMDAsOSArMzA2LDI5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICh1bnNldFllYXIpCiAgICAgICAgICAgICAgICAgY2xlYXIoWUVBUik7CisgICAgICAgICAgICBpZiAodW5zZXRFcmEpCisgICAgICAgICAgICAgICAgY2xlYXIoRVJBKTsKICAgICAgICAgfQogICAgIH0KLSAgICAgICAgCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgR3JlZ29yaWFuQ2FsZW5kYXIuY29tcHV0ZUZpZWxkcyB0byBhcHBseSBhIGRpZmZlcmVudAorICAgICAqIGRlZmF1bHQgeWVhci4gIChJdCBtdXN0IGJlIGEgbGVhcCB5ZWFyLikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRmllbGRzKCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gdW5zZXRZZWFyID0gIWlzU2V0KFlFQVIpOworICAgICAgICBpZiAodW5zZXRZZWFyKQorICAgICAgICAgICAgc2V0KFlFQVIsIGdldERlZmF1bHRZZWFyKCkpOworICAgICAgICBpZiAoaW50ZXJuYWxHZXQoWUVBUikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0KEVSQSwgQkMpOworICAgICAgICAgICAgc2V0KFlFQVIsIDEpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuY29tcHV0ZUZpZWxkcygpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIERhdGUgX2JlZ2lubmluZ09mVGltZSA9IG5ldyBEYXRlKExvbmcuTUlOX1ZBTFVFKTsKICAgICAKICAgICAvKioKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFcnJvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKaW5kZXggMGMyYmI1Ni4uYzI1ZWMwYyAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKQEAgLTE1LDkgKzE1LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOwogCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBhdCBhIHNwZWNpZmljIFhNTCBsb2NhdGlvbi4KQEAgLTIzOCw0NiArMjM4LDU1IEBACiAgICAgLyoqCiAgICAgICogVHJpZXMgdG8gcHJvZHVjZSBhIG5pY2VseSBmb3JtYXR0ZWQgZmlsZW5hbWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZvcm1hdHRlZEZpbGVOYW1lKFN0cmluZyByYXdTdHJpbmcsIFVSSSBiYXNlKQorICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZvcm1hdHRlZEZpbGVOYW1lKFN0cmluZyByYXdTdHJpbmcsIFVSTCBiYXNlKQogICAgIHsKICAgICAgICAgaWYgKHJhd1N0cmluZyA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgVVJJIHVyaSA9IG51bGw7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOwogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGFuIGFic29sdXRlIFVSSSwgdHJlYXQgaXQgYXMgc3VjaAotICAgICAgICAgICAgdXJpID0gbmV3IFVSSShyYXdTdHJpbmcpOwotCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHRyZWF0IGl0IGxpa2UgYSBmaWxlbmFtZQotICAgICAgICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKQotICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7CisgICAgICAgICAgICAvLyBpZiBpdCBsb29rcyBsaWtlIGEgVVJMLCB0cmVhdCBpdCBhcyBzdWNoCisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHJhd1N0cmluZyk7CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQorICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9IG51bGw7CisgICAgICAgICAgICB1cmwgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gbG9va3MgbGlrZSBhIGZpbGVuYW1lOyBjb252ZXJ0IGl0IHRvIHVyaSBmb3IgcmVsYXRpdml6YXRpb24KLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgdXJpID0gbmV3IEZpbGUocmF3U3RyaW5nKS50b1VSSSgpOwotCi0gICAgICAgIGlmIChiYXNlICE9IG51bGwpCi0gICAgICAgICAgICB1cmkgPSBiYXNlLnJlbGF0aXZpemUodXJpKTsKLQotICAgICAgICAvLyBmaWxlbmFtZXMgZ2V0IHRoZWlyIGZpbGU6IHN0cmlwcGVkIG9mZiBhbmQgdGhlaXIgLydzIHR1cm5lZCBpbnRvIFwncyAoTVNET1MpCi0gICAgICAgIGlmICh1cmkuaXNBYnNvbHV0ZSgpID8gdXJpLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwIDoKLSAgICAgICAgICAgIGJhc2UgIT0gbnVsbCAmJiBiYXNlLmlzQWJzb2x1dGUoKSAmJiBiYXNlLmdldFNjaGVtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoImZpbGUiKSA9PSAwKQorICAgICAgICAvLyBsb29rcyBsaWtlIGEgZmlsZW5hbWU7IGNvbnZlcnQgaXQgdG8gdXJsIGZvciByZWxhdGl2aXphdGlvbgorICAgICAgICBpZiAodXJsID09IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEZpbGUodXJpKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB1cmwgPSBuZXcgRmlsZShyYXdTdHJpbmcpLnRvVVJMKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OworICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVybCA9IG51bGw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyB1cmxQcm90b2NvbCA9IHVybCA9PSBudWxsID8gbnVsbCA6IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgICBTdHJpbmcgYmFzZVByb3RvY29sID0gYmFzZSA9PSBudWxsID8gbnVsbCA6IGJhc2UuZ2V0UHJvdG9jb2woKTsKKworICAgICAgICBTdHJpbmcgZmlsZXBhdGggPSB1cmwgPT0gbnVsbCA/IHJhd1N0cmluZyA6IHVybC5nZXRQYXRoKCk7CisKKyAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIGJhc2UgIT0gbnVsbAorICAgICAgICAgICAgJiYgdXJsUHJvdG9jb2wuZXF1YWxzKGJhc2VQcm90b2NvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcmVsYXRpdml6ZQorICAgICAgICAgICAgZmlsZXBhdGggPSByZWxhdGl2aXplKGJhc2UuZ2V0UGF0aCgpLCBmaWxlcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmxQcm90b2NvbCkgfHwgImZpbGUiLmVxdWFscyhiYXNlUHJvdG9jb2wpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmaWxlbmFtZXMgZ2V0IHRoZWlyIGZpbGU6IHN0cmlwcGVkIG9mZiBhbmQgdGhlaXIgLydzIHR1cm5lZCBpbnRvIFwncyAoTVNET1MpCisgICAgICAgICAgICBmaWxlcGF0aCA9IG5ldyBGaWxlKGZpbGVwYXRoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVwYXRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzY1LDEwICszNzQsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFByb2R1Y2VzIGEgc3RhbmRhcmQgc3RyaW5nIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UuICBJZiBhIG5vbi1udWxsCi0gICAgICogVVJJIGlzIHN1cHBsaWVkLCBzb3VyY2UgbmFtZXMgYXJlIHJlbGF0aXZpemVkIGFnYWluc3QgdGhlIGdpdmVuCi0gICAgICogVVJJLgorICAgICAqIFVSTCBpcyBzdXBwbGllZCwgc291cmNlIG5hbWVzIGFyZSByZWxhdGl2aXplZCBhZ2FpbnN0IHRoZSBnaXZlbgorICAgICAqIFVSTC4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggVVJJIGJhc2UgKQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCBVUkwgYmFzZSApCiAgICAgewogICAgICAgICAvLyBtb2RpZmllZCB0byBjYXJlZnVsbHkgbWF0Y2ggdGhlIElERSdzCiAgICAgICAgIC8vIHdvcmtzaG9wLndvcmtzcGFjZS5hbnQuQW50TG9nZ2VyIHJlZ2V4CkBAIC00MDksNCArNDE4LDYwIEBACiAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgLy9jb3BpZWQgZnJvbSBOZXRVdGlscworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBwYXRoLCBTdHJpbmcgYWJzb2x1dGVSZXNvdXJjZSkgeworICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUmVzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0aC5jaGFyQXQocGF0aC5sZW5ndGgoKSAtIDEpICE9ICcvJykgeworICAgICAgICAgICAgcGF0aCArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWJzb2x1dGVSZXNvdXJjZS5zdGFydHNXaXRoKHBhdGgpKSB7CisgICAgICAgICAgICAvLyByZXNvdXJjZSBpcyBkaXJlY3QgZGVzY2VuZGFudAorICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUmVzb3VyY2Uuc3Vic3RyaW5nKHBhdGgubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVzb3VyY2UgaXMgbm90IGRpcmVjdCBkZXNjZW5kYW50CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtYXRjaFN0cmluZ3MocGF0aCwgYWJzb2x1dGVSZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHBhdGguY2hhckF0KGluZGV4LTEpICE9ICcvJykgeworICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBwYXRoRGlmZiA9IHBhdGguc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZSA9IGFic29sdXRlUmVzb3VyY2Uuc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIGludCBsZXZlbHMgPSBjb3VudChwYXRoRGlmZiwgJy8nKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIuLi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIuYXBwZW5kKHJlc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2NvcGllZCBmcm9tIFN0cmluZ1V0aWxzCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50KFN0cmluZyBzdHIsIGNoYXIgYykgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09IGMpIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8vY29waWVkIGZyb20gU3RyaW5nVXRpbHMKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF0Y2hTdHJpbmdzKFN0cmluZyBhLCBTdHJpbmcgYikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhcltdIGNhID0gYS50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gY2IgPSBiLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGludCBsZW4gPSAoIGNhLmxlbmd0aCA8IGNiLmxlbmd0aCApID8gY2EubGVuZ3RoIDogY2IubGVuZ3RoOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKGNhW2ldICE9IGNiW2ldKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEKaW5kZXggZGUzNDc0OC4uOTVhZDAwOSAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEV4Y2VwdGlvbi5qYXZhCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFeGNlcHRpb24uamF2YQpAQCAtMTksNiArMTksOCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIAogLyoqCiAgKiBBIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLApAQCAtMzEsNyArMzMsMTAgQEAKIHB1YmxpYyBjbGFzcyBYbWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKKworICAgIHByaXZhdGUgVGhyb3dhYmxlIF9jYXVzZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2RldGFpbE1lc3NhZ2UgPSBudWxsOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UuCiAgICAgICovIApAQCAtNDAsMTMgKzQ1LDEzIEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UgYW5kIGEgY2F1c2UuCiAgICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQgKSB7IHN1cGVyKCBtLCB0ICk7IH0KLSAgICAKKyAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0ICkgeyBzdXBlciggbSApOyBfY2F1c2UgPSB0OyB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgY2F1c2UuCiAgICAgICovIAotICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBUaHJvd2FibGUgdCAgICAgICAgICAgKSB7IHN1cGVyKCB0ICk7ICAgIH0KLSAgICAKKyAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggVGhyb3dhYmxlIHQgICAgICAgICAgICkgeyBzdXBlciggKTsgX2NhdXNlID0gdDsgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGFuIHtAbGluayBYbWxFcnJvcn0uCiAgICAgICovIApAQCAtNjgsNyArNzMsNyBAQAogICAgICAqLyAKICAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBDb2xsZWN0aW9uIGVycm9ycyApCiAgICAgewotICAgICAgICBzdXBlciggbSwgdCApOworICAgICAgICB0aGlzKCBtLCB0ICk7CiAKICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKQogICAgICAgICAgICAgX2Vycm9ycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoIGVycm9ycyApICk7CkBAIC03OSw3ICs4NCw3IEBACiAgICAgICovIAogICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBYbWxSdW50aW1lRXhjZXB0aW9uIHhtbFJ1bnRpbWVFeGNlcHRpb24gKQogICAgIHsKLSAgICAgICAgc3VwZXIoCisgICAgICAgIHRoaXMoCiAgICAgICAgICAgICB4bWxSdW50aW1lRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgeG1sUnVudGltZUV4Y2VwdGlvbi5nZXRDYXVzZSgpICk7CiAKICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSB4bWxSdW50aW1lRXhjZXB0aW9uLmdldEVycm9ycygpOwpAQCAtMTA3LDUgKzExMiw4MCBAQAogICAgICAgICByZXR1cm4gX2Vycm9yczsKICAgICB9CiAKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfY2F1c2U7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBpbml0Q2F1c2UoVGhyb3dhYmxlIHQpCisgICAgeworICAgICAgICBpZiAoX2NhdXNlICE9IHRoaXMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBvdmVyd3JpdGUgY2F1c2UiKTsKKyAgICAgICAgaWYgKF9jYXVzZSA9PSB0aGlzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VsZi1jYXVzYXRpb24gbm90IHBlcm1pdHRlZCIpOworICAgICAgICBfY2F1c2UgPSB0OworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZ2V0TWVzc2FnZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKyAgICB7CisgICAgICAgIGlmIChfZGV0YWlsTWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgX2RldGFpbE1lc3NhZ2UgPSBfY2F1c2UgIT0gbnVsbCA/IF9jYXVzZS50b1N0cmluZygpIDogc3VwZXIuZ2V0TWVzc2FnZSgpOworCisgICAgICAgIHJldHVybiBfZGV0YWlsTWVzc2FnZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkKKyAgICB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7CisKKyAgICAgICAgICAgIFRocm93YWJsZSBvdXJDYXVzZSA9IGdldENhdXNlKCk7CisgICAgICAgICAgICBpZiAob3VyQ2F1c2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLnByaW50bG4oIkNhdXNlZCBieTogIik7CisgICAgICAgICAgICAgICAgb3VyQ2F1c2UucHJpbnRTdGFja1RyYWNlKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAocCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHApOworCisgICAgICAgICAgICBUaHJvd2FibGUgb3VyQ2F1c2UgPSBnZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKG91ckNhdXNlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcC5wcmludGxuKCJDYXVzZWQgYnk6ICIpOworICAgICAgICAgICAgICAgIG91ckNhdXNlLnByaW50U3RhY2tUcmFjZShwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgTGlzdCBfZXJyb3JzOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxSdW50aW1lRXhjZXB0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGRjYWY0Y2IuLjMyNjZlYWYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQpAQCAtMTksNiArMTksOCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIAogLyoqCiAgKiBBbiB1bmNoZWNrZWQgWE1MIGV4Y2VwdGlvbi4KQEAgLTMwLDcgKzMyLDE1IEBACiBwdWJsaWMgY2xhc3MgWG1sUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKKworICAgIHByaXZhdGUgVGhyb3dhYmxlIF9jYXVzZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2RldGFpbE1lc3NhZ2UgPSBudWxsOworCisgICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UuCiAgICAgICovIApAQCAtMzksMTkgKzQ5LDE5IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlIGFuZCBhIGNhdXNlLgogICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCApIHsgc3VwZXIoIG0sIHQgKTsgfQotICAgIAorICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0ICkgeyBzdXBlciggbSApOyBfY2F1c2UgPSB0OyB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIGNhdXNlLgogICAgICAqLyAKLSAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFRocm93YWJsZSB0ICAgICAgICAgICApIHsgc3VwZXIoIHQgKTsgICAgfQotICAgIAorICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggVGhyb3dhYmxlIHQgICAgICAgICAgICkgeyBzdXBlciggKTsgX2NhdXNlID0gdDsgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhIGNvbGxlY3Rpb24gb2YgWG1sRXJyb3JzLgogICAgICAqLyAKICAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCwgQ29sbGVjdGlvbiBlcnJvcnMgKQogICAgIHsKLSAgICAgICAgc3VwZXIoIG0sIHQgKTsKKyAgICAgICAgdGhpcyggbSwgdCApOwogCiAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKICAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KGVycm9ycykgKTsKQEAgLTc4LDcgKzg4LDcgQEAKICAgICAgKi8gCiAgICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBYbWxFeGNlcHRpb24geG1sRXhjZXB0aW9uICkKICAgICB7Ci0gICAgICAgIHN1cGVyKCB4bWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB4bWxFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOworICAgICAgICB0aGlzKCB4bWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCB4bWxFeGNlcHRpb24uZ2V0Q2F1c2UoKSApOwogCiAgICAgICAgIENvbGxlY3Rpb24gZXJyb3JzID0geG1sRXhjZXB0aW9uLmdldEVycm9ycygpOwogCkBAIC0xMDUsNSArMTE1LDgwIEBACiAgICAgICAgIHJldHVybiBfZXJyb3JzOwogICAgIH0KIAorICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfY2F1c2U7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBpbml0Q2F1c2UoVGhyb3dhYmxlIHQpCisgICAgeworICAgICAgICBpZiAoX2NhdXNlICE9IHRoaXMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBvdmVyd3JpdGUgY2F1c2UiKTsKKyAgICAgICAgaWYgKF9jYXVzZSA9PSB0aGlzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VsZi1jYXVzYXRpb24gbm90IHBlcm1pdHRlZCIpOworICAgICAgICBfY2F1c2UgPSB0OworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZ2V0TWVzc2FnZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKyAgICB7CisgICAgICAgIGlmIChfZGV0YWlsTWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgX2RldGFpbE1lc3NhZ2UgPSBfY2F1c2UgIT0gbnVsbCA/IF9jYXVzZS50b1N0cmluZygpIDogc3VwZXIuZ2V0TWVzc2FnZSgpOworCisgICAgICAgIHJldHVybiBfZGV0YWlsTWVzc2FnZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkKKyAgICB7CisgICAgICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7CisKKyAgICAgICAgICAgIFRocm93YWJsZSBvdXJDYXVzZSA9IGdldENhdXNlKCk7CisgICAgICAgICAgICBpZiAob3VyQ2F1c2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLnByaW50bG4oIkNhdXNlZCBieTogIik7CisgICAgICAgICAgICAgICAgb3VyQ2F1c2UucHJpbnRTdGFja1RyYWNlKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAocCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHApOworCisgICAgICAgICAgICBUaHJvd2FibGUgb3VyQ2F1c2UgPSBnZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKG91ckNhdXNlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcC5wcmludGxuKCJDYXVzZWQgYnk6ICIpOworICAgICAgICAgICAgICAgIG91ckNhdXNlLnByaW50U3RhY2tUcmFjZShwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgTGlzdCBfZXJyb3JzOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvci5qYXZhCmluZGV4IGNhMTE5YzQuLjVhMzA2MDYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yLmphdmEKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3IuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Qcm9jaW5zdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuWG1sbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuQ2hhbmdlU3RhbXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CkBAIC01Myw4ICs1NCw4IEBACiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBYbWxDdXJzb3IsIENoYW5nZUxpc3RlbmVyCiB7Ci0gICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzICkgICAgICAgIHsgYXNzZXJ0IHMgIT0gbnVsbDsgX2RhdGEgPSBDdXJzb3JEYXRhLmdldE9uZSggciApOyBzZXQoIHMgKTsgfQotICAgIEN1cnNvciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKSB7IGFzc2VydCBzICE9IG51bGw7IF9kYXRhID0gQ3Vyc29yRGF0YS5nZXRPbmUoIHIgKTsgc2V0KCBzLCBwICk7IH0KKyAgICBDdXJzb3IgKCBSb290IHIsIFNwbGF5IHMgKSAgICAgICAgeyBpZiAoWG1sQmVhbnMuQVNTRVJUUykgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzICE9IG51bGwpOyBfZGF0YSA9IEN1cnNvckRhdGEuZ2V0T25lKCByICk7IHNldCggcyApOyB9CisgICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApIHsgaWYgKFhtbEJlYW5zLkFTU0VSVFMpIFhtbEJlYW5zLmFzc2VydFRydWUocyAhPSBudWxsKTsgX2RhdGEgPSBDdXJzb3JEYXRhLmdldE9uZSggciApOyBzZXQoIHMsIHAgKTsgfQogCiAgICAgLy8KICAgICAvLwpAQCAtODYsNyArODcsOCBAQAogICAgICAgICAKICAgICAgICAgaW50IHBhID0gcy5nZXRQb3NBZnRlcigpOwogCi0gICAgICAgIGFzc2VydCBwID49IHBhIHx8IHMuaXNMZWFmKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID49IHBhIHx8IHMuaXNMZWFmKCkpOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIHAgPj0gcGEgPyBzLmdldENjaEFmdGVyKCkgLSBwICsgcGEgOiBzLmdldFBvc0xlYWZFbmQoKSAtIHA7CiAgICAgfQpAQCAtMTU1LDEwICsxNTcsMTIgQEAKICAgICAKICAgICAgICAgICAgIFR5cGUgdCA9IHMuZ2V0VHlwZSggciApOwogICAgIAotICAgICAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodCAhPSBudWxsKTsKICAgICAKICAgICAgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSB0LmdldFhtbE9iamVjdCgpOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyZXN1bHQgIT0gbnVsbCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgfQpAQCAtMjY1LDggKzI2OSw5IEBACiAgICAgICAgICAgICBpZiAoYS5nZXRSb290KCkgIT0gZ2V0Um9vdCgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKLSAgICAgICAgICAgIGFzc2VydCBhLmdldFNwbGF5KCkgIT0gbnVsbDsKLSAgICAKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYS5nZXRTcGxheSgpICE9IG51bGwpOworCiAgICAgICAgICAgICBzZXQoIGEgKTsKICAgICAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNTM1LDkgKzU0MCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc1Jvb3QoKSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKHAgPj0gcy5nZXRQb3NBZnRlcigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKQEAgLTU0NSw5ICs1NTMsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBwIDwgcy5nZXRQb3NBZnRlcigpOwotICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmlzTGVhZigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCA8IHMuZ2V0UG9zQWZ0ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBzLmdldFBvc0xlYWZFbmQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBzLmdldFBvc0xlYWZFbmQoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5nZXRDY2hBZnRlcigpID4gMCkKQEAgLTU4MCw3ICs1OTEsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU3BsYXkgdCA9IG9zLnByZXZOb25BdHRyU3BsYXkoKTsKICAgICAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHQuaXNDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHQuaXNDb250YWluZXIoKSk7CiAgICAgCiAgICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5hdmlnYXRpbmcgdG8gdGhlIGNvbnRlbnQgb2YgYSBjb250YWluZXIuICBGbHVzaApAQCAtNTk3LDcgKzYwOSw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkgJiYgIW9zLmlzQXR0cigpICYmIG9zLmdldE1heFBvcygpID4gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBvcy5pc0NvbnRhaW5lcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUob3MuaXNDb250YWluZXIoKSk7CiAgICAgCiAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHROb25BdHRyU3BsYXkoKTsKICAgICAgICAgICAgICAgICB9CkBAIC02MjMsNyArNjM2LDggQEAKICAgICAKICAgICAgICAgICAgIGlmIChwID09IDEgJiYgcy5pc0ludmFsaWQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmlzTGVhZigpKTsKICAgICAgICAgICAgICAgICBwICs9IHMuZW5zdXJlQ29udGVudFZhbGlkKCk7CiAgICAgICAgICAgICB9CiAgICAgCkBAIC02NTUsNyArNjY5LDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHQgPSB0LnByZXZOb25BdHRyU3BsYXkoKTsKICAgICAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHQuaXNDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHQuaXNDb250YWluZXIoKSk7CiAgICAgCiAgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzRG9jKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICB0LmVuc3VyZUNvbnRlbnRWYWxpZCgpOwpAQCAtNjczLDEzICs2ODgsMTUgQEAKICAgICAKICAgICAgICAgICAgIGlmIChzLmlzQXR0cigpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID09IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCA9PSAwKTsKICAgICAKICAgICAgICAgICAgICAgICBTcGxheSB0ID0gcy5wcmV2U3BsYXkoKTsKICAgICAKICAgICAgICAgICAgICAgICBpZiAoIXQuaXNBdHRyKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodC5pc0NvbnRhaW5lcigpKTsKICAgICAKICAgICAgICAgICAgICAgICAgICAgc2V0KCB0LCAwICk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7CkBAIC03MDAsMjEgKzcxNywyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBwID4gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7Ci0gICAgCisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc1Jvb3QoKSk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaW50IHBvc0FmdGVyID0gcy5nZXRQb3NBZnRlcigpOwogICAgIAogICAgICAgICAgICAgICAgIGlmIChwID49IHBvc0FmdGVyKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoQWZ0ZXIoKSA+IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmdldENjaEFmdGVyKCkgPiAwKTsKICAgICAgICAgICAgICAgICAgICAgcCA9IHBvc0FmdGVyIC0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKLSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNWYWxpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc0xlYWYoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBwID0gcCA+IDEgJiYgcCA9PSBwb3NBZnRlciAtIDEgPyAxIDogMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05NDQsOSArOTY4LDEyIEBACiAKICAgICB2b2lkIGluc2VydCAoIFNwbGF5IHNJbnNlcnQsIFN0cmluZyB2YWx1ZSApCiAgICAgewotICAgICAgICBhc3NlcnQgIWlzRGlzcG9zZWQoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNJbnNlcnQuZ2V0Um9vdFNsb3coKSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgc0luc2VydC5nZXRDY2goKSA9PSAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNEaXNwb3NlZCgpKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGwpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzSW5zZXJ0LmdldENjaCgpID09IDApOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCiAgICAgICAgICAgICBzSW5zZXJ0LmFkanVzdENjaCggdmFsdWUubGVuZ3RoKCkgKTsKQEAgLTk2MSw3ICs5ODgsOCBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzLmluc2VydCggZ2V0Um9vdCgpLCBwLCBzSW5zZXJ0LCBudWxsLCAwLCAwLCB0cnVlICk7CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRWYWx1ZSAoICkKQEAgLTExOTAsNyArMTIxOCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKICAgICAKLSAgICAgICAgICAgIGFzc2VydCAhZ2V0U3BsYXkoKS5pc1Jvb3QoKSB8fCBnZXRQb3MoKSA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghZ2V0U3BsYXkoKS5pc1Jvb3QoKSB8fCBnZXRQb3MoKSA9PSAwKTsKICAgICAgICAgICAgIHJldHVybiAhZ2V0U3BsYXkoKS5pc1Jvb3QoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyODYsNyArMTMxNSw4IEBACiAgICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBtYXhDY2gpCiAgICAgICAgICAgICAgICAgY2NoID0gbWF4Q2NoOwogICAgIAotICAgICAgICAgICAgYXNzZXJ0IHAgKyBjY2ggPD0gcy5nZXRFbmRQb3MoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCArIGNjaCA8PSBzLmdldEVuZFBvcygpKTsKICAgICAKICAgICAgICAgICAgIGlmIChwICsgY2NoID09IHMuZ2V0RW5kUG9zKCkpCiAgICAgICAgICAgICAgICAgdG9OZXh0VG9rZW4oKTsKQEAgLTEzMjksNyArMTM1OSw4IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgbWF4Q2NoID0gcCAtIHMuZ2V0UG9zQWZ0ZXIoKTsKICAgICAKLSAgICAgICAgICAgIGFzc2VydCBwVGV4dCA8PSBzVGV4dC5nZXRFbmRQb3MoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocFRleHQgPD0gc1RleHQuZ2V0RW5kUG9zKCkpOwogICAgIAogICAgICAgICAgICAgaWYgKG1heENjaCA9PSAwIHx8IGNjaCA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMTUxMiw3ICsxNTQzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCA+IDApOwogICAgIAogICAgICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICAgICAgewpAQCAtMjAzOSw3ICsyMDcxLDggQEAKICAgICAKICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBucywgbnVsbCwgdHJ1ZSk7CiAKLSAgICAgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocmVzdWx0ICE9IG51bGwpOwogCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CkBAIC0yMDYyLDcgKzIwOTUsOCBAQAogICAgIAogICAgICAgICAgICAgZG8KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0NvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGMuaXNDb250YWluZXIoKSk7CiAgICAgCiAgICAgICAgICAgICAgICAgUU5hbWUgY05hbWUgPSBjLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAKQEAgLTIyNjMsNyArMjI5Nyw4IEBACiAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKICAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKICAgICAKLSAgICAgICAgICAgIGFzc2VydCBwIDwgcy5nZXRFbmRQb3MoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCA8IHMuZ2V0RW5kUG9zKCkpOwogICAgIAogICAgICAgICAgICAgaWYgKHAgPiAwKQogICAgICAgICAgICAgewpAQCAtMjI3Miw3ICsyMzA3LDggQEAKICAgICAKICAgICAgICAgICAgICAgICBpbnQgY2NoUmVtb3ZlID0gcmVtb3ZlQ2hhcnMoIGdldFBvc3RDY2goKSApOwogICAgIAotICAgICAgICAgICAgICAgIGFzc2VydCBjY2hSZW1vdmUgPiAwOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNjaFJlbW92ZSA+IDApOwogICAgIAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQpAQCAtMjM2Myw3ICsyMzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgclNyYywgcFNyYywgZ2V0UG9zdENjaCgpLCByRHN0LCBzRHN0LCBwRHN0LCBmYWxzZSApID4gMDsKICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0IHBTcmMgPT0gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBTcmMgPT0gMCk7CiAgICAgICAgICAgICAKICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbW92ZW1lbnQgb2Ygc3R1ZmYgaW50byBpdHNlbGYhICBUaGlzIGNhc2UgaXMgYmFzaWNhbGx5CiAgICAgICAgIC8vIGEgbm8tb3AKQEAgLTIzNzQsNyArMjQxMSw4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnQgcFNyYyA9PSAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocFNyYyA9PSAwKTsKICAgICAgICAgICAgIAogICAgICAgICBzU3JjLm1vdmUoIHJTcmMsIGNEc3QuZ2V0Um9vdCgpLCBjRHN0LmdldFNwbGF5KCksIGNEc3QuZ2V0UG9zKCksIHRydWUgKTsKICAgICAgICAgICAgIApAQCAtMjQ0Niw3ICsyNDg0LDggQEAKICAgICAgICAgaWYgKHMuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggcCwgc0RzdCwgcERzdCwgdHJ1ZSApKQogICAgICAgICAgICAgcmV0dXJuIGNvcHlDaGFyc0ltcGwoIGdldFBvc3RDY2goKSwgZHN0ICkgPiAwOwogICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydCBwID09IDA7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID09IDApOwogICAgICAgICAgICAgCiAgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIHNwbGF5IGNvcHkgYmVmb3JlIGdldHRpbmcgdGhlIHRleHQgYmVjYXVzZSB0aGUgY29weQogICAgICAgICAvLyB3aWxsIHZhbGlkYXRlIGludmFsaWQgY29udGVudHMvdmFsdWVzCkBAIC0yNDk5LDcgKzI1MzgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKICAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IHRvRmlyc3RDb250ZW50VG9rZW4oKTsKLSAgICAgICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCF0dC5pc05vbmUoKSk7CiAgICAgCiAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSAhaXNGaW5pc2goKTsKICAgICAgICAgICAgIApAQCAtMjUwOCw3ICsyNTQ4LDggQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoICFpc0ZpbmlzaCgpICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHJlbW92ZVhtbCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgYjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKQEAgLTI2MDAsNyArMjY0MSw4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAKICAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOwotICAgICAgICBhc3NlcnQgIXR0LmlzTm9uZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIXR0LmlzTm9uZSgpKTsKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gbW92ZWQgPSAhaXNGaW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgCkBAIC0yNjEyLDcgKzI2NTQsOCBAQAogICAgICAgICAgICAgd2hpbGUgKCAhaXNGaW5pc2goKSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gbW92ZVhtbEltcGwoIGRzdCApOwotICAgICAgICAgICAgICAgIGFzc2VydCBiOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKQEAgLTI2OTQsNyArMjczNyw4IEBACiAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICBUb2tlblR5cGUgdHQgPSB0b0ZpcnN0Q29udGVudFRva2VuKCk7Ci0gICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghdHQuaXNOb25lKCkpOwogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgYm9vbGVhbiBjb3BpZWQgPSAhaXNGaW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgCkBAIC0yNzE0LDcgKzI3NTgsOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IGNvcHlYbWxJbXBsKCBkc3QgKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CkBAIC0yOTU4LDcgKzMwMDMsNyBAQAogICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQogICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwogICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtMzAwOSw3ICszMDU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKIAogICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlRET0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIExPT1A7CiAKICAgICAgICAgICAgICAgICB9CkBAIC0zMTM1LDcgKzMxODEsOCBAQAogICAgIAogICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBfZGF0YS5fZ29vYmVyLmdldFJvb3QoKS52YWxpZGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2RhdGEuX2dvb2Jlci5nZXRSb290KCkudmFsaWRhdGUoKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMzE2Myw3ICszMjEwLDggQEAKICAgICAgICAgCiAgICAgICAgIHZvaWQgYWRkICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmdldFJvb3RTbG93KCkgPT0gcjsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5nZXRSb290U2xvdygpID09IHIpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKICAgICAgICAgICAgIHsKQEAgLTMxNzgsNyArMzIyNiw4IEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChfc3BsYXlzID09IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9jb3VudCA9PSAwOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9jb3VudCA9PSAwKTsKICAgICAgICAgICAgICAgICBfc3BsYXlzID0gbmV3IFNwbGF5IFsgMTYgXTsKICAgICAgICAgICAgICAgICBfcG9zaXRpb25zID0gbmV3IGludCBbIDE2IF07CiAgICAgICAgICAgICB9CkBAIC0zMjAyLDcgKzMyNTEsOCBAQAogCiAgICAgICAgIHZvaWQgcG9wICggKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgc2l6ZSgpID4gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoc2l6ZSgpID4gMCk7CiAKICAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQogICAgICAgICAgICAgewpAQCAtMzI1Myw3ICszMzAzLDggQEAKIAogICAgICAgICBib29sZWFuIHNldEN1cnNvciAoIEN1cnNvciBjLCBpbnQgaSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBpID49IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGkgPj0gMCk7CiAKICAgICAgICAgICAgIHdoaWxlICggX3BhdGhFbmdpbmUgIT0gbnVsbCAmJiBjdXJyZW50U2l6ZSgpIDw9IGkgKQogICAgICAgICAgICAgewpAQCAtMzI2NiwxMiArMzMxNywxNCBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jdXJzb3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpIDwgX2N1cnNvcnMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBjLnNldCggKEN1cnNvckdvb2JlcikgX2N1cnNvcnMuZ2V0KCBpICkgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpIDwgX2NvdW50KTsKICAgICAgICAgICAgICAgICBjLnNldCggX3NwbGF5c1sgaSBdLCBfcG9zaXRpb25zWyBpIF0gKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9KYXhlblhCZWFuc0RlbGVnYXRlLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQppbmRleCA4NWRmNTRhLi42MmFjY2JiIDEwMDY0NAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQpAQCAtMTUsNiArMTUsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC00MCw3ICs0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MCw3ICs4Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCmluZGV4IGFjNTRiMWEuLjNkMzc3NzIgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKQEAgLTEzNiw3ICsxMzcsOCBAQAogCiAgICAgICAgIHN5bmNocm9uaXplZCAoIF94YmVhblBhdGhDYWNoZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAoeHFybCB8PSBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhxcmxGb3JYcGF0aCApKSB8fCB0cnVlOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgoeHFybCB8PSBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhxcmxGb3JYcGF0aCApKSB8fCB0cnVlKTsKIAogICAgICAgICAgICAgaWYgKCF4cXJsIHx8IG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWGJlYW5Gb3JYcGF0aCApKQogICAgICAgICAgICAgewpAQCAtMTYwLDcgKzE2Miw4IEBACiAKICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICEgb3B0aW9ucy5oYXNPcHRpb24oIF91c2VYYmVhbkZvclhwYXRoICk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoISBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhiZWFuRm9yWHBhdGggKSk7CiAKICAgICAgICAgICAgICAgICBwYXRoID0gKFBhdGgpIF94cXJsUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKIApAQCAtMzEwLDcgKzMxMyw4IEBACiAKICAgICAgICAgc3RhdGljIFBhdGggY3JlYXRlICggU3RyaW5nIHBhdGhFeHByLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIWN1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICkpOwogCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKQEAgLTM0OCw3ICszNTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgY29tcGlsZSBwYXRoIiwgZSApOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggIkNhbid0IGNvbXBpbGUgcGF0aCIsIGUgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTM2NCw3ICszNjgsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBYQmVhblBhdGhFbmdpbmUgKCBYUGF0aCB4cGF0aCwgUm9vdCByLCBTcGxheSBzICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNDb250YWluZXIoKSk7CiAKICAgICAgICAgICAgICAgICBfcm9vdCA9IHI7CiAgICAgICAgICAgICAgICAgX2N1cnIgPSBfdG9wID0gczsKQEAgLTQ5Myw3ICs0OTgsOCBAQAogCiAgICAgICAgIHN0YXRpYyBQYXRoIGNyZWF0ZSAoIFN0cmluZyBwYXRoRXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKTsgLy8gY2V6YXIgcmV2aWV3IHdpdGggZXJpY3ZhcworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICkpOyAvLyBjZXphciByZXZpZXcgd2l0aCBlcmljdmFzCiAKICAgICAgICAgICAgIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSBpbXBsID0gSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5jcmVhdGVJbnN0YW5jZSggcGF0aEV4cHIgKTsKICAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpCmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCmluZGV4IDgxYTAwZjcuLjY1ZDAwMWQgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUm9vdC5qYXZhCkBAIC04NSw3ICs4NSw4IEBACiAgICAgewogICAgICAgICBzdXBlciggUk9PVCApOwogCi0gICAgICAgIGFzc2VydCBzdGwgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHN0bCAhPSBudWxsKTsKIAogICAgICAgICBfc2NoZW1hVHlwZVN5c3RlbSA9IHN0bDsKIApAQCAtMTMzLDcgKzEzNCw4IEBACiAKICAgICBwdWJsaWMgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodmFsaWRhdGUoKSk7CiAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yKCB0aGlzLCBfZG9jICk7CiAgICAgfQogCkBAIC0xNjUsMTggKzE2NywyMiBAQAogICAgICAgICBpZiAoIWlzRW1wdHkoKSkKICAgICAgICAgICAgIF9kb2MucmVtb3ZlQ29udGVudCggdGhpcywgdHJ1ZSApOwogCi0gICAgICAgIGFzc2VydCBpc0VtcHR5KCk7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOwotICAgICAgICBhc3NlcnQgX2xlZnRPbmx5OwotICAgICAgICBhc3NlcnQgZ2V0Q2NoTGVmdCgpID09IDA7Ci0gICAgICAgIGFzc2VydCBfdGV4dC5sZW5ndGgoKSA9PSAwOwotICAgICAgICBhc3NlcnQgZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDE7Ci0gICAgICAgIGFzc2VydCBfZG9jICE9IG51bGwgJiYgX2xlZnRTcGxheSA9PSBfZG9jOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0VtcHR5KCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZSgpKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2xlZnRPbmx5KTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0Q2NoTGVmdCgpID09IDApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfdGV4dC5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDEpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZG9jICE9IG51bGwgJiYgX2xlZnRTcGxheSA9PSBfZG9jKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQ2NoICggU3BsYXkgcywgaW50IGRlbHRhQ2NoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCAhcy5pc1Jvb3QoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFzLmlzUm9vdCgpKTsKIAogICAgICAgICBpZiAoZGVsdGFDY2ggIT0gMCkKICAgICAgICAgewpAQCAtMjE3LDggKzIyMywxMSBAQAogICAgIHsKICAgICAgICAgLy8gb25seSBvbmUgb2YgKHNldCBvciBuYW1lKSBpcyBub3QgbnVsbAogICAgICAgICAvLyBvciBib3RoIGFyZSBudWxsIGZvciBhIHdpbGRjYXJkCi0gICAgICAgIGFzc2VydCAoIG5hbWUgPT0gbnVsbCB8fCBzZXQgPT0gbnVsbCApOwotICAgICAgICBhc3NlcnQgbiA+PSAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggbmFtZSA9PSBudWxsIHx8IHNldCA9PSBudWxsICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBuID49IDAgKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuaXNMZWFmKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTYyNiw3ICs2MzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCkBAIC02MzksNyArNjQ4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtNjY4LDcgKzY3Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03MDIsNyArNzExLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03MzAsNyArNzM5LDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHIuZGlzYWJsZVN0b3JlVmFsaWRhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCByLmRpc2FibGVTdG9yZVZhbGlkYXRpb24oKSApOwogCiAgICAgICAgICAgICAgICAgX3hyLnBhcnNlKCBpbnB1dFNvdXJjZSApOwogCkBAIC03NzYsNyArNzg2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5lbmFibGVTdG9yZVZhbGlkYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHIuZW5hYmxlU3RvcmVWYWxpZGF0aW9uKCkgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDQ5LDcgKzEwNjAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlN0cmluZ1JlYWRlciBzaG91bGQgbm90IHRocm93IElPRXhjZXB0aW9uIjsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGZhbHNlLCAiU3RyaW5nUmVhZGVyIHNob3VsZCBub3QgdGhyb3cgSU9FeGNlcHRpb24iICk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKQEAgLTEwODAsNyArMTA5Miw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKCBudWxsLCBudWxsICk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBpc0VtcHR5KCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGlzRW1wdHkoKSApOwogCiAgICAgICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgICBfdHlwZSA9IHR5cGU7CkBAIC0xMTQxLDcgKzExNTQsOCBAQAogICAgIHsKICAgICAgICAgTG9hZENvbnRleHQgKCBSb290IHJvb3QsIFhtbE9wdGlvbnMgb3B0aW9ucyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByb290ICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCByb290ICE9IG51bGwgKTsKIAogICAgICAgICAgICAgX29wdGlvbnMgPSBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwogCkBAIC0xMTg5LDE0ICsxMjAzLDE4IEBACiAKICAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0Q3AgKCBTcGxheSBzICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKLSAgICAgICAgICAgIGFzc2VydCBkdiA+IDAgfHwgcy5nZXRDcFNsb3coKSA9PSBzLmdldENjaExlZnQoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIF9yb290LmlzTGVmdE9ubHkoKSk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZHYgPiAwIHx8IHMuZ2V0Q3BTbG93KCkgPT0gcy5nZXRDY2hMZWZ0KCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoTGVmdCgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkanVzdENjaCAoIFNwbGF5IHMsIGludCBkZWx0YSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfcm9vdC5pc0xlZnRPbmx5KCkpOwogCiAgICAgICAgICAgICBzLmFkanVzdENjaCggZGVsdGEgKTsKIApAQCAtMTIwNSwxNSArMTIyMywxNyBAQAogCiAgICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0F0dHIoKSB8fCBzLmlzUm9vdCgpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQXR0cigpIHx8IHMuaXNSb290KCkpOwogICAgICAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggZGVsdGEgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnQgKCBTcGxheSBzICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIV9maW5pc2hlZCApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2NoKCkgPT0gMCApOwogCiAgICAgICAgICAgICBfcm9vdC5pbnNlcnRTcGxheSggcywgX3Jvb3QuX2xlZnRTcGxheSApOwogCkBAIC0xMjI2LDggKzEyNDYsMTEgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0ICggU3BsYXkgcywgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoKCkgPT0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoICFfZmluaXNoZWQgKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENjaCgpID09IDAgKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluc2VydCggcyApOwogICAgICAgICAgICAgX3Jvb3QuX3RleHQuaW5zZXJ0KCBnZXRDcCggcyApLCBidWYsIG9mZiwgY2NoICk7CiAgICAgICAgICAgICBhZGp1c3RDY2goIHMsIGNjaCApOwpAQCAtMTIzNSw4ICsxMjU4LDExIEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydCAoIFNwbGF5IHMsIFN0cmluZyB0ZXh0ICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIV9maW5pc2hlZCApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2NoKCkgPT0gMCApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5zZXJ0KCBzICk7CiAgICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoIGdldENwKCBzICksIHRleHQgKTsKICAgICAgICAgICAgIGFkanVzdENjaCggcywgdGV4dC5sZW5ndGgoKSApOwpAQCAtMTI4OCw3ICsxMzE0LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMzAyLDcgKzEzMjksOCBAQAogICAgICAgICAgICAgaWYgKF9mcm9udGllciAhPSBfcm9vdC5fZG9jKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oICJEb2N1bWVudCBub3QgZW5kZWQiICk7CiAKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5fbGVmdE9ubHk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfcm9vdC5fbGVmdE9ubHkgKTsKIAogICAgICAgICAgICAgX2ZpbmlzaGVkID0gdHJ1ZTsKIApAQCAtMTM0NSw3ICsxMzczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyApOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIGluc2VydCBzaG91bGQgbm90IHNwbGF5IHRoZSB0cmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggX3Jvb3QuaXNMZWZ0T25seSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEzNTcsNyArMTM4Niw4IEBACiAKICAgICAgICAgICAgIF9yb290LmludmFsaWRhdGVWZXJzaW9uKCk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfcm9vdC5pc0xlZnRPbmx5KCkgKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpICkKQEAgLTE0ODYsOSArMTUxNiwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOwotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJvbnRpZXIuaXNCZWdpbigpOwotICAgICAgICAgICAgICAgIGFzc2VydCAhX2Zyb250aWVyLmlzTGVhZigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIV9maW5pc2hlZCApOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfZnJvbnRpZXIuaXNCZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIV9mcm9udGllci5pc0xlYWYoKSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKF9sYXN0Tm9uQXR0ciA9PSBfZnJvbnRpZXIpCiAgICAgICAgICAgICAgICAgewpAQCAtMTU3OCw3ICsxNjExLDggQEAKIAogICAgICAgICBpbnQgcHJlVGV4dCAoICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhX2ZpbmlzaGVkKTsKIAogICAgICAgICAgICAgcmV0dXJuIGdldENwKCBfbGFzdE5vbkF0dHIgKSArIF9sYXN0Tm9uQXR0ci5nZXRDY2goKTsKICAgICAgICAgfQpAQCAtMTYxNyw3ICsxNjUxLDggQEAKIAogICAgICAgICB2b2lkIHRleHQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhX2ZpbmlzaGVkICk7CiAKICAgICAgICAgICAgIGludCBzdGFydCA9IG9mZjsKICAgICAgICAgICAgIGludCBlbmQgPSBvZmYgKyBjY2g7CkBAIC0xNjQ2LDcgKzE2ODEsOCBAQAogCiAgICAgICAgIHZvaWQgdGV4dCAoIFN0cmluZyB0ZXh0ICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIV9maW5pc2hlZCApOwogCiAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwogICAgICAgICAgICAgaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7CkBAIC0xOTg5LDggKzIwMjUsMTEgQEAKIAogICAgICAgICBhc3NvY2lhdGVTb3VyY2VOYW1lKCBvcHRpb25zICk7CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7Ci0gICAgICAgIGFzc2VydCBpc0xlZnRPbmx5KCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB2YWxpZGF0ZSgpICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBpc0xlZnRPbmx5KCkgKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sT2JqZWN0IHggKQpAQCAtMjUwMywxNiArMjU0MiwxOSBAQAogCiAgICAgdm9pZCBpbnNlcnRTcGxheSAoIFNwbGF5IHMsIFNwbGF5IGEgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgYSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgdmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFhLmlzUm9vdCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgYS5nZXRSb290U2xvdygpID09IHRoaXM7Ci0gICAgICAgIGFzc2VydCBzLl9wYXJlbnRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcy5fcmlnaHRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ICE9IG51bGwgfHwgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAhPSBudWxsIHx8IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzICE9IG51bGwgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoICFzLmlzUm9vdCgpICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBhICE9IG51bGwgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIFJvb3QuZHYgPiAwIHx8IHZhbGlkYXRlU3BsYXlUcmVlKCkgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoICFhLmlzUm9vdCgpICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBSb290LmR2ID4gMCB8fCBhLmdldFJvb3RTbG93KCkgPT0gdGhpcyApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5fcGFyZW50U3BsYXkgPT0gbnVsbCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5fcmlnaHRTcGxheSA9PSBudWxsICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCB8fCBzLmdldENjaExlZnQoKSA9PSAwICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCB8fCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSAwICk7CisgICAgICAgIH0KIAogICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2goKTsKICAgICAgICAgaW50IGNiZWdpbiA9IHMuZ2V0Q2RvY0JlZ2luKCk7CkBAIC0yNTI5LDExICsyNTcxLDEzIEBACiAgICAgICAgICAgICBzLl9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5OwogICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSB0aGlzOwogCi0gICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2NoTGVmdCgpID09IDAgKTsKICAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCgKICAgICAgICAgICAgICAgICBfbGVmdFNwbGF5LmdldENjaExlZnQoKSArIF9sZWZ0U3BsYXkuZ2V0Q2NoKCkgKTsKIAotICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSAwICk7CiAgICAgICAgICAgICBzLmFkanVzdENkb2NCZWdpbkxlZnQoCiAgICAgICAgICAgICAgICAgX2xlZnRTcGxheS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfbGVmdFNwbGF5LmdldENkb2NCZWdpbigpICk7CiAKQEAgLTI1OTgsNyArMjY0Miw4IEBACiAgICAgICAgICAgICBzLnNwbGF5KCB0aGlzLCB0aGlzICk7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB2YWxpZGF0ZVNwbGF5VHJlZSgpICk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjA5LDkgKzI2NTQsMTIgQEAKICAgICAKICAgICB2b2lkIGluc2VydFNpbmdsZVNwbGF5U2Fuc1NwbGF5SW5MZWZ0T25seVRyZWUgKCBTcGxheSBzLCBTcGxheSBhICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBfbGVmdE9ubHk7Ci0gICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGw7Ci0gICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgPT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIF9sZWZ0T25seSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5fcmlnaHRTcGxheSA9PSBudWxsICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLl9sZWZ0U3BsYXkgPT0gbnVsbCApOworICAgICAgICB9CiAKICAgICAgICAgcy5fbGVmdFNwbGF5ID0gYTsKICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBhLl9wYXJlbnRTcGxheTsKQEAgLTI2NDQsMTQgKzI2OTIsMTcgQEAKIAogICAgIFNwbGF5IHJlbW92ZVNwbGF5cyAoIFNwbGF5IGZpcnN0LCBTcGxheSBsYXN0ICkKICAgICB7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgZmlyc3QgIT0gbGFzdDs7Ci0gICAgICAgIGFzc2VydCAhZmlyc3QuaXNSb290KCk7Ci0gICAgICAgIGFzc2VydCAhZmlyc3QuaXNEb2MoKTsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGZpcnN0LmdldFJvb3RTbG93KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGxhc3QuZ2V0Um9vdFNsb3coKSA9PSB0aGlzOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZmlyc3QuY29tcGFyZVNsb3coIGxhc3QgKSA9PSAtMTsKLSAgICAgICAgYXNzZXJ0ICFsYXN0LmlzUm9vdCgpIHx8IGxhc3QgPT0gdGhpczsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHZhbGlkYXRlU3BsYXlUcmVlKCkgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGZpcnN0ICE9IGxhc3QgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoICFmaXJzdC5pc1Jvb3QoKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIWZpcnN0LmlzRG9jKCkgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIFJvb3QuZHYgPiAwIHx8IGZpcnN0LmdldFJvb3RTbG93KCkgPT0gdGhpcyApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggUm9vdC5kdiA+IDAgfHwgbGFzdC5nZXRSb290U2xvdygpID09IHRoaXMgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIFJvb3QuZHYgPiAwIHx8IGZpcnN0LmNvbXBhcmVTbG93KCBsYXN0ICkgPT0gLTEgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoICFsYXN0LmlzUm9vdCgpIHx8IGxhc3QgPT0gdGhpcyApOworICAgICAgICB9CiAKICAgICAgICAgU3BsYXkgeCA9IGxhc3QucHJldlNwbGF5KCk7CiAKQEAgLTI2NjYsMTEgKzI3MTcsMTQgQEAKICAgICAgICAgeC5zcGxheSggdGhpcywgbGFzdCApOwogICAgICAgICBmaXJzdC5zcGxheSggdGhpcywgeCApOwogCi0gICAgICAgIGFzc2VydCB0aGlzID09IGxhc3QgfHwgdGhpcy5fbGVmdFNwbGF5ID09IGxhc3Q7Ci0gICAgICAgIGFzc2VydCBsYXN0Ll9sZWZ0U3BsYXkgPT0geDsKLSAgICAgICAgYXNzZXJ0IHguX2xlZnRTcGxheSA9PSBmaXJzdDsKLSAgICAgICAgYXNzZXJ0IHguX3JpZ2h0U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGZpcnN0Ll9sZWZ0U3BsYXkgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHRoaXMgPT0gbGFzdCB8fCB0aGlzLl9sZWZ0U3BsYXkgPT0gbGFzdCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggbGFzdC5fbGVmdFNwbGF5ID09IHggKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHguX2xlZnRTcGxheSA9PSBmaXJzdCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggeC5fcmlnaHRTcGxheSA9PSBudWxsICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBmaXJzdC5fbGVmdFNwbGF5ICE9IG51bGwgKTsKKyAgICAgICAgfQogCiAgICAgICAgIGludCBmaXJzdENjaExlZnQgPSBmaXJzdC5nZXRDY2hMZWZ0KCk7CiAgICAgICAgIGludCBmaXJzdENiZWdpbkxlZnQgPSBmaXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCk7CkBAIC0yNjkzLDExICsyNzQ3LDE0IEBACiAgICAgICAgIGZpcnN0LmFkanVzdENjaExlZnQoIC0gZmlyc3RDY2hMZWZ0ICk7CiAgICAgICAgIGZpcnN0LmFkanVzdENkb2NCZWdpbkxlZnQoIC0gZmlyc3RDYmVnaW5MZWZ0ICk7CiAKLSAgICAgICAgYXNzZXJ0IGZpcnN0LmdldENjaExlZnQoKSA9PSAwOwotICAgICAgICBhc3NlcnQgZmlyc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBmaXJzdC5nZXRDY2hMZWZ0KCkgPT0gMCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZmlyc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDAgKTsKIAotICAgICAgICBhc3NlcnQgeC5nZXRDY2hMZWZ0KCkgKyBkZWx0YUNjaExlZnQgKyB4LmdldENjaCgpID09IDA7Ci0gICAgICAgIGFzc2VydCB4LmdldENkb2NCZWdpbkxlZnQoKSArIGRlbHRhQ2JlZ2luTGVmdCArIHguZ2V0Q2RvY0JlZ2luKCkgPT0gMDsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHguZ2V0Q2NoTGVmdCgpICsgZGVsdGFDY2hMZWZ0ICsgeC5nZXRDY2goKSA9PSAwICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB4LmdldENkb2NCZWdpbkxlZnQoKSArIGRlbHRhQ2JlZ2luTGVmdCArIHguZ2V0Q2RvY0JlZ2luKCkgPT0gMCApOworICAgICAgICB9CiAKICAgICAgICAgZmlyc3QuX2xlZnRTcGxheS5fcGFyZW50U3BsYXkgPSBsYXN0OwogICAgICAgICBsYXN0Ll9sZWZ0U3BsYXkgPSBmaXJzdC5fbGVmdFNwbGF5OwpAQCAtMjcwNiw3ICsyNzYzLDggQEAKICAgICAgICAgZmlyc3QuX2xlZnRTcGxheSA9IG51bGw7CiAgICAgICAgIGZpcnN0Ll9wYXJlbnRTcGxheSA9IG51bGw7CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdmFsaWRhdGVTcGxheVRyZWUoKSApOwogCiAgICAgICAgIHJldHVybiB4OwogICAgIH0KQEAgLTI3OTUsNyArMjg1Myw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcyA9IHZhbGlkYXRlQ29udGVudCggcyApOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNFbmQoKTogIk1pc3NpbmcgRU5ELCBzcGxheTogIiArIHMuZ2V0RGVidWdJZCgpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzRW5kKCksICJNaXNzaW5nIEVORCwgc3BsYXk6ICIgKyBzLmdldERlYnVnSWQoKSApOwogCiAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7CiAgICAgICAgICAgICB9CkBAIC0yODEyLDcgKzI4NzEsOCBAQAogCiAgICAgICAgIHMgPSB2YWxpZGF0ZUNvbnRlbnQoIHMgKTsKIAotICAgICAgICBhc3NlcnQgcy5pc1Jvb3QoKTogIkV4cGVjdGVkIHJvb3QiOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNSb290KCksICJFeHBlY3RlZCByb290IiApOwogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTI4MjgsOCArMjg4OCwxMSBAQAogICAgIHsKICAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBUeXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gVFlQRTsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGcuZ2V0S2luZCgpID09IFRZUEUgKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb250ZXh0Ll9udW1TcGxheVR5cGVzKys7CiAKQEAgLTI4NDMsMjAgKzI5MDYsMjcgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBnLmdldEtpbmQoKSAhPSBUWVBFOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZy5nZXRLaW5kKCkgIT0gVFlQRSApOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IGcuZ2V0U3BsYXkoKSA9PSBzOwotICAgICAgICBhc3NlcnQgZy5nZXRSb290KCkgPT0gdGhpczsKLSAgICAgICAgYXNzZXJ0IGcuZ2V0UG9zKCkgPj0gMDsKLSAgICAgICAgYXNzZXJ0IGcuZ2V0UG9zKCkgPD0gcy5nZXRNYXhQb3MoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGcuZ2V0U3BsYXkoKSA9PSBzICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBnLmdldFJvb3QoKSA9PSB0aGlzICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBnLmdldFBvcygpID49IDAgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGcuZ2V0UG9zKCkgPD0gcy5nZXRNYXhQb3MoKSApOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBkb1ZhbGlkYXRlICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlRG9jKCk7Ci0gICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOwotICAgICAgICBhc3NlcnQgZ2V0Q2NoTGVmdCgpID09IF90ZXh0Lmxlbmd0aCgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdmFsaWRhdGVEb2MoKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdmFsaWRhdGVTcGxheVRyZWUoKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZ2V0Q2NoTGVmdCgpID09IF90ZXh0Lmxlbmd0aCgpICk7CisgICAgICAgIH0KIAogICAgICAgICB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUoKTsKIApAQCAtMjg3Niw1MSArMjk0Niw2NyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocy5pc1Jvb3QoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQmVnaW4oKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBzOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0TmFtZSgpICE9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBiLmdldE5hbWUoKSAhPSBudWxsICk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgICAgICAgICAgYi5nZXRGaW5pc2goKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpLmdldENvbnRhaW5lcigpID09IGI7CisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpLmdldENvbnRhaW5lcigpID09IGIgKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoYi5pc0xlYWYoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpID09IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggYi5nZXRGaW5pc2goKSA9PSBudWxsICk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldEZpbmlzaCgpLmdldENvbnRhaW5lcigpID09IGI7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBiLmdldENjaFZhbHVlKCkgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGIuZ2V0RmluaXNoKCkgIT0gbnVsbCApOworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggYi5nZXRGaW5pc2goKS5nZXRDb250YWluZXIoKSA9PSBiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBiLmdldENjaFZhbHVlKCkgPT0gMCApOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAocy5pc0F0dHIoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXROYW1lKCkgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldE5hbWUoKSAhPSBudWxsICk7CisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwICk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocy5pc1Byb2NpbnN0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsICk7CisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q29udGFpbmVyKCkgPT0gcmVjZW50Q29udGFpbmVyOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENvbnRhaW5lcigpID09IHJlY2VudENvbnRhaW5lciApOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzLmlzTGVhZigpKQogICAgICAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSAoQ29udGFpbmVyKSBzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IHJlY2VudENvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5nZXRDb250YWluZXIoKSA9PSByZWNlbnRDb250YWluZXIgKTsKICAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSByZWNlbnRDb250YWluZXIuZ2V0Q29udGFpbmVyKCk7CiAgICAgICAgICAgICB9CiAKQEAgLTI5MzQsMzYgKzMwMjAsNTAgQEAKIAogICAgICAgICAgICAgaWYgKGlzSW52YWxpZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5wZWVrVHlwZSgpICE9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLnBlZWtUeXBlKCkgIT0gbnVsbCApOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGFzc2VydCBjb250ZXh0Ll9udW1TcGxheVR5cGVzID09IDE7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGNvbnRleHQuX251bVNwbGF5VHlwZXMgPT0gMSApOwogCiAgICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENjaEFmdGVyKCkgPT0gMCApOwogICAgICAgICAgICAgICAgICAgICBTcGxheSBuID0gcy5uZXh0Tm9uQXR0clNwbGF5KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG4uaXNSb290KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggbi5pc1Jvb3QoKSApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQmVnaW4oKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hWYWx1ZSgpID09IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzTGVhZigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENjaFZhbHVlKCkgPT0gMCApOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hWYWx1ZSgpID09IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5nZXRDY2hWYWx1ZSgpID09IDAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQuX251bVNwbGF5VHlwZXMgPD0gMTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggY29udGV4dC5fbnVtU3BsYXlUeXBlcyA8PSAxICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgY29udGV4dC5fY0ludmFsaWRhdGFibGVUeXBlcyA9PSBfY0ludmFsaWRhdGFibGVUeXBlczsKLSAgICAgICAgYXNzZXJ0IGNvbnRleHQuX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlcyA9PV9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXM7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBjb250ZXh0Ll9jSW52YWxpZGF0YWJsZVR5cGVzID09IF9jSW52YWxpZGF0YWJsZVR5cGVzICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBjb250ZXh0Ll9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMgPT1fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzICk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBpbmRpY2VzCiAKQEAgLTMwMzYsOSArMzEzNiwxMiBAQAogCiAgICAgICAgIFZhbGlkYXRlU3RhdHMgc3RhdHMgPSBuZXcgVmFsaWRhdGVTdGF0cygpOwogCi0gICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ICA9PSBudWxsOwotICAgICAgICBhc3NlcnQgX2RvYy5fbGVmdFNwbGF5ID09IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfcGFyZW50U3BsYXkgPT0gbnVsbCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggX3JpZ2h0U3BsYXkgID09IG51bGwgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIF9kb2MuX2xlZnRTcGxheSA9PSBudWxsICk7CisgICAgICAgIH0KIAogICAgICAgICBTcGxheSBzID0gdGhpczsKIApAQCAtMzA1MCw3ICszMTUzLDggQEAKICAgICAgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHMgPT0gX2RvYzsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzID09IF9kb2MgKTsKIAogICAgICAgICBsb29wOgogICAgICAgICBmb3IgKCA7IDsgKQpAQCAtMzEwMCw4ICszMjA0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fbGVmdFNwbGF5ID09IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcC5fbGVmdFNwbGF5ID09IHMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBwLl9yaWdodFNwbGF5ICE9IG51bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHAuX3JpZ2h0U3BsYXk7CiAKQEAgLTMxMTYsMjIgKzMyMjMsMjYgQEAKIAogICAgICAgICBmb3IgKCBzID0gX2RvYyA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFfbGVmdE9ubHkgfHwgcy5fcmlnaHRTcGxheSA9PSBudWxsOiAiIiArIHMuZ2V0RGVidWdJZCgpOwotICAgICAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAgPT0gbnVsbCB8fCBzLl9sZWZ0U3BsYXkgLl9wYXJlbnRTcGxheSA9PSBzOwotICAgICAgICAgICAgYXNzZXJ0IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBzLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9PSBzOwotCi0gICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ID09IG51bGwpCisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhX2xlZnRPbmx5IHx8IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCwgSW50ZWdlci50b1N0cmluZyhzLmdldERlYnVnSWQoKSkgKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLl9sZWZ0U3BsYXkgID09IG51bGwgfHwgcy5fbGVmdFNwbGF5IC5fcGFyZW50U3BsYXkgPT0gcyApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBzLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9PSBzICk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgICAgIHMuZ2V0Q2NoTGVmdCgpID09IHN0YXRzLmdldENjaCggcy5fbGVmdFNwbGF5ICk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiIiArIHMuZ2V0RGVidWdJZCgpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IHN0YXRzLmdldENiZWdpbiggcy5fbGVmdFNwbGF5ICk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENjaExlZnQoKSA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmdldENjaExlZnQoKSA9PSBzdGF0cy5nZXRDY2goIHMuX2xlZnRTcGxheSApLAorICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKHMuZ2V0RGVidWdJZCgpKSApOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmdldENkb2NCZWdpbkxlZnQoKSA9PSBzdGF0cy5nZXRDYmVnaW4oIHMuX2xlZnRTcGxheSApICk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxNjAsMzYgKzMyNzEsNDMgQEAKIAogICAgIHZvaWQgaW52YWxpZGF0ZVZlcnNpb24gKCApCiAgICAgewotICAgICAgICBhc3NlcnQgX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfY2hhbmdlQ2xpZW50cyA9PSBudWxsICk7CiAKICAgICAgICAgX192ZXJzaW9uKys7CiAKLSAgICAgICAgYXNzZXJ0IChfZGVidWdDaGFuZ2VWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZSApOwogICAgIH0KIAogICAgIC8vIFVzZSB0aGlzICpvbmx5KiBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCiAgICAgdm9pZCByZXN0b3JlVmVyc2lvbiAoIGxvbmcgb2xkVmVyc2lvbiApCiAgICAgewotICAgICAgICBhc3NlcnQgX192ZXJzaW9uID49IG9sZFZlcnNpb247CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggX192ZXJzaW9uID49IG9sZFZlcnNpb24gKTsKICAgICAgICAgX192ZXJzaW9uID0gb2xkVmVyc2lvbjsKLSAgICAgICAgYXNzZXJ0IChfZGVidWdDaGFuZ2VWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZSApOwogICAgIH0KIAogICAgIGJvb2xlYW4gdmFsaWRhdGVDaGFuZ2VTdGFydGVkICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IF9jaGFuZ2VDbGllbnRzID09IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggX2NoYW5nZUNsaWVudHMgPT0gbnVsbCApOwogICAgICAgICByZXR1cm4gX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKICAgICB9CiAKICAgICBib29sZWFuIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBfZGVidWdDaGFuZ2VWZXJzaW9uID09IF9fdmVyc2lvbjsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBfZGVidWdDaGFuZ2VWZXJzaW9uID09IF9fdmVyc2lvbiApOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICB2b2lkIHJlZ2lzdGVyRm9yQ2hhbmdlICggQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpICk7CiAKICAgICAgICAgLy8gU2VlIGlmIHRoaXMgbGlzdGVuZXIgaXMgdGhlIGZpcnN0IG9uZSBvbiB0aGUgbGlzdC4gIEVhc3kgYnV0IG5vdAogICAgICAgICAvLyB0b3RhbGx5IGNvbXBsZXRlICBvcHRpbWl6YXRpb24KQEAgLTMyMDYsMTEgKzMzMjQsMTMgQEAKIAogICAgIHZvaWQgc3RhcnRDaGFuZ2UgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCkgKTsKIAogICAgICAgICBsb25nIGN1cnJlbnRWZXJzaW9uID0gMDsKIAotICAgICAgICBhc3NlcnQgKGN1cnJlbnRWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWU7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggKGN1cnJlbnRWZXJzaW9uID0gX192ZXJzaW9uKSA9PSAwIHx8IHRydWUgKTsKIAogICAgICAgICB3aGlsZSAoIF9jaGFuZ2VDbGllbnRzICE9IG51bGwgKQogICAgICAgICB7CkBAIC0zMjE4LDcgKzMzMzgsOCBAQAogICAgICAgICAgICAgX2NoYW5nZUNsaWVudHMgPSBfY2hhbmdlQ2xpZW50cy5fbmV4dDsKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydCBjdXJyZW50VmVyc2lvbiA9PSBfX3ZlcnNpb247CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggY3VycmVudFZlcnNpb24gPT0gX192ZXJzaW9uICk7CiAgICAgfQogCiAgICAgLy8KQEAgLTMyNzcsNyArMzM5OCw4IEBACiAKICAgICAgICAgaW50IGRpc3RhbmNlICggU3BsYXkgcGFyZW50LCBRTmFtZSBuYW1lLCBRTmFtZVNldCBzZXQsIGludCBuICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG4gPj0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIG4gPj0gMCApOwogCiAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gUm9vdC50aGlzLmdldFZlcnNpb24oKSkKICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUUgLSAxOwpAQCAtMzI5MCw3ICszNDEyLDggQEAKIAogICAgICAgICBCZWdpbiBmZXRjaCAoIFNwbGF5IHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0LCBpbnQgbiApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBuID49IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBuID49IDAgKTsKIAogICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCkgfHwgX3BhcmVudCAhPSBwYXJlbnQgfHwKICAgICAgICAgICAgICAgICAgICEgY2FjaGVTYW1lKG5hbWUsIHNldCkgfHwgbiA9PSAwKQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhCmluZGV4IDk4NjdiNDguLjA1ZTkxMDYgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU2F2ZXIuamF2YQorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NhdmVyLmphdmEKQEAgLTIyLDExICsyMiwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXZlbnRCYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sTmFtZUltcGw7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlNlcXVlbmNlZEhhc2hNYXA7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbnRhaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuWG1sbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0zNiw3ICszOSw2IEBACiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTc1LDI4ICs3NywzOCBAQAogICAgIC8vCiAgICAgLy8KICAgICAvLwotICAgIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1vbml0b3IoKQorCisgICAgLyogIGphdmFjIGVycm9yIChKREsgMS4zLjEpOgorICAgICAgICAibW9uaXRvcigpIGlzIGluaGVyaXRlZCBmcm9tIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TYXZlci5YbWxJbnB1dFN0cmVhbVNhdmVyLlhtbEV2ZW50SW1wbAorICAgICAgICBhbmQgaGlkZXMgbWV0aG9kIGluIG91dGVyIGNsYXNzIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TYXZlci4gIEFuIGV4cGxpY2l0ICd0aGlzJworICAgICAgICBxdWFsaWZpZXIgbXVzdCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCBpbnN0YW5jZS4iCisKKyAgICAgICAgVG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGFuZ2VzLCB0aGlzIG1ldGhvZCB3YXMgcmVuYW1lZCB0byBhdm9pZCBqYXZhYyBjb25mdXNpb24uCisgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBzYXZlck1vbml0b3IoKQogICAgIHsKICAgICAgICAgcmV0dXJuIF9yb290OwogICAgIH0KIAogICAgIFNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzLmdldFJvb3RTbG93KCkgPT0gcjsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgcy5nZXRSb290U2xvdygpID09IHIpOwogCi0gICAgICAgIC8vIElucHV0IHMgYW5kIHAgbXVzdCBiZSBub3JtYWxpemVkIGFscmVhZHkKLSAgICAgICAgYXNzZXJ0IHAgPCBzLmdldEVuZFBvcygpOworICAgICAgICAgICAgLy8gSW5wdXQgcyBhbmQgcCBtdXN0IGJlIG5vcm1hbGl6ZWQgYWxyZWFkeQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwIDwgcy5nZXRFbmRQb3MoKSk7CisgICAgICAgIH0KIAogICAgICAgICBfcm9vdCA9IHI7CiAgICAgICAgIF90b3AgPSBfc3BsYXkgPSBzOwogICAgICAgICBfcG9zID0gcDsKICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKICAgICAgICAgX3NiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBfYXR0cnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBfYXR0cnMgPSBuZXcgU2VxdWVuY2VkSGFzaE1hcCgpOwogICAgICAgICBfYXR0ck5hbWVzID0gbmV3IEhhc2hTZXQoKTsKICAgICAgICAgX2ZpcnN0UHVzaCA9IHRydWU7Ci0gICAgICAgIAorCiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUgb2YgdGhlIG5hbWVzcGFjZXMKICAgICAgICAgX25hbWVzcGFjZVN0YWNrID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtMTA0LDE3ICsxMTYsMTcgQEAKICAgICAgICAgX3ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7CiAKICAgICAgICAgLy8gU3RvcHMgdGhlIHN5bnRoZXNpcyBvZiB0aGlzIG5hbXNwYWNlIGFuZCBtYWtlIGZvciBiZXR0ZXIKLSAgICAgICAgLy8gcm91bmR0cmlwcGluZyAKKyAgICAgICAgLy8gcm91bmR0cmlwcGluZwogICAgICAgICBhZGRNYXBwaW5nKCAieG1sIiwgU3BsYXkuX3htbDE5OThVcmkgKTsKIAogICAgICAgICAvLyBDaGVjayBmb3IgaW1wbGljaXQgbmFtZXNwYWNlcwotICAgICAgICAKKwogICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOwogCiAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMgKSkKICAgICAgICAgewogICAgICAgICAgICAgTWFwIG0gPSAoTWFwKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMgKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gbS5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwpAQCAtMTI0LDkgKzEzNiw5IEBACiAKICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTICkpCiAgICAgICAgICAgICBfc3VnZ2VzdGVkUHJlZml4ZXMgPSAoTWFwKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1NVR0dFU1RFRF9QUkVGSVhFUyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IHByZWZpeCBoYXMgbm90IGJlZW4gbWFwcGVkLCBkbyBzbyBub3cKLSAgICAgICAgCisKICAgICAgICAgaWYgKGdldE5hbWVzcGFjZUZvclByZWZpeCggIiIgKSA9PSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBfaW5pdGlhbERlZmF1bHRVcmkgPSBuZXcgU3RyaW5nKCAiIiApOwpAQCAtMTY0LDcgKzE3Niw3IEBACiAgICAgICAgICAgICBpZiAoIXNhdmVyLl9zeW50aE5hbWVzcGFjZXMuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAgIF9wcmVDb21wdXRlZE5hbWVzcGFjZXMgPSBzYXZlci5fc3ludGhOYW1lc3BhY2VzOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIF91c2VEZWZhdWx0TmFtZXNwYWNlID0KICAgICAgICAgICAgIG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7CiAKQEAgLTE4MCwxNCArMTkyLDE0IEBACiAgICAgICAgICAgICBfZnJhZ21lbnQgPSBTcGxheS5feG1sRnJhZ21lbnQ7CiAKICAgICAgICAgLy8gT3V0ZXIgb3ZlcnJpZGVzIGlubmVyCi0gICAgICAgIAorCiAgICAgICAgIF9pbm5lciA9CiAgICAgICAgICAgICBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0lOTkVSICkgJiYKICAgICAgICAgICAgICAgICAhb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9PVVRFUiApOwotICAgICAgICAKKwogICAgICAgICBpZiAoX2lubmVyICYmICFfdG9wLmlzRG9jKCkpCiAgICAgICAgICAgICBfc3ludGhFbGVtID0gX2ZyYWdtZW50OwotICAgICAgICAKKwogICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5UICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIF9mcmFnbWVudCA9IF9zeW50aEVsZW0gPQpAQCAtMTk2LDE3ICsyMDgsMzEgQEAKICAgICAgICAgICAgIGlmIChfc3ludGhFbGVtID09IG51bGwpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk51bGwgc3ludGhldGljIGVsZW1lbnQiICk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgX3ByZVByb2Nlc3MgPSB0cnVlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKKyAgICAvKiAgamF2YWMgZXJyb3IgKEpESyAxLjMuMSk6CisgICAgICAgICJjaGVja1ZlcnNpb24oKSBpcyBpbmhlcml0ZWQgZnJvbSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU2F2ZXIuWG1sSW5wdXRTdHJlYW1TYXZlci5YbWxFdmVudEltcGwKKyAgICAgICAgYW5kIGhpZGVzIG1ldGhvZCBpbiBvdXRlciBjbGFzcyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU2F2ZXIuICBBbiBleHBsaWNpdCAndGhpcycKKyAgICAgICAgcXVhbGlmaWVyIG11c3QgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGRlc2lyZWQgaW5zdGFuY2UuIgorCisgICAgICAgIFRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgY2hhbmdlcywgdGhpcyBtZXRob2Qgd2FzIHJlbmFtZWQgdG8gYXZvaWQgamF2YWMgY29uZnVzaW9uLgorICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tTYXZlclZlcnNpb24gKCApCiAgICAgewogICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIGR1cmluZyBzYXZlIiApOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBmaW5hbCBSb290IGdldFJvb3QgKCApIHsgcmV0dXJuIF9yb290OyB9CisgICAgLyogIGphdmFjIGVycm9yIChKREsgMS4zLjEpOgorICAgICAgICAiZ2V0Um9vdCgpIGlzIGluaGVyaXRlZCBmcm9tIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TYXZlci5YbWxJbnB1dFN0cmVhbVNhdmVyLlhtbEV2ZW50SW1wbAorICAgICAgICBhbmQgaGlkZXMgbWV0aG9kIGluIG91dGVyIGNsYXNzIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TYXZlci4gIEFuIGV4cGxpY2l0ICd0aGlzJworICAgICAgICBxdWFsaWZpZXIgbXVzdCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCBpbnN0YW5jZS4iCisKKyAgICAgICAgVG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGFuZ2VzLCB0aGlzIG1ldGhvZCB3YXMgcmVuYW1lZCB0byBhdm9pZCBqYXZhYyBjb25mdXNpb24uCisgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgUm9vdCBnZXRTYXZlclJvb3QgKCApIHsgcmV0dXJuIF9yb290OyB9CiAgICAgcHJvdGVjdGVkIGZpbmFsIE1hcCAgZ2V0VXJpTWFwICggKSB7IHJldHVybiBfdXJpTWFwOyB9CiAgICAgcHJvdGVjdGVkIGZpbmFsIE1hcCAgZ2V0UHJlZml4TWFwICggKSB7IHJldHVybiBfcHJlZml4TWFwOyB9CiAKQEAgLTIyMSw3ICsyNDcsNyBAQAogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdERvY1R5cGUoCiAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKTsKLSAgICAKKwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICk7CkBAIC0yMjksNyArMjU1LDcgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKTsKIAogICAgIC8vIENhbGxlZCB3aGVuIGEgc3ludGhldGljIHByZWZpeCBpcyBjcmVhdGVkLgotICAgIAorCiAgICAgcHJvdGVjdGVkIHZvaWQgc3ludGhldGljTmFtZXNwYWNlICgKICAgICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgYm9vbGVhbiBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCApIHsgfQogCkBAIC0yNTMsMTYgKzI3OSwyMCBAQAogCiAgICAgZmluYWwgU3RyaW5nIHRleHQgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgX3RleHQgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF90ZXh0ICE9IG51bGwpOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIF90ZXh0LnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgZmluYWwgYm9vbGVhbiBub1RleHQgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgX3RleHQgIT0gbnVsbCB8fCBfc2IubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgYXNzZXJ0IF90ZXh0ID09IG51bGwgfHwgX3RleHQgPT0gX3NiOwotICAgICAgICAKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3RleHQgIT0gbnVsbCB8fCBfc2IubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF90ZXh0ID09IG51bGwgfHwgX3RleHQgPT0gX3NiKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBfdGV4dCA9PSBudWxsOwogICAgIH0KIApAQCAtMjk5LDkgKzMyOSw5IEBACiAKICAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzICggKQogICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgIHN5bmNocm9uaXplZCAoc2F2ZXJNb25pdG9yKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgY2hlY2tTYXZlclZlcnNpb24oKTsKICAgICAKICAgICAgICAgICAgIGlmIChfcHJlUHJvY2VzcykKICAgICAgICAgICAgIHsKQEAgLTMxOSw3ICszNDksOCBAQAogICAgICAgICAgICAgICAgIGlmICgocCA9PSAwICYmIHMuaXNGaW5pc2goKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAocy5pc0xlYWYoKSAmJiBwID09IHMuZ2V0UG9zTGVhZkVuZCgpKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9zcGxheSA9PSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggbnVsbCwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMjgsOSArMzU5LDExIEBACiAgICAgCiAgICAgICAgICAgICAgICAgaWYgKHAgPiAwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzTGVhZigpIHx8IHAgIT0gcy5nZXRQb3NMZWFmRW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc0xlYWYoKSB8fCBwICE9IHMuZ2V0UG9zTGVhZkVuZCgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggcywgcCwgcy5nZXRQb3N0Q2NoKCBwICkgKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3NwbGF5ID09IG51bGwpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgCkBAIC0zNzIsNyArNDA1LDggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgIAotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc0NvbnRhaW5lcigpKTsKICAgICAKICAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOwogICAgICAgICAgICAgICAgIF9lbmRTcGxheSA9IHMuaXNDb250YWluZXIoKSA/IHMuZ2V0RmluaXNoU3BsYXkoKSA6IHM7CkBAIC0zOTQsNyArNDI4LDggQEAKICAgICAKICAgICAgICAgICAgIGlmIChfcG9zdFByb2Nlc3MpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSAhPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9zcGxheSAhPSBudWxsKTsKICAgICAKICAgICAgICAgICAgICAgICBib29sZWFuIGVtaXR0ZWQgPSBmYWxzZTsKICAgICAKQEAgLTQwOCwyMSArNDQzLDI2IEBACiAgICAgCiAgICAgICAgICAgICAgICAgICAgIGlmIChfc2tpcENvbnRhaW5lckZpbmlzaCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNCZWdpbigpICYmICFzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA9PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5LmlzRmluaXNoKCk7Ci0gICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNCZWdpbigpICYmICFzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9zcGxheS5pc0ZpbmlzaCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gX3NwbGF5ID09IF9lbmRTcGxheSA/IG51bGwgOiBfc3BsYXkubmV4dFNwbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAKICAgICAgICAgICAgICAgICAgICAgaWYgKF9za2lwQ29udGFpbmVyRmluaXNoIHx8IHMuaXNMZWFmKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAhX3Bvc3RQb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFfcG9zdFBvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBfcG9zdFBvcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLmlzRG9jKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBub1RleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobm9UZXh0KCkpOwogICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gcy5nZXRDY2hBZnRlcigpOwogICAgIApAQCAtNDMyLDcgKzQ3Miw3IEBACiAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjaEFmdGVyID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0U2F2ZXJSb290KCk7CiAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dCwKQEAgLTUwNSw3ICs1NDUsNyBAQAogICAgICAgICAgICAgaWYgKF9zcGxheSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKLSAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBnZXRSb290KCkuZ2V0VmVyc2lvbigpKQorICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IGdldFNhdmVyUm9vdCgpLmdldFZlcnNpb24oKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKICAgICAKICAgICAgICAgICAgIF9za2lwQ29udGFpbmVyRmluaXNoID0gZmFsc2U7CkBAIC01NDEsNyArNTgxLDggQEAKICAgICAgICAgICAgIGNhc2UgU3BsYXkuQVRUUiA6CiAgICAgICAgICAgICBkZWZhdWx0IDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIHNwbGF5IGtpbmQgIiArIF9zcGxheS5nZXRLaW5kKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJVbmV4cGVjdGVkIHNwbGF5IGtpbmQgIiArIF9zcGxheS5nZXRLaW5kKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU1NCw3ICs1OTUsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NDb250YWluZXIgKCBDb250YWluZXIgYyApCiAgICAgewotICAgICAgICBhc3NlcnQgYy5pc0RvYygpIHx8IGMuaXNCZWdpbigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYy5pc0RvYygpIHx8IGMuaXNCZWdpbigpKTsKIAogICAgICAgICBRTmFtZSBuYW1lID0KICAgICAgICAgICAgIF9zeW50aEVsZW0gIT0gbnVsbCAmJiBjID09IF90b3AKQEAgLTYxNiw3ICs2NTgsOCBAQAogICAgICAgICBpZiAobmFtZSAhPSBudWxsKQogICAgICAgICAgICAgZW5zdXJlTWFwcGluZyggbmFtZVVyaSwgbnVsbCwgIWVuc3VyZURlZmF1bHRFbXB0eSwgZmFsc2UgKTsKIAotICAgICAgICBhc3NlcnQgbm9UZXh0KCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShub1RleHQoKSk7CiAKICAgICAgICAgaWYgKGMuaXNJbnZhbGlkKCkpCiAgICAgICAgIHsKQEAgLTY1Miw3ICs2OTUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0U2F2ZXJSb290KCk7CiAKICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAogICAgICAgICAgICAgICAgICAgICBfdGV4dCA9IF9zYiwKQEAgLTY4OCwxMyArNzMxLDE0IEBACiAgICAgICAgIGlmIChfd2FudEZyYWdUZXN0ICYmIG5hbWUgPT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChfdGV4dCAhPSBudWxsICYmICFTcGxheS5pc1doaXRlU3BhY2UoIF90ZXh0ICkpIHx8Ci0gICAgICAgICAgICAgICAgICAhYy5pc0FmdGVyV2hpdGVTcGFjZSggZ2V0Um9vdCgpICkpCisgICAgICAgICAgICAgICAgICAhYy5pc0FmdGVyV2hpdGVTcGFjZSggZ2V0U2F2ZXJSb290KCkgKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIWMuaXNMZWFmKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIWMuaXNMZWFmKCkpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpOwogCkBAIC03MjAsNyArNzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaXNBZnRlcldoaXRlU3BhY2UoIGdldFJvb3QoKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLmlzQWZ0ZXJXaGl0ZVNwYWNlKCBnZXRTYXZlclJvb3QoKSApKQogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzU3LDcgKzgwMSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFNlZSBpZiBJIG5lZWQgdG8gZ2VuIGEgZnJhZ21lbnQgZm9yIHRoZSBkb2N1bWVudAogCi0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsIHx8IChjLmlzRG9jKCkgJiYgX3N5bnRoRWxlbSA9PSBudWxsKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobmFtZSAhPSBudWxsIHx8IChjLmlzRG9jKCkgJiYgX3N5bnRoRWxlbSA9PSBudWxsKSk7CiAKICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCiAgICAgICAgICAgICB7CkBAIC04MDEsNyArODQ2LDggQEAKIAogICAgICAgICBlbWl0RW5kKCBfc3BsYXksIG5hbWUgKTsKIAotICAgICAgICBhc3NlcnQgIV9wb3N0UG9wOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIV9wb3N0UG9wKTsKIAogICAgICAgICBfcG9zdFBvcCA9IHRydWU7CiAgICAgfQpAQCAtODU1LDEzICs5MDEsMTUgQEAKIAogICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzQXR0ckZyYWdtZW50ICggU3BsYXkgcyApCiAgICAgewotICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNOb3JtYWxBdHRyKCkpOwogCiAgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBzICk7CiAKICAgICAgICAgZW5zdXJlTWFwcGluZyggcy5nZXRVcmkoKSwgbnVsbCwgZmFsc2UsIHRydWUgKTsKIAotICAgICAgICBhc3NlcnQgbm9UZXh0KCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShub1RleHQoKSk7CiAKICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCiAgICAgICAgIHsKQEAgLTkzMywxOSArOTgxLDIyIEBACiAKICAgICBTdHJpbmcgbWFwcGluZ1ByZWZpeCAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBoYXNNYXBwaW5nKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShoYXNNYXBwaW5nKCkpOwogICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNiApOwogICAgIH0KIAogICAgIFN0cmluZyBtYXBwaW5nVXJpICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGhhc01hcHBpbmcoKSk7CiAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgKyA3ICk7CiAgICAgfQogCiAgICAgU3RyaW5nIG1hcHBpbmdQcmV2UHJlZml4VXJpICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGhhc01hcHBpbmcoKSk7CiAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBfY3VycmVudE1hcHBpbmcgKyA1ICk7CiAgICAgfQogCkBAIC05OTYsNyArMTA0Nyw4IEBACiAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFVyaSA9IChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCAiIiApOwogCiAgICAgICAgICAgICAvLyBJIG1hcCB0aGUgZGVmYXVsdCB0byAiIiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKLSAgICAgICAgICAgIGFzc2VydCBkZWZhdWx0VXJpICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGRlZmF1bHRVcmkgIT0gbnVsbCk7CiAKICAgICAgICAgICAgIGlmIChkZWZhdWx0VXJpLmxlbmd0aCgpID4gMCkKICAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKCAiIiwgIiIgKTsKQEAgLTEwNDgsOCArMTEwMCwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKICAgICB7Ci0gICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh1cmkgIT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHByZWZpeCAhPSBudWxsKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHRoZSBwcmVmaXggYmVpbmcgbWFwcGVkIGhlcmUgaXMgYWxyZWFkeSBtYXBwZWQgdG8gYSB1cmksCiAgICAgICAgIC8vIHRoYXQgdXJpIHdpbGwgZWl0aGVyIGdvIG91dCBvZiBzY29wZSBvciBiZSBtYXBwZWQgdG8gYW5vdGhlcgpAQCAtMTA5MSw3ICsxMTQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgaSAtPSA4OwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGFzc2VydCBpID4gMDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpID4gMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE3Miw3ICsxMjI4LDggQEAKIAogICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0VXJpTWFwcGluZyAoIFN0cmluZyB1cmkgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IF91cmlNYXAuZ2V0KCB1cmkgKSAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3VyaU1hcC5nZXQoIHVyaSApICE9IG51bGwpOwogICAgICAgICByZXR1cm4gKFN0cmluZykgX3VyaU1hcC5nZXQoIHVyaSApOwogICAgIH0KIApAQCAtMTIwMyw4ICsxMjYwLDExIEBACiAgICAgICAgIFN0cmluZyB1cmksIFN0cmluZyBjYW5kaWRhdGVQcmVmaXgsCiAgICAgICAgIGJvb2xlYW4gY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQsIGJvb2xlYW4gbXVzdEhhdmVQcmVmaXggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgY2FuZGlkYXRlUHJlZml4ID09IG51bGwgfHwgY2FuZGlkYXRlUHJlZml4Lmxlbmd0aCgpID4gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodXJpICE9IG51bGwpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjYW5kaWRhdGVQcmVmaXggPT0gbnVsbCB8fCBjYW5kaWRhdGVQcmVmaXgubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIENhbiBiZSBjYWxsZWQgZm9yIG5vLW5hbWVzcGFjZWQgdGhpbmdzCiAKQEAgLTEyNTAsNyArMTMxMCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgY2FuZGlkYXRlUHJlZml4ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjYW5kaWRhdGVQcmVmaXggIT0gbnVsbCk7CiAKICAgICAgICAgc3ludGhldGljTmFtZXNwYWNlKCBjYW5kaWRhdGVQcmVmaXgsIHVyaSwgY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgKTsKIApAQCAtMTI2MSw4ICsxMzIyLDExIEBACiAKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoIFN0cmluZyB1cmksIFN0cmluZyBwcmVmaXggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID4gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodXJpICE9IG51bGwpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gZW1wdHlVcmkgPSB1cmkubGVuZ3RoKCkgPT0gMDsKICAgICAgICAgCkBAIC0xMjkxLDcgKzEzNTUsNyBAQAogICAgIAogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW50aE5hbWVzcGFjZVNhdmVyIGV4dGVuZHMgU2F2ZXIKICAgICB7Ci0gICAgICAgIExpbmtlZEhhc2hNYXAgX3N5bnRoTmFtZXNwYWNlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIE1hcCBfc3ludGhOYW1lc3BhY2VzID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKICAgICAgICAgCiAgICAgICAgIFN5bnRoTmFtZXNwYWNlU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQogICAgICAgICB7CkBAIC0xMzYwLDcgKzE0MjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJz4nICk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggYyApLCBjY2ggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCBnZXRTYXZlclJvb3QoKS5nZXRDcCggYyApLCBjY2ggKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOwogCkBAIC0xMzc0LDcgKzE0MzgsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIWMuaXNMZWFmKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghYy5pc0xlYWYoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwICYmIGMubmV4dE5vbkF0dHJTcGxheSgpLmlzRW5kKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTEzODcsMTMgKzE0NTIsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGMuaXNEb2MoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBjLCBuYW1lLCBudWxsLCBudWxsLCB0cnVlICk7CiAKICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBjICksIGMuZ2V0Q2NoKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCggZ2V0U2F2ZXJSb290KCkuZ2V0Q3AoIGMgKSwgYy5nZXRDY2goKSApOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKIApAQCAtMTQwMyw3ICsxNDY5LDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgaW52YWxpZFZhbHVlICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNOb3JtYWxBdHRyKCkpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBlbWl0KCAnICcgKTsKICAgICAgICAgICAgIGVtaXROYW1lKCBzLmdldE5hbWUoKSApOwpAQCAtMTQxMiw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgIGlmIChpbnZhbGlkVmFsdWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICBlbWl0KCBpbnZhbGlkVmFsdWUgKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIHMgKSwgcy5nZXRDY2goKSApOworICAgICAgICAgICAgICAgIGVtaXQoIGdldFNhdmVyUm9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoKCkgKTsKIAogICAgICAgICAgICAgZW50aXRpemVBdHRyVmFsdWUoKTsKIApAQCAtMTQzMyw3ICsxNTAwLDggQEAKICAgICAgICAgICAgIFNwbGF5IGV4dHJhQXR0ciwgU3RyaW5nQnVmZmVyIGV4dHJhQXR0clRleHQsCiAgICAgICAgICAgICBib29sZWFuIGNsb3NlICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobmFtZSAhPSBudWxsKTsKIAogICAgICAgICAgICAgZW1pdCggJzwnICk7CiAgICAgICAgICAgICBlbWl0TmFtZSggbmFtZSApOwpAQCAtMTQ2Niw3ICsxNTM0LDcgQEAKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKICAgICAgICAgewotICAgICAgICAgICAgZW1pdCggcy5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBwICksIGNjaCApOworICAgICAgICAgICAgZW1pdCggcy5nZXRDcEZvclBvcyggZ2V0U2F2ZXJSb290KCksIHAgKSwgY2NoICk7CiAgICAgICAgICAgICBlbnRpdGl6ZUNvbnRlbnQoKTsKICAgICAgICAgfQogCkBAIC0xNTM3LDggKzE2MDUsMTEgQEAKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnMgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHVyaSAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwcmVmaXggIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh1cmkgIT0gbnVsbCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGVtaXQoICJ4bWxucyIgKTsKIApAQCAtMTU5MCw3ICsxNjYxLDggQEAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCiAgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGRvY3R5cGVOYW1lICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGRvY3R5cGVOYW1lICE9IG51bGwpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBlbWl0KCAiPCFET0NUWVBFICIgKTsKICAgICAgICAgICAgIGVtaXQoIGRvY3R5cGVOYW1lICk7CkBAIC0xNjEzLDE2ICsxNjg1LDE4IEBACiAgICAgICAgIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc0NvbW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc0NvbW1lbnQoKSk7CiAgICAgICAgICAgICBlbWl0KCAiPCEtLSIgKTsKLSAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggcyApLCBzLmdldENjaFZhbHVlKCkgKTsKKyAgICAgICAgICAgIGVtaXQoIGdldFNhdmVyUm9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOwogICAgICAgICAgICAgZW50aXRpemVDb21tZW50KCk7CiAgICAgICAgICAgICBlbWl0KCAiLS0+IiApOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzLmlzUHJvY2luc3QoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc1Byb2NpbnN0KCkpOwogICAgICAgICAgICAgZW1pdCggIjw/IiApOwogICAgICAgICAgICAgLy8gVE9ETyAtIGVuY29kaW5nIGlzc3VlcyBoZXJlPwogICAgICAgICAgICAgZW1pdCggcy5nZXRMb2NhbCgpICk7CkBAIC0xNjMwLDcgKzE3MDQsNyBAQAogICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoVmFsdWUoKSA+IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZW1pdCggIiAiICk7Ci0gICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOworICAgICAgICAgICAgICAgIGVtaXQoIGdldFNhdmVyUm9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOwogICAgICAgICAgICAgICAgIGVudGl0aXplUHJvY2luc3QoKTsKICAgICAgICAgICAgIH0KIApAQCAtMTY1OCw3ICsxNzMyLDggQEAKICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3MoKSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGFzc2VydCBhdmFpbGFibGUgPT0gZ2V0QXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGF2YWlsYWJsZSA9PSBnZXRBdmFpbGFibGUoKSk7CiAKICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTE2NjgsMTEgKzE3NDMsMTMgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWUgKCBRTmFtZSBuYW1lICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobmFtZSAhPSBudWxsKTsKIAogICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CiAKLSAgICAgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodXJpICE9IG51bGwpOwogCiAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpICE9IDApCiAgICAgICAgICAgICB7CkBAIC0xNjg1LDE0ICsxNzYyLDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQgbmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwKTsKIAogICAgICAgICAgICAgZW1pdCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByZUVtaXQgKCBpbnQgY2NoICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjY2ggPj0gMCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIF9sYXN0RW1pdENjaCA9IGNjaDsKIApAQCAtMTcwMiw3ICsxNzgxLDggQEAKICAgICAgICAgICAgIGlmIChfZnJlZSA8IGNjaCkKICAgICAgICAgICAgICAgICByZXNpemUoIGNjaCwgLTEgKTsKIAotICAgICAgICAgICAgYXNzZXJ0IGNjaCA8PSBfZnJlZTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoIDw9IF9mcmVlKTsKIAogICAgICAgICAgICAgaW50IHVzZWQgPSBnZXRBdmFpbGFibGUoKTsKIApAQCAtMTcxMiw4ICsxNzkyLDExIEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmICh1c2VkID09IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSBfb3V0OwotICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA9PSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2luID09IF9vdXQpOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID09IF9idWYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgX2luID0gX291dCA9IDA7CiAgICAgICAgICAgICB9CiAKQEAgLTE3MjEsNyArMTgwNCw4IEBACiAKICAgICAgICAgICAgIF9mcmVlIC09IGNjaDsKICAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID49IDApOwogCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTE3NzMsOCArMTg1Nyw4IEBACiAgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggaW50IGNwLCBpbnQgY2NoICkKICAgICAgICAgewogICAgICAgICAgICAgZW1pdCgKLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuX2J1ZiwKLSAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCisgICAgICAgICAgICAgICAgZ2V0U2F2ZXJSb290KCkuX3RleHQuX2J1ZiwKKyAgICAgICAgICAgICAgICBnZXRTYXZlclJvb3QoKS5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKSwKICAgICAgICAgICAgICAgICBjY2ggKTsKICAgICAgICAgfQogCkBAIC0xNzg5LDcgKzE4NzMsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPj0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID49IDApOwogCiAgICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjAyMyw3ICsyMTA4LDggQEAKIAogICAgICAgICBwcml2YXRlIGludCByZXBsYWNlICggaW50IGksIFN0cmluZyByZXBsYWNlbWVudCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByZXBsYWNlbWVudC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJlcGxhY2VtZW50Lmxlbmd0aCgpID4gMCk7CiAKICAgICAgICAgICAgIGludCBkQ2NoID0gcmVwbGFjZW1lbnQubGVuZ3RoKCkgLSAxOwogCkBAIC0yMDMzLDE1ICsyMTE5LDE4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2ZyZWUgPj0gMCk7CiAKICAgICAgICAgICAgIGlmIChkQ2NoID4gX2ZyZWUpCiAgICAgICAgICAgICAgICAgaSA9IHJlc2l6ZSggZENjaCwgaSApOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKLQotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IGRDY2g7Ci0gICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZnJlZSA+PSAwKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID49IGRDY2gpOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0QXZhaWxhYmxlKCkgPiAwKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKF9vdXQgPiBfaW4gJiYgaSA+PSBfb3V0KQogICAgICAgICAgICAgewpAQCAtMjA1MSw3ICsyMTQwLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9pbjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpIDwgX2luKTsKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBpLCBfYnVmLCBpICsgZENjaCwgX2luIC0gaSApOwogICAgICAgICAgICAgICAgIF9pbiArPSBkQ2NoOwogICAgICAgICAgICAgfQpAQCAtMjA2MCw3ICsyMTUwLDggQEAKIAogICAgICAgICAgICAgX2ZyZWUgLT0gZENjaDsKICAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID49IDApOwogCiAgICAgICAgICAgICByZXR1cm4gaSArIGRDY2ggKyAxOwogICAgICAgICB9CkBAIC0yMDc2LDkgKzIxNjcsMTIgQEAKIAogICAgICAgICBwcml2YXRlIGludCByZXNpemUgKCBpbnQgY2NoLCBpbnQgaSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOwotICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gX2ZyZWU7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID49IDApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID4gMCk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjY2ggPiBfZnJlZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBuZXdMZW4gPSBfYnVmID09IG51bGwgPyBfaW5pdGlhbEJ1ZlNpemUgOiBfYnVmLmxlbmd0aCAqIDI7CiAgICAgICAgICAgICBpbnQgdXNlZCA9IGdldEF2YWlsYWJsZSgpOwpAQCAtMjA5MiwxMyArMjE4NiwxNSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChfaW4gPiBfb3V0KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGkgPT0gLTEgfHwgKGkgPj0gX291dCAmJiBpIDwgX2luKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGkgPT0gLTEgfHwgKGkgPj0gX291dCAmJiBpIDwgX2luKSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCApOwogICAgICAgICAgICAgICAgICAgICBpIC09IF9vdXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBpID09IC0xIHx8IChpID49IF9vdXQgfHwgaSA8IF9pbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpID09IC0xIHx8IChpID49IF9vdXQgfHwgaSA8IF9pbikpOwogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgLSBfaW4gKTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgbmV3QnVmLCB1c2VkIC0gX2luLCBfaW4gKTsKICAgICAgICAgICAgICAgICAgICAgaSA9IGkgPj0gX291dCA/IGkgLSBfb3V0IDogaSArIF9vdXQ7CkBAIC0yMTExLDEzICsyMjA3LDE3IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2luID09IDAgJiYgX291dCA9PSAwOwotICAgICAgICAgICAgICAgIGFzc2VydCBpID09IC0xOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfaW4gPT0gMCAmJiBfb3V0ID09IDApOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGkgPT0gLTEpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKIAotICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID49IDApOwogCiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQpAQCAtMjEyNyw3ICsyMjI3LDggQEAKICAgICAgICAgICAgIGlmIChlbnN1cmUoIDEgKSA9PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICAgICAgYXNzZXJ0IGdldEF2YWlsYWJsZSgpID4gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0QXZhaWxhYmxlKCkgPiAwKTsKIAogICAgICAgICAgICAgaW50IGNoID0gX2J1ZlsgX291dCBdOwogCkBAIC0yMTc0LDcgKzIyNzUsOCBAQAogICAgICAgICAgICAgX291dCA9IChfb3V0ICsgbGVuKSAlIF9idWYubGVuZ3RoOwogICAgICAgICAgICAgX2ZyZWUgKz0gbGVuOwogCi0gICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2ZyZWUgPj0gMCk7CiAKICAgICAgICAgICAgIHJldHVybiBsZW47CiAgICAgICAgIH0KQEAgLTIxOTMsNyArMjI5NSw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCB0aGUgY2lyY3VsYXIgY2FzZXMKIAotICAgICAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX291dCA9PSAwKTsKIAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKQEAgLTIyMDIsMTIgKzIzMDUsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCBlICk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgX2ZyZWUgKz0gY2hhcnNBdmFpbGFibGU7CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2ZyZWUgPj0gMCk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgX2luID0gMDsKICAgICAgICAgICAgIH0KQEAgLTIyMjgsNyArMjMzMiw4IEBACiAgICAgICAgICAgICB3aGlsZSAoIHByb2Nlc3MoKSApCiAgICAgICAgICAgICAgICAgOwogCi0gICAgICAgICAgICBhc3NlcnQgX291dCA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfb3V0ID09IDApOwogCiAgICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCk7CiAKQEAgLTIzMzIsNyArMjQzNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZSApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBfdGV4dFNhdmVyID0gbmV3IFRleHRTYXZlciggciwgcywgcCwgb3B0aW9ucywgZW5jb2RpbmcgKTsKQEAgLTIzODEsNyArMjQ4Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtU2F2ZXIudGhpcy5lbnN1cmUoIDEgKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGdldEF2YWlsYWJsZSgpID4gMCk7CiAKICAgICAgICAgICAgICAgICBpbnQgYml0ZSA9IF9idWZbIF9vdXQgXTsKIApAQCAtMjQ0Myw3ICsyNTQ5LDggQEAKICAgICAgICAgICAgICAgICBpZiAoX2ZyZWUgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmVzaXplKCAxICk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPiAwOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9mcmVlID4gMCk7CiAKICAgICAgICAgICAgICAgICBfYnVmWyBfaW4gXSA9IChieXRlKSBiaXRlOwogCkBAIC0yNDUzLDcgKzI1NjAsOCBAQAogCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBjYnl0ZSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGNieXRlID49IDA7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2J5dGUgPj0gMCk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2J5dGUgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjQ2Myw4ICsyNTcxLDExIEBACiAKICAgICAgICAgICAgICAgICBpZiAoX2luID09IF9vdXQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID09IF9idWYubGVuZ3RoIC0gZ2V0QXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGdldEF2YWlsYWJsZSgpID09IDApOworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZnJlZSA9PSBfYnVmLmxlbmd0aCAtIGdldEF2YWlsYWJsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBfaW4gPSBfb3V0ID0gMDsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI0OTAsNyArMjYwMSw4IEBACiAKICAgICAgICAgICAgIHZvaWQgcmVzaXplICggaW50IGNieXRlICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY2J5dGUgPiBfZnJlZTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjYnl0ZSA+IF9mcmVlKTsKIAogICAgICAgICAgICAgICAgIGludCBuZXdMZW4gPSBfYnVmID09IG51bGwgPyBfaW5pdGlhbEJ1ZlNpemUgOiBfYnVmLmxlbmd0aCAqIDI7CiAgICAgICAgICAgICAgICAgaW50IHVzZWQgPSBnZXRBdmFpbGFibGUoKTsKQEAgLTI1MjIsNyArMjYzNCw4IEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSAwICYmIF9vdXQgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9pbiA9PSAwICYmIF9vdXQgPT0gMCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKQEAgLTI1NzAsMTEgKzI2ODMsMTMgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgZW5xdWV1ZSAoIFhtbEV2ZW50SW1wbCBlICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGUuX25leHQgPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGUuX25leHQgPT0gbnVsbCk7CiAKICAgICAgICAgICAgIGlmIChfaW4gPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgX291dCA9PSBudWxsOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9vdXQgPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgX291dCA9IF9pbiA9IGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCkBAIC0yNTk1LDggKzI3MTAsOSBAQAogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKLSAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggZ2V0Um9vdCgpLCBzLCBwLCBudWxsICkgKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID4gMCk7CisgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIGdldFNhdmVyUm9vdCgpLCBzLCBwLCBudWxsICkgKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCkBAIC0yNjIxLDEyICsyNzM3LDEyIEBACiAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKICAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCBnZXRSb290KCksIHMsIC0xLCB0ZXh0KCkgKSApOworICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggZ2V0U2F2ZXJSb290KCksIHMsIC0xLCB0ZXh0KCkgKSApOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZFByZWZpeE1hcHBpbmdzICggKQogICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgICAgICBSb290IHIgPSBnZXRTYXZlclJvb3QoKTsKIAogICAgICAgICAgICAgZm9yICggaXRlcmF0ZU1hcHBpbmdzKCkgOyBoYXNNYXBwaW5nKCkgOyBuZXh0TWFwcGluZygpICkKICAgICAgICAgICAgIHsKQEAgLTI2NDUsNyArMjc2MSw3IEBACiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQogICAgICAgICB7Ci0gICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgICAgICBSb290IHIgPSBnZXRTYXZlclJvb3QoKTsKIAogICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCiAgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZERvY3VtZW50SW1wbCggciwgcyApICk7CkBAIC0yNjUzLDcgKzI3NjksOCBAQAogICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRFbGVtZW50SW1wbCggciwgcywgbmFtZSwgZ2V0VXJpTWFwKCkgKSApOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNMZWFmKCkpOwogICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRFbGVtZW50SW1wbCggciwgcywgbmFtZSwgZ2V0VXJpTWFwKCkgKSApOwogICAgICAgICAgICAgfQogCkBAIC0yNjc3LDEyICsyNzk0LDEyIEBACiAgICAgICAgIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQogICAgICAgICB7Ci0gICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ29tbWVudEltcGwoIGdldFJvb3QoKSwgcyApICk7CisgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ29tbWVudEltcGwoIGdldFNhdmVyUm9vdCgpLCBzICkgKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQogICAgICAgICB7Ci0gICAgICAgICAgICBlbnF1ZXVlKCBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCggZ2V0Um9vdCgpLCBzICkgKTsKKyAgICAgICAgICAgIGVucXVldWUoIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCBnZXRTYXZlclJvb3QoKSwgcyApICk7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCkBAIC0yNjkyLDcgKzI4MDksNyBAQAogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQogICAgICAgICAgICAgewpAQCAtMjcxMiw3ICsyODI5LDggQEAKIAogICAgICAgICAgICAgaWYgKGMuaXNEb2MoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGMuaXNEb2MoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CkBAIC0yNzUwLDE0ICsyODY4LDE3IEBACiAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgICAgICAgdXJpID0gbnVsbDsKIAotICAgICAgICAgICAgYXNzZXJ0IG4uZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShuLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID4gMCk7CiAKLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IG1heSBmaXJlIGlmIHNvbWVvbmUgY29tcHV0ZXMgYSBuYW1lCi0gICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50L2F0dHIgdG9vIGxhdGUgKGFmdGVyIG90aGVyIGV2ZW50cyBoYXZlIGJlZW4KLSAgICAgICAgICAgIC8vIGVucXVldWVkIGFuZCB0aGUgdXJpIG1hcCBoYXMgYmVlbiB1cGRhdGVkLiAgSSBjaGVjayBsYXRlcgotICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoLCBob3dldmVyLgorICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IG1heSBmaXJlIGlmIHNvbWVvbmUgY29tcHV0ZXMgYSBuYW1lCisgICAgICAgICAgICAgICAgLy8gb2YgYW4gZWxlbWVudC9hdHRyIHRvbyBsYXRlIChhZnRlciBvdGhlciBldmVudHMgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZWQgYW5kIHRoZSB1cmkgbWFwIGhhcyBiZWVuIHVwZGF0ZWQuICBJIGNoZWNrIGxhdGVyCisgICAgICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoLCBob3dldmVyLgogCi0gICAgICAgICAgICBhc3NlcnQgdXJpID09IG51bGwgfHwgdXJpTWFwLmNvbnRhaW5zS2V5KCB1cmkgKSA6ICJQcm9ibGVtIHVyaSAiICsgdXJpOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodXJpID09IG51bGwgfHwgdXJpTWFwLmNvbnRhaW5zS2V5KCB1cmkgKSwgIlByb2JsZW0gdXJpICIgKyB1cmkpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKIApAQCAtMzIwMCw3ICszMzIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJ4bWxucyI7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IG5ldyBYbWxOYW1lSW1wbCggbnVsbCwgbG9jYWwsIHByZWZpeCApOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYW1lID0gbmV3IFhtbE5hbWVJbXBsKCBudWxsLCBsb2NhbCwgcHJlZml4ICk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSAoICkKQEAgLTMyMjEsMTAgKzMzNDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBTdHJpbmcgdmFsdWUsIE1hcCB1cmlNYXAgKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgc3VwZXIoIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmlzTm9ybWFsQXR0cigpKTsKICAgICAgICAgICAgICAgICAgICAgX3NwbGF5ID0gczsKICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lID0gY29tcHV0ZU5hbWUoIHMuZ2V0TmFtZSgpLCB1cmlNYXAgKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGNvbXB1dGVOYW1lKCBzLmdldE5hbWUoKSwgdXJpTWFwICk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSAoICkKQEAgLTMyMzMsNyArMzM1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOwogICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZSAhPSBudWxsID8gX3ZhbHVlIDogX3NwbGF5LmdldFRleHQoIF9yb290ICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlICE9IG51bGwgPyBfdmFsdWUgOiBfc3BsYXkuZ2V0VGV4dCggdGhpcy5fcm9vdCApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMzUxLDcgKzM0NzMsOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DSEFSQUNURVJfREFUQSwgciwgcyApOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHAgPiAwIHx8IChjaGFyRGF0YSAhPSBudWxsICYmIGNoYXJEYXRhLmxlbmd0aCgpID4gMCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocCA+IDAgfHwgKGNoYXJEYXRhICE9IG51bGwgJiYgY2hhckRhdGEubGVuZ3RoKCkgPiAwKSk7CiAKICAgICAgICAgICAgICAgICBfcG9zID0gcDsKICAgICAgICAgICAgICAgICBfY2hhckRhdGEgPSBjaGFyRGF0YTsKQEAgLTMzOTYsNyArMzUxOSw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkVORF9FTEVNRU5ULCByLCBzICk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzRW5kKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc0xlYWYoKSB8fCBzLmlzRW5kKCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CkBAIC0zNDQ1LDcgKzM1NjksOCBAQAogICAgICAgICAgICAgQ29tbWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DT01NRU5ULCByLCBzICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb21tZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc0NvbW1lbnQoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCAoICkKQEAgLTM0NzYsNyArMzYwMSw4IEBACiAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsICggUm9vdCByLCBTcGxheSBzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgciwgcyApOwotICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzUHJvY2luc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmlzUHJvY2luc3QoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0ICggKQpAQCAtMzUzOCw3ICszNjY0LDggQEAKIAogICAgICAgICAgICAgX3dhbnREdXBBdHRycyA9IHRydWU7CiAKLSAgICAgICAgICAgIGFzc2VydCBwID09IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPT0gMCk7CiAKICAgICAgICAgICAgIF9zdGFydFNwbGF5ID0gczsKICAgICAgICAgICAgIF92RXZlbnRTaW5rID0gdkV2ZW50U2luazsKQEAgLTM1NzEsNyArMzY5OCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNjaCA+IDApOwogICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgcCwgbnVsbCwgcywgcCApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpAQCAtMzYxNywxMCArMzc0NSwxMyBAQAogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTm9Mb2MgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTG9jID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3hzaVR5cGUgPT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBfeHNpTmlsID09IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF94c2lOb0xvYyA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF94c2lMb2MgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfeHNpVHlwZSA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF94c2lOaWwgPT0gbnVsbCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKICAgICAgICAgICAgIHsKQEAgLTM2ODEsNyArMzgxMiw4IEBACiAKICAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjLmlzRG9jKCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCiAgICAgICAgICAgICAgICAgewpAQCAtMzczNiwxNSArMzg2OCwxOCBAQAogCiAgICAgICAgICAgICBib29sZWFuIGhhc1RleHQgPSB0ZXh0ICE9IG51bGwgfHwgc1RleHQgIT0gbnVsbDsKIAotICAgICAgICAgICAgYXNzZXJ0Ci0gICAgICAgICAgICAgICAgIWhhc1RleHQgfHwKLSAgICAgICAgICAgICAgICAgICAgKGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgICFoYXNUZXh0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoa2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUKSk7CiAKLSAgICAgICAgICAgIGFzc2VydCBraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgfHwgaGFzVGV4dDsKLSAgICAgICAgICAgIGFzc2VydCBraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLlRFWFQgfHwgaGFzVGV4dDsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fCBoYXNUZXh0KTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCB8fCBoYXNUZXh0KTsKIAotICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fCBuYW1lICE9IG51bGw7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShraW5kICE9IFZhbGlkYXRvckxpc3RlbmVyLkFUVFIgfHwgbmFtZSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgX25hbWUgPSBuYW1lOwogICAgICAgICAgICAgX3NUZXh0ID0gc1RleHQ7CkBAIC0zNzY1LDggKzM5MDAsOCBAQAogCiAgICAgICAgIHB1YmxpYyBYbWxDdXJzb3IgZ2V0TG9jYXRpb25Bc0N1cnNvciAoICkKICAgICAgICAgewotICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBfc0xvYywgX3BMb2MgKTsKKyAgICAgICAgICAgIGNoZWNrU2F2ZXJWZXJzaW9uKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0U2F2ZXJSb290KCksIF9zTG9jLCBfcExvYyApOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpVHlwZSAoIENoYXJzIGNoYXJzICkKQEAgLTM4MTgsMTEgKzM5NTMsMTIgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldENoYXJzICgKICAgICAgICAgICAgIENoYXJzIGNoYXJzLCBpbnQgd3NyLCBTdHJpbmcgc3RyaW5nLCBTcGxheSBzVGV4dCwgaW50IHBUZXh0ICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHN0cmluZyAhPSBudWxsIHx8IHNUZXh0ICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHN0cmluZyAhPSBudWxsIHx8IHNUZXh0ICE9IG51bGwpOwogCi0gICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgIGNoZWNrU2F2ZXJWZXJzaW9uKCk7CiAKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOwogICAgICAgICAgICAgY2hhcnMuc3RyaW5nID0gbnVsbDsKQEAgLTM4NTEsNyArMzk4Nyw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHBUZXh0ID09IHNUZXh0LmdldFBvc0FmdGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocFRleHQgPT0gc1RleHQuZ2V0UG9zQWZ0ZXIoKSk7CiAKICAgICAgICAgICAgICAgICBib29sZWFuIG1vcmVUZXh0ID0gZmFsc2U7CiAKQEAgLTQwOTIsNyArNDIyOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjLmlzRG9jKCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCApOwpAQCAtNDEwNiw3ICs0MjQ0LDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgdmFsdWUgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc05vcm1hbEF0dHIoKSk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHMuZ2V0TG9jYWwoKTsKICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzLmdldFVyaSgpOwpAQCAtNDExNSw3ICs0MjU0LDcgQEAKICAgICAgICAgICAgICAgICBzLmdldFVyaSgpLCBzLmdldExvY2FsKCksCiAgICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBzLmdldE5hbWUoKSApLAogICAgICAgICAgICAgICAgICJDREFUQSIsCi0gICAgICAgICAgICAgICAgdmFsdWUgPT0gbnVsbCA/IHMuZ2V0VGV4dCggZ2V0Um9vdCgpICkgOiB2YWx1ZSApOworICAgICAgICAgICAgICAgIHZhbHVlID09IG51bGwgPyBzLmdldFRleHQoIGdldFNhdmVyUm9vdCgpICkgOiB2YWx1ZSApOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZUF0dHIgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKQEAgLTQxNDgsNyArNDI4Nyw4IEBACiAgICAgICAgICAgICBDb250YWluZXIgYywgUU5hbWUgbmFtZSwKICAgICAgICAgICAgIFNwbGF5IGV4dHJhQXR0ciwgU3RyaW5nQnVmZmVyIGV4dHJhQXR0clRleHQgKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShuYW1lICE9IG51bGwpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOwogCkBAIC00MTg4LDcgKzQzMjgsNyBAQAogICAgICAgICAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQogICAgICAgICB7Ci0gICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggcy5nZXRDcEZvclBvcyggZ2V0Um9vdCgpLCBwICksIGNjaCApOworICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHMuZ2V0Q3BGb3JQb3MoIGdldFNhdmVyUm9vdCgpLCBwICksIGNjaCApOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBpbnQgY3AsIGludCBjY2ggKQpAQCAtNDE5Nyw3ICs0MzM3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKAotICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLCBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCisgICAgICAgICAgICAgICAgZ2V0U2F2ZXJSb290KCkuX3RleHQuX2J1ZiwgZ2V0U2F2ZXJSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCiAgICAgICAgICAgICAgICAgY2NoICk7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC00MzMwLDE0ICs0NDcwLDE0IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChfbGV4aWNhbGhhbmRsZXIgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgY3AgPSBnZXRSb290KCkuZ2V0Q3AoIHMgKTsKKyAgICAgICAgICAgICAgICBpbnQgY3AgPSBnZXRTYXZlclJvb3QoKS5nZXRDcCggcyApOwogICAgICAgICAgICAgICAgIGludCBjY2ggPSBzLmdldENjaFZhbHVlKCk7CiAKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlci5jb21tZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0Ll9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYXZlclJvb3QoKS5fdGV4dC5fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2F2ZXJSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCiAgICAgICAgICAgICAgICAgICAgICAgICBjY2ggKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCkBAIC00MzUyLDcgKzQ0OTIsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLCBzLmdldFRleHQoIGdldFJvb3QoKSApICk7CisgICAgICAgICAgICAgICAgICAgIHMuZ2V0TG9jYWwoKSwgcy5nZXRUZXh0KCBnZXRTYXZlclJvb3QoKSApICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKICAgICAgICAgICAgIHsKQEAgLTQ0MjUsNyArNDU2NSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoICggUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC00NDY2LDcgKzQ2MDYsNyBAQAogCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBpZiAoYy5pc0RvYygpKQogICAgICAgICAgICAgewpAQCAtNDUwMyw3ICs0NjQzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0JlZ2luKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYy5pc0JlZ2luKCkpOwogCiAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lID0gYy5nZXRMb2NhbCgpOwogCkBAIC00NTg3LDkgKzQ3MjgsMTAgQEAKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEFmdGVyICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID4gMCk7CiAKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CiAKQEAgLTQ2MTIsNyArNDc1NCw3IEBACiAgICAgICAgICAgICAgICAgCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlQ29tbWVudCgKQEAgLTQ2MjIsNyArNDc2NCw3IEBACiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKApAQCAtNDY1Miw3ICs0Nzk0LDcgQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0U2F2ZXJSb290KCk7CiAKICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVRleHROb2RlKApAQCAtNDY2Nyw3ICs0ODA5LDcgQEAKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFNhdmVyUm9vdCgpOwogCiAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAogICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlQ29tbWVudCgKQEAgLTQ2NzcsNyArNDgxOSw3IEBACiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKICAgICAgICAgewotICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgICAgICAgICAgUm9vdCByID0gZ2V0U2F2ZXJSb290KCk7CiAKICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCiAgICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCkBAIC00Njk4LDcgKzQ4NDAsNyBAQAogICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgIF90ZXh0OwogICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgIF9zYjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICBfc2tpcENvbnRhaW5lckZpbmlzaDsKLSAgICBwcm90ZWN0ZWQgTGlua2VkSGFzaE1hcCBfYXR0cnM7CisgICAgcHJvdGVjdGVkIFNlcXVlbmNlZEhhc2hNYXAgICAgIF9hdHRyczsKICAgICAKICAgICBwcml2YXRlIEhhc2hTZXQgX2F0dHJOYW1lczsKIApAQCAtNDczNiw3ICs0ODc4LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICBfZmlyc3RQdXNoOwogICAgIHByaXZhdGUgU3RyaW5nICAgIF9pbml0aWFsRGVmYXVsdFVyaTsKICAgICAKLSAgICBwcml2YXRlIEhhc2hNYXAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlczsKKyAgICBwcml2YXRlIE1hcCAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlczsKICAgICBwcml2YXRlIFN0cmluZyAgX2ZpbHRlclByb2NpbnN0OwogICAgIHByaXZhdGUgTWFwICAgICBfc3VnZ2VzdGVkUHJlZml4ZXM7CiAKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YQppbmRleCAwY2I5ZDc4Li5lMzhiNGU5IDEwMDY0NAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TcGxheS5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sTWFyazsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtOTcsNTUgKzk5LDY0IEBACiAKICAgICBmaW5hbCB2b2lkIHRvZ2dsZUlzTGVhZiAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc0JlZ2luKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0JlZ2luKCkpOwogICAgICAgICBfYml0cyBePSAweDg7CiAgICAgfQogCiAgICAgZmluYWwgYm9vbGVhbiBpc1ZhbGlkICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0ICgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgoKF9iaXRzICYgMHgxMCkgPT0gMCkgfHwgaXNUeXBlYWJsZSgpKTsKICAgICAgICAgcmV0dXJuIChfYml0cyAmIDB4MTApID09IDA7CiAgICAgfQogCiAgICAgZmluYWwgYm9vbGVhbiBpc0ludmFsaWQgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgKChfYml0cyAmIDB4MTApID09IDApIHx8IGlzVHlwZWFibGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCgoX2JpdHMgJiAweDEwKSA9PSAwKSB8fCBpc1R5cGVhYmxlKCkpOwogICAgICAgICByZXR1cm4gKF9iaXRzICYgMHgxMCkgIT0gMDsKICAgICB9CiAKICAgICBmaW5hbCB2b2lkIHRvZ2dsZUlzSW52YWxpZCAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc1R5cGVhYmxlKCkpOwogICAgICAgICBfYml0cyBePSAweDEwOwogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2NoICggaW50IGRlbHRhICkKICAgICB7CiAgICAgICAgIF9jY2ggKz0gZGVsdGE7Ci0gICAgICAgIGFzc2VydCBfY2NoID49IDA7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfY2NoID49IDApOwogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2NoQWZ0ZXIgKCBpbnQgZGVsdGEgKQogICAgIHsKICAgICAgICAgX2NjaEFmdGVyICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaEFmdGVyID49IDA7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfY2NoQWZ0ZXIgPj0gMCk7CiAgICAgfQogCiAgICAgZmluYWwgdm9pZCBhZGp1c3RDY2hMZWZ0ICggaW50IGRlbHRhICkKICAgICB7CiAgICAgICAgIF9jY2hMZWZ0ICs9IGRlbHRhOwotICAgICAgICBhc3NlcnQgX2NjaExlZnQgPj0gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9jY2hMZWZ0ID49IDApOwogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2RvY0JlZ2luTGVmdCAoIGludCBkICkKICAgICB7CiAgICAgICAgIF9iaXRzICs9IGQgKiAzMjsKLSAgICAgICAgYXNzZXJ0IGdldENkb2NCZWdpbkxlZnQoKSA+PSAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0Q2RvY0JlZ2luTGVmdCgpID49IDApOwogICAgIH0KIAogICAgIGZpbmFsIFNwbGF5IGdldEZpbmlzaFNwbGF5ICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKICAgICAgICAgcmV0dXJuIGlzTGVhZigpID8gdGhpcyA6ICgoQ29udGFpbmVyKSB0aGlzKS5nZXRGaW5pc2goKTsKICAgICB9CiAKQEAgLTE1Niw3ICsxNjcsOCBAQAogCiAgICAgZmluYWwgaW50IGdldFBvc0xlYWZFbmQgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNMZWFmKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0xlYWYoKSk7CiAgICAgICAgIHJldHVybiAxICsgZ2V0Q2NoVmFsdWUoKTsKICAgICB9CiAKQEAgLTE3NSw3ICsxODcsOCBAQAogCiAgICAgZmluYWwgaW50IGdldFBvc3RDY2ggKCBpbnQgcCApCiAgICAgewotICAgICAgICBhc3NlcnQgcCA+PSAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID49IDAgJiYgcCA8PSBnZXRFbmRQb3MoKSk7CiAKICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBpc0xlYWYoKSAmJiBwIDw9IGdldFBvc0xlYWZFbmQoKQpAQCAtMjU0LDcgKzI2Nyw4IEBACiAgICAgICAgIGNhc2UgRU5EICAgICAgOiByZXR1cm4gZ2V0Q2NoQWZ0ZXIoKTsKIAogICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICtnZXRLaW5kKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiVW5leHBlY3RlZCBzcGxheSBraW5kICIgKyBnZXRLaW5kKCkpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTUsNyArMzI5LDggQEAKIAogICAgIGZpbmFsIHZvaWQgc2V0TmFtZSAoIFJvb3QgciwgUU5hbWUgbmV3TmFtZSApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpIHx8IGlzQXR0cigpIHx8IGlzUHJvY2luc3QoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzQmVnaW4oKSB8fCBpc0F0dHIoKSB8fCBpc1Byb2NpbnN0KCkpOwogCiAgICAgICAgIC8vIEJVR0JVRyAtIGRlYWwgd2l0aCB4c2k6bmlsIGhlcmUgdG9vCiAKQEAgLTMyOSw3ICszNDQsOCBAQAogCiAgICAgICAgICAgICBpZiAoIWlzUHJvY2luc3QoKSAmJiAhaXNYbWxucygpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpc0F0dHIoKSB8fCBpc0JlZ2luKCk7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNBdHRyKCkgfHwgaXNCZWdpbigpKTsKIAogICAgICAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCiAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciApOwpAQCAtMzUzLDcgKzM2OSw4IEBACiAKICAgICBmaW5hbCBpbnQgZW5zdXJlQ29udGVudFZhbGlkICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKIAogICAgICAgICBpZiAoaXNWYWxpZCgpKQogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0zNzAsNyArMzg3LDggQEAKIAogICAgIGZpbmFsIHZvaWQgZW5zdXJlVmFsdWVWYWxpZCAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzTm9ybWFsQXR0cigpKTsKIAogICAgICAgICBpZiAoaXNJbnZhbGlkKCkpCiAgICAgICAgIHsKQEAgLTM4Niw3ICs0MDQsOCBAQAogCiAgICAgZmluYWwgVG9rZW5UeXBlIGdldFRva2VuVHlwZSAoIGludCBwICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBwID49IDAgJiYgcCA8PSBnZXRNYXhQb3MoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPj0gMCAmJiBwIDw9IGdldE1heFBvcygpKTsKIAogICAgICAgICAvLyBObyBuZWVkIHRvIHJldmFsaWRhdGUgdGV4dCB2YWx1ZSBoZXJlIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG5vIHBvcwogICAgICAgICAvLyB3aGljaCBjb3VsZCBleGlzdHMgd2hlbiB0aGlzIHNwbGF5IGlzIGludmFsaWQgd2hpY2ggY291bGQgYmUgb24KQEAgLTQwNiw3ICs0MjUsOCBAQAogICAgICAgICAgICAgaWYgKHAgPT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLlNUQVJUOwogCi0gICAgICAgICAgICBhc3NlcnQgaXNMZWFmKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0xlYWYoKSk7CiAKICAgICAgICAgICAgIHJldHVybiBwID09IGdldFBvc0xlYWZFbmQoKSA/IFRva2VuVHlwZS5FTkQgOiBUb2tlblR5cGUuVEVYVDsKIApAQCAtNDE3LDcgKzQzNyw4IEBACiAgICAgICAgIGNhc2UgRU5EICAgICAgOiByZXR1cm4gVG9rZW5UeXBlLkVORDsKIAogICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgZ2V0S2luZCgpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgZ2V0S2luZCgpKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNDMwLDE5ICs0NTEsMjUgQEAKIAogICAgIGZpbmFsIHZvaWQgZm9saWF0ZSAoIFJvb3QgciApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNCZWdpbigpOwotICAgICAgICBhc3NlcnQgIWlzTGVhZigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0JlZ2luKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNMZWFmKCkpOworICAgICAgICB9CiAKICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdGhpczsKICAgICAgICAgU3BsYXkgZSA9IGIuZ2V0RmluaXNoKCk7CiAKLSAgICAgICAgYXNzZXJ0IGIubmV4dE5vbkF0dHJTcGxheSgpID09IGU7Ci0gICAgICAgIGFzc2VydCBiLl9lbmQgPT0gZTsKLSAgICAgICAgYXNzZXJ0IGUuaXNFbmQoKTsKLSAgICAgICAgYXNzZXJ0ICFiLmlzTGVhZigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShiLm5leHROb25BdHRyU3BsYXkoKSA9PSBlKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYi5fZW5kID09IGUpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShlLmlzRW5kKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghYi5pc0xlYWYoKSk7CiAKLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOworICAgICAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHIudmFsaWRhdGVDaGFuZ2VTdGFydGVkKCkpOworICAgICAgICB9CiAKICAgICAgICAgaW50IGNjaEJlZm9yZSA9IGdldENjaCgpOwogCkBAIC00NjAsNyArNDg3LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgbmV4dEdvb2JlciA9IGUubmV4dEdvb2JlciggZyApOwogCi0gICAgICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShnLmdldFBvcygpID09IDApOwogICAgICAgICAgICAgZy5zZXQoIHRoaXMsIGNjaEJlZm9yZSArIDEgKTsKICAgICAgICAgfQogCkBAIC00NzksMTMgKzUwNywxNiBAQAogCiAgICAgZmluYWwgdm9pZCBkZWZvbGlhdGUgKCBSb290IHIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzTGVhZigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggaXNMZWFmKCkgKTsKIAotICAgICAgICAvLyBDYWxsZXIgbXVzdCBpbml0aWF0ZSBjaGFuZ2UKLSAgICAgICAgYXNzZXJ0IHIudmFsaWRhdGVDaGFuZ2VTdGFydGVkKCk7CisgICAgICAgICAgICAvLyBDYWxsZXIgbXVzdCBpbml0aWF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHIudmFsaWRhdGVDaGFuZ2VTdGFydGVkKCkgKTsKIAotICAgICAgICAvLyBDYWxsZXIgbXVzdCBlbnN1cmUgbGVhZiBpcyB2YWxpZAotICAgICAgICBhc3NlcnQgaXNWYWxpZCgpOworICAgICAgICAgICAgLy8gQ2FsbGVyIG11c3QgZW5zdXJlIGxlYWYgaXMgdmFsaWQKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGlzVmFsaWQoKSApOworICAgICAgICB9CiAKICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdGhpczsKIApAQCAtNTMzLDcgKzU2NCw4IEBACiAgICAgICAgICAgICAgICAgZy5zZXQoIGIuX2VuZCwgZ3AgLSBwb3NMZWFmRW5kICk7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB2YWxpZGF0ZSgpICk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NDMsMTIgKzU3NSwxNSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJlbW92ZVRleHRBZnRlciAoIFJvb3QgciApCiAgICAgewotICAgICAgICBhc3NlcnQgciAhPSBudWxsOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpICYmICFpc0F0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHIgIT0gbnVsbCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhaXNSb290KCkgJiYgIWlzQXR0cigpICk7CiAKLSAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCi0gICAgICAgIGFzc2VydCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpOworICAgICAgICAgICAgLy8gQ2FsbGVyIG11c3QgaW5pdGlhdGUgY2hhbmdlCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCByLnZhbGlkYXRlQ2hhbmdlU3RhcnRlZCgpICk7CisgICAgICAgIH0KIAogICAgICAgICBpbnQgY2NoVGV4dEFmdGVyID0gZ2V0Q2NoQWZ0ZXIoKTsKIApAQCAtNTgwLDcgKzYxNSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHZhbGlkYXRlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTkxLDExICs2MjcsMTQgQEAKIAogICAgIHByaXZhdGUgZmluYWwgaW50IHNhdmVUZXh0QWZ0ZXIgKCBSb290IHIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUociAhPSBudWxsKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByKTsKIAotICAgICAgICAvLyBDYWxsZXIgbXVzdCBpbml0aWF0ZSBjaGFuZ2UKLSAgICAgICAgYXNzZXJ0IHIudmFsaWRhdGVDaGFuZ2VTdGFydGVkKCk7CisgICAgICAgICAgICAvLyBDYWxsZXIgbXVzdCBpbml0aWF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKSk7CisgICAgICAgIH0KIAogICAgICAgICBTcGxheSBlbmRUZXh0ID0gdGhpczsKIApAQCAtNjA3LDcgKzY0Niw4IEBACiAgICAgICAgIGlmIChjY2hFbmRUZXh0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBhc3NlcnQgIWlzUm9vdCgpICYmICFpc0RvYygpICYmICFpc0F0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc1Jvb3QoKSAmJiAhaXNEb2MoKSAmJiAhaXNBdHRyKCkpOwogCiAgICAgICAgIFNwbGF5IGdldHNUZXh0ID0gcHJldk5vbkF0dHJTcGxheSgpOwogICAgICAgICBpbnQgZ2V0c1RleHRMYXN0UG9zID0gZ2V0c1RleHQuZ2V0RW5kUG9zKCk7CkBAIC02MjEsNyArNjYxLDggQEAKICAgICAgICAgci51cGRhdGVDY2goIGdldHNUZXh0LCBjY2hFbmRUZXh0ICk7CiAgICAgICAgIHIudXBkYXRlQ2NoKCBlbmRUZXh0LCAtIGNjaEVuZFRleHQgKTsKIAotICAgICAgICBhc3NlcnQgY3BHZXRzVGV4dCA8PSBjcEVuZFRleHQ7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjcEdldHNUZXh0IDw9IGNwRW5kVGV4dCk7CiAKICAgICAgICAgaWYgKGNwR2V0c1RleHQgIT0gY3BFbmRUZXh0KQogICAgICAgICB7CkBAIC02NDIsNyArNjgzLDggQEAKICAgICAgICAgICAgICAgICBnLnNldCggZ2V0c1RleHQsIGdldHNUZXh0TGFzdFBvcyArIGdwIC0gcG9zRW5kVGV4dCApOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZSgpKTsKIAogICAgICAgICByZXR1cm4gY2NoRW5kVGV4dDsKICAgICB9CkBAIC02NTUsMTggKzY5NywyMSBAQAogICAgIGZpbmFsIHZvaWQgbW92ZSAoCiAgICAgICAgIFJvb3QgciwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCwgYm9vbGVhbiBpbnZhbGlkYXRlICkKICAgICB7Ci0gICAgICAgIGFzc2VydCByICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCAhaXNEb2MoKSAmJiAhaXNGaW5pc2goKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUociAhPSBudWxsKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIWlzRG9jKCkgJiYgIWlzRmluaXNoKCkpOwogCi0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgKHIgIT0gckRzdCB8fCAhc0RzdC5iZXR3ZWVuKCByLCBwRHN0LCB0aGlzICkgKTsKLSAgICAgICAgYXNzZXJ0IHJEc3QgPT0gbnVsbCB8fCBzRHN0ICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgUm9vdC5kdiA+IDAgfHwgc0RzdC5nZXRSb290U2xvdygpID09IHJEc3Q7Ci0gICAgICAgIGFzc2VydCByRHN0ID09IG51bGwgfHwgcERzdCA+PSAwICYmIHBEc3QgPCBzRHN0LmdldEVuZFBvcygpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyRHN0ID09IG51bGwgfHwgKHIgIT0gckRzdCB8fCAhc0RzdC5iZXR3ZWVuKCByLCBwRHN0LCB0aGlzICkgKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJEc3QgPT0gbnVsbCB8fCBzRHN0ICE9IG51bGwpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyRHN0ID09IG51bGwgfHwgUm9vdC5kdiA+IDAgfHwgc0RzdC5nZXRSb290U2xvdygpID09IHJEc3QpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShyRHN0ID09IG51bGwgfHwgcERzdCA+PSAwICYmIHBEc3QgPCBzRHN0LmdldEVuZFBvcygpKTsKIAotICAgICAgICBhc3NlcnQKLSAgICAgICAgICAgIHJEc3QgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICh0cnVlIHx8IGNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHNEc3QsIHBEc3QsIGZhbHNlICkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICByRHN0ID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgKHRydWUgfHwgY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgc0RzdCwgcERzdCwgZmFsc2UgKSkpOworICAgICAgICB9CiAKICAgICAgICAgci5zdGFydENoYW5nZSgpOwogCkBAIC03MjAsNyArNzY1LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydCBzRHN0ICE9IHRoaXM7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzRHN0ICE9IHRoaXMpOwogCiAgICAgICAgIC8vIENvbXB1dGUgdGhlIHNwbGF5LCB1cCB0byB3aGljaCwgSSB3aWxsIHJlbW92ZQogCkBAIC03NDMsNyArNzg5LDggQEAKIAogICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCkgfHwgcy5pc05vcm1hbEF0dHIoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzLmlzTGVhZigpIHx8IHMuaXNOb3JtYWxBdHRyKCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkpCiAgICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlVmFsdWVWYWxpZCgpOwpAQCAtODE1LDggKzg2MiwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHIudmFsaWRhdGUoKTsKLSAgICAgICAgYXNzZXJ0IHJEc3QgPT0gbnVsbCB8fCByRHN0LnZhbGlkYXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHIudmFsaWRhdGUoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJEc3QgPT0gbnVsbCB8fCByRHN0LnZhbGlkYXRlKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC04NDUsMTAgKzg5NSwxMyBAQAogICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tJbnNlcnRpb25WYWxpZGl0eSAoCiAgICAgICAgIGludCBwLCBTcGxheSBzRHN0LCBpbnQgcERzdCwgYm9vbGVhbiBlbmRPayApCiAgICAgewotICAgICAgICBhc3NlcnQgcCA+PSAwOwotICAgICAgICBhc3NlcnQgcCA8IGdldEVuZFBvcygpOwotICAgICAgICBhc3NlcnQgcERzdCA+PSAwOwotICAgICAgICBhc3NlcnQgcERzdCA8IHNEc3QuZ2V0RW5kUG9zKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPj0gMCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPCBnZXRFbmRQb3MoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBEc3QgPj0gMCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBEc3QgPCBzRHN0LmdldEVuZFBvcygpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gc3JjQ2hhcnMgPSBmYWxzZTsKIApAQCAtOTMwLDQxICs5ODMsNDcgQEAKICAgICB7CiAvLyBCVUdCVUcgLSB3aGF0IGlzIGEgbmV3IHhzaXR5cGUgYXR0ciBpcyBpbnNlcnRlZD8gLS0gbXVzdCBkaXNjb25uZWN0IHR5cGVzCiAKLSAgICAgICAgYXNzZXJ0IHAgPCBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IGNjaFR4dCA+PSAwOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgcm9vdEluc2VydC5fcGFyZW50U3BsYXkgPT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJvb3RJbnNlcnQuZ2V0Q2NoTGVmdCgpICsgcm9vdEluc2VydC5nZXRDY2goKSA9PSBjY2hUeHQ7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPCBnZXRFbmRQb3MoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNjaFR4dCA+PSAwKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocm9vdEluc2VydCAhPSBudWxsKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocm9vdEluc2VydC5fcGFyZW50U3BsYXkgPT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJvb3RJbnNlcnQuZ2V0Q2NoTGVmdCgpICsgcm9vdEluc2VydC5nZXRDY2goKSA9PSBjY2hUeHQpOwogCi0gICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgYSB0cmVlIGhlcmUuICBHZXQgdGhlIGZpcnN0IHNwbGF5IGluIHRoZSB0cmVlCi0gICAgICAgIC8vIEl0IG11c3QgZWl0aGVyIGJlIGF0IHRoZSByb290IG9yIGp1c3QgdG8gdGhlIGxlZnQgb2YgdGhlIHJvb3QuCi0gICAgICAgIC8vIFRoaXMgaXMgdGhlICJjbGFzc2ljIiBkb2cgbGVnIHBhdHRlcm4gSSB1c2UgdG8gcGFzcyBzcGxheSB0cmVlcy4KKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgYSB0cmVlIGhlcmUuICBHZXQgdGhlIGZpcnN0IHNwbGF5IGluIHRoZSB0cmVlCisgICAgICAgICAgICAvLyBJdCBtdXN0IGVpdGhlciBiZSBhdCB0aGUgcm9vdCBvciBqdXN0IHRvIHRoZSBsZWZ0IG9mIHRoZSByb290LgorICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgImNsYXNzaWMiIGRvZyBsZWcgcGF0dGVybiBJIHVzZSB0byBwYXNzIHNwbGF5IHRyZWVzLgogCi0gICAgICAgIGFzc2VydAotICAgICAgICAgICAgcm9vdEluc2VydC5fbGVmdFNwbGF5ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkuX2xlZnRTcGxheSA9PSBudWxsOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkuX2xlZnRTcGxheSA9PSBudWxsKTsKKyAgICAgICAgfQogCiAgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKIAogICAgICAgICBTcGxheSBzSW5zZXJ0ID0KICAgICAgICAgICAgIHJvb3RJbnNlcnQuX2xlZnRTcGxheSA9PSBudWxsID8gcm9vdEluc2VydCA6IHJvb3RJbnNlcnQuX2xlZnRTcGxheTsKIAotICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNEb2MoKSAmJiAhc0luc2VydC5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghc0luc2VydC5pc0RvYygpICYmICFzSW5zZXJ0LmlzRmluaXNoKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHIpOwogCi0gICAgICAgIC8vIFdoZW4gdGhpcyBtZW1iZXIgaXMgY2FsbGVkLCB3ZSBiZXR0ZXIgYmUgYWJsZSB0byBkbyB0aGUgaW5zZXJ0LgorICAgICAgICAgICAgLy8gV2hlbiB0aGlzIG1lbWJlciBpcyBjYWxsZWQsIHdlIGJldHRlciBiZSBhYmxlIHRvIGRvIHRoZSBpbnNlcnQuCiAKLSAgICAgICAgYXNzZXJ0IHRydWUgfHwgc0luc2VydC5jaGVja0luc2VydGlvblZhbGlkaXR5KCAwLCB0aGlzLCBwLCBmYWxzZSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh0cnVlIHx8IHNJbnNlcnQuY2hlY2tJbnNlcnRpb25WYWxpZGl0eSggMCwgdGhpcywgcCwgZmFsc2UgKSk7CiAKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBmcmFnbWVudCwgdGhlcmUgYmV0dGVyIGJlIHRleHQgaW4gaXQKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZnJhZ21lbnQsIHRoZXJlIGJldHRlciBiZSB0ZXh0IGluIGl0CiAKLSAgICAgICAgYXNzZXJ0ICFzSW5zZXJ0LmlzRnJhZ21lbnQoKSB8fCBzSW5zZXJ0LmdldENjaCgpID4gMDsKLQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghc0luc2VydC5pc0ZyYWdtZW50KCkgfHwgc0luc2VydC5nZXRDY2goKSA+IDApOworICAgICAgICB9CiAgICAgICAgIC8vCiAKICAgICAgICAgU3BsYXkgcyA9IHRoaXM7CiAKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNJbnNlcnQuZ2V0Um9vdFNsb3coKSA9PSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgc0luc2VydC5nZXRSb290U2xvdygpID09IG51bGwpOwogCiAgICAgICAgIFNwbGF5IHNPcmlnID0gbnVsbDsKICAgICAgICAgaW50ICAgcE9yaWcgPSAwOwpAQCAtOTgwLDggKzEwMzksMTEgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBwbGUgPT0gMTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPT0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocGxlID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID09IDEpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaW50IGNjaFZhbGlkID0gcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKIApAQCAtOTg5LDExICsxMDUxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHBsZSArPSBjY2hWYWxpZDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRGaW5pc2hTcGxheSgpID09IHM7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5nZXRGaW5pc2hTcGxheSgpID09IHMpOwogCiAgICAgICAgICAgICAgICAgZGVmb2xpYXRlKCByICk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRGaW5pc2hTcGxheSgpICE9IHM7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5nZXRGaW5pc2hTcGxheSgpICE9IHMpOwogCiAgICAgICAgICAgICAgICAgaWYgKHAgPT0gcGxlKQogICAgICAgICAgICAgICAgIHsKQEAgLTEwMTAsNyArMTA3NCw4IEBACiAgICAgICAgICAgICAvLyBhZnRlciBhbGwgcHJlLWV4aXNpdG5nIGF0dHJzLiAgVGhpcyB0aGVzZSBjYXNlcywgcCA9PSAxIG9uCiAgICAgICAgICAgICAvLyB0aGUgYmVnaW4uICBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbW92ZSB0ZXh0IGxhdGVyLgogCi0gICAgICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNBdHRyKCkgfHwgKHAgPT0gMSAmJiBzLmlzQ29udGFpbmVyKCkpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghc0luc2VydC5pc0F0dHIoKSB8fCAocCA9PSAxICYmIHMuaXNDb250YWluZXIoKSkpOwogCiAgICAgICAgICAgICBzT3JpZyA9IHM7CiAgICAgICAgICAgICBwT3JpZyA9IHA7CkBAIC0xMDIwLDggKzEwODUsMTEgQEAKICAgICAgICAgICAgIHAgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHAgPT0gMDsKLSAgICAgICAgYXNzZXJ0ICFzLmlzRG9jKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBwID09IDApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc0RvYygpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEdldCB0aGUgY29udGFpbmVyIHJlY2VpdmluZyBhbGwgb2YgdGhpcwogCkBAIC0xMDQ0LDcgKzExMTIsOCBAQAogCiAgICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdDsKIAotICAgICAgICAgICAgICAgIGFzc2VydCBiLl9jb250YWluZXIgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShiLl9jb250YWluZXIgPT0gbnVsbCk7CiAKICAgICAgICAgICAgICAgICBiLl9jb250YWluZXIgPSBjOwogCkBAIC0xMDUyLDcgKzExMjEsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAodC5pc0ZyYWdtZW50KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGluc2VydGluZ0ZyYWdtZW50ID09IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaW5zZXJ0aW5nRnJhZ21lbnQgPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgaW5zZXJ0aW5nRnJhZ21lbnQgPSB0OwogICAgICAgICAgICAgfQogCkBAIC0xMTA2LDggKzExNzYsMTEgQEAKICAgICAgICAgaWYgKHNPcmlnICE9IG51bGwgJiYgIXNJbnNlcnQuaXNBdHRyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBjY2hNb3ZlZCA9IHNPcmlnLm1vdmVDaGFycyggciwgcE9yaWcsIC0xLCByLCBzLCAwLCB0cnVlICk7Ci0gICAgICAgICAgICBhc3NlcnQgY2NoTW92ZWQgPiAwOwotICAgICAgICAgICAgYXNzZXJ0IGNjaE1vdmVkID09IGNjaEJ5cGFzc2VkOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjY2hNb3ZlZCA+IDApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoTW92ZWQgPT0gY2NoQnlwYXNzZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gYnVpbGQgYSBsZWFmIGlmIHBvc3NpYmxlCkBAIC0xMTE3LDcgKzExOTAsOCBAQAogCiAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKIAotICAgICAgICBhc3NlcnQgci52YWxpZGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoci52YWxpZGF0ZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzEsOSArMTIwNSwxMiBAQAogICAgICAgICBSb290IHIsIFNwbGF5IHNTcmMsIFJvb3QgclNyYywKICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVR5cGUsIGJvb2xlYW4gcHJlc2VydmVOYW1lc3BhY2VzICkKICAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNGaW5pc2goKSAmJiAhc1NyYy5pc0ZpbmlzaCgpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc1NyYy5nZXRSb290U2xvdygpID09IHJTcmM7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc0ZpbmlzaCgpICYmICFzU3JjLmlzRmluaXNoKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHIpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShSb290LmR2ID4gMCB8fCBzU3JjLmdldFJvb3RTbG93KCkgPT0gclNyYyk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB0aGUgc3JjIGFuZCBkc3QgYXJlIHRoZSBzYW1lIHNwbGF5LCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KIApAQCAtMTE1OSw3ICsxMjM2LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzdGFydENoYW5nZSgpIGhlcmUsIGZjbnMgSSBjYWxsIHdpbGwgZG8gaXQgZm9yIG1lCiAKLSAgICAgICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKIAogICAgICAgICAgICAgLy8gTWFrZSBjb3B5IG9mIHNvdXJjZQogCkBAIC0xMTg3LDggKzEyNjUsMTEgQEAKIAogICAgICAgICAgICAgcmVtb3ZlQ29udGVudCggciwgdHJ1ZSApOwogCi0gICAgICAgICAgICBhc3NlcnQgaXNMZWFmKCkgfHwgZ2V0RmluaXNoU3BsYXkoKSA9PSBuZXh0U3BsYXkoKTsKLSAgICAgICAgICAgIGFzc2VydCBnZXRDY2hWYWx1ZSgpID09IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzTGVhZigpIHx8IGdldEZpbmlzaFNwbGF5KCkgPT0gbmV4dFNwbGF5KCkpOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZ2V0Q2NoVmFsdWUoKSA9PSAwKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3BsYXkgY29weSA9IGNvcHlDb250ZXh0LmdldFRyZWUoKTsKIApAQCAtMTI2MSw3ICsxMzQyLDggQEAKIAogICAgICAgICB2b2lkIGNvcHlTcGxheSAoIFNwbGF5IHMsIGJvb2xlYW4gY29weVRleHRBZnRlciApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCAhcy5pc0RvYygpICYmICFzLmlzUm9vdCgpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc0RvYygpICYmICFzLmlzUm9vdCgpKTsKIAogICAgICAgICAgICAgU3BsYXkgdDsKIApAQCAtMTMxMyw3ICsxMzk1LDggQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFzc2VydCBzLmlzVmFsaWQoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocy5pc1ZhbGlkKCkpOwogCiAgICAgICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2hWYWx1ZSgpOwogCkBAIC0xMzM2LDcgKzE0MTksOCBAQAogCiAgICAgICAgIHZvaWQgY29weUZyYWdtZW50ICggaW50IGNjaCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShjY2ggPiAwKTsKIAogICAgICAgICAgICAgU3BsYXkgcyA9IG5ldyBGcmFnbWVudCgpOwogCkBAIC0xMzQ4LDcgKzE0MzIsOCBAQAogCiAgICAgICAgIFNwbGF5IGdldFRyZWUgKCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfZnJvbnRpZXIgPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2Zyb250aWVyID09IG51bGwpOwogCiAgICAgICAgICAgICBpZiAoX2xhc3QgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTE0NDgsNyArMTUzMyw4IEBACiAKICAgICBmaW5hbCBDb3B5Q29udGV4dCBjb3B5U3BsYXlDb250ZW50cyAoIFJvb3QgciApCiAgICAgewotICAgICAgICBhc3NlcnQgIWlzRmluaXNoKCkgJiYgIWlzWG1sbnMoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc0ZpbmlzaCgpICYmICFpc1htbG5zKCkpOwogCiAgICAgICAgIGlmIChpc0NvbnRhaW5lcigpKQogICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7CkBAIC0xNTE0LDcgKzE2MDAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGlzTm9ybWFsQXR0cigpIHx8IGlzQ29tbWVudCgpIHx8IGlzUHJvY2luc3QoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNOb3JtYWxBdHRyKCkgfHwgaXNDb21tZW50KCkgfHwgaXNQcm9jaW5zdCgpKTsKIAogICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gZ2V0Q2NoVmFsdWUoKTsKIApAQCAtMTU0MCw3ICsxNjI3LDggQEAKIAogICAgIGZpbmFsIFNwbGF5IGNvcHlTcGxheSAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCAhaXNEb2MoKSAmJiAhaXNGaW5pc2goKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc0RvYygpICYmICFpc0ZpbmlzaCgpKTsKIAogICAgICAgICAvLyBDb21wdXRlIHNwbGF5IHRvIHN0b3AgYXQgKGRvZXMgbm90IGdldCBjb3BpZWQpLiAgQWxzbyBjb21wdXRlCiAgICAgICAgIC8vIGEgc3BsYXksIHRvIGJlIGNvcGllZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXZlIGl0J3MgdGV4dCBhZnRlciBjb3BpZWQuCkBAIC0xNTc0LDcgKzE2NjIsOCBAQAogCiAgICAgZmluYWwgdm9pZCByZW1vdmVBdHRyaWJ1dGVzICggUm9vdCByICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNDb250YWluZXIoKSk7CiAKICAgICAgICAgZm9yICggOyA7ICkKICAgICAgICAgewpAQCAtMTU5NCw3ICsxNjgzLDggQEAKIAogICAgIGZpbmFsIHZvaWQgcmVtb3ZlQ29udGVudCAoIFJvb3QgciwgYm9vbGVhbiByZW1vdmVBdHRycyApCiAgICAgewotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByKTsKIAogICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CiAKQEAgLTE2MzQsNyArMTcyNCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChpc1htbG5zKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciByZW1vdmVDb250ZW50IjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQga2luZCBmb3IgcmVtb3ZlQ29udGVudCIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKQEAgLTE2NjYsMTYgKzE3NTcsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciByZW1vdmVDb250ZW50IjsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJVbmV4cGVjdGVkIGtpbmQgZm9yIHJlbW92ZUNvbnRlbnQiKTsKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydCBpc0RvYygpIHx8IChpc0JlZ2luKCkgJiYgIWlzTGVhZigpKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzRG9jKCkgfHwgKGlzQmVnaW4oKSAmJiAhaXNMZWFmKCkpKTsKIAogICAgICAgICBTcGxheSBzID0gbmV4dE5vbkF0dHJTcGxheSgpOwogCiAgICAgICAgIGlmIChzLmlzUm9vdCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgaXNEb2MoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNEb2MoKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xNjg3LDcgKzE3ODEsOCBAQAogICAgICAgICAgICAgU3BsYXkgbmV4dDsKICAgICAgICAgICAgIGZvciAoIHMgPSBuZXh0Tm9uQXR0clNwbGF5KCkgOyAhcy5pc0ZpbmlzaCgpIDsgcyA9IG5leHQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCAhcy5pc0F0dHIoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghcy5pc0F0dHIoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMubmV4dE5vbkF0dHJTcGxheSgpOwpAQCAtMTcwNCw3ICsxNzk5LDggQEAKICAgICAgICAgICAgIC8vIHJlbW92ZXMgY291bGQgaGF2ZSBzdXVmZmxlZCB0ZXh0IHRvIGFmdGVyIHRoaXMuCiAgICAgICAgICAgICAvLwogCi0gICAgICAgICAgICBhc3NlcnQgIWlzTGVhZigpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNMZWFmKCkpOwogCiAgICAgICAgICAgICBpZiAoZ2V0Q2NoQWZ0ZXIoKSA+IDApCiAgICAgICAgICAgICAgICAgcmVtb3ZlVGV4dEFmdGVyKCByICk7CkBAIC0xNzQyLDEzICsxODM4LDE1IEBACiAgICAgICAgIGlmIChyLl9sZWZ0U3BsYXkgPT0gci5fZG9jICYmIHIuX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsKQogICAgICAgICAgICAgci5fbGVmdE9ubHkgPSB0cnVlOwogCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodmFsaWRhdGUoKSk7CiAgICAgfQogCiAgICAgZmluYWwgaW50IGNvcHlDaGFycyAoCiAgICAgICAgIFJvb3QgciwgaW50IHAsIGludCBjY2gsIFJvb3QgckRzdCwgU3BsYXkgc0RzdCwgaW50IHBEc3QgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHBEc3QgPiAwICYmIHBEc3QgPD0gc0RzdC5nZXRFbmRQb3MoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBEc3QgPiAwICYmIHBEc3QgPD0gc0RzdC5nZXRFbmRQb3MoKSk7CiAKICAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCBwICk7CiAKQEAgLTE3NTgsNyArMTg1Niw4IEBACiAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCiAgICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOwogCi0gICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID4gMCk7CiAKIC8vIFRPRE8gLSB1c2VzIHN0cmluZyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNvdXJjZSBhbmQgZGVzdCBmcm9tIHNhbWUgYnVmZmVyCiAvLyAgICAgICAgcmV3cml0ZSB0byBub3QgY3JlYXRlIHN0cmluZyBvYmplY3QKQEAgLTE3OTcsNyArMTg5Niw4IEBACiAgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKICAgICAgICAgckRzdC5zdGFydENoYW5nZSgpOwogCi0gICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoY2NoID4gMCk7CiAKICAgICAgICAgLy8gSSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZSBpbnZhbGlkaXR5IG9mIHRoZSBzb3VyY2UgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gb25seSBpbnZhbGlkIHRleHQgSSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aCBpcyB0aGF0IGluIGEgbGVhZiwgYW5kCkBAIC0xODMzLDcgKzE5MzMsOCBAQAogICAgICAgICBpZiAoc0RzdCA9PSB0aGlzICYmIHBEc3QgPj0gcCAmJiBwRHN0IDw9IHAgKyBjY2gpCiAgICAgICAgICAgICByZXR1cm4gY2NoOwogCi0gICAgICAgIGFzc2VydCBwRHN0ID4gMDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBEc3QgPiAwKTsKIAogICAgICAgICBDb250YWluZXIgY0RzdCA9IHNEc3QuZ2V0Q29udGFpbmVyKCBwRHN0ICk7CiAgICAgICAgIENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCBwICk7CkBAIC0xODU5LDcgKzE5NjAsOCBAQAogICAgICAgICAgICAgICAgIGcuc2V0KCBncCArIGNjaCApOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHNEc3QgIT0gdGhpcyB8fCBwRHN0IDwgcCB8fCBwRHN0ID4gcCArIGNjaDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNEc3QgIT0gdGhpcyB8fCBwRHN0IDwgcCB8fCBwRHN0ID4gcCArIGNjaCk7CiAKICAgICAgICAgaWYgKHNEc3QgPT0gdGhpcykKICAgICAgICAgewpAQCAtMTkyMSw3ICsyMDIzLDggQEAKICAgICB7CiAgICAgICAgIGludCBtYXhQb3MgPSBnZXRNYXhQb3MoKTsKIAotICAgICAgICBhc3NlcnQgcCA+IDAgJiYgcCA8PSBtYXhQb3M7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID4gMCAmJiBwIDw9IG1heFBvcyk7CiAKICAgICAgICAgaWYgKHAgPT0gMCkKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMTk2Myw3ICsyMDY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggcCApOwogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBrID09IEFOTk9UQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoayA9PSBBTk5PVEFUSU9OKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmRpc2Nvbm5lY3QoIHIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTk3OSwxMSArMjA4MywxMyBAQAogCiAgICAgICAgIGludCBwb3NBZnRlciA9IGdldFBvc0FmdGVyKCk7CiAKLSAgICAgICAgYXNzZXJ0IHAgPj0gcG9zQWZ0ZXI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID49IHBvc0FmdGVyKTsKIAogICAgICAgICBpbnQgbWF4Q2NoID0gbWF4UG9zIC0gcCArIDE7CiAKLSAgICAgICAgYXNzZXJ0IG1heENjaCA+PSAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobWF4Q2NoID49IDApOwogCiAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IG1heENjaCkKICAgICAgICAgICAgIGNjaCA9IG1heENjaDsKQEAgLTIwMjAsNyArMjEyNiw4IEBACiAKICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOwogCi0gICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodmFsaWRhdGUoKSk7CiAKICAgICAgICAgcmV0dXJuIGNjaDsKICAgICB9CkBAIC0yMDMxLDcgKzIxMzgsOCBAQAogCiAgICAgZmluYWwgdm9pZCBpbnNlcnRDaGFycyAoIGludCBwLCBSb290IHIsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHAgPiAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID4gMCAmJiBwIDw9IGdldEVuZFBvcygpKTsKIAogICAgICAgICBpZiAoY2NoID09IDApCiAgICAgICAgICAgICByZXR1cm47CkBAIC0yMDYyLDcgKzIxNzAsOCBAQAogCiAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKIAotICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHZhbGlkYXRlKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVEFURSA9IDA7CkBAIC0yMDcyLDEyICsyMTgxLDE2IEBACiAgICAgcHVibGljIGZpbmFsIGludCBzY3J1YlRleHQoCiAgICAgICAgIFRleHQgdGV4dCwgaW50IHdzLCBpbnQgY3AsIGludCBjY2gsIFN0cmluZ0J1ZmZlciBzYiwgaW50IHN0YXRlICkKICAgICB7Ci0gICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwpOwogCiAgICAgICAgIGlmICh0ZXh0Ll9idWYgPT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGNjaCA9PSAwOwotICAgICAgICAgICAgYXNzZXJ0IGNwID09IDA7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNjaCA9PSAwKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGNwID09IDApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgICB9CiAKQEAgLTIwOTQsNyArMjIwNyw4IEBACiAgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX1JFUExBQ0UgICAgIDogICAgICAgICAgICByZXBsYWNlID0gdHJ1ZTsgYnJlYWs7CiAgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX0NPTExBUFNFICAgIDogY29sbGFwc2UgPSByZXBsYWNlID0gdHJ1ZTsgYnJlYWs7CiAKLQkJZGVmYXVsdCA6IGFzc2VydCBmYWxzZTogIlVua25vd24gd2hpdGUgc3BhY2UgcnVsZSAiICt3czsKKwkJZGVmYXVsdCA6IGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiVW5rbm93biB3aGl0ZSBzcGFjZSBydWxlICIgKyB3cyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXJlcGxhY2UgJiYgIWNvbGxhcHNlKQpAQCAtMjI5Myw3ICsyNDA3LDggQEAKIAogICAgIFNwbGF5IGdldEF0dHIgKCBRTmFtZSBuYW1lICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShuYW1lICE9IG51bGwpOwogCiAgICAgICAgIGlmICghaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjMwOSw3ICsyNDI0LDggQEAKIAogICAgIHZvaWQgc2V0WHNpTmlsICggUm9vdCByLCBib29sZWFuIG5pbCApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzQ29udGFpbmVyKCkpOwogCiAgICAgICAgIGlmIChnZXRYc2lOaWwoIHIgKSA9PSBuaWwpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0yMzE5LDcgKzI0MzUsOCBAQAogCiAgICAgYm9vbGVhbiBnZXRYc2lOaWwgKCBSb290IHIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKIAogICAgICAgICBTcGxheSBzOwogCkBAIC0yMzM5LDcgKzI0NTYsOCBAQAogCiAgICAgUU5hbWUgZ2V0WHNpVHlwZU5hbWUgKCBSb290IHIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKIAogICAgICAgICBTcGxheSBzOwogCkBAIC0yMzUyLDcgKzI0NzAsOCBAQAogICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAotICAgICAgICBhc3NlcnQgcy5pc1hzaVR5cGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMuaXNYc2lUeXBlKCkpOwogCiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHMuZ2V0VGV4dCggciwgVHlwZVN0b3JlLldTX0NPTExBUFNFICk7CiAKQEAgLTIzODQsNyArMjUwMyw4IEBACiAKICAgICB2b2lkIHNldFhzaVR5cGUgKCBSb290IHIsIFFOYW1lIHR5cGVOYW1lICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNDb250YWluZXIoKSk7CiAKICAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCiAgICAgICAgIHsKQEAgLTIzOTgsNyArMjUxOCw4IEBACiAKICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeEZvck5hbWVzcGFjZSggciwgbnMsIG51bGwsIHRydWUpOwogCi0gICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbCA6ICJDYW5ub3QgZXN0YWJsaXNoIHByZWZpeCBmb3IgIiArIG5zOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocHJlZml4ICE9IG51bGwsICJDYW5ub3QgZXN0YWJsaXNoIHByZWZpeCBmb3IgIi5jb25jYXQobnMpKTsKIAogICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKICAgICAgICAgICAgIHZhbHVlID0gcHJlZml4ICsgIjoiICsgdmFsdWU7CkBAIC0yNDIyLDkgKzI1NDMsMTIgQEAKIAogICAgIHZvaWQgc2V0QXR0ciAoIFJvb3QgciwgUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKLSAgICAgICAgYXNzZXJ0IGF0dHJOYW1lICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc0NvbnRhaW5lcigpKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoYXR0ck5hbWUgIT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHZhbHVlICE9IG51bGwpOworICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBzZXQgPSBmYWxzZTsKIApAQCAtMjQ4Miw3ICsyNjA2LDggQEAKICAgICAgICAgY2FzZSBET0MgOgogICAgICAgICBjYXNlIEJFR0lOIDoKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpc0JlZ2luKCkgfHwgaXNMZWFmKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc0JlZ2luKCkgfHwgaXNMZWFmKCkpOwogICAgICAgICAgICAgaW5zZXJ0Q2hhcnMoIDEsIHIsIHR4dCwgb2ZmLCBjY2ggKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNDkwLDcgKzI2MTUsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaXNYbWxucygpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQga2luZCBmb3Igc2V0VGV4dCI7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZmFsc2UsICJVbmV4cGVjdGVkIGtpbmQgZm9yIHNldFRleHQiKTsKICAgICAgICAgICAgIH0KIC8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCiAvLyBUT0RPIC0gaWYgc2V0dGluZyB0ZXh0IG9mIHhzaTp0eXBlIG9yIHhzaTpuaWwgbXVzdCBkbyBzdHVmZgpAQCAtMjUwNCw3ICsyNjMwLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgci5zdGFydENoYW5nZSgpOwogCi0gICAgICAgICAgICBhc3NlcnQgZ2V0Q2NoVmFsdWUoKSA9PSAwOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShnZXRDY2hWYWx1ZSgpID09IDApOwogCiAgICAgICAgICAgICByLl90ZXh0Lmluc2VydCggci5nZXRDcCggdGhpcyApLCB0eHQsIG9mZiwgY2NoICk7CiAgICAgICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgY2NoICk7CkBAIC0yNTIyLDEwICsyNjQ5LDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQga2luZCBmb3Igc2V0VGV4dCI7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQga2luZCBmb3Igc2V0VGV4dCIpOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZSgpKTsKICAgICB9CiAKICAgICBmaW5hbCBNYXAgbG9va3VwQWxsUHJlZml4TWFwcGluZ3MgKCApCkBAIC0yNjA4LDcgKzI3MzcsOCBAQAogICAgICAqLwogICAgIGZpbmFsIFN0cmluZyBnZXRQcmVmaXggKCBSb290IHIgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKSB8fCBpc0F0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzQmVnaW4oKSB8fCBpc0F0dHIoKSk7CiAKICAgICAgICAgaWYgKGlzWG1sbnMoKSkKICAgICAgICAgICAgIHJldHVybiAieG1sbnMiOwpAQCAtMjY2MCw3ICsyNzkwLDggQEAKICAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKHByZWZpeCkpCiAgICAgICAgICAgICByZXR1cm4gX3htbG5zVXJpOwogCi0gICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNDb250YWluZXIoKSk7CiAKICAgICAgICAgLy8gZmluZCBhbiB4bWxucyBkZWNsCiAgICAgICAgIGZvciAoIENvbnRhaW5lciBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpKQpAQCAtMjcyMiw3ICsyODUzLDggQEAKICAgICAgICAgaWYgKF94bWxuc1VyaS5lcXVhbHMoIG5zICkpCiAgICAgICAgICAgICByZXR1cm4gInhtbG5zIjsKIAotICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzQ29udGFpbmVyKCkpOwogCiAgICAgICAgIENvbnRhaW5lciBjOwogICAgICAgICBTcGxheSBzOwpAQCAtMjc5Niw3ICsyOTI4LDggQEAKICAgICAgICAgLy8gdGhlIG9yZGluYXJ5IG5vdC1hLW5vLW5hbWVzcGFjZSBjYXNlCiAgICAgICAgIC8vCiAKLSAgICAgICAgYXNzZXJ0IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApOwogCiAgICAgICAgIC8vCiAgICAgICAgIC8vIGxvb2sgZm9yIGFuIGV4aXN0aW5nIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBVUkkKQEAgLTI5MjQsOCArMzA1NywxMSBAQAogCiAgICAgZmluYWwgQ29udGFpbmVyIGdldENvbnRhaW5lciAoIGludCBwICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBwID49IDAgJiYgcCA8PSBnZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHAgPiAwIHx8ICFpc0RvYygpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID49IDAgJiYgcCA8PSBnZXRFbmRQb3MoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgPiAwIHx8ICFpc0RvYygpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChwID09IDApCiAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7CkBAIC0yOTU2LDggKzMwOTIsMTEgQEAKIAogICAgIENvbnRhaW5lciBmaW5kQ29udGFpbmVyICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0ICFpc0NvbnRhaW5lcigpOwotICAgICAgICBhc3NlcnQgIWlzRmluaXNoKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCFpc0NvbnRhaW5lcigpKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIWlzRmluaXNoKCkpOworICAgICAgICB9CiAKICAgICAgICAgU3BsYXkgcyA9IG5leHRTcGxheSgpOwogCkBAIC0yOTY5LDEzICszMTA4LDE1IEBACiAKICAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVUZXh0ICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVmFsaWQoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzVmFsaWQoKSk7CiAKICAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKIAogICAgICAgICBpZiAodCAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc1R5cGVhYmxlKCkpOwogCiAgICAgICAgICAgICB0LmludmFsaWRhdGVUZXh0KCk7CiAgICAgICAgIH0KQEAgLTI5ODMsNyArMzEyNCw4IEBACiAKICAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVOaWwgKCApCiAgICAgewotICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNUeXBlYWJsZSgpKTsKIAogICAgICAgICBpZiAoIWlzQXR0cigpKQogICAgICAgICB7CkBAIC0zMDAxLDcgKzMxNDMsOCBAQAogICAgIAogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciwgYm9vbGVhbiBkaXNjb25uZWN0RG9jICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc1R5cGVhYmxlKCkpOwogCiAgICAgICAgIFNwbGF5IGxhc3QgPSBpc0F0dHIoKSA/IHRoaXMgOiBnZXRGaW5pc2hTcGxheSgpOwogCkBAIC0zMDY3LDggKzMyMTAsMTEgQEAKICAgICAKICAgICBmaW5hbCB2b2lkIHNldFR5cGUgKCBSb290IHIsIFNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gY29tcGxhaW4gKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKLSAgICAgICAgYXNzZXJ0IHNUeXBlICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzVHlwZWFibGUoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHNUeXBlICE9IG51bGwpOworICAgICAgICB9CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gSXMgdGhlIGN1cnJlbnQgdHlwZSBhbHJlYWR5IHRoaXMgdHlwZT8KQEAgLTMwODcsMTEgKzMyMzMsMTMgQEAKICAgICAgICAgewogICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByLCB0cnVlICk7CiAKLSAgICAgICAgICAgIGFzc2VydCBwZWVrVHlwZSgpID09IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBlZWtUeXBlKCkgPT0gbnVsbCk7CiAKICAgICAgICAgICAgIG5ldyBUeXBlKCByLCBzVHlwZSwgdGhpcyApOwogCi0gICAgICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodmFsaWRhdGUoKSk7CiAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMzEwMyw3ICszMjUxLDggQEAKIAogICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBnZXRDb250YWluZXIoKS5nZXRUeXBlKCByICk7CiAKLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBhcmVudFR5cGUgIT0gbnVsbCk7CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gWW91IGNhbiBzZXQgdGhlIGF0dHJpYnV0ZSB0eXBlLCBhcyBsb25nIGFzIGl0IGlzIHRoZSBuYXR1cmFsCkBAIC0zMTIxLDcgKzMyNzAsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzQmVnaW4oKSk7CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gTm93LCBmb3IgaW50ZXJpb3IgdHlwZXMsIEkgaGF2ZSB0byBkZWFsIHdpdGggeHNpOnR5cGUgYW5kCkBAIC0zMTM3LDcgKzMyODcsOCBAQAogCiAgICAgICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKIAotICAgICAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHZhbGlkYXRlKCkpOwogCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTMxNzMsNyArMzMyNCw4IEBACiAKICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByICk7CiAKLSAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMxODMsNyArMzMzNSw4IEBACiAKICAgICBmaW5hbCBUeXBlIHBlZWtUeXBlICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGlzVHlwZWFibGUoKSk7CiAKICAgICAgICAgVHlwZSB0eXBlID0gbnVsbDsKIApAQCAtMzE5NCw3ICszMzQ3LDggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUeXBlKSBnOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbCB8fCBpc1ZhbGlkKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSh0eXBlICE9IG51bGwgfHwgaXNWYWxpZCgpKTsKIAogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CkBAIC0zMjA2LDcgKzMzNjAsOCBAQAogCiAgICAgZmluYWwgVHlwZSBnZXRUeXBlICggUm9vdCByICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc1R5cGVhYmxlKCkpOwogCiAgICAgICAgIFR5cGUgdHlwZSA9IHBlZWtUeXBlKCk7CiAKQEAgLTMyMTQsNyArMzM2OSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKIAotICAgICAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocGFyZW50VHlwZSAhPSBudWxsKTsKIAogICAgICAgICAgICAgLy8gRGVmZW5zaXZlCiAgICAgICAgICAgICBpZiAocGFyZW50VHlwZSA9PSBudWxsKQpAQCAtMzIzMCwxMiArMzM4NiwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShpc05vcm1hbEF0dHIoKSk7CiAKICAgICAgICAgICAgICAgICBuZXdVc2VyID0gcGFyZW50VHlwZS5jcmVhdGVfYXR0cmlidXRlX3VzZXIoIGdldE5hbWUoKSApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQgbmV3VXNlciAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShuZXdVc2VyICE9IG51bGwpOwogCiAgICAgICAgICAgICAvLyBEZWZlbnNpdmUKICAgICAgICAgICAgIGlmIChuZXdVc2VyID09IG51bGwpCkBAIC0zMjQ0LDcgKzM0MDIsOCBAQAogICAgICAgICAgICAgdHlwZSA9IG5ldyBUeXBlKCByLCBuZXdVc2VyLCB0aGlzICk7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUodHlwZSAhPSBudWxsKTsKIAogICAgICAgICByZXR1cm4gdHlwZTsKICAgICB9CkBAIC0zMjU1LDggKzM0MTQsMTEgQEAKIAogICAgIGZpbmFsIGJvb2xlYW4gYmV0d2VlbiAoIFJvb3QgciwgaW50IHBUaGlzLCBTcGxheSBzUmFuZ2UgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1JhbmdlLmdldFJvb3RTbG93KCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcik7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1JhbmdlLmdldFJvb3RTbG93KCkpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHNSYW5nZS5pc0RvYygpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMjY3LDcgKzM0MjksOCBAQAogICAgICAgICBTcGxheSBzRW5kOwogICAgICAgICBpbnQgICBwRW5kOwogCi0gICAgICAgIGFzc2VydCAhc1JhbmdlLmlzRG9jKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghc1JhbmdlLmlzRG9jKCkpOwogCiAgICAgICAgIGlmIChzUmFuZ2UuaXNMZWFmKCkpCiAgICAgICAgIHsKQEAgLTMyOTYsMTAgKzM0NTksMTMgQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHNUaGlzID0gdGhpczsKIAotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc1RoaXMuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgc1RoYXQuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgcFRoaXMgPj0gMCAmJiBwVGhpcyA8PSBzVGhpcy5nZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBUaGF0ID49IDAgJiYgcFRoYXQgPD0gc1RoYXQuZ2V0RW5kUG9zKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IHNUaGlzLmdldFJvb3RTbG93KCkgPT0gcik7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IHNUaGF0LmdldFJvb3RTbG93KCkgPT0gcik7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBUaGlzID49IDAgJiYgcFRoaXMgPD0gc1RoaXMuZ2V0RW5kUG9zKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwVGhhdCA+PSAwICYmIHBUaGF0IDw9IHNUaGF0LmdldEVuZFBvcygpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIE5vcm1hbGl6ZSBwb3NpdGlvbnMKIApAQCAtMzM0MSw4ICszNTA3LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnQgcFRoaXMgPCBzVGhpcy5nZXRFbmRQb3MoKTsKLSAgICAgICAgYXNzZXJ0IHBUaGF0IDwgc1RoYXQuZ2V0RW5kUG9zKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHBUaGlzIDwgc1RoaXMuZ2V0RW5kUG9zKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwVGhhdCA8IHNUaGF0LmdldEVuZFBvcygpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChzVGhpcyA9PSBzVGhhdCkKICAgICAgICAgICAgIHJldHVybiBwVGhpcyA8IHBUaGF0ID8gLTEgOiBwVGhpcyA+IHBUaGF0ID8gMSA6IDA7CkBAIC0zMzYxLDcgKzM1MzAsOCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKHNUaGF0LmlzQXR0cigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIXNUaGlzLmlzQXR0cigpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghc1RoaXMuaXNBdHRyKCkpOwogCiAgICAgICAgICAgICBpZiAoc1RoYXQucHJldk5vbkF0dHJTcGxheSgpICE9IHNUaGlzKQogICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOwpAQCAtMzQxOCw3ICszNTg4LDggQEAKICAgICAgICAgc1RoaXMuc3BsYXkoIHIsIHIgKTsKICAgICAgICAgc1RoYXQuc3BsYXkoIHIsIHNUaGlzICk7CiAKLSAgICAgICAgYXNzZXJ0IHNUaGlzLl9sZWZ0U3BsYXkgPT0gc1RoYXQgfHwgc1RoaXMuX3JpZ2h0U3BsYXkgPT0gc1RoYXQ7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0IHx8IHNUaGlzLl9yaWdodFNwbGF5ID09IHNUaGF0KTsKIAogICAgICAgICByZXR1cm4gc1RoaXMuX2xlZnRTcGxheSA9PSBzVGhhdCA/IDEgOiAtMTsKICAgICB9CkBAIC0zNDgxLDEyICszNjUyLDE0IEBACiAKICAgICBmaW5hbCB2b2lkIHJvdGF0ZVJpZ2h0ICggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID09IHRoaXM7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9PSB0aGlzKTsKIAogICAgICAgICBTcGxheSBwID0gX3BhcmVudFNwbGF5OwogICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7CiAKLSAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgIT0gbnVsbCk7CiAKICAgICAgICAgcC5fbGVmdFNwbGF5ID0gX3JpZ2h0U3BsYXk7CiAKQEAgLTM1MTEsMTIgKzM2ODQsMTQgQEAKIAogICAgIGZpbmFsIHZvaWQgcm90YXRlTGVmdCAoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkuX3JpZ2h0U3BsYXkgPT0gdGhpczsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9wYXJlbnRTcGxheS5fcmlnaHRTcGxheSA9PSB0aGlzKTsKIAogICAgICAgICBTcGxheSBwID0gX3BhcmVudFNwbGF5OwogICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7CiAKLSAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgIT0gbnVsbCk7CiAKICAgICAgICAgcC5fcmlnaHRTcGxheSA9IF9sZWZ0U3BsYXk7CiAKQEAgLTM1NTEsMjIgKzM3MjYsMjcgQEAKIAogICAgIGZpbmFsIHZvaWQgc3BsYXkgKCBSb290IHIsIFNwbGF5IHBTdG9wICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBwU3RvcCAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdGhpcyAhPSBwU3RvcDsKLSAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHIgPT0gbnVsbCB8fCBnZXRSb290U2xvdygpID09IHI7Ci0gICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCByID09IG51bGwgfHwgcFN0b3AuZ2V0Um9vdFNsb3coKSA9PSByOwotICAgICAgICBhc3NlcnQgciA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocFN0b3AgIT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHRoaXMgIT0gcFN0b3ApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShSb290LmR2ID4gMCB8fCByID09IG51bGwgfHwgZ2V0Um9vdFNsb3coKSA9PSByKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgciA9PSBudWxsIHx8IHBTdG9wLmdldFJvb3RTbG93KCkgPT0gcik7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHIgPT0gbnVsbCB8fCByLnZhbGlkYXRlU3BsYXlUcmVlKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNSb290KCkpOworICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiByb3RhdGVkID0gZmFsc2U7CiAKICAgICAgICAgZm9yICggOyA7ICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheSAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfcGFyZW50U3BsYXkgIT0gbnVsbCk7CiAKICAgICAgICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7CiAKLSAgICAgICAgICAgIGFzc2VydCBwICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHAgIT0gbnVsbCk7CiAKICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGlsZCBvZiB0aGUgc3RvcHBlciwgdGhlbiB3ZSBhcmUgZG9uZQogCkBAIC0zNjE0LDcgKzM3OTQsOCBAQAogICAgICAgICBpZiAocm90YXRlZCAmJiByICE9IG51bGwpCiAgICAgICAgICAgICByLl9sZWZ0T25seSA9IGZhbHNlOwogCi0gICAgICAgIGFzc2VydCByID09IG51bGwgfHwgci52YWxpZGF0ZVNwbGF5VHJlZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUociA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNjI2LDEyICszODA3LDE0IEBACiAgICAgewogICAgICAgICBSb290IHJvb3QgPSByLmlzUm9vdCgpID8gKFJvb3QpIHIgOiBudWxsOwogCi0gICAgICAgIGFzc2VydCByLl9wYXJlbnRTcGxheSA9PSBudWxsOwotICAgICAgICBhc3NlcnQgcm9vdCA9PSBudWxsIHx8IHJvb3QudmFsaWRhdGVTcGxheVRyZWUoKTsKLSAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKTsKLSAgICAgICAgYXNzZXJ0ICFpc0RvYygpOwotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0U3BsYXlSb290U2xvdygpID09IHI7Ci0KKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoci5fcGFyZW50U3BsYXkgPT0gbnVsbCk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHJvb3QgPT0gbnVsbCB8fCByb290LnZhbGlkYXRlU3BsYXlUcmVlKCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNSb290KCkpOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSghaXNEb2MoKSk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IGdldFNwbGF5Um9vdFNsb3coKSA9PSByKTsKKyAgICAgICAgfQogICAgICAgICAvLyBJZiB0aGUgc3BsYXkgdG8gYmUgcmVtb3ZlZCBoYXMgbm8gY2NoIG9yIGNiZWdpbiwgdGhlbiB3aGVuIHRoZQogICAgICAgICAvLyB0cmVlIGlzIGxlZnQgb25seSBjaGlsZHJlbiwgd2UgbmVlZCBub3Qgc3BsYXkuCiAKQEAgLTM2NDAsOCArMzgyMywxMSBAQAogCiAgICAgICAgIGlmIChyb290ICE9IG51bGwgJiYgcm9vdC5fbGVmdE9ubHkgJiYgY2NoID09IDAgJiYgY2JlZ2luID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBfcmlnaHRTcGxheSA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheSAhPSBudWxsOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfcmlnaHRTcGxheSA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKF9wYXJlbnRTcGxheSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKChfcGFyZW50U3BsYXkuX2xlZnRTcGxheSA9IF9sZWZ0U3BsYXkpICE9IG51bGwpCiAgICAgICAgICAgICAgICAgX2xlZnRTcGxheS5fcGFyZW50U3BsYXkgPSBfcGFyZW50U3BsYXk7CkBAIC0zNjY0LDcgKzM4NTAsOCBAQAogCiAgICAgICAgICAgICAgICAgcC5zcGxheSggcm9vdCwgdGhpcyApOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0IHAuX3JpZ2h0U3BsYXkgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwLl9yaWdodFNwbGF5ID09IG51bGwpOwogCiAgICAgICAgICAgICAgICAgci5fbGVmdFNwbGF5ID0gcDsKICAgICAgICAgICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHI7CkBAIC0zNjgxLDcgKzM4NjgsOCBAQAogICAgICAgICBhZGp1c3RDY2hMZWZ0KCAtIGdldENjaExlZnQoKSApOwogICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSApOwogCi0gICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocm9vdCA9PSBudWxsIHx8IHJvb3QudmFsaWRhdGVTcGxheVRyZWUoKSk7CiAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQpAQCAtMzc3Myw3ICszOTYxLDggQEAKICAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUsIGJvb2xlYW4gaXNYbWxucyApCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKCBBVFRSLCB0cnVlLCBuYW1lICk7Ci0gICAgICAgICAgICBhc3NlcnQgaXNYbWxuczsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoaXNYbWxucyk7CiAgICAgICAgIH0KIAogICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKQpAQCAtMzgzMiwxNyArNDAyMSwyMCBAQAogCiAgICAgICAgIGZpbmFsIHZvaWQgc2V0ICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMgIT0gbnVsbCk7CiAgICAgICAgICAgICBkb1NldCggciwgcywgcCApOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGRvU2V0ICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBzICE9IG51bGwgfHwgcCA9PSAwOwotICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMgPT0gbnVsbCB8fCByID09IHMuZ2V0Um9vdFNsb3coKTsKLSAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBfc3BsYXkgPT0gbnVsbCB8fCBfcm9vdCA9PSBfc3BsYXkuZ2V0Um9vdFNsb3coKTsKLS8vICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IF9yb290ID09IHIgfHwgX3NwbGF5LmdldFJvb3RTbG93KCkgIT0gcy5nZXRSb290U2xvdygpOwotCisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHMgIT0gbnVsbCB8fCBwID09IDApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgcyA9PSBudWxsIHx8IHIgPT0gcy5nZXRSb290U2xvdygpKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IF9zcGxheSA9PSBudWxsIHx8IF9yb290ID09IF9zcGxheS5nZXRSb290U2xvdygpKTsKKy8vICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoUm9vdC5kdiA+IDAgfHwgX3Jvb3QgPT0gciB8fCBfc3BsYXkuZ2V0Um9vdFNsb3coKSAhPSBzLmdldFJvb3RTbG93KCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgX3Jvb3QgPSByOwogCiAgICAgICAgICAgICBpZiAoX3NwbGF5ICE9IHMpCkBAIC0zODU0LDE0ICs0MDQ2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcyApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhc3NlcnQgcCA+PSAwOwotICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsIHx8IHAgPD0gX3NwbGF5LmdldE1heFBvcygpOworICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShwID49IDApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3NwbGF5ID09IG51bGwgfHwgcCA8PSBfc3BsYXkuZ2V0TWF4UG9zKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgX3N0YXRlID0gcCAqIDggKyAoX3N0YXRlICYgNyk7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByICE9IG51bGw7CisgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKHIgIT0gbnVsbCk7CiAgICAgICAgICAgICBfcm9vdCA9IHI7CiAgICAgICAgIH0KIApAQCAtMzg4NCwxMSArNDA4MCwxNCBAQAogCiAgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBhcHBlbmQgKCBTcGxheSBzICkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzLmdldFJvb3RTbG93KCkgPT0gX3Jvb3Q7Ci0gICAgICAgICAgICBhc3NlcnQgX3NwbGF5ID09IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX3BhcmVudCA9PSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IF9uZXh0ID09IG51bGwgJiYgX3ByZXYgPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUocyAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSBfcm9vdCk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfc3BsYXkgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfcGFyZW50ID09IG51bGwpOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX25leHQgPT0gbnVsbCAmJiBfcHJldiA9PSBudWxsKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHMuX2dvb2JlcnMgPT0gbnVsbCkKICAgICAgICAgICAgIHsKQEAgLTM5MDksMTIgKzQxMDgsMTYgQEAKIAogICAgICAgICBwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlICggKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgX3NwbGF5ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgX2dvb2JlcnMgPT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3NwbGF5ICE9IG51bGwpOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2dvb2JlcnMgPT0gbnVsbCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChfbmV4dCA9PSB0aGlzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBfcGFyZW50Ll9nb29iZXJzID09IHRoaXM7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzKTsKIAogICAgICAgICAgICAgICAgIF9wYXJlbnQuX2dvb2JlcnMgPSBudWxsOwogCkBAIC0zOTIzLDcgKzQxMjYsOCBAQAogICAgICAgICAgICAgICAgIGlmIChfcGFyZW50ICE9IF9zcGxheSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEdvb2JlciBnID0gKEdvb2JlcikgX3BhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGcuZ2V0S2luZCgpID09IEFHR1JFR0FURTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGcuZ2V0S2luZCgpID09IEFHR1JFR0FURSk7CiAgICAgICAgICAgICAgICAgICAgIGcucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzk4Myw3ICs0MTg3LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ3JlZXB5IHdheSB0byBkaXNjb3ZlciBpcyBhc3NlcnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCAobWFwID0gbmV3IEhhc2hNYXAoKSkgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoKG1hcCA9IG5ldyBIYXNoTWFwKCkpICE9IG51bGwpOwogICAgICAgICAgICAgcmV0dXJuIG1hcDsKICAgICAgICAgfQogCkBAIC00MDgyLDE1ICs0Mjg3LDE5IEBACiAgICAgICAgIGlmIChfZ29vYmVycyA9PSBudWxsIHx8IF9nb29iZXJzLmdldEtpbmQoKSAhPSBBR0dSRUdBVEUpCiAgICAgICAgICAgICByZXR1cm4gX2dvb2JlcnM7CiAKLSAgICAgICAgYXNzZXJ0IF9nb29iZXJzLl9nb29iZXJzICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBfZ29vYmVycy5fZ29vYmVycy5nZXRLaW5kKCkgIT0gQUdHUkVHQVRFOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZShfZ29vYmVycy5fZ29vYmVycyAhPSBudWxsKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoX2dvb2JlcnMuX2dvb2JlcnMuZ2V0S2luZCgpICE9IEFHR1JFR0FURSk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gX2dvb2JlcnMuX2dvb2JlcnM7CiAgICAgfQogCiAgICAgZmluYWwgR29vYmVyIG5leHRHb29iZXIgKCBHb29iZXIgZyApCiAgICAgewotICAgICAgICBhc3NlcnQgZyAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoZyAhPSBudWxsKTsKIAogICAgICAgICBpZiAoKGcgPSBnLl9uZXh0KSAhPSBnLl9wYXJlbnQuX2dvb2JlcnMpCiAgICAgICAgICAgICByZXR1cm4gZzsKQEAgLTQxMDIsMTAgKzQzMTEsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRBc3NlcnRFbmFibGVkICggKQogICAgIHsKLSAgICAgICAgLy8gQ3JlZXB5IHdheSB0byBkaXNjb3ZlciBpcyBhc3NlcnQgaXMgZW5hYmxlZC4KLSAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydCAoZW5hYmxlZCA9IHRydWUpIHx8IHRydWU7Ci0gICAgICAgIHJldHVybiBlbmFibGVkOworICAgICAgICByZXR1cm4gWG1sQmVhbnMuQVNTRVJUUzsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBhc3NlcnRBc3NlcnRFbmFibGVkICggKQpAQCAtNDE3OSw3ICs0Mzg1LDcgQEAKICAgICB7CiAgICAgICAgIGFzc2VydEFzc2VydEVuYWJsZWQoKTsKIAotICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSBzVGhhdC5nZXRSb290U2xvdygpOworICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1RoYXQuZ2V0Um9vdFNsb3coKSk7CiAKICAgICAgICAgaWYgKHRoaXMgPT0gc1RoYXQpCiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTQxOTIsNyArNDM5OCw3IEBACiAgICAgICAgICAgICBpZiAocyA9PSBzVGhhdCkKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKIAotICAgICAgICBhc3NlcnQgZmFsc2U6ICJZaWtlcyEiOworICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKGZhbHNlLCAiWWlrZXMhIik7CiAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UZXh0LmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YQppbmRleCBjNDc0NGIyLi5kNjNmODY4IDEwMDY0NAotLS0gYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YQorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogCiAvL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5Xcml0ZUNvbnRleHQ7CiAvL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5SZWFkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRleHQKQEAgLTM3LDcgKzM5LDggQEAKIAogICAgIHByaXZhdGUgdm9pZCBjb3B5ICggY2hhcltdIG5ld0J1ZiApCiAgICAgewotICAgICAgICBhc3NlcnQgX2J1ZiAhPSBudWxsICYmIG5ld0J1Zi5sZW5ndGggPj0gbGVuZ3RoKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggX2J1ZiAhPSBudWxsICYmIG5ld0J1Zi5sZW5ndGggPj0gbGVuZ3RoKCkgKTsKICAgICAgICAgCiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgX2dhcCApOwogCkBAIC01MCw3ICs1Myw4IEBACiAKICAgICB2b2lkIHJlc2l6ZSAoIGludCBjY2ggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+IF9nYXBMZW47CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggY2NoID4gX2dhcExlbiApOwogICAgICAgICAKICAgICAgICAgaW50IG5ld1NpemUgPSBsZW5ndGgoKSArIGNjaDsKICAgICAgICAgaW50IG5ld0xlbiA9IF9idWYgPT0gbnVsbCA/IDEwMjQgOiBfYnVmLmxlbmd0aCAqIDI7CkBAIC0xMDUsNyArMTA5LDggQEAKICAgICAgICAgICAgICAgICBpbnNlcnQoIHBvcywgKFRleHQpIHR4dCwgb2ZmLCBjY2ggKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgdHh0IGluc3RhbmNlb2YgY2hhcltdOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB0eHQgaW5zdGFuY2VvZiBjaGFyW10gKTsKICAgICAgICAgICAgICAgICBpbnNlcnQoIHBvcywgKGNoYXJbXSkgdHh0LCBvZmYsIGNjaCApOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDksOSArMTU0LDEyIEBACiAgICAgCiAgICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBjaGFyW10gY2hhcnMsIGludCBvZmYsIGludCBjY2ggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGNoYXJzICE9IF9idWY7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7Ci0gICAgICAgIAorICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggY2hhcnMgIT0gX2J1ZiApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcG9zID49IDAgJiYgcG9zIDw9IGxlbmd0aCgpICk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY2NoID4gMCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNjaCA+IF9nYXBMZW4pCkBAIC0xNzMsMTMgKzE4MSwxNyBAQAogICAgIAogICAgIHZvaWQgaW5zZXJ0ICggaW50IHBvcywgU3RyaW5nIHMsIGludCBvZmYsIGludCBjY2ggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyA8PSBsZW5ndGgoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCkgKTsKICAgICAgICAgCiAgICAgICAgIGlmIChjY2ggPiAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgb2ZmID49IDAgJiYgb2ZmIDwgcy5sZW5ndGgoKTsKLSAgICAgICAgICAgIGFzc2VydCBjY2ggPD0gcy5sZW5ndGgoKSAtIG9mZjsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggb2ZmID49IDAgJiYgb2ZmIDwgcy5sZW5ndGgoKSApOworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGNjaCA8PSBzLmxlbmd0aCgpIC0gb2ZmICk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQogICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7CiAgICAgICAgICAgICAKQEAgLTE5OSwxMSArMjExLDEzIEBACiAgICAgCiAgICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoLCBjaGFyW10gcmV0QnVmLCBpbnQgb2ZmICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgKyBjY2ggPD0gbGVuZ3RoKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpICk7CiAKICAgICAgICAgbW92ZUdhcCggcG9zICk7CiAKLSAgICAgICAgYXNzZXJ0IHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoICk7CiAKICAgICAgICAgaWYgKGNjaCA+IDAgJiYgcmV0QnVmICE9IG51bGwpCiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfZ2FwICsgX2dhcExlbiwgcmV0QnVmLCBvZmYsIGNjaCApOwpAQCAtMjIzLDggKzIzNywxMSBAQAogCiAgICAgaW50IHVuT2JzY3VyZSAoIGludCBwb3MsIGludCBjY2ggKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOwotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggY2NoID49IDAgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKSApOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGNjaCA+IDAgJiYgKHBvcyA8IF9nYXAgJiYgcG9zICsgY2NoID4gX2dhcCkpCiAgICAgICAgICAgICBtb3ZlR2FwKCBwb3MgKyBjY2ggKTsKQEAgLTIzNCw3ICsyNTEsOCBAQAogCiAgICAgdm9pZCBmZXRjaCAoIFN0cmluZ0J1ZmZlciBzYiwgaW50IHBvcywgaW50IGNjaCApCiAgICAgewotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKSApOwogCiAgICAgICAgIGlmIChjY2ggPT0gMCkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTI1OSw3ICsyNzcsOCBAQAogCiAgICAgU3RyaW5nIGZldGNoICggaW50IHBvcywgaW50IGNjaCApCiAgICAgewotICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKSApOwogCiAgICAgICAgIGlmIChjY2ggPT0gMCkKICAgICAgICAgICAgIHJldHVybiAiIjsKQEAgLTI4MCw5ICsyOTksMTIgQEAKIAogICAgIHZvaWQgZmV0Y2ggKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgcG9zLCBpbnQgY2NoICkKICAgICB7Ci0gICAgICAgIGFzc2VydCBvZmYgPj0gMDsKLSAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKLSAgICAgICAgYXNzZXJ0IGJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggb2ZmID49IDAgKTsKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggYnVmLmxlbmd0aCAtIG9mZiA+PSBjY2ggKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChjY2ggPT0gMCkKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKaW5kZXggNzUzNWQ3ZC4uYzQzOGQyZCAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CkBAIC00OSwxMCArNTAsMTMgQEAKICAgICB7CiAgICAgICAgIHN1cGVyKCByLCBTcGxheS5UWVBFICk7CiAgICAgICAgIAotICAgICAgICBhc3NlcnQgcy5wZWVrVHlwZSgpID09IG51bGw7Ci0gICAgICAgIGFzc2VydCB1c2VyICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKLSAgICAgICAgCisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLnBlZWtUeXBlKCkgPT0gbnVsbCApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdXNlciAhPSBudWxsICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOworICAgICAgICB9CisKICAgICAgICAgX3VzZXIgPSB1c2VyOwogICAgICAgICAKICAgICAgICAgc2V0KCBzLCAwICk7CkBAIC0xNTIsNyArMTU2LDggQEAKICAgICAKICAgICB2b2lkIGludmFsaWRhdGVFbGVtZW50ICggQ29udGFpbmVyIGNvbnRhaW5lciwgU3BsYXkgcyApCiAgICAgewotICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXI7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXIgKTsKICAgICAgICAgCiAgICAgICAgIGlmIChfaW5oaWJpdFVzZXJJbnZhbGlkYXRlID4gMCkKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE3MSw3ICsxNzYsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXIgKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTIwMywxMiArMjA5LDE2IEBACiAgICAgewogICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CiAgICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc0ludmFsaWQoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCkgfHwgcy5pc0RvYygpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0ludmFsaWQoKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0xlYWYoKSB8fCBzLmlzRG9jKCkgKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyB0ZXh0ID0gYnVpbGRfdGV4dCggbnNtICk7CiAKLSAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB0ZXh0ICE9IG51bGwgKTsKIAogICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7CiAKQEAgLTIzMCwxMiArMjQwLDE2IEBACiAgICAgewogICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CiAgICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc0ludmFsaWQoKTsKLSAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzSW52YWxpZCgpICk7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzTm9ybWFsQXR0cigpICk7CisgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgdGV4dCA9IGJ1aWxkX3RleHQoIG5zbSApOwogCi0gICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdGV4dCAhPSBudWxsICk7CiAKICAgICAgICAgLy8gVmFsaWRhdGluZyBkb2VzIG5vdCBsb2dpY2FsbHkgY2hhbmdlIHRoZSBkb2MKICAgICAgICAgbG9uZyBvbGRWZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7CkBAIC0yODksNyArMzAzLDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCkgfHwgcy5pc05vcm1hbEF0dHIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQ29udGFpbmVyKCkgfHwgcy5pc05vcm1hbEF0dHIoKSApOwogCiAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zMDUsNyArMzIwLDggQEAKIAogICAgICAgICBUeXBlIHQgPSBzLmdldFR5cGUoIGdldFJvb3QoKSApOwogCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdCAhPSBudWxsICk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gdC5fdXNlcjsKICAgICB9CkBAIC0zMTQsNyArMzMwLDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOwogCiAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzI0LDcgKzM0MSw4IEBACiAgICAgICAgIHMucmVtb3ZlQ29udGVudCggZ2V0Um9vdCgpLCBmYWxzZSApOwogCiAgICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7Ci0gICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNJbnZhbGlkKCkgKTsKICAgICAgICAgCiAgICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUtLTsKICAgICB9CkBAIC0zMzMsNyArMzUxLDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCAhcy5pc0ludmFsaWQoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhcy5pc0ludmFsaWQoKSApOwogICAgICAgICAKICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkNhbid0IGZldGNoIHRleHQgd2hlbiBpbnZhbGlkIiApOwpAQCAtMzUyLDcgKzM3MSw4IEBACiAgICAgewogICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKICAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOwogCiAgICAgICAgIGlmIChzLmlzRG9jKCkpCiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTM2MSw3ICszODEsOCBAQAogCiAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IHBhcmVudENvbnRhaW5lci5nZXRUeXBlKCBnZXRSb290KCkgKTsKIAotICAgICAgICBhc3NlcnQgcGFyZW50VHlwZSAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHBhcmVudFR5cGUgIT0gbnVsbCApOwogCiAgICAgICAgIFR5cGVTdG9yZVVzZXIgcGFyZW50VXNlciA9IHBhcmVudFR5cGUuX3VzZXI7CiAKQEAgLTM3OCwxNCArMzk5LDE2IEBACiAgICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCAhcGFyZW50Q29udGFpbmVyLmlzTGVhZigpICk7CiAgICAgICAgIAogICAgICAgICBmb3IgKCBTcGxheSB0ID0gcGFyZW50Q29udGFpbmVyLm5leHRTcGxheSgpIDsgOyB0ID0gdC5uZXh0U3BsYXkoKSApCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoIHQuZ2V0S2luZCgpICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKLSAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGZhbHNlICk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgpAQCAtNDA1LDcgKzQyOCw4IEBACiAgICAgewogICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKICAgICAgICAgCi0gICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzVHlwZWFibGUoKSApOwogCiAgICAgICAgIGlmIChzLmlzRG9jKCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTQxNywxMCArNDQxLDEyIEBACiAgICAgICAgIGlmIChzLmlzQXR0cigpKQogICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2F0dHJpYnV0ZV9maWVsZCggcy5nZXROYW1lKCkgKTsKIAotICAgICAgICBhc3NlcnQgcy5pc0JlZ2luKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQmVnaW4oKSApOworICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKSApOworICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0ICFwYXJlbnRDb250YWluZXIuaXNMZWFmKCk7Ci0gICAgICAgIAogICAgICAgICBUeXBlU3RvcmVWaXNpdG9yIHZpc2l0b3IgPSBwYXJlbnRVc2VyLm5ld192aXNpdG9yKCk7CiAKICAgICAgICAgaWYgKHZpc2l0b3IgPT0gbnVsbCkKQEAgLTQzMSw3ICs0NTcsOCBAQAogICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgotICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6CkBAIC00NjEsNyArNDg4LDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0NvbnRhaW5lcigpICk7CiAgICAgICAgIAogICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTQ3Myw3ICs1MDEsOCBAQAogCiAgICAgICAgIFR5cGUgdCA9IG50aEJlZ2luLmdldFR5cGUoIGdldFJvb3QoKSApOwogCi0gICAgICAgIGFzc2VydCB0ICE9IG51bGw7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggdCAhPSBudWxsICk7CiAgICAgICAgIAogICAgICAgICByZXR1cm4gdC5fdXNlcjsKICAgICB9CkBAIC00ODEsMjAgKzUxMCwyMyBAQAogICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWVTZXQgbmFtZXMsIGludCBpICkKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNDb250YWluZXIoKSApOwogCiAgICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbihzLCAgbnVsbCwgbmFtZXMsIGkpOwogICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKICAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZShnZXRSb290KCkpOwotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHQgIT0gbnVsbCApOwogCiAgICAgICAgIHJldHVybiB0Ll91c2VyOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgZmluZEFsbEVsZW1lbnRUeXBlcyAoIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgTGlzdCBmaWxsTWVVcCApCiAgICAgewotICAgICAgICBhc3NlcnQgZ2V0U3BsYXkoKS5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGdldFNwbGF5KCkuaXNDb250YWluZXIoKSApOwogCiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCkBAIC01MTksNyArNTUxLDggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKCBnZXRSb290KCkgKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHR5cGUgIT0gbnVsbCApOwogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNZVVwLmFkZCggdHlwZSApOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MjksNyArNTYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyhzLmdldE5hbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IHMuZ2V0VHlwZShnZXRSb290KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHR5cGUgIT0gbnVsbCApOwogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1lVXAuYWRkKHR5cGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTYyLDcgKzU5Niw4IEBACiAKICAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2F0dHJpYnV0ZV91c2VyICggUU5hbWUgbmFtZSApCiAgICAgewotICAgICAgICBhc3NlcnQgZ2V0U3BsYXkoKS5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIGdldFNwbGF5KCkuaXNDb250YWluZXIoKSApOwogCiAgICAgICAgIFNwbGF5IGEgPSBnZXRTcGxheSgpLmdldEF0dHIoIG5hbWUgKTsKIApAQCAtNTcxLDcgKzYwNiw4IEBACiAKICAgICAgICAgVHlwZSB0ID0gYS5nZXRUeXBlKCBnZXRSb290KCkgKTsKIAotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHQgIT0gbnVsbCApOwogCiAgICAgICAgIHJldHVybiB0Ll91c2VyOwogICAgIH0KQEAgLTU4MCw3ICs2MTYsOCBAQAogICAgIHsKICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CiAgICAgICAgIAotICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc1R5cGVhYmxlKCkgKTsKIAogICAgICAgICBpZiAocy5pc0RvYygpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC01ODksNyArNjI2LDggQEAKIAogICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CiAKLSAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBwYXJlbnRUeXBlICE9IG51bGwgKTsKIAogICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOwogCkBAIC02MDYsMTQgKzY0NCwxNiBAQAogICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgYXNzZXJ0ICFwYXJlbnRDb250YWluZXIuaXNMZWFmKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKSApOwogICAgICAgICAKICAgICAgICAgZm9yICggU3BsYXkgdCA9IHBhcmVudENvbnRhaW5lci5uZXh0U3BsYXkoKSA7IDsgdCA9IHQubmV4dFNwbGF5KCkgKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2ggKCB0LmdldEtpbmQoKSApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBjYXNlIFNwbGF5LkVORCA6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBmYWxzZSApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKQEAgLTYzMyw3ICs2NzMsOCBAQAogICAgIHsKICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CiAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNUeXBlYWJsZSgpICk7CiAKICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQogICAgICAgICAgICAgcy5zZXRYc2lOaWwoIGdldFJvb3QoKSwgYnVpbGRfbmlsKCkgKTsKQEAgLTY0Myw3ICs2ODQsOCBAQAogICAgIHsKICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CiAKLSAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNUeXBlYWJsZSgpICk7CiAgIAogICAgICAgICByZXR1cm4gcy5pc0F0dHIoKSA/IGZhbHNlIDogcy5nZXRYc2lOaWwoIGdldFJvb3QoKSApOwogICAgIH0KQEAgLTY1OCw3ICs3MDAsOCBAQAogCiAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBuc3VyaSwgc3VnZ2VzdGVkX3ByZWZpeCwgdHJ1ZSk7CiAKLSAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHJlc3VsdCAhPSBudWxsICk7CiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02NzcsNyArNzIwLDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0NvbnRhaW5lcigpICk7CiAgICAgICAgIAogICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTcwNSw3ICs3NDksOCBAQAogICAgIHsKICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CiAKLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQ29udGFpbmVyKCkgKTsKIAogICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTczNCw3ICs3NzksOCBAQAogICAgIHsKICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CiAKLSAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQ29udGFpbmVyKCkgKTsKICAgICAgICAgCiAgICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtNzc0LDcgKzgyMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB0LmlzQ29udGFpbmVyKCkgKTsKIAogICAgICAgICAgICAgICAgIGlmICh0LmdldE5hbWUoKS5lcXVhbHMoIHFuYW1lICkpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODAxLDcgKzg0OCw4IEBACiAgICAgICAgIAogICAgICAgICBUeXBlIHQgPSBiLmdldFR5cGUoIHIgKTsKIAotICAgICAgICBhc3NlcnQgdCAhPSBudWxsOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHQgIT0gbnVsbCApOwogICAgICAgICAKICAgICAgICAgcmV0dXJuIHQuX3VzZXI7CiAgICAgfQpAQCAtODEzLDcgKzg2MSw4IEBACiAgICAgICAgIAogICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKIAotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNDb250YWluZXIoKSApOwogICAgICAgICAKICAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CkBAIC04MzYsNyArODg1LDggQEAKIAogICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKIAotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNDb250YWluZXIoKSApOwogCiAgICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtODU3LDcgKzkwNyw4IEBACiAgICAgewogICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKIAotICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICBpZiAoWG1sQmVhbnMuQVNTRVJUUykKKyAgICAgICAgICAgIFhtbEJlYW5zLmFzc2VydFRydWUoIHMuaXNDb250YWluZXIoKSApOwogICAgICAgICAKICAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CkBAIC04NzIsNyArOTIzLDggQEAKICAgICAgICAgCiAgICAgICAgIFR5cGUgdCA9IGEuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CiAKLSAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCB0ICE9IG51bGwgKTsKIAogICAgICAgICByZXR1cm4gdC5fdXNlcjsKICAgICB9CkBAIC04ODEsNyArOTMzLDggQEAKICAgICB7CiAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0NvbnRhaW5lcigpICk7CiAgICAgICAgIAogICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTg5Niw3ICs5NDksOCBAQAogICAgIAogICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNvcHlfY29udGVudHNfZnJvbSAoIFR5cGVTdG9yZSBzb3VyY2UgKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHNvdXJjZSBpbnN0YW5jZW9mIFR5cGU7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggc291cmNlIGluc3RhbmNlb2YgVHlwZSApOwogCiAgICAgICAgIFR5cGUgc291cmNlVHlwZSA9IChUeXBlKSBzb3VyY2U7CiAKQEAgLTk0Niw3ICsxMDAwLDggQEAKICAgICAgICAgZm9yICggOyBtID4gbiA7IG4rKyApCiAgICAgICAgICAgICBhZGRfZWxlbWVudF91c2VyKCBlbGVtZW50TmFtZSApOwogCi0gICAgICAgIGFzc2VydCBtID09IG47CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggbSA9PSBuICk7CiAgICAgICAgIAogICAgICAgICBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIApAQCAtOTU0LDcgKzEwMDksOCBAQAogCiAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKICAgICAgICAgCi0gICAgICAgIGFzc2VydCBlbGVtZW50cy5zaXplKCkgPT0gbjsKKyAgICAgICAgaWYgKFhtbEJlYW5zLkFTU0VSVFMpCisgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBlbGVtZW50cy5zaXplKCkgPT0gbiApOwogCiAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKICAgICAgICAgewpAQCAtOTY2LDEwICsxMDIyLDEyIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IHR5cGUuZ2V0U3BsYXkoKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydCByID09IHR5cGUuZ2V0Um9vdCgpOworICAgICAgICAgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggciA9PSB0eXBlLmdldFJvb3QoKSApOworICAgICAgICAgICAgICAgICAgICBYbWxCZWFucy5hc3NlcnRUcnVlKCBzLmlzQ29udGFpbmVyKCkgKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIHMucmVtb3ZlQ29udGVudCggciwgdHJ1ZSApOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gKENvcHlDb250ZXh0KSBjb3BpZXMuZ2V0KCBpICk7CkBAIC05OTMsNyArMTA1MSw4IEBACiAgICAgewogICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOwogCi0gICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIGlmIChYbWxCZWFucy5BU1NFUlRTKQorICAgICAgICAgICAgWG1sQmVhbnMuYXNzZXJ0VHJ1ZSggcy5pc0NvbnRhaW5lcigpICk7CiAgICAgICAgIAogICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YbWxPYmplY3RMaXN0LmphdmEKaW5kZXggZjMyMjMyNi4uMzhkZmY4NSAxMDA2NDQKLS0tIGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YbWxPYmplY3RMaXN0LmphdmEKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YbWxPYmplY3RMaXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIC8vIEJVR0JVRzogKioqVExMKioqIFdoeSBpc24ndCB0aGlzIGV4cG9zZWQgaW4gb3JnLmFwYWNoZS54bWxiZWFucz8/Pz8KIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKIApAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIENMQVNTID0gQ2xhc3MuZm9yTmFtZSgiY29tLmJlYS53bGkudmFyaWFibGVzLlhtbE9iamVjdExpc3RJbXBsIik7CiAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBYbWxPYmplY3RMaXN0SW1wbC4iKTsKKyAgICAgICAgICAgICAgICBYbWxSdW50aW1lRXhjZXB0aW9uIGlzZSA9IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBYbWxPYmplY3RMaXN0SW1wbC4iKTsKICAgICAgICAgICAgICAgICBpc2UuaW5pdENhdXNlKHQpOwogICAgICAgICAgICAgICAgIHRocm93IGlzZTsKICAgICAgICAgICAgIH0KQEAgLTEyOCw5ICsxMjksOSBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gKFhtbE9iamVjdExpc3QpQ0xBU1MubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oaWUpOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGlhZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTQ3LDkgKzE0OCw5IEBACiAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGRBbGwobGlzdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7CiAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGllKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihpYWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE2NSw5ICsxNjYsOSBAQAogICAgICAgICAgICAgICAgIG5ld0xpc3QuYWRkQWxsKHhtbE9iamVjdHMpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXdMaXN0OwogICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihpZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1hxcmxEZWxlZ2F0ZS5qYXZhCmluZGV4IGY1MWYzMmYuLjNjODkzNWIgMTAwNjQ0Ci0tLSBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFJ1bnRpbWVFeGNlcHRpb247CiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBYcXJsRGVsZWdhdGUgCitwdWJsaWMgZmluYWwgY2xhc3MgWHFybERlbGVnYXRlCiB7CiAgICAgcHJpdmF0ZSBYcXJsRGVsZWdhdGUgKCApCiAgICAgewpAQCAtNTQsMTEgKzU1LDcgQEAKICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQogICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7CiAgICAgICAgIAotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgIAotICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHJ0ZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBjYXVzZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgCi0gICAgICAgIHJ0ZS5pbml0Q2F1c2UoIGNhdXNlICk7CisgICAgICAgIFhtbFJ1bnRpbWVFeGNlcHRpb24gcnRlID0gbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUudG9TdHJpbmcoKSwgZSApOwogCiAgICAgICAgIHRocm93IHJ0ZTsKICAgICB9CkBAIC0xMjQsNyArMTIxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3YxL3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWEJlYW5zWFBhdGhBZHYuamF2YSBiL3YxL3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWEJlYW5zWFBhdGhBZHYuamF2YQppbmRleCA2MDhiNjE5Li5jOTQwYTQ4IDEwMDY0NAotLS0gYS92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc1hQYXRoQWR2LmphdmEKKysrIGIvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aEFkdi5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmpheGVuLkJhc2VYUGF0aDsKIGltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5KYXhlblhCZWFuc0RlbGVnYXRlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC04NCw3ICs4NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS92MS9zcmMvemlwY29tcGFyZS96aXBjb21wYXJlL1ppcENvbXBhcmUuamF2YSBiL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCmluZGV4IDI3ZjkwMmIuLmJlMjIxODkgMTAwNjQ0Ci0tLSBhL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCisrKyBiL3YxL3NyYy96aXBjb21wYXJlL3ppcGNvbXBhcmUvWmlwQ29tcGFyZS5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAKIHBhY2thZ2UgemlwY29tcGFyZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaFNldDsKKwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwogaW1wb3J0IGphdmEudXRpbC4qOwpAQCAtNDEsMTEgKzQzLDExIEBACiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJpbmcgIiArIGFyZ3NbMF0gKyAiIHdpdGggIiArIGFyZ3NbMV0gKyAiOiIpOwogCi0gICAgICAgIFNldCBzZXQxID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IHNldDEgPSBuZXcgU2VxdWVuY2VkSGFzaFNldCgpOwogICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMS5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKICAgICAgICAgICAgIHNldDEuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOwogCi0gICAgICAgIFNldCBzZXQyID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IHNldDIgPSBuZXcgU2VxdWVuY2VkSGFzaFNldCgpOwogICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMi5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKICAgICAgICAgICAgIHNldDIuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOwogCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0dEYXRlVGVzdHMuamF2YQppbmRleCA5MmQ0MjEwLi45NWZhODhiIDEwMDY0NAotLS0gYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEKQEAgLTI3MSwxNCArMjcxLDE0IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RkLCBnY2QpOwogICAgICAgICAKICAgICAgICAgLy8gc2V0IHVwIDIvMjksIGFuZCByZWFkIG91dCBGZWIgMjkgaW4gdGhlIHllYXIgMSBCQy4KLSAgICAgICAgQ2FsZW5kYXIgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjksIGdyZWdjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIgLSAxLCBncmVnY2FsLmdldChDYWxlbmRhci5NT05USCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLllFQVIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBncmVnY2FsLmdldChDYWxlbmRhci5FUkEpKTsKKyAgICAgICAgWG1sQ2FsZW5kYXIgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjksIGdyZWdjYWwucGVlayhDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyIC0gMSwgZ3JlZ2NhbC5wZWVrKENhbGVuZGFyLk1PTlRIKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZ3JlZ2NhbC5wZWVrKENhbGVuZGFyLllFQVIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBncmVnY2FsLnBlZWsoQ2FsZW5kYXIuRVJBKSk7CiAgICAgICAgIC8vIHJlcGVhdCBzb21lIHRlc3RzIHRvIG1ha2Ugc3VyZSBpdCdzIHN0YWJsZS4KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyOSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiAtIDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjksIGdyZWdjYWwucGVlayhDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyIC0gMSwgZ3JlZ2NhbC5wZWVrKENhbGVuZGFyLk1PTlRIKSk7CiAKICAgICAgICAgLy8gbm93IHRyeSBzb21lIHNldHRlcnMKICAgICAgICAgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSmF4ZW5YUGF0aFRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSmF4ZW5YUGF0aFRlc3RzLmphdmEKaW5kZXggNmJiYzI5NS4uMjFlMzNjYyAxMDA2NDQKLS0tIGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0pheGVuWFBhdGhUZXN0cy5qYXZhCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9KYXhlblhQYXRoVGVzdHMuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTg0LDcgKzg1LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1OSwxMSArMTYwLDExIEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODIsMTEgKzE4MywxMSBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhCmluZGV4IDljOGQ2YTguLjUyYzFlZjQgMTAwNjQ0Ci0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0b3JlVGVzdHMuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbE5hbWVJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uU2VxdWVuY2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtODM3LDggKzgzOCw2IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotCiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKQEAgLTI1NTIsNyArMjU1MSw3IEBACiAgICAgewogICAgICAgICBTdHJpbmcgeG1sID0gIjxhIHhtbG5zOmE9J2FOUyc+PGE6Yi8+PC9hPiI7CiAKLSAgICAgICAgTWFwIG1hcCA9IG5ldyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCgpOworICAgICAgICBNYXAgbWFwID0gbmV3IFNlcXVlbmNlZEhhc2hNYXAoKTsKICAgICAgICAgbWFwLnB1dCgiYiIsICJiTlMiKTsKICAgICAgICAgbWFwLnB1dCgiYyIsICJjTlMiKTsKICAgICAgICAgbWFwLnB1dCgiYSIsICJub3QtYU5TIik7CkBAIC0yNTY4LDcgKzI1NjcsNyBAQAogCiAgICAgICAgIHhtbCA9ICI8YSB4bWxucz0nYU5TJz48Yi8+PC9hPiI7CiAKLSAgICAgICAgbWFwID0gbmV3IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIG1hcCA9IG5ldyBTZXF1ZW5jZWRIYXNoTWFwKCk7CiAgICAgICAgIG1hcC5wdXQoImIiLCAiYk5TIik7CiAgICAgICAgIG1hcC5wdXQoImMiLCAiY05TIik7CiAgICAgICAgIG1hcC5wdXQoIiIsICJub3QtYU5TIik7CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdFJ1blV0aWwuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCmluZGV4IGNhY2Y3MzguLjNkM2UzYTAgMTAwNjQ0Ci0tLSBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCkBAIC03OCw3ICs3OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9lcmljdGVzdC9FcmljVGVzdC5qYXZhCmluZGV4IGMyZDc4YTcuLjcyY2NhZGIgMTAwNjQ0Ci0tLSBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEKKysrIGIvdjEvdGVzdC9zcmMvZXJpY3Rlc3QvRXJpY1Rlc3QuamF2YQpAQCAtNTgsNyArNTgsNiBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0ZpeGVkQXR0clRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvRml4ZWRBdHRyVGVzdC5qYXZhCmluZGV4IDZmMWZlNWEuLjEzNmM1NTIgMTAwNjQ0Ci0tLSBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvRml4ZWRBdHRyVGVzdC5qYXZhCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvRml4ZWRBdHRyVGVzdC5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIGludCBwb3MgPSBzYi5sZW5ndGgoKTsKICAgICAgICAgc2IuYXBwZW5kKCI8L3B1cjppdGVtcz48L3B1cjpwdXJjaGFzZU9yZGVyPiIpOwogCi0gICAgICAgIFN0cmluZyBzRXhwZWN0ZWQgPSBzYi5zdWJTZXF1ZW5jZSgwLCBwb3MpICsgc2JDb250ZW50LnRvU3RyaW5nKCkgKyBzYi5zdWJTZXF1ZW5jZShwb3MsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nIHNFeHBlY3RlZCA9IHNiLnN1YnN0cmluZygwLCBwb3MpICsgc2JDb250ZW50LnRvU3RyaW5nKCkgKyBzYi5zdWJzdHJpbmcocG9zLCBzYi5sZW5ndGgoKSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHNFeHBlY3RlZCwgcG9Eb2MueG1sVGV4dCgpKTsKIApkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9uc3VzZS9kcnRjYXNlcy9NdWx0SW50ZXJmYWNlc1Rlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvTXVsdEludGVyZmFjZXNUZXN0LmphdmEKaW5kZXggNjc0ODM0ZC4uZmE3YWIyMyAxMDA2NDQKLS0tIGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9uc3VzZS9kcnRjYXNlcy9NdWx0SW50ZXJmYWNlc1Rlc3QuamF2YQorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL011bHRJbnRlcmZhY2VzVGVzdC5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgICAgICAgIGludCBwb3MgPSBzYi5sZW5ndGgoKTsKICAgICAgICAgc2IuYXBwZW5kKCI8L3B1cjppdGVtcz48L3B1cjpwdXJjaGFzZU9yZGVyPiIpOwogCi0gICAgICAgIFN0cmluZyBzRXhwZWN0ZWQgPSBzYi5zdWJTZXF1ZW5jZSgwLCBwb3MpICsgc2JDb250ZW50LnRvU3RyaW5nKCkgKyBzYi5zdWJTZXF1ZW5jZShwb3MsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nIHNFeHBlY3RlZCA9IHNiLnN1YnN0cmluZygwLCBwb3MpICsgc2JDb250ZW50LnRvU3RyaW5nKCkgKyBzYi5zdWJzdHJpbmcocG9zLCBzYi5sZW5ndGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzRXhwZWN0ZWQsIHBvRG9jLnhtbFRleHQoKSk7CiAKIApAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAgICAgICAgIHNiQ29udGVudC5hcHBlbmQoIjxwdXI6aXRlbT48cHVyOlVTUHJpY2U+IiArIHByaWNlICsgIjwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBzYkNvbnRlbnQuYXBwZW5kKCI8cHVyOml0ZW0+PHB1cjpVU1ByaWNlPiIgKyBpICsgIjwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKLSAgICAgICAgc0V4cGVjdGVkID0gc2Iuc3ViU2VxdWVuY2UoMCwgcG9zKSArIHNiQ29udGVudC50b1N0cmluZygpICsgc2Iuc3ViU2VxdWVuY2UocG9zLCBzYi5sZW5ndGgoKSk7CisgICAgICAgIHNFeHBlY3RlZCA9IHNiLnN1YnN0cmluZygwLCBwb3MpICsgc2JDb250ZW50LnRvU3RyaW5nKCkgKyBzYi5zdWJzdHJpbmcocG9zLCBzYi5sZW5ndGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzRXhwZWN0ZWQsIHBvRG9jLnhtbFRleHQoKSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHByaWNlLCBwb0RvYy5nZXRNaW5QcmljZSgpKTsKZGlmZiAtLWdpdCBhL3YxL3hraXQvUkVBRE1FLnR4dCBiL3YxL3hraXQvUkVBRE1FLnR4dAppbmRleCAyMDIzNmFlLi42OTliZDg2IDEwMDY0NAotLS0gYS92MS94a2l0L1JFQURNRS50eHQKKysrIGIvdjEveGtpdC9SRUFETUUudHh0CkBAIC0xLDQgKzEsNCBAQAotWE1MQmVhbnMgdiAxLjAuMyBEZXZlbG9wbWVudCBLaXQKK1hNTEJlYW5zIHYgMS4wLjMgRGV2ZWxvcG1lbnQgS2l0IChqZGsxLjMgcG9ydCkKIAogCiBXZWxjb21lIHRvIFhNTEJlYW5zIQo=