ZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L015UHJvamVjdEFwcGxpY2F0aW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9NeVByb2plY3RBcHBsaWNhdGlvbi5qYXZhCmluZGV4IDQ5Y2Q1ZjAuLmViNTgwODIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L015UHJvamVjdEFwcGxpY2F0aW9uLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvTXlQcm9qZWN0QXBwbGljYXRpb24uamF2YQpAQCAtNSwxMCArNSwxNCBAQAogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5TcHJpbmdBcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5TcHJpbmdCb290QXBwbGljYXRpb247CiAKKworCiBAU3ByaW5nQm9vdEFwcGxpY2F0aW9uCiBATWFwcGVyU2NhbigiY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlciIpICAvLyDmiavmj48gTWFwcGVyIOaOpeWPoworCiBwdWJsaWMgY2xhc3MgTXlQcm9qZWN0QXBwbGljYXRpb24gewogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgU3ByaW5nQXBwbGljYXRpb24ucnVuKE15UHJvamVjdEFwcGxpY2F0aW9uLmNsYXNzLCBhcmdzKTsKICAgICB9CiB9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9Db21tb25SZXN1bHRTdGF0dXMuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9Db21tb25SZXN1bHRTdGF0dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU2M2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL0NvbW1vblJlc3VsdFN0YXR1cy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbjsKKworCitwdWJsaWMgZW51bSBDb21tb25SZXN1bHRTdGF0dXMgaW1wbGVtZW50cyBSZXN1bHRTdGF0dXMgeworCisgICAgT0soMCwgIuaIkOWKnyIpLAorCisgICAgRkFJTCg1MDAsICLlpLHotKUiKSwKKworICAgIFBBUkFNX0VSUk9SKDQwMCwgIuWPguaVsOmdnuazlSIpLAorCisgICAgUkVDT1JEX05PVF9FWElTVCg0MDQsICLorrDlvZXkuI3lrZjlnKgiKSwKKworICAgIFVOQVVUSE9SSVpFRCg0MDEsICLmnKrmjojmnYMiKSwKKworICAgIEZPUkJJRERFTig0MDMsICLml6DmnYPpmZAiKSwKKworICAgIFNFUlZFUl9FUlJPUig1MDAsICLmnI3liqHlmajlhoXpg6jplJnor68iKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGNvZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgIENvbW1vblJlc3VsdFN0YXR1cyhpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvZGUoKSB7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL0NvbnN0YW50cy5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlM2Q4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uOworCisKK3B1YmxpYyBpbnRlcmZhY2UgQ29uc3RhbnRzIHsKKworICAgIFN0cmluZyBUT0tFTl9IRUFERVJfTkFNRSA9ICJBdXRob3JpemF0aW9uIjsKKyAgICBTdHJpbmcgU0VTU0lPTl9DVVJSRU5UX1VTRVIgPSAiY3VycmVudFVzZXIiOworCisgICAgLyoqCisgICAgICog6I+c5Y2V5qC5aWQKKyAgICAgKi8KKyAgICBJbnRlZ2VyIFJFU09VUkNFX1JPT1RfSUQgPSAwOworCisgICAgaW50ZXJmYWNlIE9yZGVyIHsKKyAgICAgICAgU3RyaW5nIERFRkFVTFRfT1JERVJfVFlQRSA9ICJkZXNjIjsKKworICAgICAgICBTdHJpbmdbXSBPUkRFUl9UWVBFID0gbmV3IFN0cmluZ1tdeyJkZXNjIiwgImFzYyIsICJERVNDIiwgIkFTQyJ9OworICAgIH0KKworICAgIGludGVyZmFjZSBGaW5pc2hTdGF0dXMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiDlt7LlrozmiJDlubbmtYvor5UKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBGSU5JU0hFRCA9ICIgKOW3suWujOaIkOW5tua1i+ivlemAmui/hykiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiDmnKrlrozmiJDmnKrmtYvor5UKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBVTkZJTklTSEVEID0gIiAo5pyq5a6M5oiQ5pyq5rWL6K+VKSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIOW3suWujOaIkOS9huacqua1i+ivlQorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIEZJTklTSEVEX05PVF9URVNUID0gIiAo5bey5a6M5oiQ5L2G5pyq5rWL6K+VKSI7CisKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU291cmNlIHsKKyAgICAgICAgU3RyaW5nIFBSRUZJWCA9ICJbUktUXSAiOworCisgICAgICAgIFN0cmluZyBOQU1FID0gInJvY2tldCBwdCI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEFubm91bmNlIHsKKworICAgICAgICBTdHJpbmcgUFJPVE9DT0wgPSAiaHR0cCI7CisKKyAgICAgICAgU3RyaW5nIEhPU1ROQU1FID0gIjE5Mi4xNjguNi4xMTIiOworCisgICAgICAgIEludGVnZXIgUE9SVCA9IDk5NjY7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vUmVzdWx0U3RhdHVzLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vUmVzdWx0U3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjN2FmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9SZXN1bHRTdGF0dXMuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb247CisKKworcHVibGljIGludGVyZmFjZSBSZXN1bHRTdGF0dXMgeworICAgIC8qKgorICAgICAqIOmUmeivr+eggQorICAgICAqLworICAgIGludCBnZXRDb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiDplJnor6/kv6Hmga8KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TWVzc2FnZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvSTE4bk1lc3NhZ2UuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL0kxOG5NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyNWU5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL0kxOG5NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmJhc2U7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuTWVzc2FnZVNvdXJjZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuaTE4bi5Mb2NhbGVDb250ZXh0SG9sZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LlJlbG9hZGFibGVSZXNvdXJjZUJ1bmRsZU1lc3NhZ2VTb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IGxvbWJvay5leHBlcmltZW50YWwuVXRpbGl0eUNsYXNzOworaW1wb3J0IGxvbWJvay5leHRlcm4uc2xmNGouU2xmNGo7CisKK0BTbGY0agorQFV0aWxpdHlDbGFzcworcHVibGljIGNsYXNzIEkxOG5NZXNzYWdlIHsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFJlbG9hZGFibGVSZXNvdXJjZUJ1bmRsZU1lc3NhZ2VTb3VyY2UgbWVzc2FnZVNvdXJjZSA9CisgICAgICAgICAgICAgICAgbmV3IFJlbG9hZGFibGVSZXNvdXJjZUJ1bmRsZU1lc3NhZ2VTb3VyY2UoKTsKKyAgICAgICAgbWVzc2FnZVNvdXJjZS5zZXRDYWNoZVNlY29uZHMoNSk7CisgICAgICAgIG1lc3NhZ2VTb3VyY2Uuc2V0QmFzZW5hbWVzKCJjbGFzc3BhdGg6aTE4bi9tZXNzYWdlIik7CisgICAgICAgIEkxOG5NZXNzYWdlLmluaXQobWVzc2FnZVNvdXJjZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZVNvdXJjZSBtZXNzYWdlU291cmNlOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoTWVzc2FnZVNvdXJjZSBtZXNzYWdlU291cmNlKSB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobWVzc2FnZVNvdXJjZSwgIk1lc3NhZ2VTb3VyY2UgY2FuJ3QgYmUgbnVsbCIpOworICAgICAgICBJMThuTWVzc2FnZS5tZXNzYWdlU291cmNlID0gbWVzc2FnZVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDor7vlj5blm73pmYXljJbmtojmga8KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2dDb2RlIOa2iOaBr+eggQorICAgICAqIEBwYXJhbSBhcmdzICAgIOa2iOaBr+WPguaVsCDkvos6IG5ldyBTdHJpbmdbXXsiMSIsIjIiLCIzIn0KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnQ29kZSwgT2JqZWN0W10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEkxOG5NZXNzYWdlLm1lc3NhZ2VTb3VyY2UuZ2V0TWVzc2FnZShtc2dDb2RlLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICBMb2NhbGVDb250ZXh0SG9sZGVyLmdldExvY2FsZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuZXJyb3IoIj09PT4g6K+75Y+W5Zu96ZmF5YyW5raI5oGv5aSx6LSlLCBjb2RlOnt9LCBhcmdzOnt9LCBleDp7fSIsIG1zZ0NvZGUsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBlLnRvU3RyaW5nKCkgOiBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICItVW5rbm93bi0iOworICAgIH0KKworICAgIC8qKgorICAgICAqIOiOt+WPluS4gOadoeivreiogOmFjee9ruS/oeaBrworICAgICAqCisgICAgICogQHBhcmFtIG1zZ0NvZGUg5raI5oGv56CBCisgICAgICogQHJldHVybiDlr7nlupTphY3nva7nmoTkv6Hmga8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dDb2RlKSB7CisgICAgICAgIHJldHVybiBJMThuTWVzc2FnZS5nZXRNZXNzYWdlKG1zZ0NvZGUsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL09yZGVyUGFnZVBhcmFtLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9PcmRlclBhZ2VQYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmYzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9PcmRlclBhZ2VQYXJhbS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlOworCisKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLkNvbW1vblJlc3VsdFN0YXR1czsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLkNvbnN0YW50czsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmV4Y2VwdGlvbi5Sb2NrZXRQVEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNuLmh1dG9vbC5jb3JlLnV0aWwuQXJyYXlVdGlsOworaW1wb3J0IGNuLmh1dG9vbC5jb3JlLnV0aWwuU3RyVXRpbDsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5hbm5vdGF0aW9ucy5tZWRpYS5TY2hlbWE7CitpbXBvcnQgbG9tYm9rLkdldHRlcjsKK2ltcG9ydCBsb21ib2suU2V0dGVyOworCitAR2V0dGVyCitAU2V0dGVyCitwdWJsaWMgY2xhc3MgT3JkZXJQYWdlUGFyYW0gZXh0ZW5kcyBQYWdlUGFyYW0geworCisgICAgLyoqCisgICAgICog5o6S5bqP5a2X5q61CisgICAgICovCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmjpLluo/lrZfmrrUiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvcDsKKworICAgIC8qKgorICAgICAqIOaOkuW6j+inhOWImQorICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5o6S5bqP6KeE5YiZIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNvcnQ7CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZE9yZGVyKExpc3Q8U3RyaW5nPiBvcmRlcktleSkgdGhyb3dzIFJvY2tldFBURXhjZXB0aW9uIHsKKyAgICAgICAgcHJvcCA9IFN0cmluZ1V0aWxzLmlzQmxhbmsocHJvcCkgPyBudWxsIDogU3RyVXRpbC50b1VuZGVybGluZUNhc2UocHJvcCk7CisgICAgICAgIHNvcnQgPSBTdHJpbmdVdGlscy5pc0JsYW5rKHNvcnQpID8gQ29uc3RhbnRzLk9yZGVyLkRFRkFVTFRfT1JERVJfVFlQRSA6IHNvcnQ7CisKKyAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QoQ29uc3RhbnRzLk9yZGVyLk9SREVSX1RZUEUpLmluZGV4T2Yoc29ydCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUm9ja2V0UFRFeGNlcHRpb24oQ29tbW9uUmVzdWx0U3RhdHVzLlBBUkFNX0VSUk9SLCAi5o6S5bqP5pa55byP6Yyv6KqkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhwcm9wKSAmJiBBcnJheXMuYXNMaXN0KG9yZGVyS2V5KS5pbmRleE9mKHByb3ApIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJvY2tldFBURXhjZXB0aW9uKENvbW1vblJlc3VsdFN0YXR1cy5QQVJBTV9FUlJPUiwgIuaOkuW6j+ashOS9jemMr+iqpCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRPcmRlcigpIHRocm93cyBSb2NrZXRQVEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBvcmRlcktleSA9IGdldE9yZGVyS2V5KCk7CisgICAgICAgIHByb3AgPSBTdHJpbmdVdGlscy5pc0JsYW5rKHByb3ApID8gbnVsbCA6IFN0clV0aWwudG9VbmRlcmxpbmVDYXNlKHByb3ApOworICAgICAgICBzb3J0ID0gU3RyaW5nVXRpbHMuaXNCbGFuayhzb3J0KSA/IENvbnN0YW50cy5PcmRlci5ERUZBVUxUX09SREVSX1RZUEUgOiBzb3J0OworCisgICAgICAgIGlmICghQXJyYXlVdGlsLmNvbnRhaW5zKENvbnN0YW50cy5PcmRlci5PUkRFUl9UWVBFLCBzb3J0KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJvY2tldFBURXhjZXB0aW9uKENvbW1vblJlc3VsdFN0YXR1cy5QQVJBTV9FUlJPUiwgIuaOkuW6j+aWueW8j+mMr+iqpCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsocHJvcCkgJiYgIW9yZGVyS2V5LmNvbnRhaW5zKHByb3ApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUm9ja2V0UFRFeGNlcHRpb24oQ29tbW9uUmVzdWx0U3RhdHVzLlBBUkFNX0VSUk9SLCAi5o6S5bqP5qyE5L2N6Yyv6KqkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIOWPjeWwhOiOt+WPluWtl+auteWIl+ihqAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0T3JkZXJLZXkoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBnZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChTdHJVdGlsLnRvVW5kZXJsaW5lQ2FzZShuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4g5Y+N5bCE6I635Y+W5a2X5q615YiX6KGoCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRPcmRlcktleShDbGFzcyBjbGF6eikgeworICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIEZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGxpc3QuYWRkKFN0clV0aWwudG9VbmRlcmxpbmVDYXNlKG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL1BhZ2VQYXJhbS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUGFnZVBhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MTA4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL1BhZ2VQYXJhbS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGxvbWJvay5HZXR0ZXI7CitpbXBvcnQgbG9tYm9rLlNldHRlcjsKK2ltcG9ydCBsb21ib2suVG9TdHJpbmc7CisKKworQEdldHRlcgorQFNldHRlcgorQFRvU3RyaW5nCitwdWJsaWMgY2xhc3MgUGFnZVBhcmFtIHsKKyAgICBATm90TnVsbChtZXNzYWdlID0gInBhZ2Xlj4LmlbDkuI3og73kuLrnqboiKQorICAgIEBNaW4odmFsdWUgPSAxTCwgbWVzc2FnZSA9ICJwYWdl5Y+C5pWw5b+F6aG75piv5pWw5a2X5oiW5pWw5YC85bCP5LqO6ZmQ5Yi2IikKKyAgICBwcm90ZWN0ZWQgSW50ZWdlciBwYWdlOworCisgICAgQE5vdE51bGwobWVzc2FnZSA9ICLlj4LmlbDkuI3og73kuLrnqboiKQorICAgIEBNaW4odmFsdWUgPSAxTCwgbWVzc2FnZSA9ICLlj4LmlbDlv4XpobvmmK/mlbDlrZfmiJbmlbDlgLzlsI/kuo7pmZDliLYiKQorICAgIEBNYXgodmFsdWUgPSAyMDBMLCBtZXNzYWdlID0gIuWPguaVsOW/hemhu+aYr+aVsOWtl+aIluaVsOWAvOWkp+S6jumZkOWItiIpCisgICAgcHJvdGVjdGVkIEludGVnZXIgc2l6ZTsKKworCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9QYWdlVXRpbC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUGFnZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI1MWNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUGFnZVV0aWwuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uYmFzZTsKKworaW1wb3J0IGNvbS5naXRodWIucGFnZWhlbHBlci5QYWdlSGVscGVyOworaW1wb3J0IGNvbS5naXRodWIucGFnZWhlbHBlci5QYWdlSW5mbzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgUGFnZVV0aWwgeworCisKKyAgICBwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX1BBR0VfU0laRSA9IDIwOworCisgICAgLyoqCisgICAgICog5byA5aeL5YiG6aG1CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRQYWdlKE9yZGVyUGFnZVBhcmFtIHBhcmFtKSB7CisgICAgICAgIEludGVnZXIgcGFnZSA9IHBhcmFtLmdldFBhZ2UoKTsKKyAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW0uc2V0UGFnZSgxKTsKKyAgICAgICAgICAgIHBhcmFtLnNldFNpemUoREVGQVVMVF9QQUdFX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgUGFnZUhlbHBlci5zdGFydFBhZ2UocGFyYW0uZ2V0UGFnZSgpLCBwYXJhbS5nZXRTaXplKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICog5byA5aeL5YiG6aG1CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRQYWdlKFBhZ2VQYXJhbSBwYXJhbSkgeworICAgICAgICBJbnRlZ2VyIHBhZ2UgPSBwYXJhbS5nZXRQYWdlKCk7CisgICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtLnNldFBhZ2UoMSk7CisgICAgICAgICAgICBwYXJhbS5zZXRTaXplKERFRkFVTFRfUEFHRV9TSVpFKTsKKyAgICAgICAgfQorCisgICAgICAgIFBhZ2VIZWxwZXIuc3RhcnRQYWdlKHBhcmFtLmdldFBhZ2UoKSwgcGFyYW0uZ2V0U2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDliIbpobXnu5PmnpwKKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNQYWdlIGdldFBhZ2UoTGlzdCBsaXN0KSB7CisgICAgICAgIFBhZ2VJbmZvIHBhZ2VJbmZvID0gbmV3IFBhZ2VJbmZvKGxpc3QpOworICAgICAgICByZXR1cm4gbmV3IFJlc1BhZ2UocGFnZUluZm8uZ2V0VG90YWwoKSwgcGFnZUluZm8uZ2V0UGFnZU51bSgpLCBwYWdlSW5mby5nZXRTaXplKCkpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUmVzUGFnZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUmVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTIyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9SZXNQYWdlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmJhc2U7CitpbXBvcnQgbG9tYm9rLkFsbEFyZ3NDb25zdHJ1Y3RvcjsKK2ltcG9ydCBsb21ib2suR2V0dGVyOworaW1wb3J0IGxvbWJvay5Ob0FyZ3NDb25zdHJ1Y3RvcjsKK2ltcG9ydCBsb21ib2suU2V0dGVyOworaW1wb3J0IGxvbWJvay5Ub1N0cmluZzsKKworLyoqCisgKiDliIbpobXnmoTov5Tlm57lgLwKKyAqLworQEdldHRlcgorQFNldHRlcgorQFRvU3RyaW5nKGNhbGxTdXBlciA9IGZhbHNlKQorQE5vQXJnc0NvbnN0cnVjdG9yCitAQWxsQXJnc0NvbnN0cnVjdG9yCitwdWJsaWMgY2xhc3MgUmVzUGFnZSB7CisKKyAgICBwcml2YXRlIGxvbmcgdG90YWw7CisKKyAgICBwcml2YXRlIGludCBwYWdlOworCisgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVzUGFnZSBnZXRQYWdlKGxvbmcgdG90YWwsIGludCBwYWdlLCBpbnQgc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc1BhZ2UodG90YWwsIHBhZ2UsIHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzUGFnZSBkZWZhdWx0UGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNQYWdlKDEwLCAxLCAxMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUmVzdWx0LmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDIwZjRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2Jhc2UvUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlOworCisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Qcm9wZXJ0eTsKKworaW1wb3J0IGxvbWJvay5HZXR0ZXI7CitpbXBvcnQgbG9tYm9rLk5vQXJnc0NvbnN0cnVjdG9yOworaW1wb3J0IGxvbWJvay5TZXR0ZXI7CitpbXBvcnQgbG9tYm9rLlRvU3RyaW5nOworCisvKioKKyAqIOi/lOWbnuWAvOWunuS9k+exuworICovCitAR2V0dGVyCitAU2V0dGVyCitAVG9TdHJpbmcKK0BOb0FyZ3NDb25zdHJ1Y3RvcgorcHVibGljIGNsYXNzIFJlc3VsdDxUPiB7CisKKyAgICBwcml2YXRlIGludCBjb2RlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbXNnOworCisgICAgQEpzb25Qcm9wZXJ0eQorICAgIHByaXZhdGUgVCBkYXRhOworCisgICAgcHJpdmF0ZSBSZXNQYWdlIHBhZ2U7CisKKworICAgIHB1YmxpYyBSZXN1bHQoU3RhdHVzIHN0YXR1cykgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IHN0YXR1cy5nZXRNc2coKTsKKyAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0KFN0YXR1cyBzdGF0dXMsIFQgZGF0YSkgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IHN0YXR1cy5nZXRNc2coKTsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0KFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gc3RhdHVzLmdldENvZGUoKTsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdChTdGF0dXMgc3RhdHVzLCBpbnQgbXNnQ29kZSkgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IEkxOG5NZXNzYWdlLmdldE1lc3NhZ2UoU3RyaW5nLnZhbHVlT2YobXNnQ29kZSkpOworICAgICAgICB0aGlzLmRhdGEgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHQoU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1zZywgVCBkYXRhKSB7CisgICAgICAgIHRoaXMuY29kZSA9IHN0YXR1cy5nZXRDb2RlKCk7CisgICAgICAgIHRoaXMubXNnID0gbXNnOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHQoU3RhdHVzIHN0YXR1cywgaW50IG1zZ0NvZGUsIFQgZGF0YSkgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IEkxOG5NZXNzYWdlLmdldE1lc3NhZ2UoU3RyaW5nLnZhbHVlT2YobXNnQ29kZSkpOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBSZXN1bHQoU3RhdHVzIHN0YXR1cywgVCBkYXRhLCBSZXNQYWdlIHBhZ2UpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gc3RhdHVzLmdldENvZGUoKTsKKyAgICAgICAgdGhpcy5tc2cgPSBzdGF0dXMuZ2V0TXNnKCk7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdChTdGF0dXMgc3RhdHVzLCBTdHJpbmcgbXNnLCBUIGRhdGEsIFJlc1BhZ2UgcGFnZSkgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgdGhpcy5wYWdlID0gcGFnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdWx0KFN0YXR1cyBzdGF0dXMsIGludCBtc2dDb2RlLCBUIGRhdGEsIFJlc1BhZ2UgcGFnZSkgeworICAgICAgICB0aGlzLmNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOworICAgICAgICB0aGlzLm1zZyA9IEkxOG5NZXNzYWdlLmdldE1lc3NhZ2UoU3RyaW5nLnZhbHVlT2YobXNnQ29kZSkpOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOworICAgIH0KKworICAgIEBKc29uSWdub3JlCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb2RlID09IFN0YXR1cy5TVUNDRVNTLmdldENvZGUoKTsKKyAgICB9CisKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBib29sZWFuIG5vblN1Y2Nlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvZGUgIT0gU3RhdHVzLlNVQ0NFU1MuZ2V0Q29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBzdWNjZXNzKFN0cmluZyDlj5bmtojmlLbol4/miJDlip8pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oU3RhdHVzLlNVQ0NFU1MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBvaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oU3RhdHVzLlNVQ0NFU1MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBvayhUIGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oU3RhdHVzLlNVQ0NFU1MsIGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBpbGxlZ2FsKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdDxUPihTdGF0dXMuQkFEX1JFUVVFU1QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiB1bmF1dGhvcml6ZWQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KFN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBmb3JiaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KFN0YXR1cy5GT1JCSURERU4pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBub3RGb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oU3RhdHVzLk5PVF9GT1VORCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gUmVzdWx0PFQ+IGZhaWx1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KFN0YXR1cy5GQUlMVVJFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSZXN1bHQ8VD4gZmFpbHVyZShTdHJpbmcgbXNnKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KFN0YXR1cy5GQUlMVVJFLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBlcnJvcihTdHJpbmcgbXNnKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KFN0YXR1cy5GQUlMVVJFLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBjb25mbGljdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oU3RhdHVzLkNPTkZMSUNUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSZXN1bHQ8VD4gYnVpbGQoU3RhdHVzIHN0YXR1cywgVCBkYXRhKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KHN0YXR1cywgZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gUmVzdWx0PFQ+IGJ1aWxkKFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oc3RhdHVzLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBidWlsZChTdGF0dXMgc3RhdHVzLCBpbnQgbXNnQ29kZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdDxUPihzdGF0dXMsIG1zZ0NvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBidWlsZChTdGF0dXMgc3RhdHVzLCBTdHJpbmcgbXNnLCBUIGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQ8VD4oc3RhdHVzLCBtc2csIGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBidWlsZChTdGF0dXMgc3RhdHVzLCBpbnQgbXNnQ29kZSwgVCBkYXRhKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0PFQ+KHN0YXR1cywgbXNnQ29kZSwgZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXN1bHQgb2soT2JqZWN0IGRhdGEsIFJlc1BhZ2UgcGFnZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChTdGF0dXMuU1VDQ0VTUywgZGF0YSwgcGFnZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXN1bHQgYnVpbGQoU3RhdHVzIHN0YXR1cywgT2JqZWN0IGRhdGEsIFJlc1BhZ2UgcGFnZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChzdGF0dXMsIGRhdGEsIHBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IGJ1aWxkKFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtc2csIE9iamVjdCBkYXRhLCBSZXNQYWdlIHBhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoc3RhdHVzLCBtc2csIGRhdGEsIHBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IGJ1aWxkKFN0YXR1cyBzdGF0dXMsIGludCBtc2dDb2RlLCBPYmplY3QgZGF0YSwgUmVzUGFnZSBwYWdlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KHN0YXR1cywgbXNnQ29kZSwgZGF0YSwgcGFnZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9TdGF0dXMuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbW1vbi9iYXNlL1N0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDlkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vYmFzZS9TdGF0dXMuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uYmFzZTsKKworCitwdWJsaWMgZW51bSBTdGF0dXMgeworCisgICAgLyoqCisgICAgICog6K+35rGC5omn6KGM5oiQ5YqfCisgICAgICovCisgICAgU1VDQ0VTUygwLCAi5pON5L2c5oiQ5YqfIiksCisKKyAgICAvKioKKyAgICAgKiDor7fmsYLpqozor4HlpLHotKUKKyAgICAgKi8KKyAgICBCQURfUkVRVUVTVCg0MDAsICLmk43kvZzpqozor4HlpLHotKUiKSwKKworICAgIC8qKgorICAgICAqIOadg+mZkOS4jei2sworICAgICAqLworICAgIFVOQVVUSE9SSVpFRCg0MDEsICLmk43kvZzmnKrmjojmnYMiKSwKKworICAgIC8qKgorICAgICAqIOivt+axguaLkue7nQorICAgICAqLworICAgIEZPUkJJRERFTig0MDMsICLmk43kvZzooqvmi5Lnu50iKSwKKworICAgIC8qKgorICAgICAqIOacquefpeivt+axggorICAgICAqLworICAgIE5PVF9GT1VORCg0MDQsICLmnKrnn6Xmk43kvZwiKSwKKworICAgIC8qKgorICAgICAqIOacquefpeivt+axggorICAgICAqLworICAgIENPTkZMSUNUKDQwOSwgIuivt+axguWPkeeUn+WGsueqgSIpLAorCisgICAgLyoqCisgICAgICog6K+35rGC5omn6KGM5aSx6LSlCisgICAgICovCisgICAgRkFJTFVSRSg1MDAsICLmk43kvZzlpLHotKUiKTsKKworICAgIHByaXZhdGUgaW50IGNvZGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtc2c7CisKKyAgICBTdGF0dXMoaW50IGNvZGUsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb2RlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb2RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXNnKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tc2c7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2V4Y2VwdGlvbi9Sb2NrZXRQVEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29tbW9uL2V4Y2VwdGlvbi9Sb2NrZXRQVEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDc1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb21tb24vZXhjZXB0aW9uL1JvY2tldFBURXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uQ29tbW9uUmVzdWx0U3RhdHVzOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uUmVzdWx0U3RhdHVzOworCitwdWJsaWMgY2xhc3MgUm9ja2V0UFRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisKKyAgICBwdWJsaWMgUm9ja2V0UFRFeGNlcHRpb24oUmVzdWx0U3RhdHVzIHN0YXR1cykgeworICAgICAgICBzdXBlcihzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgcHVibGljIFJvY2tldFBURXhjZXB0aW9uKFJlc3VsdFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICBwdWJsaWMgUm9ja2V0UFRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMuc3RhdHVzID0gQ29tbW9uUmVzdWx0U3RhdHVzLkZBSUw7CisgICAgfQorCisgICAgcHVibGljIFJlc3VsdFN0YXR1cyBnZXRTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbmZpZy9NeU1ldGFPYmplY3RIYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb25maWcvTXlNZXRhT2JqZWN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzFiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb25maWcvTXlNZXRhT2JqZWN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbmZpZzsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmhhbmRsZXJzLk1ldGFPYmplY3RIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLnJlZmxlY3Rpb24uTWV0YU9iamVjdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBNeU1ldGFPYmplY3RIYW5kbGVyIGltcGxlbWVudHMgTWV0YU9iamVjdEhhbmRsZXIgeworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRGaWxsKE1ldGFPYmplY3QgbWV0YU9iamVjdCkgeworICAgICAgICB0aGlzLnN0cmljdEluc2VydEZpbGwobWV0YU9iamVjdCwgImNyZWF0ZVRpbWUiLCBMb2NhbERhdGVUaW1lLmNsYXNzLCBMb2NhbERhdGVUaW1lLm5vdygpKTsKKyAgICAgICAgdGhpcy5zdHJpY3RJbnNlcnRGaWxsKG1ldGFPYmplY3QsICJ1cGRhdGVUaW1lIiwgTG9jYWxEYXRlVGltZS5jbGFzcywgTG9jYWxEYXRlVGltZS5ub3coKSk7CisgICAgfQorCisgICAgLy8g5pu05paw5pe26Ieq5Yqo5aGr5YWFCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlRmlsbChNZXRhT2JqZWN0IG1ldGFPYmplY3QpIHsKKyAgICAgICAgdGhpcy5zdHJpY3RVcGRhdGVGaWxsKG1ldGFPYmplY3QsICJ1cGRhdGVUaW1lIiwgTG9jYWxEYXRlVGltZS5jbGFzcywgTG9jYWxEYXRlVGltZS5ub3coKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29uZmlnL1RyYWNrZXJDb25maWcuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbmZpZy9UcmFja2VyQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1MjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbmZpZy9UcmFja2VyQ29uZmlnLmphdmEKQEAgLTAsMCArMSw4MSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuY29uZmlnOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VkVG9ycmVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKKworQENvbmZpZ3VyYXRpb24KK3B1YmxpYyBjbGFzcyBUcmFja2VyQ29uZmlnIHsKKyAgICBAVmFsdWUoIiR7cHQudHJhY2tlci5wb3J0fSIpCisgICAgcHJpdmF0ZSBpbnQgdHJhY2tlclBvcnQ7CisKKyAgICBAVmFsdWUoIiR7cHQudHJhY2tlci50b3JyZW50LWRpcn0iKQorICAgIHByaXZhdGUgU3RyaW5nIHRvcnJlbnREaXI7CisgICAgQFZhbHVlKCIke3B0LnRyYWNrZXIuYW5ub3VuY2UtdXJsfSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3VuY2VVUkw7CisKKyAgICBwcml2YXRlIFRyYWNrZXIgdHJhY2tlcjsgLy8g5a2Y5YKoIFRyYWNrZXIg5a6e5L6LCisKKyAgICBAQmVhbgorICAgIHB1YmxpYyBUcmFja2VyIHRvcnJlbnRUcmFja2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8g6aqM6K+B5bm25Yib5bu655uu5b2VCisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUodG9ycmVudERpcik7CisgICAgICAgIHZhbGlkYXRlVG9ycmVudERpcmVjdG9yeShkaXIpOworCisgICAgICAgIC8vIOWIneWni+WMliBUcmFja2VyCisgICAgICAgIHRyYWNrZXIgPSBuZXcgVHJhY2tlcih0cmFja2VyUG9ydCwgYW5ub3VuY2VVUkwpOworICAgICAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyhmYWxzZSk7IC8vIFBUIOermeeCueW/hemhu+WFs+mXreWMv+WQjeaooeW8jworICAgICAgICB0cmFja2VyLnNldEFubm91bmNlSW50ZXJ2YWwoMTgwMCk7IC8vIDMw5YiG6ZKfIGFubm91bmNlIOmXtOmalAorCisgICAgICAgIC8vIOWKoOi9veenjeWtkOaWh+S7tgorICAgICAgICBsb2FkVG9ycmVudHModHJhY2tlciwgZGlyKTsKKworICAgICAgICAvLyDlkK/liqggVHJhY2tlcgorICAgICAgICB0cmFja2VyLnN0YXJ0KHRydWUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYWNrZXIgc3RhcnRlZCBvbiBwb3J0ICIgKyB0cmFja2VyUG9ydCk7CisgICAgICAgIHJldHVybiB0cmFja2VyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRvcnJlbnREaXJlY3RvcnkoRmlsZSBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoIWRpci5ta2RpcnMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigi5peg5rOV5Yib5bu655uu5b2VOiAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCLot6/lvoTkuI3mmK/nm67lvZU6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghZGlyLmNhblJlYWQoKSB8fCAhZGlyLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigi5bqU55So56iL5bqP5peg5p2D6ZmQ6K6/6Zeu55uu5b2VOiAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkVG9ycmVudHMoVHJhY2tlciB0cmFja2VyLCBGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIuaXoOaViOeahOenjeWtkOebruW9lTogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlW10gdG9ycmVudEZpbGVzID0gZGlyLmxpc3RGaWxlcygoZCwgbmFtZSkgLT4gbmFtZS5lbmRzV2l0aCgiLnRvcnJlbnQiKSk7CisgICAgICAgIGlmICh0b3JyZW50RmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCLml6Dms5Xor7vlj5bnm67lvZXlhoXlrrk6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGaWxlIGYgOiB0b3JyZW50RmlsZXMpIHsKKyAgICAgICAgICAgIHRyYWNrZXIuYW5ub3VuY2UoVHJhY2tlZFRvcnJlbnQubG9hZChmKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHN0b3BUcmFja2VyKCkgeworICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmFja2VyLnN0b3AoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhY2tlciBzdG9wcGVkLiIpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEyY2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5jb250cm9sbGVyOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlLlBhZ2VVdGlsOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuVG9ycmVudEVudGl0eTsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3Quc2VydmljZS5Ub3JyZW50U2VydmljZTsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3Quc2VydmljZS5Qcm9tb3Rpb25TZXJ2aWNlOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5kdG8ucGFyYW0uVG9ycmVudFBhcmFtOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5kdG8udm8uVG9ycmVudFZPOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uYmFzZS5SZXN1bHQ7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50VXBsb2FkUGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5Ub3JyZW50VXBkYXRlRFRPOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5kdG8uUHJvbW90aW9uQ3JlYXRlRFRPOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuUHJvbW90aW9uOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLlVzZXJTZXJ2aWNlOworCitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMuT3BlcmF0aW9uOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLmFubm90YXRpb25zLm1lZGlhLkNvbnRlbnQ7CitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuU2NoZW1hOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLmFubm90YXRpb25zLnJlc3BvbnNlcy5BcGlSZXNwb25zZTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmh0dHAuUmVzcG9uc2VFbnRpdHk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay52YWxpZGF0aW9uLmFubm90YXRpb24uVmFsaWRhdGVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi4qOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY24uZGV2MzMuc2F0b2tlbi5hbm5vdGF0aW9uLlNhQ2hlY2tMb2dpbjsKK2ltcG9ydCBjbi5kZXYzMy5zYXRva2VuLnN0cC5TdHBVdGlsOworCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL3NlZWRzIikKK3B1YmxpYyBjbGFzcyBUb3JyZW50Q29udHJvbGxlciB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUb3JyZW50U2VydmljZSB0b3JyZW50U2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFByb21vdGlvblNlcnZpY2UgcHJvbW90aW9uU2VydmljZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFVzZXJTZXJ2aWNlIHVzZXJTZXJ2aWNlOworCisKKyAgICBAU2FDaGVja0xvZ2luCisgICAgQE9wZXJhdGlvbihzdW1tYXJ5ID0gIuenjeWtkOWIl+ihqOafpeivoiIsIGRlc2NyaXB0aW9uID0gIuenjeWtkOWIl+ihqOadoeS7tuafpeivoi3liIbpobUt5o6S5bqPIikKKyAgICBAQXBpUmVzcG9uc2UocmVzcG9uc2VDb2RlID0gIjAiLCBkZXNjcmlwdGlvbiA9ICLmk43kvZzmiJDlip8iLAorICAgICAgICAgICAgY29udGVudCA9IHtAQ29udGVudChtZWRpYVR5cGUgPSAiYXBwbGljYXRpb24vanNvbiIsCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IEBTY2hlbWEoaW1wbGVtZW50YXRpb24gPSBUb3JyZW50Vk8uY2xhc3MpKQorICAgICAgICAgICAgfSkKKyAgICBAUG9zdE1hcHBpbmcoIi9saXN0IikKKyAgICBwdWJsaWMgUmVzdWx0IGxpc3QoQFJlcXVlc3RCb2R5IFRvcnJlbnRQYXJhbSBwYXJhbSkgeworICAgICAgICAvLyDmnoTlu7rmjpLluo/lkozmqKHns4rmn6Xor6LmnaHku7YKKyAgICAgICAgcGFyYW0udmFsaWRPcmRlcihwYXJhbS5nZXRPcmRlcktleShUb3JyZW50RW50aXR5LmNsYXNzKSk7CisgICAgICAgIHBhcmFtLmJ1aWxkTGlrZSgpOworCisgICAgICAgIFBhZ2VVdGlsLnN0YXJ0UGFnZShwYXJhbSk7CisKKyAgICAgICAgLy8g5p+l6K+i5pWw5o2uCisgICAgICAgIExpc3Q8VG9ycmVudEVudGl0eT4gbGlzdCA9IHRvcnJlbnRTZXJ2aWNlLnNlYXJjaChwYXJhbSk7CisKKyAgICAgICAgLy8g6L+U5Zue5YiG6aG157uT5p6cCisgICAgICAgIHJldHVybiBSZXN1bHQub2sobGlzdCwgUGFnZVV0aWwuZ2V0UGFnZShsaXN0KSk7CisgICAgfQorCisgICAgQFNhQ2hlY2tMb2dpbgorICAgIEBPcGVyYXRpb24oc3VtbWFyeSA9ICLnp43lrZDor6bmg4Xmn6Xor6IiKQorICAgIEBBcGlSZXNwb25zZShyZXNwb25zZUNvZGUgPSAiMCIsIGRlc2NyaXB0aW9uID0gIuaTjeS9nOaIkOWKnyIsIGNvbnRlbnQgPSB7CisgICAgICAgICAgICBAQ29udGVudChtZWRpYVR5cGUgPSAiYXBwbGljYXRpb24vanNvbiIsIHNjaGVtYSA9IEBTY2hlbWEoaW1wbGVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgICAgICBUb3JyZW50RW50aXR5LmNsYXNzKSkKKyAgICB9KQorICAgIEBQb3N0TWFwcGluZygiL2luZm8ve2lkfSIpCisgICAgcHVibGljIFJlc3VsdCBpbmZvKEBQYXRoVmFyaWFibGUoImlkIilMb25nIGlkKSB7CisKKyAgICAgICAgVG9ycmVudEVudGl0eSBlbnRpdHkgPSB0b3JyZW50U2VydmljZS5zZWxlY3RCeVNlZWRJZChpZCk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soZW50aXR5KTsKKyAgICB9CisKK0BPcGVyYXRpb24oc3VtbWFyeSA9ICLkuIrkvKDnp43lrZAiKQorCisgICAgQFBvc3RNYXBwaW5nKCIvdXBsb2FkIikKKyAgICBwdWJsaWMgUmVzdWx0IHVwbG9hZFRvcnJlbnQoCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKCJmaWxlIikgTXVsdGlwYXJ0RmlsZSBmaWxlLAorICAgICAgICAgICAgQE1vZGVsQXR0cmlidXRlIEBWYWxpZGF0ZWQgVG9ycmVudFVwbG9hZFBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8g6aqM6K+B55So5oi35p2D6ZmQCisgICAgICAgICAgICAvLyBMb25nIHVzZXJJZCA9IFN0cFV0aWwuZ2V0TG9naW5JZEFzTG9uZygpOworICAgICAgICAgICAgU3RyaW5nIHVzZXJJZCA9IFN0cmluZy52YWx1ZU9mKHBhcmFtLmdldFVwbG9hZGVyKCkpOworICAgICAgICAgICAgcGFyYW0uc2V0VXBsb2FkZXIodXNlcklkKTsKKworICAgICAgICAgICAgLy8g6aqM6K+B5paH5Lu25aSn5bCP5ZKM57G75Z6LCisgICAgICAgICAgICBpZiAoZmlsZS5pc0VtcHR5KCkgfHwgZmlsZS5nZXRTaXplKCkgPiAxMCAqIDEwMjQgKiAxMDI0KSB7IC8vIDEwTULpmZDliLYKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLmlofku7blpKflsI/kuI3nrKblkIjopoHmsYIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmaWxlLmdldE9yaWdpbmFsRmlsZW5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIudG9ycmVudCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi5Y+q5pSv5oyBLnRvcnJlbnTmlofku7YiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9ycmVudFNlcnZpY2UudXBsb2FkVG9ycmVudChmaWxlLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLnp43lrZDkuIrkvKDlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiDojrflj5bnp43lrZDmlofku7YKKyAgICAgKi8KKyAgICBAR2V0TWFwcGluZygiL3tzZWVkX2lkfS9kb3dubG9hZCIpCisgICAgcHVibGljIHZvaWQgZG93bmxvYWRUb3JyZW50KAorICAgICAgICAgICAgQFBhdGhWYXJpYWJsZSgic2VlZF9pZCIpIExvbmcgc2VlZElkLAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSgicGFzc2tleSIpIFN0cmluZyBwYXNza2V5LAorICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyDojrflj5bnp43lrZDlrp7kvZMKKyAgICAgICAgVG9ycmVudEVudGl0eSBlbnRpdHkgPSB0b3JyZW50U2VydmljZS5zZWxlY3RCeVNlZWRJZChzZWVkSWQpOworICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwgIuenjeWtkOS4jeWtmOWcqCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8g6I635Y+W5bm25aSE55CG56eN5a2Q5paH5Lu25YaF5a6577yI6ZyA5Zyoc2VydmljZeS4reWunueOsHBhc3NrZXnms6jlhaXvvIkKKyAgICAgICAgYnl0ZVtdIHRvcnJlbnRCeXRlcyA9IHRvcnJlbnRTZXJ2aWNlLmZldGNoKHNlZWRJZCwgcGFzc2tleSk7CisKKyAgICAgICAgLy8g6K6+572u5LiL6L295paH5Lu25ZCNCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGVudGl0eS5nZXRGaWxlTmFtZSgpOworICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCB8fCBmaWxlbmFtZS5pc0JsYW5rKCkpIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VlZElkICsgIi50b3JyZW50IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi50b3JyZW50IikpIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyAiLnRvcnJlbnQiOworICAgICAgICB9CisgICAgICAgIGZpbGVuYW1lID0gamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUoZmlsZW5hbWUsIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkucmVwbGFjZUFsbCgiXFwrIiwKKyAgICAgICAgICAgICAgICAiJTIwIik7CisKKyAgICAgICAgLy8g6K6+572u5ZON5bqU5aS0CisgICAgICAgIHJlc3BvbnNlLnNldENoYXJhY3RlckVuY29kaW5nKGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfOC5uYW1lKCkpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKHRvcnJlbnRCeXRlcy5sZW5ndGgpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC1iaXR0b3JyZW50Iik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIsICJhdHRhY2htZW50O2ZpbGVuYW1lPSIgKyBmaWxlbmFtZSk7CisKKyAgICAgICAgLy8g5YaZ5YWl5paH5Lu25YaF5a65CisgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHRvcnJlbnRCeXRlcyk7CisgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog5pS26JeP5oiW6ICF5Y+W5raI5pS26JePCisgICAgICovCisgICAgQFBvc3RNYXBwaW5nKCIve3NlZWRfaWR9L2Zhdm9yaXRlLXRvZ2dsZSIpCisgICAgcHVibGljIFJlc3VsdCBmYXZvcml0ZSgKKyAgICAgICAgICAgIEBQYXRoVmFyaWFibGUoInNlZWRfaWQiKSBMb25nIHNlZWRJZCwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oInVzZXJfaWQiKSBMb25nICB1c2VySWQpIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgcmV0dXJuICB0b3JyZW50U2VydmljZS5mYXZvcml0ZShzZWVkSWQsIHVzZXJJZCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLlpLHotKU6ICIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNhQ2hlY2tMb2dpbgorICAgIEBPcGVyYXRpb24oc3VtbWFyeSA9ICLliKDpmaTnp43lrZAiKQorICAgIEBEZWxldGVNYXBwaW5nKCIve3RvcnJlbnRJZH0iKQorICAgIHB1YmxpYyBSZXN1bHQgZGVsZXRlVG9ycmVudChAUGF0aFZhcmlhYmxlIExvbmcgdG9ycmVudElkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgIC8vICDpqozor4HnlKjmiLfmnYPpmZAKKyAgICAgICAgICAgIExvbmcgdXNlcklkID0gU3RwVXRpbC5nZXRMb2dpbklkQXNMb25nKCk7CisgICAgICAgICAgICBpZiAoIXRvcnJlbnRTZXJ2aWNlLmNhblVzZXJEZWxldGVUb3JyZW50KHRvcnJlbnRJZCwgdXNlcklkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuayoeacieadg+mZkOWIoOmZpOatpOenjeWtkCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b3JyZW50U2VydmljZS5kZWxldGVUb3JyZW50KHRvcnJlbnRJZCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLliKDpmaTlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2FDaGVja0xvZ2luCisgICAgQE9wZXJhdGlvbihzdW1tYXJ5ID0gIuS/ruaUueenjeWtkOS/oeaBryIpCisgICAgQFB1dE1hcHBpbmcoIi97dG9ycmVudElkfSIpCisgICAgcHVibGljIFJlc3VsdCB1cGRhdGVUb3JyZW50KAorICAgICAgICAgICAgQFBhdGhWYXJpYWJsZSBMb25nIHRvcnJlbnRJZCwKKyAgICAgICAgICAgIEBSZXF1ZXN0Qm9keSBAVmFsaWRhdGVkIFRvcnJlbnRVcGRhdGVEVE8gdXBkYXRlRFRPKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyDpqozor4HnlKjmiLfmnYPpmZAKKyAgICAgICAgICAgIExvbmcgdXNlcklkID0gU3RwVXRpbC5nZXRMb2dpbklkQXNMb25nKCk7CisgICAgICAgICAgICBpZiAoIXRvcnJlbnRTZXJ2aWNlLmNhblVzZXJVcGRhdGVUb3JyZW50KHRvcnJlbnRJZCwgdXNlcklkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuayoeacieadg+mZkOS/ruaUueatpOenjeWtkCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b3JyZW50U2VydmljZS51cGRhdGVUb3JyZW50KHRvcnJlbnRJZCwgdXBkYXRlRFRPKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2soKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuabtOaWsOWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTYUNoZWNrTG9naW4KKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi5Yib5bu65L+D6ZSA5rS75YqoIikKKyAgICBAUG9zdE1hcHBpbmcoIi9wcm9tb3Rpb25zIikKKyAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZVByb21vdGlvbihAUmVxdWVzdEJvZHkgQFZhbGlkYXRlZCBQcm9tb3Rpb25DcmVhdGVEVE8gcHJvbW90aW9uRFRPKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyDpqozor4HnlKjmiLfmnYPpmZDvvIjlj6rmnInnrqHnkIblkZjlj6/ku6XliJvlu7rkv4PplIDvvIkKKy8vICAgICAgICAgICAgaWYgKCFTdHBVdGlsLmhhc1JvbGUoImFkbWluIikpIHsKKy8vICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuayoeacieadg+mZkOWIm+W7uuS/g+mUgOa0u+WKqCIpOworLy8gICAgICAgICAgICB9CisvLworICAgICAgICAgICAgUHJvbW90aW9uIHByb21vdGlvbiA9IHByb21vdGlvblNlcnZpY2UuY3JlYXRlUHJvbW90aW9uKHByb21vdGlvbkRUTyk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKHByb21vdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLliJvlu7rkv4PplIDlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2FDaGVja0xvZ2luCisgICAgQE9wZXJhdGlvbihzdW1tYXJ5ID0gIuiOt+WPluS/g+mUgOa0u+WKqOWIl+ihqCIpCisgICAgQEdldE1hcHBpbmcoIi9wcm9tb3Rpb25zIikKKyAgICBwdWJsaWMgUmVzdWx0IGdldFByb21vdGlvbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PFByb21vdGlvbj4gcHJvbW90aW9ucyA9IHByb21vdGlvblNlcnZpY2UuZ2V0QWxsQWN0aXZlUHJvbW90aW9ucygpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vayhwcm9tb3Rpb25zKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuiOt+WPluS/g+mUgOWIl+ihqOWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTYUNoZWNrTG9naW4KKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi6I635Y+W5L+D6ZSA6K+m5oOFIikKKyAgICBAR2V0TWFwcGluZygiL3Byb21vdGlvbnMve3Byb21vdGlvbklkfSIpCisgICAgcHVibGljIFJlc3VsdCBnZXRQcm9tb3Rpb25EZXRhaWxzKEBQYXRoVmFyaWFibGUgTG9uZyBwcm9tb3Rpb25JZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvbW90aW9uIHByb21vdGlvbiA9IHByb21vdGlvblNlcnZpY2UuZ2V0UHJvbW90aW9uQnlJZChwcm9tb3Rpb25JZCk7CisgICAgICAgICAgICBpZiAocHJvbW90aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLkv4PplIDmtLvliqjkuI3lrZjlnKgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2socHJvbW90aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuiOt+WPluS/g+mUgOivpuaDheWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTYUNoZWNrTG9naW4KKyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi5Yig6Zmk5L+D6ZSA5rS75YqoIikKKyAgICBARGVsZXRlTWFwcGluZygiL3Byb21vdGlvbnMve3Byb21vdGlvbklkfSIpCisgICAgcHVibGljIFJlc3VsdCBkZWxldGVQcm9tb3Rpb24oQFBhdGhWYXJpYWJsZSBMb25nIHByb21vdGlvbklkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyDpqozor4HnlKjmiLfmnYPpmZDvvIjlj6rmnInnrqHnkIblkZjlj6/ku6XliKDpmaTkv4PplIDvvIkKKyAgICAgICAgICAgIGlmICghU3RwVXRpbC5oYXNSb2xlKCJhZG1pbiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi5rKh5pyJ5p2D6ZmQ5Yig6Zmk5L+D6ZSA5rS75YqoIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb21vdGlvblNlcnZpY2UuZGVsZXRlUHJvbW90aW9uKHByb21vdGlvbklkKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2soKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIuWIoOmZpOS/g+mUgOWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIOS4i+i9veenjeWtkO+8iOWMheWQq+WPjeS9nOW8iuacuuWItu+8iQorICAgIEBQb3N0TWFwcGluZygiL3t0b3JyZW50SWR9L2Rvd25sb2FkIikKKyAgICBwdWJsaWMgUmVzcG9uc2VFbnRpdHk8Pz4gZG93bmxvYWRUb3JyZW50KEBQYXRoVmFyaWFibGUgTG9uZyB0b3JyZW50SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSBMb25nIHVzZXJJZCkgeworLy8gICAgICAgIC8vIOmqjOivgeeUqOaIt+i6q+S7veWSjOadg+mZkAorLy8gICAgICAgIGlmICghdXNlclNlcnZpY2UudmFsaWRhdGVVc2VyKHVzZXJJZCkpIHsKKy8vICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlRW50aXR5LnN0YXR1cyhIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCkuYnVpbGQoKTsKKy8vICAgICAgICB9CisKKyAgICAgICAgLy8g5qOA5p+l55So5oi35LiK5Lyg6YeP5piv5ZCm6Laz5aSfCisgICAgICAgIGlmICghdG9ycmVudFNlcnZpY2UuY2hlY2tVc2VyVXBsb2FkUmF0aW8odXNlcklkKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlRW50aXR5LnN0YXR1cyhIdHRwU3RhdHVzLkZPUkJJRERFTikKKyAgICAgICAgICAgICAgICAuYm9keSgi5LiK5Lyg6YeP5LiN6Laz77yM5peg5rOV5LiL6L29Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyDlupTnlKjkv4PplIDmipjmiaPvvIjlpoLmnpzmnInvvIkKKyAgICAgICAgZG91YmxlIGRvd25sb2FkU2l6ZSA9IHRvcnJlbnRTZXJ2aWNlLmNhbGN1bGF0ZURvd25sb2FkU2l6ZSh0b3JyZW50SWQsIHVzZXJJZCk7CisKKyAgICAgICAgLy8g6K6w5b2V5LiL6L29CisgICAgICAgIHRvcnJlbnRTZXJ2aWNlLnJlY29yZERvd25sb2FkKHRvcnJlbnRJZCwgdXNlcklkLCBkb3dubG9hZFNpemUpOworCisgICAgICAgIHJldHVybiBSZXNwb25zZUVudGl0eS5vaygpLmJ1aWxkKCk7CisgICAgfQorCisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXIuamF2YQppbmRleCA0YmY2YWRmLi5hY2RhNDAzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Vc2VyQ29udHJvbGxlci5qYXZhCkBAIC0xLDE2ICsxLDI1IEBACiBwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5jb250cm9sbGVyOwogCitpbXBvcnQgY24uZGV2MzMuc2F0b2tlbi5hbm5vdGF0aW9uLlNhQ2hlY2tMb2dpbjsKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5jb25kaXRpb25zLnF1ZXJ5LlF1ZXJ5V3JhcHBlcjsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmJhc2UuUGFnZVV0aWw7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50UGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by52by5Ub3JyZW50Vk87CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Ub3JyZW50RW50aXR5OwogaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5tYXBwZXIuVXNlck1hcHBlcjsKIGltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QubWFwcGVyLlZlcmlmaWNhdGlvblRva2VuTWFwcGVyOwogaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuVXNlcjsKIGltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuZW50aXR5LlZlcmlmaWNhdGlvblRva2VuOwogaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLkVtYWlsU2VydmljZTsKIGltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3Quc2VydmljZS5Vc2VyU2VydmljZTsKLWltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QudXRpbHMuUmVzdWx0OworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uYmFzZS5SZXN1bHQ7CiBpbXBvcnQgaW8uc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGk7CiBpbXBvcnQgaW8uc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlPcGVyYXRpb247CiBpbXBvcnQgaW8uc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlQYXJhbTsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5hbm5vdGF0aW9ucy5PcGVyYXRpb247CitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuQ29udGVudDsKK2ltcG9ydCBpby5zd2FnZ2VyLnYzLm9hcy5hbm5vdGF0aW9ucy5tZWRpYS5TY2hlbWE7CitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMucmVzcG9uc2VzLkFwaVJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5SYW5kb21TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtMjcsNiArMzYsNyBAQAogaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CiBpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CiBpbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIEBSZXN0Q29udHJvbGxlcgogQFJlcXVlc3RNYXBwaW5nKCIvdXNlciIpCkBAIC02MSw5ICs3MSw5IEBACiAgICAgICAgICAgICBVc2VyIHVzZXIgPSB1c2VyTWFwcGVyLnNlbGVjdE9uZShuZXcgUXVlcnlXcmFwcGVyPFVzZXI+KCkuZXEoInVzZXJuYW1lIiwgdXNlcm5hbWUpKTsKIAogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dpbiBzdWNjZXNzZnVsIGZvciB1c2VyOiAiICsgdXNlcm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5zdWNjZXNzKHVzZXIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vayh1c2VyKTsKICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigiNDAxIiwgIueZu+W9leWksei0pe+8miIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLnmbvlvZXlpLHotKUiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzEsMTUgKzgxLDE1IEBACiAgICAgQEFwaU9wZXJhdGlvbih2YWx1ZSA9ICLnlKjmiLfms6jlhowiLCBub3RlcyA9ICLkvb/nlKjnlKjmiLfkv6Hmga/ov5vooYzms6jlhowiKQogICAgIHB1YmxpYyBSZXN1bHQgcmVnaXN0ZXJDb250cm9sbGVyKEBSZXF1ZXN0Qm9keSBAQXBpUGFyYW0odmFsdWUgPSAi5paw55So5oi35L+h5oGvIiwgcmVxdWlyZWQgPSB0cnVlKSBVc2VyIG5ld1VzZXIpIHsKICAgICAgICAgaWYgKHVzZXJTZXJ2aWNlLmNoZWNrRW1haWxFeGlzdHMobmV3VXNlci5nZXRFbWFpbCgpKSkgewotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi6YKu566x5Yay56qBIiwgIumCrueuseW3suiiq+S9v+eUqO+8jOivt+S9v+eUqOWFtuS7lumCrueuseazqOWGjOaIluaJvuWbnuWvhuegge+8gSIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvciggIumCrueuseW3suiiq+S9v+eUqO+8jOivt+S9v+eUqOWFtuS7lumCrueuseazqOWGjOaIluaJvuWbnuWvhuegge+8gSIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHVzZXJTZXJ2aWNlLnByZVJlZ2lzdGVyVXNlcihuZXdVc2VyKTsKICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgIFVzZXIgcmVzcG9uc2VVc2VyID0gbmV3IFVzZXIoKTsKICAgICAgICAgICAgIHJlc3BvbnNlVXNlci5zZXRFbWFpbChuZXdVc2VyLmdldEVtYWlsKCkpOwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5zdWNjZXNzKHJlc3BvbnNlVXNlciwgIumqjOivgemCruS7tuW3suWPkemAge+8jOivt+ajgOafpeaCqOeahOmCrueuseOAgiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi5rOo5YaM5aSx6LSlIiwgIui0puWPt+W3suWtmOWcqOaIluazqOWGjOWksei0pe+8gSIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi6LSm5Y+35bey5a2Y5Zyo5oiW5rOo5YaM5aSx6LSl77yBIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMCw5ICsxMTAsOSBAQAogICAgICAgICBTdHJpbmcgY29kZSA9IHZlcmlmaWNhdGlvblJlcXVlc3QuZ2V0Q29kZSgpOwogICAgICAgICBib29sZWFuIGlzVmVyaWZpZWQgPSB1c2VyU2VydmljZS52ZXJpZnlFbWFpbChlbWFpbCwgY29kZSk7CiAgICAgICAgIGlmIChpc1ZlcmlmaWVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVzdWx0LnN1Y2Nlc3MobnVsbCwgIumCrueusemqjOivgeaIkOWKn++8gSIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigi6aqM6K+B5aSx6LSlIiwgIumqjOivgeeggemUmeivr+aIluW3sui/h+acn++8gSIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvciggIumqjOivgeeggemUmeivr+aIluW3sui/h+acn++8gSIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjMsNyArMTMzLDcgQEAKICAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCLmnKrmib7liLDkuI7or6Xpgq7nrrHlnLDlnYDnm7jlhbPogZTnmoTnlKjmiLc6IHt9IiwgZW1haWwpOwogICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlRW50aXR5LnN0YXR1cyhIdHRwU3RhdHVzLkJBRF9SRVFVRVNUKQotICAgICAgICAgICAgICAgICAgICAuYm9keShSZXN1bHQuZXJyb3IoIjEiLCLmnKrmib7liLDkuI7or6Xpgq7nrrHlnLDlnYDnm7jlhbPogZTnmoTnlKjmiLciKSk7CisgICAgICAgICAgICAgICAgICAgIC5ib2R5KFJlc3VsdC5lcnJvcigi5pyq5om+5Yiw5LiO6K+l6YKu566x5Zyw5Z2A55u45YWz6IGU55qE55So5oi3IikpOwogICAgICAgICB9CiAKICAgICAgICAgLy8g55Sf5oiQ6aqM6K+B56CBCkBAIC0xMzksMTUgKzE0OSw0MiBAQAogICAgICAgICBsb2dnZXIuaW5mbygi6aqM6K+B5Luk54mM5bey5L+d5a2Y77yM55So5oi3OiB7fSIsIHVzZXIuZ2V0VXNlcm5hbWUoKSk7CiAgICAgICAgIGVtYWlsU2VydmljZS5zZW5kVmVyaWZpY2F0aW9uRW1haWwoZW1haWwsIHRva2VuKTsKIAotICAgICAgICByZXR1cm4gUmVzcG9uc2VFbnRpdHkub2soUmVzdWx0LnN1Y2Nlc3MoMjAwLCAi6aqM6K+B6YKu5Lu25bey5Y+R6YCB77yBIikpOworICAgICAgICByZXR1cm4gUmVzcG9uc2VFbnRpdHkub2soUmVzdWx0Lm9rKCkpOwogICAgIH0KICAgICBAUG9zdE1hcHBpbmcoIi9jaGVja1Bhc3N3b3JkIikKICAgICBwdWJsaWMgUmVzdWx0PFN0cmluZz4gY2hlY2tQYXNzd29yZChAUmVxdWVzdFBhcmFtIExvbmcgdXNlcklkLCBAUmVxdWVzdFBhcmFtIFN0cmluZyBwYXNzd29yZCkgewogICAgICAgICBib29sZWFuIGlzUGFzc3dvcmRDb3JyZWN0ID0gdXNlclNlcnZpY2UuY2hlY2tQYXNzd29yZCh1c2VySWQsIHBhc3N3b3JkKTsKICAgICAgICAgaWYgKGlzUGFzc3dvcmRDb3JyZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVzdWx0LnN1Y2Nlc3MoIjIwMCIsIuWOn+Wni+Wvhueggei+k+WFpeato+ehriIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcigiMzA1Iiwi5Y6f5aeL5a+G56CB6L6T5YWl6ZSZ6K+vIik7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLljp/lp4vlr4bnoIHovpPlhaXplJnor68iKTsKICAgICAgICAgfQogICAgIH0KKworCisvLyAgICBAU2FDaGVja0xvZ2luCisvLyAgICBAT3BlcmF0aW9uKHN1bW1hcnkgPSAi55So5oi35pS26JeP5YiX6KGoIiwgZGVzY3JpcHRpb24gPSAi6I635Y+W55So5oi35pS26JeP55qE56eN5a2Q5YiX6KGoLeWIhumhtS3mjpLluo8iKQorLy8gICAgQEFwaVJlc3BvbnNlKHJlc3BvbnNlQ29kZSA9ICIwIiwgZGVzY3JpcHRpb24gPSAi5pON5L2c5oiQ5YqfIiwKKy8vICAgICAgICAgICAgY29udGVudCA9IHtAQ29udGVudChtZWRpYVR5cGUgPSAiYXBwbGljYXRpb24vanNvbiIsCisvLyAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gQFNjaGVtYShpbXBsZW1lbnRhdGlvbiA9IFRvcnJlbnRWTy5jbGFzcykpCisvLyAgICAgICAgICAgIH0pCisvLyAgICBAUG9zdE1hcHBpbmcoIi9mYXZvcml0ZS9saXN0IikKKy8vICAgIHB1YmxpYyBSZXN1bHQgbGlzdEZhdm9yaXRlcyhAUmVxdWVzdEJvZHkgRmF2b3JpdGVQYXJhbSBwYXJhbSkgeworLy8gICAgICAgIGlmIChwYXJhbS5nZXRVc2VySWQoKSA9PSBudWxsKSB7CisvLyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoIue8uuWwkSB1c2VySWQiKTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIC8vIOagoemqjOaOkuW6j+Wtl+auteaYr+WQpuWQiOeQhu+8iOWPr+mAie+8iQorLy8gICAgICAgIHBhcmFtLnZhbGlkT3JkZXIocGFyYW0uZ2V0T3JkZXJLZXkoVG9ycmVudEVudGl0eS5jbGFzcykpOworLy8KKy8vICAgICAgICBQYWdlVXRpbC5zdGFydFBhZ2UocGFyYW0pOworLy8KKy8vICAgICAgICBMaXN0PFRvcnJlbnRFbnRpdHk+IGxpc3QgPSBmYXZvcml0ZVNlcnZpY2UuZ2V0VXNlckZhdm9yaXRlc1BhZ2VkKHBhcmFtLmdldFVzZXJJZCgpKTsKKy8vCisvLyAgICAgICAgcmV0dXJuIFJlc3VsdC5vayhsaXN0LCBQYWdlVXRpbC5nZXRQYWdlKGxpc3QpKTsKKy8vICAgIH0KKy8vCisKKworCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vUHJvbW90aW9uQ3JlYXRlRFRPLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vUHJvbW90aW9uQ3JlYXRlRFRPLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExOTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2R0by9Qcm9tb3Rpb25DcmVhdGVEVE8uamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5kdG87CisKK2ltcG9ydCBsb21ib2suRGF0YTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLio7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BEYXRhCitwdWJsaWMgY2xhc3MgUHJvbW90aW9uQ3JlYXRlRFRPIHsKKyAgICBATm90QmxhbmsobWVzc2FnZSA9ICLkv4PplIDlkI3np7DkuI3og73kuLrnqboiKQorICAgIEBTaXplKG1heCA9IDEwMCwgbWVzc2FnZSA9ICLkv4PplIDlkI3np7Dplb/luqbkuI3og73otoXov4cxMDDkuKrlrZfnrKYiKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgCisgICAgQFNpemUobWF4ID0gNTAwLCBtZXNzYWdlID0gIuaPj+i/sOmVv+W6puS4jeiDvei2hei/hzUwMOS4quWtl+espiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgCisgICAgQE5vdE51bGwobWVzc2FnZSA9ICLlvIDlp4vml7bpl7TkuI3og73kuLrnqboiKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBzdGFydFRpbWU7CisgICAgCisgICAgQE5vdE51bGwobWVzc2FnZSA9ICLnu5PmnZ/ml7bpl7TkuI3og73kuLrnqboiKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBlbmRUaW1lOworICAgIAorICAgIEBOb3ROdWxsKG1lc3NhZ2UgPSAi5oqY5omj5q+U5L6L5LiN6IO95Li656m6IikKKyAgICBATWluKHZhbHVlID0gMCwgbWVzc2FnZSA9ICLmipjmiaPmr5TkvovkuI3og73lsI/kuo4wIikKKyAgICBATWF4KHZhbHVlID0gMTAwLCBtZXNzYWdlID0gIuaKmOaJo+avlOS+i+S4jeiDveWkp+S6jjEwMCIpCisgICAgcHJpdmF0ZSBkb3VibGUgZGlzY291bnRQZXJjZW50YWdlOworICAgIAorICAgIEBOb3RFbXB0eShtZXNzYWdlID0gIumAgueUqOenjeWtkOWIl+ihqOS4jeiDveS4uuepuiIpCisgICAgcHJpdmF0ZSBMaXN0PExvbmc+IGFwcGxpY2FibGVUb3JyZW50SWRzOworICAgIAorICAgIEBBc3NlcnRUcnVlKG1lc3NhZ2UgPSAi57uT5p2f5pe26Ze05b+F6aG75pma5LqO5byA5aeL5pe26Ze0IikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZFRpbWVBZnRlclN0YXJ0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGVuZFRpbWUgIT0gbnVsbCAmJiBzdGFydFRpbWUgIT0gbnVsbCAmJiBlbmRUaW1lLmlzQWZ0ZXIoc3RhcnRUaW1lKTsKKyAgICB9Cit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2R0by9Ub3JyZW50VXBkYXRlRFRPLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vVG9ycmVudFVwZGF0ZURUTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDkzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vVG9ycmVudFVwZGF0ZURUTy5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0bzsKKworaW1wb3J0IGxvbWJvay5EYXRhOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90Qmxhbms7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworCitARGF0YQorcHVibGljIGNsYXNzIFRvcnJlbnRVcGRhdGVEVE8geworICAgIEBOb3RCbGFuayhtZXNzYWdlID0gIuagh+mimOS4jeiDveS4uuepuiIpCisgICAgQFNpemUobWF4ID0gMzAsIG1lc3NhZ2UgPSAi5ZCN56ew6ZW/5bqm5LiN6IO96LaF6L+HMzDkuKrlrZfnrKYiKQorICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIAorICAgIEBTaXplKG1heCA9IDEwMDAsIG1lc3NhZ2UgPSAi5o+P6L+w6ZW/5bqm5LiN6IO96LaF6L+HMTAwMOS4quWtl+espiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgCisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi5YiG57G75LiN6IO95Li656m6IikKKyAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKyAgICAKKworICAgIHByaXZhdGUgU3RyaW5nIHRhZ3M7CisgICAgQE5vdEJsYW5rKG1lc3NhZ2UgPSAi5bCB6Z2i5LiN6IO95Li656m6IikKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBpbWFnZVVybDsKK30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3BhcmFtL1RvcnJlbnRQYXJhbS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3BhcmFtL1RvcnJlbnRQYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjgzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vcGFyYW0vVG9ycmVudFBhcmFtLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuZHRvLnBhcmFtOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlLk9yZGVyUGFnZVBhcmFtOworaW1wb3J0IGlvLnN3YWdnZXIudjMub2FzLmFubm90YXRpb25zLm1lZGlhLlNjaGVtYTsKK2ltcG9ydCBsb21ib2suRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIOenjeWtkOafpeivouWPguaVsAorICovCitARGF0YQorQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLnp43lrZDmn6Xor6Llj4LmlbAiKQorcHVibGljIGNsYXNzIFRvcnJlbnRQYXJhbSBleHRlbmRzIE9yZGVyUGFnZVBhcmFtIHsKKworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5YWz6ZSu5a2XIikKKyAgICBwcml2YXRlIFN0cmluZyBrZXl3b3JkOworCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLliIbnsbsiKQorICAgIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OworCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLkv4PplIDnp43lrZAiKQorICAgIHByaXZhdGUgU3RyaW5nIGZyZWU7CisKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGxpa2VFeHByZXNzaW9uczsKKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkTGlrZSgpIHsKKyAgICAgICAgbGlrZUV4cHJlc3Npb25zID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShrZXl3b3JkKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLnJlcGxhY2UoIi4iLCAiICIpOworICAgICAgICBTdHJpbmdbXSBzZWFyY2hzdHJFeHBsb2RlZCA9IGtleXdvcmQuc3BsaXQoIiAiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hzdHJFeHBsb2RlZC5sZW5ndGggJiYgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzZWFyY2hzdHJFbGVtZW50ID0gc2VhcmNoc3RyRXhwbG9kZWRbaV0udHJpbSgpOworICAgICAgICAgICAgaWYgKCFzZWFyY2hzdHJFbGVtZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGxpa2VFeHByZXNzaW9ucy5hZGQoc2VhcmNoc3RyRWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3BhcmFtL1RvcnJlbnRVcGxvYWRQYXJhbS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3BhcmFtL1RvcnJlbnRVcGxvYWRQYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGU0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vcGFyYW0vVG9ycmVudFVwbG9hZFBhcmFtLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuZHRvLnBhcmFtOworCitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuU2NoZW1hOworaW1wb3J0IGxvbWJvay5EYXRhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BEYXRhCitAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuenjeWtkOS4iuS8oOWPguaVsCIpCitwdWJsaWMgY2xhc3MgVG9ycmVudFVwbG9hZFBhcmFtIHsKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuS4iuS8oOiAhSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXBsb2FkZXI7CisKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuenjeWtkOagh+mimCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuenjeWtkOaPj+i/sCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuenjeWtkOagh+etviIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnczsKKworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi56eN5a2Q5YiG57G7IikKKyAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi56eN5a2Q5bCB6Z2i5Zu+IFVSTCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1hZ2VVcmw7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3ZvL1RvcnJlbnRWTy5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZHRvL3ZvL1RvcnJlbnRWTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjNjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9kdG8vdm8vVG9ycmVudFZPLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by52bzsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCitpbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuU2NoZW1hOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90RW1wdHk7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGxvbWJvay5EYXRhOworCitARGF0YQorcHVibGljIGNsYXNzIFRvcnJlbnRWTyB7CisgICAgLyoqCisgICAgICog56eN5a2QSUQKKyAgICAgKi8KKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuenjeWtkElEIikKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICAvKioKKyAgICAgKiDmoIfpopgKKyAgICAgKi8KKyAgICBATm90RW1wdHkKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuagh+mimCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKworICAgIC8qKgorICAgICAqIOWwgemdogorICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5bCB6Z2iIikKKyAgICBwcml2YXRlIFN0cmluZyBpbWFnZVVybDsKKyAgICAvKioKKyAgICAgKiDmj4/ov7AKKyAgICAgKi8KKyAgICBATm90RW1wdHkKKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuaPj+i/sCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICAvKioKKyAgICAgKiDnsbvliKsKKyAgICAgKi8KKyAgICBATm90TnVsbAorICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi57G75YirIikKKyAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKworCisgICAgLyoqCisgICAgICog5re75Yqg5pel5pyfCisgICAgICovCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmt7vliqDml6XmnJ8iKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworCisgICAgLyoqCisgICAgICog5L+u5pS55pel5pyfCisgICAgICovCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLkv67mlLnml6XmnJ8iKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSB1cGRhdGVUaW1lOworCisgICAgLyoqCisgICAgICog5LiK5Lyg6ICFCisgICAgICovCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLkuIrkvKDogIUiKQorICAgIHByaXZhdGUgU3RyaW5nIHVwbG9hZGVyOworICAgIC8qKgorICAgICAqIOaWh+S7tuWkp+WwjworICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5paH5Lu25aSn5bCPIikKKyAgICBwcml2YXRlIExvbmcgc2l6ZTsKKyAgIAorCisKKyAgICAvKioKKyAgICAgKiDor4TorrrmlbAKKyAgICAgKi8KKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuivhOiuuuaVsCIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGNvbW1lbnRzOworICAgIC8qKgorICAgICAqIOa1j+iniOasoeaVsAorICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5rWP6KeI5qyh5pWwIikKKyAgICBwcml2YXRlIEludGVnZXIgdmlld3M7CisgICAgLyoqCisgICAgICog54K55Ye75qyh5pWwCisgICAgICovCisgICAgQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLngrnlh7vmrKHmlbAiKQorICAgIHByaXZhdGUgSW50ZWdlciBoaXRzOworCisKKyAgICAvKioKKyAgICAgKiDkuIvovb3mlbAKKyAgICAgKi8KKyAgICBAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuS4i+i9veaVsCIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGxlZWNoZXJzOworICAgIC8qKgorICAgICAqIOWBmuenjeaVsAorICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5YGa56eN5pWwIikKKyAgICBwcml2YXRlIEludGVnZXIgc2VlZGVyczsKKworICAgIC8qKgorICAgICAqIOWujOaIkOasoeaVsAorICAgICAqLworICAgIEBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5a6M5oiQ5qyh5pWwIikKKyAgICBwcml2YXRlIEludGVnZXIgY29tcGxldGlvbnM7CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2VudGl0eS9FbnRpdHlCYXNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvRW50aXR5QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTgzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvRW50aXR5QmFzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eTsKKworCisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5JZFR5cGU7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uVGFibGVJZDsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgbG9tYm9rLkdldHRlcjsKK2ltcG9ydCBsb21ib2suU2V0dGVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFuIGVudGl0eSwgYXMgZXhwbGFpbmVkIGluIHRoZSBib29rICJEb21haW4gRHJpdmVuIERlc2lnbiIuCisgKiBBbGwgZW50aXRpZXMgaW4gdGhpcyBwcm9qZWN0IGhhdmUgYW4gaWRlbnRpdHkgYXR0cmlidXRlIHdpdGggdHlwZSBMb25nIGFuZAorICogbmFtZSBpZC4gSW5zcGlyZWQgYnkgdGhlIERERCBTYW1wbGUgcHJvamVjdC4KKworICovCitAU2V0dGVyCitAR2V0dGVyCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50aXR5QmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlkZW50aXR5IGZpZWxkIGhhcyB0aGUgd3JhcHBlciBjbGFzcyB0eXBlIExvbmcgc28gdGhhdCBhbiBlbnRpdHkgd2hpY2gKKyAgICAgKiBoYXMgbm90IGJlZW4gc2F2ZWQgaXMgcmVjb2duaXphYmxlIGJ5IGEgbnVsbCBpZGVudGl0eS4KKyAgICAgKi8KKyAgICBAVGFibGVJZCh0eXBlID0gSWRUeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGlkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRW50aXR5QmFzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG9iamVjdC5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEVudGl0eUJhc2UgdGhhdCA9IChFbnRpdHlCYXNlKSBvYmplY3Q7CisgICAgICAgIF9jaGVja0lkZW50aXR5KHRoaXMpOworICAgICAgICBfY2hlY2tJZGVudGl0eSh0aGF0KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQuZXF1YWxzKHRoYXQuZ2V0SWQoKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrSWRlbnRpdHkoZmluYWwgRW50aXR5QmFzZSBlbnRpdHkpIHsKKyAgICAgICAgaWYgKGVudGl0eS5nZXRJZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBhcmlzb24gaWRlbnRpdHkgbWlzc2luZyBpbiBlbnRpdHk6ICIgKyBlbnRpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaCh0aGlzLmdldElkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIjwiICsgZ2V0SWQoKSArICI+IjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2VudGl0eS9GYXZvcml0ZUVudGl0eS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZW50aXR5L0Zhdm9yaXRlRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2VudGl0eS9GYXZvcml0ZUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eTsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLklkVHlwZTsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUZpZWxkOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLlRhYmxlSWQ7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uVGFibGVOYW1lOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Qcm9wZXJ0eTsKK2ltcG9ydCBpby5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU1vZGVsOworaW1wb3J0IGlvLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpTW9kZWxQcm9wZXJ0eTsKK2ltcG9ydCBsb21ib2suRGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitARGF0YQorQFRhYmxlTmFtZSgiZmF2b3JpdGUiKQorQEFwaU1vZGVsKCLmlLbol4/lrp7kvZPnsbsiKQorcHVibGljIGNsYXNzIEZhdm9yaXRlRW50aXR5IHsKKyAgICBAVGFibGVJZCh0eXBlID0gSWRUeXBlLkFVVE8pCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5pS26JePSUQiLCBleGFtcGxlID0gIjEiKQorICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIueUqOaIt0lEIiwgZXhhbXBsZSA9ICIxMDAxIikKKyAgICBASnNvblByb3BlcnR5KCJ1c2VySWQiKQorICAgIEBUYWJsZUZpZWxkKCJ1c2VyX2lkIikKKyAgICBwcml2YXRlIExvbmcgdXNlcklkOworCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi56eN5a2QSUQiLCBleGFtcGxlID0gIjIwMDEiKQorICAgIEBKc29uUHJvcGVydHkoInNlZWRJZCIpCisgICAgQFRhYmxlRmllbGQoInNlZWRfaWQiKQorICAgIHByaXZhdGUgTG9uZyBzZWVkSWQ7CisKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLmlLbol4/ml7bpl7QiLCBleGFtcGxlID0gIjIwMjQtMDUtMTMgMTI6MDA6MDAiKQorICAgIEBKc29uUHJvcGVydHkoImNyZWF0ZVRpbWUiKQorICAgIEBUYWJsZUZpZWxkKCJjcmVhdGVfdGltZSIpCisgICAgcHJpdmF0ZSBEYXRlIGNyZWF0ZVRpbWU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZW50aXR5L1Byb21vdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZW50aXR5L1Byb21vdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTg0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvUHJvbW90aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QuZW50aXR5OworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uSWRUeXBlOworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5hbm5vdGF0aW9uLlRhYmxlSWQ7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uVGFibGVOYW1lOworaW1wb3J0IGxvbWJvay5EYXRhOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BEYXRhCitAVGFibGVOYW1lKCJwcm9tb3Rpb24iKQorcHVibGljIGNsYXNzIFByb21vdGlvbiB7CisgICAgQFRhYmxlSWQodHlwZSA9IElkVHlwZS5BVVRPKQorICAgIHByaXZhdGUgTG9uZyBpZDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIAorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBzdGFydFRpbWU7CisgICAgCisgICAgcHJpdmF0ZSBMb2NhbERhdGVUaW1lIGVuZFRpbWU7CisgICAgCisgICAgcHJpdmF0ZSBkb3VibGUgZGlzY291bnRQZXJjZW50YWdlOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGFwcGxpY2FibGVUb3JyZW50SWRzOworICAgIAorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworICAgIAorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSB1cGRhdGVUaW1lOworICAgIAorICAgIHByaXZhdGUgQm9vbGVhbiBpc0RlbGV0ZWQ7Cit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2VudGl0eS9Ub3JyZW50RW50aXR5LmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvVG9ycmVudEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MmZiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvVG9ycmVudEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHk7CisKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi4qOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Qcm9wZXJ0eTsKK2ltcG9ydCBpby5zd2FnZ2VyLmFubm90YXRpb25zLkFwaU1vZGVsOworaW1wb3J0IGlvLnN3YWdnZXIuYW5ub3RhdGlvbnMuQXBpTW9kZWxQcm9wZXJ0eTsKK2ltcG9ydCBsb21ib2suRGF0YTsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitARGF0YQorQFRhYmxlTmFtZSgidG9ycmVudCIpCitAQXBpTW9kZWwoIuenjeWtkOWunuS9k+exuyIpCitwdWJsaWMgY2xhc3MgVG9ycmVudEVudGl0eSB7CisKKyAgICBAVGFibGVJZCh0eXBlID0gSWRUeXBlLkFVVE8pCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi56eN5a2QSUQiLCBleGFtcGxlID0gIjEiKQorICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIEBKc29uUHJvcGVydHkoImluZm9IYXNoIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLnp43lrZDkv6Hmga/lk4jluIwiLCBleGFtcGxlID0gImFiY2RlZjEyMzQ1NiIpCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5mb0hhc2g7CisKKyAgICBASnNvblByb3BlcnR5KCJmaWxlTmFtZSIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi56eN5a2Q5paH5Lu25ZCNIiwgZXhhbXBsZSA9ICJtb3ZpZV90b3JyZW50X2ZpbGUudG9ycmVudCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7CisKKyAgICBASnNvblByb3BlcnR5KCJ1cGxvYWRlciIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5LiK5Lyg6ICFIiwgZXhhbXBsZSA9ICJ1c2VyMTIzIikKKyAgICBwcml2YXRlIFN0cmluZyB1cGxvYWRlcjsKKworICAgIEBKc29uUHJvcGVydHkoImNyZWF0ZWRUaW1lIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLkuIrkvKDml7bpl7QiLCBleGFtcGxlID0gIjIwMjQtMDEtMDEgMTI6MDA6MDAiKQorICAgIEBUYWJsZUZpZWxkKGZpbGwgPSBGaWVsZEZpbGwuSU5TRVJUKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworCisgICAgQEpzb25Qcm9wZXJ0eSgidXBkYXRlVGltZSIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5pu05paw5pe26Ze0IiwgZXhhbXBsZSA9ICIyMDI0LTAxLTAxIDEyOjAwOjAwIikKKworICAgIEBUYWJsZUZpZWxkKGZpbGwgPSBGaWVsZEZpbGwuSU5TRVJUX1VQREFURSkKKyAgICBwcml2YXRlIExvY2FsRGF0ZVRpbWUgdXBkYXRlVGltZTsKKworICAgIEBKc29uUHJvcGVydHkoInNpemUiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuenjeWtkOaWh+S7tuWkp+WwjyIsIGV4YW1wbGUgPSAiMTIzNDU2IikKKyAgICBwcml2YXRlIExvbmcgc2l6ZTsKKworICAgIEBKc29uUHJvcGVydHkoInRpdGxlIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLnp43lrZDmoIfpopgiLCBleGFtcGxlID0gIuOAiuaYn+mZheepv+i2iuOAiyIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKyAgICBASnNvblByb3BlcnR5KCJkZXNjcmlwdGlvbiIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi56eN5a2Q5o+P6L+wIiwgZXhhbXBsZSA9ICLov5nmmK/kuIDpg6jlpb3nnIvnmoTnp5HlubvnlLXlvbEiKQorICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgQEpzb25Qcm9wZXJ0eSgidGFncyIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi56eN5a2Q5qCH562+IiwgZXhhbXBsZSA9ICJbXCLnp5HlubtcIixcIuWKqOS9nFwiXSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFnczsKKworICAgIEBKc29uUHJvcGVydHkoImNhdGVnb3J5IikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLnp43lrZDliIbnsbsiLCBleGFtcGxlID0gIm1vdmllIikKKyAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKKworICAgIEBKc29uUHJvcGVydHkoImltYWdlVXJsIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLnp43lrZDlsIHpnaLlm75VUkwiLCBleGFtcGxlID0gImh0dHA6Ly9leGFtcGxlLmNvbS9pbWFnZXMvY292ZXIuanBnIikKKyAgICBwcml2YXRlIFN0cmluZyBpbWFnZVVybDsKKworICAgIEBKc29uUHJvcGVydHkoImxlZWNoZXJzIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLkuIvovb3mrKHmlbAiLCBleGFtcGxlID0gIjEyMyIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGxlZWNoZXJzOworCisgICAgQEpzb25Qcm9wZXJ0eSgic2VlZGVycyIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5YGa56eN5pWwIiwgZXhhbXBsZSA9ICIxMCIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIHNlZWRlcnM7CisKKyAgICBASnNvblByb3BlcnR5KCJjb21tZW50cyIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi6K+E6K665pWwIiwgZXhhbXBsZSA9ICI1IikKKyAgICBwcml2YXRlIEludGVnZXIgY29tbWVudHM7CisKKyAgICBASnNvblByb3BlcnR5KCJ2aWV3cyIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5rWP6KeI5qyh5pWwIiwgZXhhbXBsZSA9ICIxMDAwIikKKyAgICBwcml2YXRlIEludGVnZXIgdmlld3M7CisKKyAgICBASnNvblByb3BlcnR5KCJoaXRzIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLngrnlh7vmrKHmlbAiLCBleGFtcGxlID0gIjIwMDAiKQorICAgIHByaXZhdGUgSW50ZWdlciBoaXRzOworCisgICAgQEpzb25Qcm9wZXJ0eSgicHJvbW90aW9uVGltZVR5cGUiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuS/g+mUgOaXtumXtOexu+WeiyIsIGV4YW1wbGUgPSAiMSIpCisgICAgcHJpdmF0ZSBJbnRlZ2VyIHByb21vdGlvblRpbWVUeXBlOworCisgICAgQEpzb25Qcm9wZXJ0eSgicHJvbW90aW9uVW50aWwiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuS/g+mUgOaIquatouaXpeacnyIsIGV4YW1wbGUgPSAiMjAyNC0xMi0zMVQyMzo1OTo1OSIpCisgICAgcHJpdmF0ZSBMb2NhbERhdGVUaW1lIHByb21vdGlvblVudGlsOworCisgICAgCisgICAgQEpzb25Qcm9wZXJ0eSgidG9ycmVudEZpbGUiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuenjeWtkOaWh+S7tiIsIGV4YW1wbGUgPSAiYmFzZTY0IGVuY29kZWQgdG9ycmVudCBmaWxlIikKKyAgICBwcml2YXRlIGJ5dGVbXSB0b3JyZW50RmlsZTsKKworICAgIEBKc29uUHJvcGVydHkoImlzRGVsZXRlZCIpCisgICAgQEFwaU1vZGVsUHJvcGVydHkodmFsdWUgPSAi5piv5ZCm5Yig6ZmkIiwgZXhhbXBsZSA9ICJmYWxzZSIpCisgICAgcHJpdmF0ZSBCb29sZWFuIGlzRGVsZXRlZDsKKworICAgIHB1YmxpYyBUb3JyZW50RW50aXR5KCkgeworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvVXNlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvZW50aXR5L1VzZXIuamF2YQppbmRleCAyMGY3MTM4Li43NTc0ZTY3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9lbnRpdHkvVXNlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2VudGl0eS9Vc2VyLmphdmEKQEAgLTksNiArOSw4IEBACiBpbXBvcnQgaW8uc3dhZ2dlci5hbm5vdGF0aW9ucy5BcGlNb2RlbFByb3BlcnR5OwogaW1wb3J0IGxvbWJvay5EYXRhOwogCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKIEBEYXRhCiBAVGFibGVOYW1lKCJ1c2VyIikgLy8g5oyH5a6a5pWw5o2u5bqT6KGo5ZCNCiBAQXBpTW9kZWwoIueUqOaIt+WunuS9k+exuyIpIC8vIOeUqOS6juaPj+i/sOaooeWeiwpAQCAtNTAsNiArNTIsMjYgQEAKICAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLlpLTlg48iKQogICAgIHByaXZhdGUgU3RyaW5nIGF2YXRhcjsKIAorICAgIEBKc29uUHJvcGVydHkoInVwbG9hZGVkIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLkuIrkvKDph48iLCBleGFtcGxlID0gIjEwMDAiKQorICAgIHByaXZhdGUgTG9uZyB1cGxvYWRlZDsKKworICAgIEBKc29uUHJvcGVydHkoImRvd25sb2FkZWQiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuS4i+i9vemHjyIsIGV4YW1wbGUgPSAiNTAwIikKKyAgICBwcml2YXRlIExvbmcgZG93bmxvYWRlZDsKKworICAgIEBKc29uUHJvcGVydHkoImNyZWF0ZV90aW1lIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLliJvlu7rml7bpl7QiLCBleGFtcGxlID0gIjIwMjQtMDQtMDFUMTI6MDA6MDAiKQorICAgIHByaXZhdGUgTG9jYWxEYXRlVGltZSBjcmVhdGVUaW1lOworCisgICAgQEpzb25Qcm9wZXJ0eSgidXBkYXRlX3RpbWUiKQorICAgIEBBcGlNb2RlbFByb3BlcnR5KHZhbHVlID0gIuabtOaWsOaXtumXtCIsIGV4YW1wbGUgPSAiMjAyNC0wNC0wMVQxMjowMDowMCIpCisgICAgcHJpdmF0ZSBMb2NhbERhdGVUaW1lIHVwZGF0ZVRpbWU7CisKKyAgICBASnNvblByb3BlcnR5KCJpc19kZWxldGVkIikKKyAgICBAQXBpTW9kZWxQcm9wZXJ0eSh2YWx1ZSA9ICLmmK/lkKbliKDpmaQiLCBleGFtcGxlID0gImZhbHNlIikKKyAgICBwcml2YXRlIEJvb2xlYW4gaXNEZWxldGVkOworCiAgICAgcHVibGljIFVzZXIoKSB7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvbWFwcGVyL0Zhdm9yaXRlTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9tYXBwZXIvRmF2b3JpdGVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI4MTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvbWFwcGVyL0Zhdm9yaXRlTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QubWFwcGVyOworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUubWFwcGVyLkJhc2VNYXBwZXI7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5GYXZvcml0ZUVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy4qOworCitATWFwcGVyCitwdWJsaWMgaW50ZXJmYWNlIEZhdm9yaXRlTWFwcGVyIGV4dGVuZHMgQmFzZU1hcHBlcjxGYXZvcml0ZUVudGl0eT4geworCisgICBAU2VsZWN0KCJTRUxFQ1QgKiBGUk9NIGZhdm9yaXRlIFdIRVJFIHVzZXJfaWQgPSAje3VzZXJJZH0gQU5EIHNlZWRfaWQgPSAje3NlZWRJZH0gTElNSVQgMSIpCisgICAgRmF2b3JpdGVFbnRpdHkgc2VsZWN0QnlVc2VySWRBbmRTZWVkSWQoQFBhcmFtKCJ1c2VySWQiKSBMb25nIHVzZXJJZCwgQFBhcmFtKCJzZWVkSWQiKSBMb25nIHNlZWRJZCk7CisKKyAgICBARGVsZXRlKCJERUxFVEUgRlJPTSBmYXZvcml0ZSBXSEVSRSB1c2VyX2lkID0gI3t1c2VySWR9IEFORCBzZWVkX2lkID0gI3tzZWVkSWR9IikKKyAgICB2b2lkIGRlbGV0ZUJ5VXNlcklkQW5kU2VlZElkKEBQYXJhbSgidXNlcklkIikgTG9uZyB1c2VySWQsIEBQYXJhbSgic2VlZElkIikgTG9uZyBzZWVkSWQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Qcm9tb3Rpb25NYXBwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Qcm9tb3Rpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDc4ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvbWFwcGVyL1Byb21vdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlcjsKKworaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLm1hcHBlci5CYXNlTWFwcGVyOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuUHJvbW90aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuVXBkYXRlOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BNYXBwZXIKK3B1YmxpYyBpbnRlcmZhY2UgUHJvbW90aW9uTWFwcGVyIGV4dGVuZHMgQmFzZU1hcHBlcjxQcm9tb3Rpb24+IHsKKworICAgIEBTZWxlY3QoIlNFTEVDVCAqIEZST00gcHJvbW90aW9uIFdIRVJFIGlzX2RlbGV0ZWQgPSBmYWxzZSAiICsKKyAgICAgICAgICAgICJBTkQgc3RhcnRfdGltZSA8PSAje25vd30gQU5EIGVuZF90aW1lID49ICN7bm93fSIpCisgICAgTGlzdDxQcm9tb3Rpb24+IGZpbmRBY3RpdmVQcm9tb3Rpb25zKEBQYXJhbSgibm93IikgTG9jYWxEYXRlVGltZSBub3cpOworCisgICAgLyoqCisgICAgICog5p+l5om+5p+Q5LiqdG9ycmVudElk5piv5ZCm5Zyo5L+D6ZSA5rS75Yqo55qEYXBwbGljYWJsZV90b3JyZW50X2lkc+Wtl+espuS4suS4rQorICAgICAqIOeUqE15U1FM55qERklORF9JTl9TRVTliKTmlq0KKyAgICAgKi8KKyAgICBAU2VsZWN0KCJTRUxFQ1QgcC4qIEZST00gcHJvbW90aW9uIHAgIiArCisgICAgICAgICAgICAiV0hFUkUgcC5pc19kZWxldGVkID0gZmFsc2UgIiArCisgICAgICAgICAgICAiQU5EIHAuc3RhcnRfdGltZSA8PSAje25vd30gQU5EIHAuZW5kX3RpbWUgPj0gI3tub3d9ICIgKworICAgICAgICAgICAgIkFORCBGSU5EX0lOX1NFVCgje3RvcnJlbnRJZH0sIHAuYXBwbGljYWJsZV90b3JyZW50X2lkcykgPiAwIikKKyAgICBMaXN0PFByb21vdGlvbj4gZmluZEFjdGl2ZVByb21vdGlvbnNGb3JUb3JyZW50KAorICAgICAgICAgICAgQFBhcmFtKCJ0b3JyZW50SWQiKSBMb25nIHRvcnJlbnRJZCwKKyAgICAgICAgICAgIEBQYXJhbSgibm93IikgTG9jYWxEYXRlVGltZSBub3cpOworCisgICAgLyoqCisgICAgICog5qCh6aqM56eN5a2QaWTmmK/lkKblrZjlnKjvvIzov5Tlm57orqHmlbDvvIww5Luj6KGo5LiN5a2Y5Zyo77yMPjDku6PooajlrZjlnKgKKyAgICAgKi8KKyAgICBAU2VsZWN0KCJTRUxFQ1QgQ09VTlQoKikgRlJPTSB0b3JyZW50IFdIRVJFIGlkID0gI3t0b3JyZW50SWR9IikKKyAgICBpbnQgY2hlY2tUb3JyZW50RXhpc3RzKEBQYXJhbSgidG9ycmVudElkIikgTG9uZyB0b3JyZW50SWQpOworCisgICAgLyoqCisgICAgICog5o+S5YWl5L+D6ZSA5rS75YqoCisgICAgICovCisvLyAgICBpbnQgaW5zZXJ0KFByb21vdGlvbiBwcm9tb3Rpb24pOworCisgICAgLyoqCisgICAgICog5qC55o2uSUTmm7TmlrDkv4PplIDmtLvliqjvvIjkvovlpoLova/liKDpmaTvvIkKKyAgICAgKi8KKyAgICBpbnQgdXBkYXRlQnlJZChQcm9tb3Rpb24gcHJvbW90aW9uKTsKKworICAgIC8qKgorICAgICAqIOagueaNrklE5p+l6K+i5L+D6ZSA5rS75YqoCisgICAgICovCisgICAgUHJvbW90aW9uIHNlbGVjdEJ5SWQoQFBhcmFtKCJpZCIpIExvbmcgaWQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvbWFwcGVyL1RvcnJlbnRNYXBwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljZGNkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QubWFwcGVyOworCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUubWFwcGVyLkJhc2VNYXBwZXI7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50UGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Ub3JyZW50RW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5TZWxlY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuVXBkYXRlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BNYXBwZXIKK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudE1hcHBlciBleHRlbmRzIEJhc2VNYXBwZXI8VG9ycmVudEVudGl0eT4geworCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50cyBXSEVSRSBpbmZvX2hhc2ggPSAje2luZm9IYXNofSIpCisgICAgVG9ycmVudEVudGl0eSBzZWxlY3RCeUluZm9IYXNoKFN0cmluZyBpbmZvSGFzaCk7CisgICAgCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50cyBXSEVSRSBzZWVkX2lkID0gI3tzZWVkSWR9IikKKyAgICBUb3JyZW50RW50aXR5IHNlbGVjdEJ5U2VlZElkKExvbmcgc2VlZElkKTsKKyAgICAKKyAgICBMaXN0PFRvcnJlbnRFbnRpdHk+IHNlYXJjaChAUGFyYW0oInBhcmFtIikgVG9ycmVudFBhcmFtIHBhcmFtKTsKKyAgICAKKyAgICBAVXBkYXRlKCJVUERBVEUgdG9ycmVudCBTRVQgZG93bmxvYWRzID0gZG93bmxvYWRzICsgMSBXSEVSRSBpZCA9ICN7dG9ycmVudElkfSIpCisgICAgdm9pZCBpbmNyZWFzZURvd25sb2FkcyhAUGFyYW0oInRvcnJlbnRJZCIpIExvbmcgdG9ycmVudElkKTsKKyAgICAKKyAgICBib29sZWFuIGNoZWNrRmF2b3JpdGUoQFBhcmFtKCJzZWVkSWQiKSBMb25nIHNlZWRJZCwgQFBhcmFtKCJ1c2VySWQiKSBMb25nIHVzZXJJZCk7CisgICAgCisgICAgdm9pZCBhZGRGYXZvcml0ZShAUGFyYW0oInNlZWRJZCIpIExvbmcgc2VlZElkLCBAUGFyYW0oInVzZXJJZCIpIExvbmcgdXNlcklkKTsKKyAgICAKKyAgICB2b2lkIHJlbW92ZUZhdm9yaXRlKEBQYXJhbSgic2VlZElkIikgTG9uZyBzZWVkSWQsIEBQYXJhbSgidXNlcklkIikgTG9uZyB1c2VySWQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Vc2VyTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9tYXBwZXIvVXNlck1hcHBlci5qYXZhCmluZGV4IGEwNzBiYjUuLjNhMjliNjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L21hcHBlci9Vc2VyTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvbWFwcGVyL1VzZXJNYXBwZXIuamF2YQpAQCAtNCw2ICs0LDcgQEAKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5tYXBwZXIuQmFzZU1hcHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5NYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuU2VsZWN0OworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLlVwZGF0ZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5xdWVyeS5QYXJhbTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMjIsNCArMjMsOSBAQAogICAgIC8vIOagueaNrueUqOaIt+WQjeWMheWQq+afpeaJvueUqOaItwogICAgIExpc3Q8VXNlcj4gc2VsZWN0QnlVc2VybmFtZUNvbnRhaW5pbmcoQFBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpOwogCisgICAgQFVwZGF0ZSgiVVBEQVRFIHVzZXIgU0VUIGRvd25sb2FkZWQgPSBkb3dubG9hZGVkICsgI3tzaXplfSBXSEVSRSBpZCA9ICN7dXNlcklkfSIpCisgICAgdm9pZCBpbmNyZWFzZURvd25sb2FkZWQoQFBhcmFtKCJ1c2VySWQiKSBMb25nIHVzZXJJZCwgQFBhcmFtKCJzaXplIikgZG91YmxlIHNpemUpOworICAgIAorICAgIGJvb2xlYW4gaGFzUm9sZShAUGFyYW0oInVzZXJJZCIpIExvbmcgdXNlcklkLCBAUGFyYW0oInJvbGUiKSBTdHJpbmcgcm9sZSk7CisKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1Byb21vdGlvblNlcnZpY2UuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2UvUHJvbW90aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2MxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1Byb21vdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Qcm9tb3Rpb247CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5Qcm9tb3Rpb25DcmVhdGVEVE87CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgUHJvbW90aW9uU2VydmljZSB7CisgICAgUHJvbW90aW9uIGNyZWF0ZVByb21vdGlvbihQcm9tb3Rpb25DcmVhdGVEVE8gcHJvbW90aW9uRFRPKTsKKyAgICAKKyAgICBMaXN0PFByb21vdGlvbj4gZ2V0QWxsQWN0aXZlUHJvbW90aW9ucygpOworICAgIAorICAgIFByb21vdGlvbiBnZXRQcm9tb3Rpb25CeUlkKExvbmcgcHJvbW90aW9uSWQpOworICAgIAorICAgIHZvaWQgZGVsZXRlUHJvbW90aW9uKExvbmcgcHJvbW90aW9uSWQpOworICAgIAorICAgIGRvdWJsZSBnZXRDdXJyZW50RGlzY291bnQoTG9uZyB0b3JyZW50SWQpOworfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1RvcnJlbnRTZXJ2aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1RvcnJlbnRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxODA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2UvVG9ycmVudFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmNvbW1vbi5iYXNlLlJlc3VsdDsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuZW50aXR5LlRvcnJlbnRFbnRpdHk7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50UGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50VXBsb2FkUGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5Ub3JyZW50VXBkYXRlRFRPOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLm11bHRpcGFydC5NdWx0aXBhcnRGaWxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGludGVyZmFjZSBUb3JyZW50U2VydmljZSB7CisgICAgTGlzdDxUb3JyZW50RW50aXR5PiBzZWFyY2goVG9ycmVudFBhcmFtIHBhcmFtKTsKKyAgICAKKyAgICBUb3JyZW50RW50aXR5IHNlbGVjdEJ5U2VlZElkKExvbmcgc2VlZElkKTsKKyAgICAKKyAgICB2b2lkIHVwbG9hZFRvcnJlbnQoTXVsdGlwYXJ0RmlsZSBmaWxlLCBUb3JyZW50VXBsb2FkUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICBieXRlW10gZmV0Y2goTG9uZyBzZWVkSWQsIFN0cmluZyBwYXNza2V5KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgUmVzdWx0IGZhdm9yaXRlKExvbmcgc2VlZElkLCBMb25nIHVzZXJJZCk7CisgICAgCisgICAgdm9pZCBkZWxldGVUb3JyZW50KExvbmcgc2VlZElkKTsKKyAgICAKKyAgICB2b2lkIHVwZGF0ZVRvcnJlbnQoTG9uZyBzZWVkSWQsIFRvcnJlbnRVcGRhdGVEVE8gdXBkYXRlRFRPKTsKKyAgICAKKyAgICBib29sZWFuIGNhblVzZXJEZWxldGVUb3JyZW50KExvbmcgc2VlZElkLCBMb25nIHVzZXJJZCk7CisgICAgCisgICAgYm9vbGVhbiBjYW5Vc2VyVXBkYXRlVG9ycmVudChMb25nIHNlZWRJZCwgTG9uZyB1c2VySWQpOworICAgIAorICAgIGJvb2xlYW4gY2hlY2tVc2VyVXBsb2FkUmF0aW8oTG9uZyB1c2VySWQpOworICAgIAorICAgIGRvdWJsZSBjYWxjdWxhdGVEb3dubG9hZFNpemUoTG9uZyB0b3JyZW50SWQsIExvbmcgdXNlcklkKTsKKyAgICAKKyAgICB2b2lkIHJlY29yZERvd25sb2FkKExvbmcgdG9ycmVudElkLCBMb25nIHVzZXJJZCwgZG91YmxlIGRvd25sb2FkU2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1VzZXJTZXJ2aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL1VzZXJTZXJ2aWNlLmphdmEKaW5kZXggNTM1ZjYzNS4uNzE0MzVjNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3Qvc2VydmljZS9Vc2VyU2VydmljZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2UvVXNlclNlcnZpY2UuamF2YQpAQCAtMjEsNCArMjEsNSBAQAogICAgIGJvb2xlYW4gY2hlY2tQYXNzd29yZChMb25nIHVzZXJJZCwgU3RyaW5nIHJhd1Bhc3N3b3JkKTsKIAogCisvLyAgICBJbnRlZ2VyIGdldFVzZXJJZCgpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2Uvc2VydmljZUltcGwvUHJvbW90aW9uU2VydmljZUltcGwuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2Uvc2VydmljZUltcGwvUHJvbW90aW9uU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3Qvc2VydmljZS9zZXJ2aWNlSW1wbC9Qcm9tb3Rpb25TZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLnNlcnZpY2VJbXBsOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Qcm9tb3Rpb247CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlci5Qcm9tb3Rpb25NYXBwZXI7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LnNlcnZpY2UuUHJvbW90aW9uU2VydmljZTsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuZHRvLlByb21vdGlvbkNyZWF0ZURUTzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRyYW5zYWN0aW9uLmFubm90YXRpb24uVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBQcm9tb3Rpb25TZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIFByb21vdGlvblNlcnZpY2UgeworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgUHJvbW90aW9uTWFwcGVyIHByb21vdGlvbk1hcHBlcjsKKworICAgIEBPdmVycmlkZQorICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIFByb21vdGlvbiBjcmVhdGVQcm9tb3Rpb24oUHJvbW90aW9uQ3JlYXRlRFRPIHByb21vdGlvbkRUTykgeworICAgICAgICAvLyDpqozor4Hml7bpl7QKKyAgICAgICAgTG9jYWxEYXRlVGltZSBub3cgPSBMb2NhbERhdGVUaW1lLm5vdygpOworICAgICAgICBpZiAocHJvbW90aW9uRFRPLmdldEVuZFRpbWUoKS5pc0JlZm9yZShub3cpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi57uT5p2f5pe26Ze05LiN6IO95pep5LqO5b2T5YmN5pe26Ze0Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyDpqozor4Hnp43lrZBJROaYr+WQpuWtmOWcqAorICAgICAgICB2YWxpZGF0ZVRvcnJlbnRJZHMocHJvbW90aW9uRFRPLmdldEFwcGxpY2FibGVUb3JyZW50SWRzKCkpOworCisgICAgICAgIC8vIOWIm+W7uuS/g+mUgOa0u+WKqAorICAgICAgICBQcm9tb3Rpb24gcHJvbW90aW9uID0gbmV3IFByb21vdGlvbigpOworICAgICAgICBwcm9tb3Rpb24uc2V0TmFtZShwcm9tb3Rpb25EVE8uZ2V0TmFtZSgpKTsKKyAgICAgICAgcHJvbW90aW9uLnNldERlc2NyaXB0aW9uKHByb21vdGlvbkRUTy5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgcHJvbW90aW9uLnNldFN0YXJ0VGltZShwcm9tb3Rpb25EVE8uZ2V0U3RhcnRUaW1lKCkpOworICAgICAgICBwcm9tb3Rpb24uc2V0RW5kVGltZShwcm9tb3Rpb25EVE8uZ2V0RW5kVGltZSgpKTsKKyAgICAgICAgcHJvbW90aW9uLnNldERpc2NvdW50UGVyY2VudGFnZShwcm9tb3Rpb25EVE8uZ2V0RGlzY291bnRQZXJjZW50YWdlKCkpOworCisgICAgICAgIC8vIOaKikxpc3Q8TG9uZz7ovazmjaLmiJDpgJflj7fliIbpmpTlrZfnrKbkuLIKKyAgICAgICAgU3RyaW5nIGFwcGxpY2FibGVUb3JyZW50SWRzU3RyID0gcHJvbW90aW9uRFRPLmdldEFwcGxpY2FibGVUb3JyZW50SWRzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKFN0cmluZzo6dmFsdWVPZikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisgICAgICAgIHByb21vdGlvbi5zZXRBcHBsaWNhYmxlVG9ycmVudElkcyhhcHBsaWNhYmxlVG9ycmVudElkc1N0cik7CisKKyAgICAgICAgcHJvbW90aW9uLnNldENyZWF0ZVRpbWUobm93KTsKKyAgICAgICAgcHJvbW90aW9uLnNldFVwZGF0ZVRpbWUobm93KTsKKyAgICAgICAgcHJvbW90aW9uLnNldElzRGVsZXRlZChmYWxzZSk7CisKKyAgICAgICAgcHJvbW90aW9uTWFwcGVyLmluc2VydChwcm9tb3Rpb24pOworICAgICAgICByZXR1cm4gcHJvbW90aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFByb21vdGlvbj4gZ2V0QWxsQWN0aXZlUHJvbW90aW9ucygpIHsKKyAgICAgICAgTG9jYWxEYXRlVGltZSBub3cgPSBMb2NhbERhdGVUaW1lLm5vdygpOworICAgICAgICByZXR1cm4gcHJvbW90aW9uTWFwcGVyLmZpbmRBY3RpdmVQcm9tb3Rpb25zKG5vdyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByb21vdGlvbiBnZXRQcm9tb3Rpb25CeUlkKExvbmcgcHJvbW90aW9uSWQpIHsKKyAgICAgICAgUHJvbW90aW9uIHByb21vdGlvbiA9IHByb21vdGlvbk1hcHBlci5zZWxlY3RCeUlkKHByb21vdGlvbklkKTsKKyAgICAgICAgaWYgKHByb21vdGlvbiA9PSBudWxsIHx8IHByb21vdGlvbi5nZXRJc0RlbGV0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb21vdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVByb21vdGlvbihMb25nIHByb21vdGlvbklkKSB7CisgICAgICAgIFByb21vdGlvbiBwcm9tb3Rpb24gPSBnZXRQcm9tb3Rpb25CeUlkKHByb21vdGlvbklkKTsKKyAgICAgICAgaWYgKHByb21vdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi5L+D6ZSA5rS75Yqo5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworICAgICAgICAvLyDova/liKDpmaQKKyAgICAgICAgcHJvbW90aW9uLnNldElzRGVsZXRlZCh0cnVlKTsKKyAgICAgICAgcHJvbW90aW9uLnNldFVwZGF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7CisgICAgICAgIHByb21vdGlvbk1hcHBlci51cGRhdGVCeUlkKHByb21vdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50RGlzY291bnQoTG9uZyB0b3JyZW50SWQpIHsKKyAgICAgICAgTG9jYWxEYXRlVGltZSBub3cgPSBMb2NhbERhdGVUaW1lLm5vdygpOworICAgICAgICBMaXN0PFByb21vdGlvbj4gYWN0aXZlUHJvbW90aW9ucyA9IHByb21vdGlvbk1hcHBlci5maW5kQWN0aXZlUHJvbW90aW9uc0ZvclRvcnJlbnQodG9ycmVudElkLCBub3cpOworCisgICAgICAgIC8vIOWmguaenOacieWkmuS4quS/g+mUgOa0u+WKqO+8jOWPluaKmOaJo+acgOWkp+eahAorICAgICAgICByZXR1cm4gYWN0aXZlUHJvbW90aW9ucy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXBUb0RvdWJsZShQcm9tb3Rpb246OmdldERpc2NvdW50UGVyY2VudGFnZSkKKyAgICAgICAgICAgICAgICAubWF4KCkKKyAgICAgICAgICAgICAgICAub3JFbHNlKDAuMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICog6aqM6K+B56eN5a2QSUTmmK/lkKblrZjlnKgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUb3JyZW50SWRzKExpc3Q8TG9uZz4gdG9ycmVudElkcykgeworICAgICAgICBpZiAodG9ycmVudElkcyA9PSBudWxsIHx8IHRvcnJlbnRJZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi6YCC55So56eN5a2Q5YiX6KGo5LiN6IO95Li656m6Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyDmo4Dmn6XmiYDmnInnp43lrZBJROaYr+WQpumDveWtmOWcqAorICAgICAgICBMaXN0PExvbmc+IGludmFsaWRJZHMgPSB0b3JyZW50SWRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcihpZCAtPiBwcm9tb3Rpb25NYXBwZXIuY2hlY2tUb3JyZW50RXhpc3RzKGlkKSA9PSAwKSAgLy8g5pS55oiQID09IDAKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBpZiAoIWludmFsaWRJZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi5Lul5LiL56eN5a2QSUTkuI3lrZjlnKg6ICIgKyBpbnZhbGlkSWRzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3NlcnZpY2Uvc2VydmljZUltcGwvVG9ycmVudFNlcnZpY2VJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL3NlcnZpY2VJbXBsL1RvcnJlbnRTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGM2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9zZXJ2aWNlL3NlcnZpY2VJbXBsL1RvcnJlbnRTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLnNlcnZpY2VJbXBsOworCitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Ub3JyZW50RW50aXR5OworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuVXNlcjsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QubWFwcGVyLlRvcnJlbnRNYXBwZXI7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlci5Vc2VyTWFwcGVyOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLlRvcnJlbnRTZXJ2aWNlOworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5zZXJ2aWNlLlByb21vdGlvblNlcnZpY2U7CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50UGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5wYXJhbS5Ub3JyZW50VXBsb2FkUGFyYW07CitpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LmR0by5Ub3JyZW50VXBkYXRlRFRPOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNpbXBsZUNsaWVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb24uTWV0YWRhdGFCdWlsZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZWRUb3JyZW50OworaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5jb21tb24uYmFzZS5SZXN1bHQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZWRUb3JyZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuSGV4OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRyYW5zYWN0aW9uLmFubm90YXRpb24uVHJhbnNhY3Rpb25hbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5tdWx0aXBhcnQuTXVsdGlwYXJ0RmlsZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRDb3B5T3B0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxUaW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBUb3JyZW50U2VydmljZUltcGwgaW1wbGVtZW50cyBUb3JyZW50U2VydmljZSB7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVG9ycmVudE1hcHBlciB0b3JyZW50TWFwcGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBUcmFja2VkVG9ycmVudD4gdG9ycmVudFJlZ2lzdHJ5ID0gbmV3IEhhc2hNYXA8PigpOworCisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBVc2VyTWFwcGVyIHVzZXJNYXBwZXI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBQcm9tb3Rpb25TZXJ2aWNlIHByb21vdGlvblNlcnZpY2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgTUlOX1VQTE9BRF9SQVRJTyA9IDAuNTsgLy8g5pyA5bCP5LiK5Lyg5q+U5L6L6KaB5rGCCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUb3JyZW50RW50aXR5PiBzZWFyY2goVG9ycmVudFBhcmFtIHBhcmFtKSB7CisgICAgICAgIHJldHVybiB0b3JyZW50TWFwcGVyLnNlYXJjaChwYXJhbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRvcnJlbnRFbnRpdHkgc2VsZWN0QnlTZWVkSWQoTG9uZyBzZWVkSWQpIHsKKyAgICAgICAgcmV0dXJuIHRvcnJlbnRNYXBwZXIuc2VsZWN0QnlJZChzZWVkSWQpOworICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBzZWVkZXJFeGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIHVwbG9hZFRvcnJlbnQoTXVsdGlwYXJ0RmlsZSBmaWxlLCBUb3JyZW50VXBsb2FkUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIOmqjOivgeeUqOaIt+adg+mZkAorICAgICAgICBVc2VyIHVzZXIgPSB1c2VyTWFwcGVyLnNlbGVjdEJ5SWQocGFyYW0uZ2V0VXBsb2FkZXIoKSk7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCLnlKjmiLfkuI3lrZjlnKgiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgd29ya2luZ0RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgUGF0aCBvcmlnaW5hbERpciA9IFBhdGhzLmdldCh3b3JraW5nRGlyLCAiZGF0YSIsICJmaWxlcyIpOworICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcmllcyhvcmlnaW5hbERpcik7CisgICAgICAgIFBhdGggb3JpZ2luYWxGaWxlUGF0aCA9IG9yaWdpbmFsRGlyLnJlc29sdmUoZmlsZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCkpOworICAgICAgICBGaWxlcy5jb3B5KGZpbGUuZ2V0SW5wdXRTdHJlYW0oKSwgb3JpZ2luYWxGaWxlUGF0aCwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOworCisgICAgICAgIE1ldGFkYXRhQnVpbGRlciBidWlsZGVyID0gbmV3IE1ldGFkYXRhQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZEZpbGUob3JpZ2luYWxGaWxlUGF0aC50b0ZpbGUoKSwgZmlsZS5nZXRPcmlnaW5hbEZpbGVuYW1lKCkpIC8vIOa3u+WKoOWOn+Wni+aWh+S7tgorICAgICAgICAgICAgICAgIC5zZXRUcmFja2VyKCIgIikgLy8g6K6+572uVHJhY2tlcuWcsOWdgAorICAgICAgICAgICAgICAgIC5zZXRQaWVjZUxlbmd0aCg1MTIgKiAxMDI0KSAvLyDliIbniYflpKflsI81MTJLQgorICAgICAgICAgICAgICAgIC5zZXRDb21tZW50KCJHZW5lcmF0ZWQgYnkgUFTnq5kiKQorICAgICAgICAgICAgICAgIC5zZXRDcmVhdGVkQnkoIlBULVNlcnZlciIpOworCisgICAgICAgIC8vIOWkhOeQhuenjeWtkOaWh+S7tgorICAgICAgICBieXRlW10gdG9ycmVudEJ5dGVzID0gZmlsZS5nZXRCeXRlcygpOworICAgICAgICBTdHJpbmcgaW5mb0hhc2ggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5mb0hhc2ggPSBjYWxjdWxhdGVJbmZvSGFzaCh0b3JyZW50Qnl0ZXMpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyDkv53lrZjnp43lrZDmlofku7bliLBkYXRhL3RvcnJlbnRz55uu5b2VCisgICAgICAgIFBhdGggdG9ycmVudERpciA9IFBhdGhzLmdldCh3b3JraW5nRGlyLCAiZGF0YSIsICJ0b3JyZW50cyIpOworICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3Rvcmllcyh0b3JyZW50RGlyKTsKKyAgICAgICAgUGF0aCB0b3JyZW50UGF0aCA9IHRvcnJlbnREaXIucmVzb2x2ZShpbmZvSGFzaCArICIudG9ycmVudCIpOworICAgICAgICBGaWxlcy5jb3B5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0b3JyZW50Qnl0ZXMpLCB0b3JyZW50UGF0aCwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOworCisgICAgICAgIC8vIOazqOWGjOWIsFRyYWNrZXIKKyAgICAgICAgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCA9IFRyYWNrZWRUb3JyZW50LmxvYWQodG9ycmVudFBhdGgudG9GaWxlKCkpOworICAgICAgICB0cmFja2VyLmFubm91bmNlKHRvcnJlbnQpOworCisKKyAgICAgICAgLy8g5byC5q2l5ZCv5Yqo5YGa56eN5a6i5oi356uvCisgICAgICAgIHNlZWRlckV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXJ0U2VlZGluZyh0b3JyZW50UGF0aCwgb3JpZ2luYWxEaXIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBSZXN1bHQuZXJyb3IoIuWBmuenjeWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKworCisKKyAgICAgICAgLy8g5L+d5a2Y56eN5a2Q5L+h5oGvCisgICAgICAgIFRvcnJlbnRFbnRpdHkgZW50aXR5PSBuZXcgVG9ycmVudEVudGl0eSgpOworICAgICAgICBlbnRpdHkuc2V0VXBsb2FkZXIocGFyYW0uZ2V0VXBsb2FkZXIoKSk7CisgICAgICAgIGVudGl0eS5zZXRGaWxlTmFtZShmaWxlLmdldE9yaWdpbmFsRmlsZW5hbWUoKSk7CisgICAgICAgIGVudGl0eS5zZXRTaXplKGZpbGUuZ2V0U2l6ZSgpKTsKKyAgICAgICAgZW50aXR5LnNldENhdGVnb3J5KHBhcmFtLmdldENhdGVnb3J5KCkpOworICAgICAgICBlbnRpdHkuc2V0VGFncyhwYXJhbS5nZXRUYWdzKCkpOworICAgICAgICBlbnRpdHkuc2V0VGl0bGUocGFyYW0uZ2V0VGl0bGUoKSk7CisgICAgICAgIGVudGl0eS5zZXRJbWFnZVVybChwYXJhbS5nZXRJbWFnZVVybCgpKTsKKyAgICAgICAgZW50aXR5LnNldFRvcnJlbnRGaWxlKHRvcnJlbnRCeXRlcyk7CisgICAgICAgIGVudGl0eS5zZXRJbmZvSGFzaChpbmZvSGFzaCk7CisKKyAgICAgICAgdG9ycmVudE1hcHBlci5pbnNlcnQoZW50aXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZVtdIGZldGNoKExvbmcgc2VlZElkLCBTdHJpbmcgcGFzc2tleSkgeworICAgICAgICBUb3JyZW50RW50aXR5IHRvcnJlbnQgPSBzZWxlY3RCeVNlZWRJZChzZWVkSWQpOworICAgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi56eN5a2Q5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gdG9ycmVudEJ5dGVzID0gdG9ycmVudC5nZXRUb3JyZW50RmlsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAxLiDop6PnoIEgLnRvcnJlbnQg5paH5Lu25Li6IE1hcAorICAgICAgICAgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gZGVjb2RlZCA9IEJEZWNvZGVyLmJkZWNvZGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRvcnJlbnRCeXRlcykpLmdldE1hcCgpOworCisgICAgICAgICAgICAvLyAyLiDojrflj5bljp/lp4sgYW5ub3VuY2Ug5a2X5q61CisgICAgICAgICAgICBTdHJpbmcgYW5ub3VuY2UgPSBkZWNvZGVkLmdldCgiYW5ub3VuY2UiKS5nZXRTdHJpbmcoKTsKKworICAgICAgICAgICAgLy8gMy4g5rOo5YWlIHBhc3NrZXkg5YiwIGFubm91bmNlIFVSTAorICAgICAgICAgICAgaWYgKCFhbm5vdW5jZS5jb250YWlucygicGFzc2tleT0iKSkgeworICAgICAgICAgICAgICAgIGFubm91bmNlID0gYW5ub3VuY2UgKyAiP3Bhc3NrZXk9IiArIHBhc3NrZXk7CisgICAgICAgICAgICAgICAgZGVjb2RlZC5wdXQoImFubm91bmNlIiwgbmV3IEJFVmFsdWUoYW5ub3VuY2UpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gNC4g57yW56CB5oiQ5paw55qEIC50b3JyZW50IOaWh+S7tuWtl+iKguaVsOe7hAorICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJFbmNvZGVyLmJlbmNvZGUoZGVjb2RlZCwgb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIuWkhOeQhiB0b3JyZW50IOaWh+S7tuWksei0pSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwKKyAgICBwdWJsaWMgUmVzdWx0IGZhdm9yaXRlKExvbmcgc2VlZElkLCBMb25nIHVzZXJJZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0b3JyZW50TWFwcGVyLmNoZWNrRmF2b3JpdGUoc2VlZElkLCB1c2VySWQpOworICAgICAgICAgICAgaWYgKGV4aXN0cykgeworICAgICAgICAgICAgICAgIHRvcnJlbnRNYXBwZXIucmVtb3ZlRmF2b3JpdGUoc2VlZElkLCB1c2VySWQpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuc3VjY2Vzcygi5Y+W5raI5pS26JeP5oiQ5YqfIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvcnJlbnRNYXBwZXIuYWRkRmF2b3JpdGUoc2VlZElkLCB1c2VySWQpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuc3VjY2Vzcygi5pS26JeP5oiQ5YqfIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKCLlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVRvcnJlbnQoTG9uZyBzZWVkSWQpIHsKKyAgICAgICAgdG9ycmVudE1hcHBlci5kZWxldGVCeUlkKHNlZWRJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFRyYW5zYWN0aW9uYWwKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3JyZW50KExvbmcgc2VlZElkLCBUb3JyZW50VXBkYXRlRFRPIHVwZGF0ZURUTykgeworICAgICAgICBUb3JyZW50RW50aXR5IHRvcnJlbnQgPSBzZWxlY3RCeVNlZWRJZChzZWVkSWQpOworICAgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi56eN5a2Q5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworCisgICAgICAgIHRvcnJlbnQuc2V0RGVzY3JpcHRpb24odXBkYXRlRFRPLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB0b3JyZW50LnNldENhdGVnb3J5KHVwZGF0ZURUTy5nZXRDYXRlZ29yeSgpKTsKKyAgICAgICAgdG9ycmVudC5zZXRUaXRsZSh1cGRhdGVEVE8uZ2V0VGl0bGUoKSk7CisgICAgICAgIHRvcnJlbnQuc2V0VGFncyh1cGRhdGVEVE8uZ2V0VGFncygpKTsKKyAgICAgICAgdG9ycmVudC5zZXRJbWFnZVVybCh1cGRhdGVEVE8uZ2V0SW1hZ2VVcmwoKSk7CisKKyAgICAgICAgdG9ycmVudE1hcHBlci51cGRhdGVCeUlkKHRvcnJlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNhblVzZXJEZWxldGVUb3JyZW50KExvbmcgc2VlZElkLCBMb25nIHVzZXJJZCkgeworICAgICAgICBUb3JyZW50RW50aXR5IHRvcnJlbnQgPSBzZWxlY3RCeVNlZWRJZChzZWVkSWQpOworICAgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyDmo4Dmn6XmmK/lkKbmmK/np43lrZDlj5HluIPogIXmiJbnrqHnkIblkZgKKyAgICAgICAgcmV0dXJuIHRvcnJlbnQuZ2V0VXBsb2FkZXIoKS5lcXVhbHModXNlcklkKSB8fAorICAgICAgICAgICAgICAgIHVzZXJNYXBwZXIuaGFzUm9sZSh1c2VySWQsICJhZG1pbiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNhblVzZXJVcGRhdGVUb3JyZW50KExvbmcgc2VlZElkLCBMb25nIHVzZXJJZCkgeworICAgICAgICByZXR1cm4gY2FuVXNlckRlbGV0ZVRvcnJlbnQoc2VlZElkLCB1c2VySWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrVXNlclVwbG9hZFJhdGlvKExvbmcgdXNlcklkKSB7CisgICAgICAgIFVzZXIgdXNlciA9IHVzZXJNYXBwZXIuc2VsZWN0QnlJZCh1c2VySWQpOworICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyDpmLLmraLpmaTku6Xpm7YKKyAgICAgICAgaWYgKHVzZXIuZ2V0RG93bmxvYWRlZCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZG91YmxlIHVwbG9hZFJhdGlvID0gdXNlci5nZXRVcGxvYWRlZCgpIC8gKGRvdWJsZSkgdXNlci5nZXREb3dubG9hZGVkKCk7CisgICAgICAgIHJldHVybiB1cGxvYWRSYXRpbyA+PSBNSU5fVVBMT0FEX1JBVElPOworICAgIH0KKyAgICAvKioKKyAgICAgKiDlkK/liqjlgZrnp43lrqLmiLfnq68KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRTZWVkaW5nKFBhdGggdG9ycmVudFBhdGgsIFBhdGggZGF0YURpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNsaWVudCBzZWVkZXJDbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KCk7CisgICAgICAgIHNlZWRlckNsaWVudC5kb3dubG9hZFRvcnJlbnQoCisgICAgICAgICAgICAgICAgdG9ycmVudFBhdGgudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBkYXRhRGlyLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgICAgICAvLyDkv53mjIHlgZrnp43nirbmgIHvvIjpmLvloZ7nur/nqIvvvIkKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg2MDAwMCk7IC8vIOavjzYw56eS5qOA5p+l5LiA5qyhCisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgY2FsY3VsYXRlRG93bmxvYWRTaXplKExvbmcgdG9ycmVudElkLCBMb25nIHVzZXJJZCkgeworICAgICAgICBUb3JyZW50RW50aXR5IHRvcnJlbnQgPSBzZWxlY3RCeVNlZWRJZCh0b3JyZW50SWQpOworICAgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigi56eN5a2Q5LiN5a2Y5ZyoIik7CisgICAgICAgIH0KKworICAgICAgICAvLyDojrflj5blvZPliY3mnInmlYjnmoTkv4PplIDmtLvliqgKKyAgICAgICAgZG91YmxlIGRpc2NvdW50ID0gcHJvbW90aW9uU2VydmljZS5nZXRDdXJyZW50RGlzY291bnQodG9ycmVudElkKTsKKworICAgICAgICAvLyDorqHnrpflrp7pmYXkuIvovb3ph48KKyAgICAgICAgcmV0dXJuIHRvcnJlbnQuZ2V0U2l6ZSgpICogKDEgLSBkaXNjb3VudCAvIDEwMC4wKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVHJhbnNhY3Rpb25hbAorICAgIHB1YmxpYyB2b2lkIHJlY29yZERvd25sb2FkKExvbmcgdG9ycmVudElkLCBMb25nIHVzZXJJZCwgZG91YmxlIGRvd25sb2FkU2l6ZSkgeworICAgICAgICAvLyDmm7TmlrDnlKjmiLfkuIvovb3ph48KKyAgICAgICAgdXNlck1hcHBlci5pbmNyZWFzZURvd25sb2FkZWQodXNlcklkLCBkb3dubG9hZFNpemUpOworCisgICAgICAgIC8vIOabtOaWsOenjeWtkOS4i+i9veasoeaVsAorICAgICAgICB0b3JyZW50TWFwcGVyLmluY3JlYXNlRG93bmxvYWRzKHRvcnJlbnRJZCk7CisgICAgfQorICAgIC8qKgorICAgICAqIOiuoeeul+enjeWtkOaWh+S7tueahGluZm9IYXNoCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlSW5mb0hhc2goYnl0ZVtdIHRvcnJlbnREYXRhKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uICB7CisgICAgICAgIE1lc3NhZ2VEaWdlc3Qgc2hhMSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0xIik7CisgICAgICAgIHNoYTEudXBkYXRlKHRvcnJlbnREYXRhKTsKKyAgICAgICAgYnl0ZVtdIGhhc2hCeXRlcyA9IHNoYTEuZGlnZXN0KCk7CisgICAgICAgIHJldHVybiBIZXguZW5jb2RlSGV4U3RyaW5nKGhhc2hCeXRlcyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L3V0aWxzL1Jlc3VsdC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvdXRpbHMvUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzhhMWMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvdXRpbHMvUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotcGFja2FnZSBjb20uZXhhbXBsZS5teXByb2plY3QudXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFJlc3VsdDxUPiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtc2c7Ci0gICAgcHJpdmF0ZSBUIGRhdGE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvZGUoU3RyaW5nIGNvZGUpIHsKLSAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1zZygpIHsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNc2coU3RyaW5nIG1zZykgewotICAgICAgICB0aGlzLm1zZyA9IG1zZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKFQgZGF0YSkgewotICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXN1bHQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3VsdChUIGRhdGEpIHsKLSAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCBzdWNjZXNzKCkgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdDw+KCk7Ci0gICAgICAgIHJlc3VsdC5zZXRDb2RlKCIyMDAiKTsKLSAgICAgICAgcmVzdWx0LnNldE1zZygi5oiQ5YqfIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyA8VD4gUmVzdWx0PFQ+IHN1Y2Nlc3MoVCBkYXRhKSB7Ci0gICAgICAgIFJlc3VsdDxUPiByZXN1bHQgPSBuZXcgUmVzdWx0PD4oZGF0YSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDb2RlKCIyMDAiKTsKLSAgICAgICAgcmVzdWx0LnNldE1zZygi5oiQ5YqfIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3VsdDxUPiBzdWNjZXNzKFN0cmluZyBtc2cpIHsKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICAgICAgcmVzdWx0LnNldENvZGUoIjIwMCIpOwotICAgICAgICByZXN1bHQuc2V0TXNnKCLmiJDlip8iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBSZXN1bHQ8VD4gc3VjY2VzcyhUIGRhdGEsU3RyaW5nIG1zZykgewotICAgICAgICBSZXN1bHQ8VD4gcmVzdWx0ID0gbmV3IFJlc3VsdDw+KGRhdGEpOwotICAgICAgICByZXN1bHQuc2V0Q29kZSgiMjAwIik7Ci0gICAgICAgIHJlc3VsdC5zZXRNc2cobXNnKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCBlcnJvcihTdHJpbmcgY29kZSwgU3RyaW5nIG1zZykgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0Q29kZShjb2RlKTsKLSAgICAgICAgcmVzdWx0LnNldE1zZyhtc2cpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAvKioKLSAgICAgKiDliJvlu7rkuIDkuKrooajnpLrmlofku7blpKflsI/otoXlh7rpmZDliLbnmoTnu5Pmnpzlr7nosaHjgIIKLSAgICAgKgotICAgICAqIEByZXR1cm4g5p6E6YCg55qE5paH5Lu26L+H5aSn6ZSZ6K+v57uT5p6c5a+56LGhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXN1bHQgZmlsZVRvb0xhcmdlKCkgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0Q29kZSgiNDEzIik7Ci0gICAgICAgIHJlc3VsdC5zZXRNc2coIuaWh+S7tuWkp+Wwj+i2heWHuumZkOWItuOAgiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIOWIm+W7uuS4gOS4quihqOekuuaWh+S7tuagvOW8j+S4jeaUr+aMgeeahOe7k+aenOWvueixoeOAggotICAgICAqCi0gICAgICogQHJldHVybiDmnoTpgKDnmoTmlofku7bmoLzlvI/plJnor6/nu5Pmnpzlr7nosaEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCB1bnN1cHBvcnRlZEZpbGVUeXBlKCkgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0Q29kZSgiNDE1Iik7Ci0gICAgICAgIHJlc3VsdC5zZXRNc2coIuS4jeaUr+aMgeeahOaWh+S7tuagvOW8j+OAgiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIOWIm+W7uuS4gOS4quihqOekuuaWh+S7tuacquaJvuWIsOeahOe7k+aenOWvueixoeOAggotICAgICAqCi0gICAgICogQHJldHVybiDmnoTpgKDnmoTmlofku7bmnKrmib7liLDplJnor6/nu5Pmnpzlr7nosaEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCBmaWxlTm90Rm91bmQoKSB7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0gICAgICAgIHJlc3VsdC5zZXRDb2RlKCI0MDQiKTsKLSAgICAgICAgcmVzdWx0LnNldE1zZygi5paH5Lu25pyq5om+5Yiw44CCIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICog5Yib5bu65LiA5Liq6KGo56S65paH5Lu25a2Y5YKo6ZSZ6K+v55qE57uT5p6c5a+56LGh44CCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXJyb3JNc2cg6K+m57uG6ZSZ6K+v5L+h5oGvCi0gICAgICogQHJldHVybiDmnoTpgKDnmoTmlofku7blrZjlgqjplJnor6/nu5Pmnpzlr7nosaEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCBmaWxlU3RvcmFnZUVycm9yKFN0cmluZyBlcnJvck1zZykgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0Q29kZSgiNTAwIik7Ci0gICAgICAgIHJlc3VsdC5zZXRNc2coIuaWh+S7tuWtmOWCqOmUmeivrzogIiArIGVycm9yTXNnKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc3VsdCBwZXJtaXNzaW9uRGVuaWVkKCkgewotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgICAgICByZXN1bHQuc2V0Q29kZSgiNDAxIik7Ci0gICAgICAgIHJlc3VsdC5zZXRNc2coIuadg+mZkOS4jei2s++8jOaXoOazleaJp+ihjOivpeaTjeS9nOOAgiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMgYi9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcwppbmRleCBiNzUzZGE3Li4wNTkwMzMzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcworKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcwpAQCAtMTksMyArMTksMTMgQEAKIHNwcmluZy5qcGEuZW5hYmxlZD1mYWxzZQogc3ByaW5nLmpwYS5oaWJlcm5hdGUuZGRsLWF1dG89bm9uZQogc3ByaW5nLmpwYS5vcGVuLWluLXZpZXc9ZmFsc2UKKworIyB0cmFja2VyPz8KK3B0LnRyYWNrZXIucG9ydD02OTY5CisKK3B0LnRyYWNrZXIudG9ycmVudC1kaXI9JHt1c2VyLmRpcn0vZGF0YS90b3JyZW50cworCitwdC50cmFja2VyLmFsbG93LWZvcmVpZ249ZmFsc2UKK3B0LnRyYWNrZXIuYW5ub3VuY2UtdXJsPS9jdXN0b20tYW5ub3VuY2UKKworbXliYXRpcy1wbHVzLm1hcHBlci1sb2NhdGlvbnM9Y2xhc3NwYXRoOi9tYXBwZXIvKiovKi54bWwKZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9maWxlcy9maWxlcy50b3JyZW50IGIvc3JjL21haW4vcmVzb3VyY2VzL2ZpbGVzL2ZpbGVzLnRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0OTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9maWxlcy9maWxlcy50b3JyZW50CkBAIC0wLDAgKzEgQEAKK2Q4OmFubm91bmNlMjI6aHR0cHM6Ly90cmFja2VyLmJ5ci5wdDEwOmNyZWF0ZWQgYnkyMTpxQml0dG9ycmVudCB2NC41LjMuMTAxMzpjcmVhdGlvbiBkYXRlaTE3NDc3MTc5MDFlNDppbmZvZDU6ZmlsZXNsZDY6bGVuZ3RoaTE3M2U0OnBhdGhsMTM6dmFsaWQudG9ycmVudGVlZTQ6bmFtZTU6ZmlsZXMxMjpwaWVjZSBsZW5ndGhpMTYzODRlNjpwaWVjZXMyMDov8e3oRfQ14zzy+x/s1YSfUaGW+2VlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9GYXZvcml0ZU1hcHBlci54bWwgYi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL0Zhdm9yaXRlTWFwcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ4ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9GYXZvcml0ZU1hcHBlci54bWwKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIG1hcHBlciBQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisgICAgICAgICJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKzxtYXBwZXIgbmFtZXNwYWNlPSJjb20uZXhhbXBsZS5teXByb2plY3QubWFwcGVyLkZhdm9yaXRlTWFwcGVyIj4KKyAKKzwvbWFwcGVyPgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9Qcm9tb3Rpb25NYXBwZXIueG1sIGIvc3JjL21haW4vcmVzb3VyY2VzL21hcHBlci9Qcm9tb3Rpb25NYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmZkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL1Byb21vdGlvbk1hcHBlci54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBtYXBwZXIgUFVCTElDICItLy9teWJhdGlzLm9yZy8vRFREIE1hcHBlciAzLjAvL0VOIgorICAgICAgICAiaHR0cDovL215YmF0aXMub3JnL2R0ZC9teWJhdGlzLTMtbWFwcGVyLmR0ZCI+Cis8bWFwcGVyIG5hbWVzcGFjZT0iY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlci5Qcm9tb3Rpb25NYXBwZXIiPgorCisgICAgPGluc2VydCBpZD0iaW5zZXJ0IiBwYXJhbWV0ZXJUeXBlPSJjb20uZXhhbXBsZS5teXByb2plY3QuZW50aXR5LlByb21vdGlvbiI+CisgICAgICAgIElOU0VSVCBJTlRPIHByb21vdGlvbiAoCisgICAgICAgIG5hbWUsIGRlc2NyaXB0aW9uLCBzdGFydF90aW1lLCBlbmRfdGltZSwgZGlzY291bnRfcGVyY2VudGFnZSwgYXBwbGljYWJsZV90b3JyZW50X2lkcworICAgICAgICApIFZBTFVFUyAoCisgICAgICAgICN7bmFtZX0sICN7ZGVzY3JpcHRpb259LCAje3N0YXJ0VGltZX0sICN7ZW5kVGltZX0sICN7ZGlzY291bnRQZXJjZW50YWdlfSwgI3thcHBsaWNhYmxlVG9ycmVudElkc30KKyAgICAgICAgKQorICAgIDwvaW5zZXJ0PgorCis8L21hcHBlcj4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwZXIvVG9ycmVudE1hcHBlci54bWwgYi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL1RvcnJlbnRNYXBwZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvbWFwcGVyL1RvcnJlbnRNYXBwZXIueG1sCkBAIC0wLDAgKzEsMTA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIG1hcHBlciBQVUJMSUMgIi0vL215YmF0aXMub3JnLy9EVEQgTWFwcGVyIDMuMC8vRU4iCisgICAgICAgICJodHRwOi8vbXliYXRpcy5vcmcvZHRkL215YmF0aXMtMy1tYXBwZXIuZHRkIj4KKworPG1hcHBlciBuYW1lc3BhY2U9ImNvbS5leGFtcGxlLm15cHJvamVjdC5tYXBwZXIuVG9ycmVudE1hcHBlciI+CisgICAgPHJlc3VsdE1hcCBpZD0iQmFzZVJlc3VsdE1hcCIgdHlwZT0iY29tLmV4YW1wbGUubXlwcm9qZWN0LmVudGl0eS5Ub3JyZW50RW50aXR5Ij4KKyAgICAgICAgPGlkIGNvbHVtbj0iaW5mb19oYXNoIiBwcm9wZXJ0eT0iaW5mb0hhc2giLz4KKyAgICAgICAgPHJlc3VsdCBjb2x1bW49ImZpbGVfbmFtZSIgcHJvcGVydHk9ImZpbGVOYW1lIi8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJ1cGxvYWRlciIgcHJvcGVydHk9InVwbG9hZGVyIi8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJ1cGxvYWRfdGltZSIgcHJvcGVydHk9InVwbG9hZFRpbWUiLz4KKyAgICAgICAgPHJlc3VsdCBjb2x1bW49InNpemUiIHByb3BlcnR5PSJzaXplIi8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJ0aXRsZSIgcHJvcGVydHk9InRpdGxlIi8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJkZXNjcmlwdGlvbiIgcHJvcGVydHk9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJjYXRlZ29yeSIgcHJvcGVydHk9ImNhdGVnb3J5Ii8+CisgICAgICAgIDxyZXN1bHQgY29sdW1uPSJpbWFnZV91cmwiIHByb3BlcnR5PSJpbWFnZVVybCIvPgorICAgIDwvcmVzdWx0TWFwPgorCisgICAgPHNlbGVjdCBpZD0ic2VsZWN0QnlJbmZvSGFzaCIgcmVzdWx0TWFwPSJCYXNlUmVzdWx0TWFwIj4KKyAgICAgICAgU0VMRUNUICogRlJPTSB0b3JyZW50IFdIRVJFIGluZm9faGFzaCA9ICN7aW5mb0hhc2h9CisgICAgPC9zZWxlY3Q+CisgICAgPHNlbGVjdCBpZD0ic2VsZWN0QnlTZWVkSWQiIHJlc3VsdE1hcD0iQmFzZVJlc3VsdE1hcCI+CisgICAgICAgIFNFTEVDVCAqIEZST00gdG9ycmVudCBXSEVSRSBzZWVkX2lkID0gI3tzZWVkSWR9CisgICAgPC9zZWxlY3Q+CisKKworCisKKyAgICA8dXBkYXRlIGlkPSJ1cGRhdGUiIHBhcmFtZXRlclR5cGU9ImNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuVG9ycmVudEVudGl0eSI+CisgICAgICAgIFVQREFURSB0b3JyZW50CisgICAgICAgIFNFVCBmaWxlX25hbWUgPSAje2ZpbGVOYW1lfSwKKyAgICAgICAgdXBsb2FkZXIgPSAje3VwbG9hZGVyfSwKKyAgICAgICAgdXBsb2FkX3RpbWUgPSAje3VwbG9hZFRpbWV9LAorICAgICAgICBzaXplID0gI3tzaXplfSwKKyAgICAgICAgdGl0bGUgPSAje3RpdGxlfSwKKyAgICAgICAgZGVzY3JpcHRpb24gPSAje2Rlc2NyaXB0aW9ufSwKKyAgICAgICAgY2F0ZWdvcnkgPSAje2NhdGVnb3J5fSwKKyAgICAgICAgaW1hZ2VfdXJsID0gI3tpbWFnZVVybH0KKyAgICAgICAgV0hFUkUgaW5mb19oYXNoID0gI3tpbmZvSGFzaH0KKyAgICA8L3VwZGF0ZT4KKyAgICA8c2VsZWN0IGlkPSJzZWFyY2giIHJlc3VsdFR5cGU9ImNvbS5leGFtcGxlLm15cHJvamVjdC5lbnRpdHkuVG9ycmVudEVudGl0eSI+CisgICAgICAgIFNFTEVDVCAqIEZST00gdG9ycmVudAorICAgICAgICA8d2hlcmU+CisgICAgICAgICAgICA8aWYgdGVzdD0icGFyYW0uY2F0ZWdvcnkgIT0gbnVsbCI+CisgICAgICAgICAgICAgICAgQU5EIGNhdGVnb3J5ID0gI3twYXJhbS5jYXRlZ29yeX0KKyAgICAgICAgICAgIDwvaWY+CisKKyAgICAgICAgICAgIDwhLS0gICAgICAgIDxpZiB0ZXN0PSJwYXJhbS5mcmVlICE9IG51bGwgYW5kIHBhcmFtLmZyZWUgIT0gJyciPi0tPgorICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIEFORCBmcmVlID0gI3twYXJhbS5mcmVlfS0tPgorICAgICAgICAgICAgPCEtLSAgICAgICAgPC9pZj4tLT4KKyAgICAgICAgICAgIDxpZiB0ZXN0PSJwYXJhbS5mcmVlICE9IG51bGwiPgorICAgICAgICAgICAgPGNob29zZT4KKyAgICAgICAgICAgICAgICA8IS0tIOetm+mAieKAnOato+WcqOS/g+mUgOS4reKAneeahOenjeWtkCAtLT4KKyAgICAgICAgICAgICAgICA8d2hlbiB0ZXN0PSJwYXJhbS5mcmVlID09IHRydWUiPgorICAgICAgICAgICAgICAgICAgICBBTkQgRVhJU1RTICgKKyAgICAgICAgICAgICAgICAgICAgU0VMRUNUIDEgRlJPTSBwcm9tb3Rpb24gcAorICAgICAgICAgICAgICAgICAgICBXSEVSRQorICAgICAgICAgICAgICAgICAgICBKU09OX0NPTlRBSU5TKHAuYXBwbGljYWJsZV90b3JyZW50X2lkcywgSlNPTl9BUlJBWSh0LmlkKSkKKyAgICAgICAgICAgICAgICAgICAgQU5EIE5PVygpIEJFVFdFRU4gcC5zdGFydF90aW1lIEFORCBwLmVuZF90aW1lCisgICAgICAgICAgICAgICAgICAgIEFORCBwLmlzX2RlbGV0ZWQgPSAwCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICA8L3doZW4+CisgICAgICAgICAgICAgICAgPCEtLSDnrZvpgInigJzmnKrlnKjkv4PplIDkuK3igJ3nmoTnp43lrZAgLS0+CisgICAgICAgICAgICAgICAgPG90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgQU5EIE5PVCBFWElTVFMgKAorICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgMSBGUk9NIHByb21vdGlvbiBwCisgICAgICAgICAgICAgICAgICAgIFdIRVJFCisgICAgICAgICAgICAgICAgICAgIEpTT05fQ09OVEFJTlMocC5hcHBsaWNhYmxlX3RvcnJlbnRfaWRzLCBKU09OX0FSUkFZKHQuaWQpKQorICAgICAgICAgICAgICAgICAgICBBTkQgTk9XKCkgQkVUV0VFTiBwLnN0YXJ0X3RpbWUgQU5EIHAuZW5kX3RpbWUKKyAgICAgICAgICAgICAgICAgICAgQU5EIHAuaXNfZGVsZXRlZCA9IDAKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIDwvb3RoZXJ3aXNlPgorICAgICAgICAgICAgPC9jaG9vc2U+CisgICAgICAgICAgICA8L2lmPgorCisgICAgICAgICAgICA8aWYgdGVzdD0icGFyYW0ubGlrZUV4cHJlc3Npb25zICE9IG51bGwgYW5kIHBhcmFtLmxpa2VFeHByZXNzaW9ucy5zaXplID4gMCI+CisgICAgICAgICAgICAgICAgQU5EICgKKyAgICAgICAgICAgICAgICA8Zm9yZWFjaCBjb2xsZWN0aW9uPSJwYXJhbS5saWtlRXhwcmVzc2lvbnMiIGl0ZW09Iml0ZW0iIG9wZW49IigiIHNlcGFyYXRvcj0iIEFORCAiIGNsb3NlPSIpIj4KKworICAgICAgICAgICAgICAgICAgICAoIHRpdGxlIExJS0UgQ09OQ0FUKCclJywgI3tpdGVtfSwgJyUnKSApIG9yICggZGVzY3JpcHRpb24gTElLRSBDT05DQVQoJyUnLCAje2l0ZW19LCAnJScpICkgb3IgKCB0YWdzIExJS0UgQ09OQ0FUKCclJywgI3tpdGVtfSwgJyUnKSApCisgICAgICAgICAgICAgICAgPC9mb3JlYWNoPgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIDwvaWY+CisgICAgICAgIDwvd2hlcmU+CisKKyAgICAgICAgPGlmIHRlc3Q9InBhcmFtLnByb3AgIT0gbnVsbCBhbmQgcGFyYW0uc29ydCAhPSBudWxsIj4KKyAgICAgICAgICAgIE9SREVSIEJZICR7cGFyYW0ucHJvcH0gJHtwYXJhbS5zb3J0fQorICAgICAgICA8L2lmPgorICAgIDwvc2VsZWN0PgorICAgIDxzZWxlY3QgaWQ9ImNoZWNrRmF2b3JpdGUiIHJlc3VsdFR5cGU9ImJvb2xlYW4iPgorICAgICAgICBTRUxFQ1QgQ09VTlQoKikgPiAwCisgICAgICAgIEZST00gZmF2b3JpdGUKKyAgICAgICAgV0hFUkUgc2VlZF9pZCA9ICN7c2VlZElkfSBBTkQgdXNlcl9pZCA9ICN7dXNlcklkfQorICAgIDwvc2VsZWN0PgorICAgIDxpbnNlcnQgaWQ9ImFkZEZhdm9yaXRlIj4KKyAgICAgICAgSU5TRVJUIElOVE8gZmF2b3JpdGUgKHNlZWRfaWQsIHVzZXJfaWQpCisgICAgICAgIFZBTFVFUyAoI3tzZWVkSWR9LCAje3VzZXJJZH0pCisgICAgPC9pbnNlcnQ+CisgICAgPGRlbGV0ZSBpZD0icmVtb3ZlRmF2b3JpdGUiPgorICAgICAgICBERUxFVEUgRlJPTSBmYXZvcml0ZQorICAgICAgICBXSEVSRSBzZWVkX2lkID0gI3tzZWVkSWR9IEFORCB1c2VyX2lkID0gI3t1c2VySWR9CisgICAgPC9kZWxldGU+CisKKworPC9tYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vcmVzb3VyY2VzL291dHB1dC92YWxpZC50b3JyZW50IGIvc3JjL21haW4vcmVzb3VyY2VzL291dHB1dC92YWxpZC50b3JyZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTBlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3V0cHV0L3ZhbGlkLnRvcnJlbnQKQEAgLTAsMCArMSBAQAorZDEwOmNyZWF0ZWQgYnkxODpxQml0dG9ycmVudCB2NS4xLjAxMzpjcmVhdGlvbiBkYXRlaTE3NDU5NDg5OTVlNDppbmZvZDY6bGVuZ3RoaTIyZTQ6bmFtZTE1OmV4YW1wbGUudG9ycmVudDEyOnBpZWNlIGxlbmd0aGkxNjM4NGU2OnBpZWNlczIwOkZuHvC2Gin6PMcJjgbmwmgUo3RsNzpwcml2YXRlaTFlZWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb250cm9sbGVyL1RvcnJlbnRDb250cm9sbGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Vc2VyQ29udHJvbGxlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvY29tL2V4YW1wbGUvbXlwcm9qZWN0L2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggOGEwOWU1My4uZDMzMmYzMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9jb20vZXhhbXBsZS9teXByb2plY3QvY29udHJvbGxlci9Vc2VyQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL2NvbS9leGFtcGxlL215cHJvamVjdC9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyVGVzdC5qYXZhCkBAIC02LDEzICs2LDEyIEBACiBpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LnNlcnZpY2UuVXNlclNlcnZpY2U7CiBpbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0Lm1hcHBlci5Vc2VyTWFwcGVyOwogaW1wb3J0IGNvbS5leGFtcGxlLm15cHJvamVjdC5tYXBwZXIuVmVyaWZpY2F0aW9uVG9rZW5NYXBwZXI7Ci1pbXBvcnQgY29tLmV4YW1wbGUubXlwcm9qZWN0LnV0aWxzLlJlc3VsdDsKK2ltcG9ydCBjb20uZXhhbXBsZS5teXByb2plY3QuY29tbW9uLmJhc2UuUmVzdWx0OwogaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOwogaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwogaW1wb3J0IG9yZy5tb2NraXRvLio7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLlJlc3BvbnNlRW50aXR5OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uQXV0aGVudGljYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuYXV0aGVudGljYXRpb24uVXNlcm5hbWVQYXNzd29yZEF1dGhlbnRpY2F0aW9uVG9rZW47CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zZWN1cml0eS5jb3JlLkF1dGhlbnRpY2F0aW9uOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc2VjdXJpdHkuY29yZS5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKIAo=