ZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IGExOTIxZDYuLjdiNjViMDUgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtNTEsNiArNTEsNyBAQAogICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXliYXRpcy1wbHVzLXNwcmluZy1ib290My1zdGFydGVyPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHZlcnNpb24+My41LjEwLjE8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KKwogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmNvbS5iYW9taWRvdTwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15YmF0aXMtcGx1cy1qc3FscGFyc2VyPC9hcnRpZmFjdElkPgpAQCAtMTI1LDYgKzEyNiwyNCBAQAogICAgICAgICAgICAgPHZlcnNpb24+Mi45LjA8L3ZlcnNpb24+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KIAorICAgICAgICA8IS0tdHJhY2tlciDphY3nva4tLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRyYWNrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWJlbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKwogICAgIDwvZGVwZW5kZW5jaWVzPgogCiAgICAgPGJ1aWxkPgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29uZmlnL1dlYkNvbmZpZy5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29uZmlnL1dlYkNvbmZpZy5qYXZhCmluZGV4IGQwZmRiOGUuLmJiODE2MzEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbmZpZy9XZWJDb25maWcuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb25maWcvV2ViQ29uZmlnLmphdmEKQEAgLTE4LDQgKzE4LDQgQEAKICAgICAgICAgICAgICAgICAuYWxsb3dDcmVkZW50aWFscyh0cnVlKTsgIC8vIOaYr+WQpuWFgeiuuOaQuuW4puWHreivgQogCiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvSW52aXRlQ29kZUNvbnRyb2xsZXIuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvSW52aXRlQ29kZUNvbnRyb2xsZXIuamF2YQppbmRleCBjZjQ4MmM2Li40YTRlNjI1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL0ludml0ZUNvZGVDb250cm9sbGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9JbnZpdGVDb2RlQ29udHJvbGxlci5qYXZhCkBAIC0xLDQgKzEsNTggQEAKIHBhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CiAKKworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuSU5WSVRFX0NPREU7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5VU0VSOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuSW52aXRlQ29kZU1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlVzZXJNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLkp3dFV0aWxzOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS51dGlscy5SZXN1bHQ7CitpbXBvcnQgamFrYXJ0YS5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGpha2FydGEuc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitAUmVzdENvbnRyb2xsZXIKK0BSZXF1ZXN0TWFwcGluZygiL2ludml0ZWNvZGUiKQogcHVibGljIGNsYXNzIEludml0ZUNvZGVDb250cm9sbGVyIHsKKyAgICAvL21hcHBlcuWSjGNvbnRyb2xsZXIKKyAgICBAUmVzb3VyY2UKKyAgICBwcml2YXRlIEludml0ZUNvZGVNYXBwZXIgaW52aXRlQ29kZU1hcHBlcjsKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBVc2VyTWFwcGVyIHVzZXJNYXBwZXI7CisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgVXNlckNvbnRyb2xsZXIgdXNlckNvbnRyb2xsZXI7CisKKyAgICAvL+S9v+eUqOmtlOWKm+WAvOWFkeaNoumCgOivt+eggQorICAgIEBQb3N0TWFwcGluZygiL2dlbmVyYXRlIikKKyAgICBwdWJsaWMgUmVzdWx0IGdlbmVyYXRlSW52aXRlQ29kZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBVU0VSIHVzZXIgPSB1c2VyQ29udHJvbGxlci5nZXRVc2VySW5SZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odXNlci5nZXRNYWdpY1BvaW50cygpKTsKKyAgICAgICAgaWYgKHVzZXIuZ2V0TWFnaWNQb2ludHMoKSA+PSAxMCkgeworICAgICAgICAgICAgdXNlci5nZW5lcmF0ZUludml0ZUNvZGUoKTsKKyAgICAgICAgICAgIElOVklURV9DT0RFIGludml0ZUNvZGUgPSBuZXcgSU5WSVRFX0NPREUodXNlci5nZXRVc2VybmFtZSgpKTsKKworICAgICAgICAgICAgaW52aXRlQ29kZU1hcHBlci5pbnNlcnRJbnZpdGVDb2RlKGludml0ZUNvZGUpOworICAgICAgICAgICAgdXNlck1hcHBlci51cGRhdGVVc2VyKHVzZXIpOworCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgiaW52aXRlQ29kZSIsIGludml0ZUNvZGUpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi5YWR5o2i6YKA6K+356CB5aSx6LSl77yM6a2U5Yqb5YC85LiN6Laz44CCIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8v55So5oi36I635Y+W5oyB5pyJ55qE6YKA6K+356CBCisgICAgQEdldE1hcHBpbmcoIi91c2VySW52aXRlQ29kZSIpCisgICAgcHVibGljIFJlc3VsdCB1c2VySW52aXRlQ29kZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBVU0VSIHVzZXIgPSB1c2VyQ29udHJvbGxlci5nZXRVc2VySW5SZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgIExpc3Q8SU5WSVRFX0NPREU+IGludml0ZUNvZGUgPSBpbnZpdGVDb2RlTWFwcGVyLnNlbGVjdEJ5VXNlcih1c2VyLmdldFVzZXJuYW1lKCkpOworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgiaW52aXRlQ29kZSIsIGludml0ZUNvZGUpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Ub3JyZW50Q29udHJvbGxlci5qYXZhCmluZGV4IDNjNzFiYTEuLjQzNmVjZGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1RvcnJlbnRDb250cm9sbGVyLmphdmEKQEAgLTEsMTIxICsxLDM1OSBAQAotcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uY29udHJvbGxlcjsNCi0NCi1pbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy5xdWVyeS5RdWVyeVdyYXBwZXI7DQotaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVG9ycmVudENvbW1lbnQ7DQotaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVG9ycmVudDsNCi1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuVG9ycmVudENvbW1lbnRTZXJ2aWNlOw0KLWltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5Ub3JyZW50U2VydmljZTsNCi1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsNCi1pbXBvcnQgbG9tYm9rLkFsbEFyZ3NDb25zdHJ1Y3RvcjsNCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7DQotaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLm1ldGFkYXRhLklQYWdlOw0KLWltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnBsdWdpbnMucGFnaW5hdGlvbi5QYWdlOw0KLQ0KLWltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLUBSZXN0Q29udHJvbGxlcg0KLUBSZXF1ZXN0TWFwcGluZygiL3RvcnJlbnQiKQ0KLUBBbGxBcmdzQ29uc3RydWN0b3INCi1wdWJsaWMgY2xhc3MgVG9ycmVudENvbnRyb2xsZXIgew0KLSAgICBwcml2YXRlIGZpbmFsIFRvcnJlbnRTZXJ2aWNlIHBvc3RTZXJ2aWNlOw0KLSAgICBwcml2YXRlIGZpbmFsIFRvcnJlbnRDb21tZW50U2VydmljZSBjb21tZW50U2VydmljZTsNCi0NCi0gICAgLy8g5Yib5bu65biW5a2QDQotICAgIEBQb3N0TWFwcGluZw0KLSAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZVRvcnJlbnQoQFJlcXVlc3RCb2R5IFRvcnJlbnQgdG9ycmVudCkgew0KLSAgICAgICAgcG9zdFNlcnZpY2Uuc2F2ZSh0b3JyZW50KTsNCi0gICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJwb3N0IiwgdG9ycmVudCk7DQotICAgIH0NCi0NCi0gICAgLy8g5YiX6KGo5YiG6aG1DQotICAgIEBHZXRNYXBwaW5nDQotICAgIHB1YmxpYyBSZXN1bHQgbGlzdFBvc3RzKEBSZXF1ZXN0UGFyYW0oZGVmYXVsdFZhbHVlID0gIjEiKSBpbnQgcGFnZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbShkZWZhdWx0VmFsdWUgPSAiNSIpIGludCBzaXplKSB7DQotICAgICAgICBJUGFnZTxUb3JyZW50PiBpcGFnZSA9IHBvc3RTZXJ2aWNlLnBhZ2UoDQotICAgICAgICAgICAgICAgIG5ldyBQYWdlPD4ocGFnZSwgc2l6ZSksDQotICAgICAgICAgICAgICAgIG5ldyBRdWVyeVdyYXBwZXI8VG9ycmVudD4oKS5vcmRlckJ5RGVzYygiY3JlYXRlX3RpbWUiKQ0KLSAgICAgICAgKTsNCi0gICAgICAgIHJldHVybiBSZXN1bHQub2soKQ0KLSAgICAgICAgICAgICAgICAuZGF0YSgicmVjb3JkcyIsIGlwYWdlLmdldFJlY29yZHMoKSkNCi0gICAgICAgICAgICAgICAgLmRhdGEoInRvdGFsIiwgaXBhZ2UuZ2V0VG90YWwoKSk7DQotICAgIH0NCi0NCi0gICAgQEdldE1hcHBpbmcoIi97SWR9IikNCi0gICAgcHVibGljIFJlc3VsdCBnZXRQb3N0KEBQYXRoVmFyaWFibGUgaW50IElkKSB7DQotICAgICAgICBUb3JyZW50IHRvcnJlbnQgPSBwb3N0U2VydmljZS5nZXRCeUlkKElkKTsNCi0gICAgICAgIGlmICh0b3JyZW50ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi56eN5a2Q5LiN5a2Y5ZyoIik7IC8vIOaYjuehruiuvue9rjQwNOeKtuaAgeeggQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8g6I635Y+W5omA5pyJ6K+E6K6677yI5oyJ5Yib5bu65pe26Ze05o6S5bqP77yJDQotICAgICAgICBMaXN0PFRvcnJlbnRDb21tZW50PiBhbGxDb21tZW50cyA9IGNvbW1lbnRTZXJ2aWNlLmxpc3QoDQotICAgICAgICAgICAgICAgIG5ldyBRdWVyeVdyYXBwZXI8VG9ycmVudENvbW1lbnQ+KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXEoInBvc3RfaWQiLCBJZCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAub3JkZXJCeUFzYygiY3JlYXRlX3RpbWUiKQ0KLSAgICAgICAgKTsNCi0NCi0gICAgICAgIC8vIOaehOW7uuivhOiuuuagkeW9oue7k+aehA0KLSAgICAgICAgTGlzdDxUb3JyZW50Q29tbWVudD4gcm9vdENvbW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7DQotICAgICAgICBNYXA8SW50ZWdlciwgVG9ycmVudENvbW1lbnQ+IGNvbW1lbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7DQotDQotICAgICAgICAvLyDnrKzkuIDpgY3vvJrliJ3lp4vljJbmiYDmnInor4TorrrliLBtYXDkuK0NCi0gICAgICAgIGZvciAoVG9ycmVudENvbW1lbnQgY29tbWVudCA6IGFsbENvbW1lbnRzKSB7DQotICAgICAgICAgICAgY29tbWVudC5zZXRSZXBsaWVzKG5ldyBBcnJheUxpc3Q8PigpKTsgLy8g5Yid5aeL5YyWcmVwbGllc+WIl+ihqA0KLSAgICAgICAgICAgIGNvbW1lbnRNYXAucHV0KGNvbW1lbnQuZ2V0SWQoKSwgY29tbWVudCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyDnrKzkuozpgY3vvJrmnoTlu7rniLblrZDlhbPns7sNCi0gICAgICAgIGZvciAoVG9ycmVudENvbW1lbnQgY29tbWVudCA6IGFsbENvbW1lbnRzKSB7DQotICAgICAgICAgICAgaWYgKGNvbW1lbnQuZ2V0UGFyZW50SWQoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHJvb3RDb21tZW50cy5hZGQoY29tbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgVG9ycmVudENvbW1lbnQgcGFyZW50ID0gY29tbWVudE1hcC5nZXQoY29tbWVudC5nZXRQYXJlbnRJZCgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0UmVwbGllcygpLmFkZChjb21tZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBSZXN1bHQub2soKQ0KLSAgICAgICAgICAgICAgICAuZGF0YSgidG9ycmVudCIsIHRvcnJlbnQpDQotICAgICAgICAgICAgICAgIC5kYXRhKCJjb21tZW50cyIsIHJvb3RDb21tZW50cyk7DQotICAgIH0NCi0NCi0gICAgLy8g54K56LWe5biW5a2QDQotICAgIEBQb3N0TWFwcGluZygiL3tJZH0vbGlrZSIpDQotICAgIHB1YmxpYyBSZXN1bHQgbGlrZVBvc3QoQFBhdGhWYXJpYWJsZSBpbnQgSWQpIHsNCi0gICAgICAgIHBvc3RTZXJ2aWNlLmluY3JlbWVudExpa2UoSWQpOw0KLSAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpOw0KLSAgICB9DQotDQotICAgIEBQb3N0TWFwcGluZygiL3tJZH0vY29tbWVudHMiKQ0KLSAgICBwdWJsaWMgUmVzdWx0IGNvbW1lbnQoQFBhdGhWYXJpYWJsZSBpbnQgSWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBAUmVxdWVzdEJvZHkgVG9ycmVudENvbW1lbnQgY29tbWVudCkgew0KLSAgICAgICAgLy8g6K6+572u6K+E6K665L+h5oGvDQotICAgICAgICBjb21tZW50LnNldFBvc3RJZChJZCk7DQotICAgICAgICBjb21tZW50LnNldENyZWF0ZVRpbWUoTG9jYWxEYXRlVGltZS5ub3coKSk7DQotICAgICAgICBjb21tZW50LnNldExpa2VDb3VudCgwKTsgLy8g5Yid5aeL5YyW54K56LWe5pWwDQotICAgICAgICBjb21tZW50LnNldFBhcmVudElkKDApOyAgLy8g6buY6K6k54i26K+E6K66SUQNCi0gICAgICAgIGNvbW1lbnQuc2V0UmVwbHlUbyhudWxsKTsgLy8g5Li76K+E6K66IHJlcGx5VG89bnVsbA0KLQ0KLSAgICAgICAgLy8g5L+d5a2Y6K+E6K66DQotICAgICAgICBib29sZWFuIHNhdmVkID0gY29tbWVudFNlcnZpY2Uuc2F2ZShjb21tZW50KTsNCi0gICAgICAgIGlmICghc2F2ZWQpIHsNCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi6K+E6K665L+d5a2Y5aSx6LSlIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyDmm7TmlrDlm57lpI3mlbANCi0gICAgICAgIHBvc3RTZXJ2aWNlLmluY3JlbWVudFJlcGx5Q291bnQoSWQpOw0KLQ0KLSAgICAgICAgLy8g6I635Y+W5pu05paw5ZCO55qE5a6M5pW06K+E6K6677yI5YyF5ZCr5pWw5o2u5bqT55Sf5oiQ55qESUTlkozml7bpl7TvvIkNCi0gICAgICAgIFRvcnJlbnRDb21tZW50IG5ld0NvbW1lbnQgPSBjb21tZW50U2VydmljZS5nZXRCeUlkKGNvbW1lbnQuZ2V0SWQoKSk7DQotDQotICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkNCi0gICAgICAgICAgICAgICAgLmRhdGEoImNvbW1lbnQiLCBuZXdDb21tZW50KSAgLy8g6L+U5Zue5a6M5pW06K+E6K665pWw5o2uDQotICAgICAgICAgICAgICAgIC5kYXRhKCJuZXdSZXBseUNvdW50IiwgcG9zdFNlcnZpY2UuZ2V0QnlJZChJZCkuZ2V0UmVwbHlDb3VudCgpKTsNCi0gICAgfQ0KK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlRPUlJFTlQ7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5VU0VSOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuVG9ycmVudE1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlVzZXJNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuQ2xpZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5UcmFja2VyU2VydmljZTsKK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5jb25kaXRpb25zLnF1ZXJ5LlF1ZXJ5V3JhcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlRvcnJlbnRDb21tZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLlRvcnJlbnRDb21tZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5Ub3JyZW50U2VydmljZTsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuUmVzdWx0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50U3RhdGlzdGljOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlZFBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VkVG9ycmVudDsKK2ltcG9ydCBqYWthcnRhLmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYWthcnRhLmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGxvbWJvay5BbGxBcmdzQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUubWV0YWRhdGEuSVBhZ2U7CitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmV4dGVuc2lvbi5wbHVnaW5zLnBhZ2luYXRpb24uUGFnZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRDb3B5T3B0aW9uOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IHN0YXRpYyBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuSnd0VXRpbHMuZ2V0Q2xhaW1CeVRva2VuOworCisvL+WunueOsOenjeWtkOeahOWinuWIoOaUueafpQorQFJlc3RDb250cm9sbGVyCitAUmVxdWVzdE1hcHBpbmcoIi90b3JyZW50IikKK0BBbGxBcmdzQ29uc3RydWN0b3IKK3B1YmxpYyBjbGFzcyBUb3JyZW50Q29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50U2VydmljZSBwb3N0U2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIFRvcnJlbnRDb21tZW50U2VydmljZSBjb21tZW50U2VydmljZTsKKworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgVG9ycmVudE1hcHBlciB0b3JyZW50TWFwcGVyOworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgVXNlck1hcHBlciB1c2VyTWFwcGVyOworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgVXNlckNvbnRyb2xsZXIgdXNlckNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIFRyYWNrZXJTZXJ2aWNlIHRzID0gbmV3IFRyYWNrZXJTZXJ2aWNlKCk7CisgICAgcHJpdmF0ZSBDbGllbnRTZXJ2aWNlIGNzID0gbmV3IENsaWVudFNlcnZpY2UoKTsKKworICAgIEBHZXRNYXBwaW5nKCIve0lkfSIpCisgICAgcHVibGljIFJlc3VsdCBnZXRQb3N0KEBQYXRoVmFyaWFibGUgaW50IElkKSB7CisgICAgICAgIFRPUlJFTlQgdG9ycmVudCA9IHBvc3RTZXJ2aWNlLmdldEJ5SWQoSWQpOworICAgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi56eN5a2Q5LiN5a2Y5ZyoIik7IC8vIOaYjuehruiuvue9rjQwNOeKtuaAgeeggQorICAgICAgICB9CisKKyAgICAgICAgLy8g6I635Y+W5omA5pyJ6K+E6K6677yI5oyJ5Yib5bu65pe26Ze05o6S5bqP77yJCisgICAgICAgIExpc3Q8VG9ycmVudENvbW1lbnQ+IGFsbENvbW1lbnRzID0gY29tbWVudFNlcnZpY2UubGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgUXVlcnlXcmFwcGVyPFRvcnJlbnRDb21tZW50PigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXEoInBvc3RfaWQiLCBJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5QXNjKCJjcmVhdGVfdGltZSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8g5p6E5bu66K+E6K665qCR5b2i57uT5p6ECisgICAgICAgIExpc3Q8VG9ycmVudENvbW1lbnQ+IHJvb3RDb21tZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBNYXA8SW50ZWdlciwgVG9ycmVudENvbW1lbnQ+IGNvbW1lbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgLy8g56ys5LiA6YGN77ya5Yid5aeL5YyW5omA5pyJ6K+E6K665YiwbWFw5LitCisgICAgICAgIGZvciAoVG9ycmVudENvbW1lbnQgY29tbWVudCA6IGFsbENvbW1lbnRzKSB7CisgICAgICAgICAgICBjb21tZW50LnNldFJlcGxpZXMobmV3IEFycmF5TGlzdDw+KCkpOyAvLyDliJ3lp4vljJZyZXBsaWVz5YiX6KGoCisgICAgICAgICAgICBjb21tZW50TWFwLnB1dChjb21tZW50LmdldElkKCksIGNvbW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8g56ys5LqM6YGN77ya5p6E5bu654i25a2Q5YWz57O7CisgICAgICAgIGZvciAoVG9ycmVudENvbW1lbnQgY29tbWVudCA6IGFsbENvbW1lbnRzKSB7CisgICAgICAgICAgICBpZiAoY29tbWVudC5nZXRQYXJlbnRJZCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByb290Q29tbWVudHMuYWRkKGNvbW1lbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUb3JyZW50Q29tbWVudCBwYXJlbnQgPSBjb21tZW50TWFwLmdldChjb21tZW50LmdldFBhcmVudElkKCkpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0UmVwbGllcygpLmFkZChjb21tZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgidG9ycmVudCIsIHRvcnJlbnQpCisgICAgICAgICAgICAgICAgLmRhdGEoImNvbW1lbnRzIiwgcm9vdENvbW1lbnRzKTsKKyAgICB9CisKKyAgICAvLyDngrnotZ7luJblrZAKKyAgICBAUG9zdE1hcHBpbmcoIi97SWR9L2xpa2UiKQorICAgIHB1YmxpYyBSZXN1bHQgbGlrZVBvc3QoQFBhdGhWYXJpYWJsZSBpbnQgSWQpIHsKKyAgICAgICAgcG9zdFNlcnZpY2UuaW5jcmVtZW50TGlrZShJZCk7CisgICAgICAgIHJldHVybiBSZXN1bHQub2soKTsKKyAgICB9CisKKyAgICBAUG9zdE1hcHBpbmcoIi97SWR9L2NvbW1lbnRzIikKKyAgICBwdWJsaWMgUmVzdWx0IGNvbW1lbnQoQFBhdGhWYXJpYWJsZSBpbnQgSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBSZXF1ZXN0Qm9keSBUb3JyZW50Q29tbWVudCBjb21tZW50KSB7CisgICAgICAgIC8vIOiuvue9ruivhOiuuuS/oeaBrworICAgICAgICBjb21tZW50LnNldFBvc3RJZChJZCk7CisgICAgICAgIGNvbW1lbnQuc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm5vdygpKTsKKyAgICAgICAgY29tbWVudC5zZXRMaWtlQ291bnQoMCk7IC8vIOWIneWni+WMlueCuei1nuaVsAorICAgICAgICBjb21tZW50LnNldFBhcmVudElkKDApOyAgLy8g6buY6K6k54i26K+E6K66SUQKKyAgICAgICAgY29tbWVudC5zZXRSZXBseVRvKG51bGwpOyAvLyDkuLvor4TorrogcmVwbHlUbz1udWxsCisKKyAgICAgICAgLy8g5L+d5a2Y6K+E6K66CisgICAgICAgIGJvb2xlYW4gc2F2ZWQgPSBjb21tZW50U2VydmljZS5zYXZlKGNvbW1lbnQpOworICAgICAgICBpZiAoIXNhdmVkKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi6K+E6K665L+d5a2Y5aSx6LSlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyDmm7TmlrDlm57lpI3mlbAKKyAgICAgICAgcG9zdFNlcnZpY2UuaW5jcmVtZW50UmVwbHlDb3VudChJZCk7CisKKyAgICAgICAgLy8g6I635Y+W5pu05paw5ZCO55qE5a6M5pW06K+E6K6677yI5YyF5ZCr5pWw5o2u5bqT55Sf5oiQ55qESUTlkozml7bpl7TvvIkKKyAgICAgICAgVG9ycmVudENvbW1lbnQgbmV3Q29tbWVudCA9IGNvbW1lbnRTZXJ2aWNlLmdldEJ5SWQoY29tbWVudC5nZXRJZCgpKTsKKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgiY29tbWVudCIsIG5ld0NvbW1lbnQpICAvLyDov5Tlm57lrozmlbTor4TorrrmlbDmja4KKyAgICAgICAgICAgICAgICAuZGF0YSgibmV3UmVwbHlDb3VudCIsIHBvc3RTZXJ2aWNlLmdldEJ5SWQoSWQpLmdldFJlcGxheV9jb3VudCgpKTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdCAvL+WQr+WKqOmhueebruaXtuWAmeiHquWKqOWQr+WKqHRyYWNrZXLmnI3liqHlmagKKyAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0VFMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cy5zdGFydFRyYWNrZXIoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi5oiQ5Yqf5ZCv5YqodHJhY2tlcuacjeWKoeWZqCIpOworICAgICAgICAgICAgcmV0dXJuICLmiJDlip/lkK/liqh0cmFja2Vy5pyN5Yqh5ZmoIjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi5ZCv5Yqo5aSx6LSlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuICLlkK/liqjlpLHotKU6ICIgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v5LiK5Lyg44CB5LiL6L2944CB5Yig6Zmk5pON5L2cCisgICAgLy9wb3N0IOimgea3u+WKoOaVsOaNruW6kyDmlofku7blkox0cmFja2Vy55qE5L+h5oGvCisgICAgQFBvc3RNYXBwaW5nCisgICAgcHVibGljIFJlc3VsdCBhZGRUb3JyZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBAUmVxdWVzdEJvZHkgVE9SUkVOVCB0b3JyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIDEuIOajgOafpea6kOaWh+S7tgorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0b3JyZW50LmdldEZpbGVQYXRoKCkpOworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5kYXRhKCJtZXNzYWdlIiwgIuaWh+S7tuS4jeWtmOWcqOaIlui3r+W+hOaXoOaViCIpOworICAgICAgICB9CisgICAgICAgIGlmICghZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50b3JyZW50IikpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5kYXRhKCJtZXNzYWdlIiwgIuS7heaUr+aMgS50b3JyZW505paH5Lu2Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiDnoa7lrprlrZjlgqjnm67lvZXvvIjmlLnkuLrpobnnm67moLnnm67lvZXkuIvnmoR0b3JyZW50c+aWh+S7tuWkue+8iQorICAgICAgICBTdHJpbmcgcHJvamVjdFJvb3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgIFN0cmluZyB1cGxvYWREaXIgPSBwcm9qZWN0Um9vdCArIEZpbGUuc2VwYXJhdG9yICsgInRvcnJlbnRzIjsKKyAgICAgICAgRmlsZSB0b3JyZW50c0ZvbGRlciA9IG5ldyBGaWxlKHVwbG9hZERpcik7CisgICAgICAgIGlmICghdG9ycmVudHNGb2xkZXIuZXhpc3RzKCkgJiYgIXRvcnJlbnRzRm9sZGVyLm1rZGlycygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuZGF0YSgibWVzc2FnZSIsICLml6Dms5XliJvlu7rlrZjlgqjnm67lvZUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDMuIOWkjeWItuaWh+S7tgorICAgICAgICBGaWxlIHVwbG9hZGVkRmlsZSA9IG5ldyBGaWxlKHRvcnJlbnRzRm9sZGVyLCBmaWxlLmdldE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlcy5jb3B5KGZpbGUudG9QYXRoKCksIHVwbG9hZGVkRmlsZS50b1BhdGgoKSwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLmlofku7bkv53lrZjmiJDlip86ICIgKyB1cGxvYWRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuaWh+S7tuWkjeWItuWksei0pSIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5kYXRhKCJtZXNzYWdlIiwgIuaWh+S7tuS/neWtmOWksei0pTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDQuIOWkhOeQhlRyYWNrZXLpgLvovpEKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRyYWNrZWRUb3JyZW50IHR0ID0gdHMuYWRkVHJhY2tlZFRvcnJlbnQodXBsb2FkZWRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFRyYWNrZWRQZWVyIHRwID0gY3JlYXRlVHJhY2tlZFBlZXIodHQpOworICAgICAgICAgICAgdHQuYWRkUGVlcih0cCk7CisKKyAgICAgICAgICAgIC8vIDUuIOaVsOaNruW6k+aTjeS9nAorICAgICAgICAgICAgdG9ycmVudC5zZXRIYXNoKHR0LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICAgICAgdG9ycmVudC5zZXRTaXplKHVwbG9hZGVkRmlsZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB0b3JyZW50LnNldFVzZXJuYW1lKGdldENsYWltQnlUb2tlbihyZXF1ZXN0LmdldEhlYWRlcigiQXV0aG9yaXphdGlvbiIpKS5nZXRTdWJqZWN0KCkpOworICAgICAgICAgICAgdG9ycmVudC5zZXRGaWxlUGF0aCh1cGxvYWRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICBpZiAodG9ycmVudE1hcHBlci5pbnNlcnRUb3JyZW50KHRvcnJlbnQpID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgibWVzc2FnZSIsICLkuIrkvKDmiJDlip8iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoInBhdGgiLCB1cGxvYWRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcmFja2Vy5oiW5pWw5o2u5bqT5pON5L2c5aSx6LSlIiArIGUpOworICAgICAgICAgICAgdXBsb2FkZWRGaWxlLmRlbGV0ZSgpOyAvLyDlm57mu5rvvJrliKDpmaTlt7Lkv53lrZjnmoTmlofku7YKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5kYXRhKCJtZXNzYWdlIiwgIuS4iuS8oOWksei0pSIpOworICAgIH0KKworICAgIC8v5qC55o2u5pys5py65Yib5bu6cGVlcuWvueixoQorICAgIHB1YmxpYyBzdGF0aWMgVHJhY2tlZFBlZXIgY3JlYXRlVHJhY2tlZFBlZXIoVHJhY2tlZFRvcnJlbnQgdG9ycmVudCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8g6I635Y+W5pys5py6SVDlnLDlnYAKKyAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgICAgICAgICBTdHJpbmcgaXAgPSBpbmV0QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpOyAvLyDmnKzmnLpJUOWcsOWdgAorCisgICAgICAgICAgICAvLyDlgYforr7kvb/nlKjkuIDkuKrpmo/mnLrnmoTnq6/lj6PvvIzov5nkuKrnq6/lj6Plj6/ku6XmoLnmja7pnIDmsYLosIPmlbQKKyAgICAgICAgICAgIGludCBwb3J0ID0gNjg4MTsgLy8g6L+Z6YeM5L2/55So5Zu65a6a56uv5Y+j77yM5Lmf5Y+v5Lul6YCa6L+H5Yqo5oCB5pa55byP5YiG6YWNCisKKyAgICAgICAgICAgIC8vIOWIm+W7ulBlZXIgSUQgKOWPr+S7pemaj+acuueUn+aIkOaIluS7juWFtuS7luWcsOaWueiOt+WPlikKKyAgICAgICAgICAgIC8vIOi/memHjOS9v+eUqFVVSUTmnaXnlJ/miJDkuIDkuKrpmo/mnLrnmoQgUGVlciBJRAorICAgICAgICAgICAgU3RyaW5nIHBlZXJJZFN0cmluZyA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHBlZXJJZCA9IEJ5dGVCdWZmZXIud3JhcChwZWVySWRTdHJpbmcuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgICAgIC8vIOWIm+W7ulRyYWNrZWRQZWVy5a6e5L6LCisgICAgICAgICAgICBUcmFja2VkUGVlciB0cmFja2VkUGVlciA9IG5ldyBUcmFja2VkUGVlcih0b3JyZW50LCBpcCwgcG9ydCwgcGVlcklkKTsKKworICAgICAgICAgICAgcmV0dXJuIHRyYWNrZWRQZWVyOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL+enjeWtkOS4i+i9vSDmoLnmja5pZOiOt+WPluaVsOaNrgorICAgIC8vIOiDveaIkOWKn+iOt+WPluWIsOaVsOaNrgorICAgIC8vIOiDveWkn+agueaNruatpOWAvO+8jOWujOaIkOWvueebuOWFs+aVsOaNrueahOS/ruaUuQorICAgIC8vIGdldERvd25sb2FkZWRCeXRlczozMDYzOTYzCisgICAgLy9nZXRVcGxvYWRlZEJ5dGVzOjAKKyAgICBAR2V0TWFwcGluZygiL2Rvd25sb2FkVG9ycmVudCIpCisgICAgcHVibGljIFJlc3VsdCBnZXRUb3JyZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LGludCBpZCAsU3RyaW5nIGRvd25sb2FkUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRPUlJFTlQgdG9ycmVudCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0QnlJRChpZCk7CisKKyAgICAgICAgLy8g5LiL6L295a6M5oiQCisgICAgICAgIC8vIOS8oOWFpeWPmOmHj++8muS4i+i9veenjeWtkOeahGlkIOS4i+i9veWIsOaWh+S7tueahOi3r+W+hAorICAgICAgICBjcy5kb3dubG9hZFRvcnJlbnQodG9ycmVudC5nZXRGaWxlUGF0aCgpLCBkb3dubG9hZFBhdGgpOworCisgICAgICAgIC8v566h55CG56eN5a2Q55u45YWz5pWw5o2uCisgICAgICAgIFRvcnJlbnRTdGF0aXN0aWMgdHMgPSBjcy5nZXRTdGF0aXN0aWNzKHRvcnJlbnQuZ2V0RmlsZVBhdGgoKSk7CisKKyAgICAgICAgLy/kv67mlLnnlKjmiLflr7nlupTnmoTkv6Hmga8KKyAgICAgICAgVVNFUiBkb3dubG9hZFVzZXIgPSB1c2VyQ29udHJvbGxlci5nZXRVc2VySW5SZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICBVU0VSIHVwbG9hZFVzZXIgPSB1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodG9ycmVudC5nZXRVc2VybmFtZSgpKTsKKworICAgICAgICBkb3dubG9hZFVzZXIudXBkYXRlRG93bmxvYWQodHMuZ2V0RG93bmxvYWRlZEJ5dGVzKCkpOworICAgICAgICB1cGxvYWRVc2VyLnVwZGF0ZVVwbG9hZCh0cy5nZXREb3dubG9hZGVkQnl0ZXMoKSk7CisKKyAgICAgICAgdXNlck1hcHBlci51cGRhdGVVc2VyKGRvd25sb2FkVXNlcik7CisgICAgICAgIHVzZXJNYXBwZXIudXBkYXRlVXNlcih1cGxvYWRVc2VyKTsKKworCisgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5kYXRhKCJ0b3JyZW50IiwgdG9ycmVudCk7CisgICAgfQorCisgICAgLy/moLnmja5pZOWIoOmZpAorICAgIEBEZWxldGVNYXBwaW5nKCIvZGVsZXRlVG9ycmVudC97aWR9IikKKyAgICBwdWJsaWMgUmVzdWx0IGRlbGV0ZVRvcnJlbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsQFBhdGhWYXJpYWJsZSgiaWQiKWludCBpZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRPUlJFTlQgdG9ycmVudCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0QnlJRChpZCk7CisKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gdG9ycmVudC5nZXRGaWxlUGF0aCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25piv5ZCm5a2Y5ZyoCisgICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKFBhdGhzLmdldChmaWxlUGF0aCkpKSB7CisgICAgICAgICAgICAgICAgRmlsZXMuZGVsZXRlKFBhdGhzLmdldChmaWxlUGF0aCkpOyAgLy8g5Yig6Zmk5paH5Lu2CisgICAgICAgICAgICAgICAgdG9ycmVudE1hcHBlci5kZWxldGVUb3JyZW50KGlkKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQub2soKS5tZXNzYWdlKCLnp43lrZDmlofku7bliKDpmaTmiJDlip8iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGaWxlIG5vdCBmb3VuZDogIiArIGZpbGVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8g5byC5bi45aSE55CGCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgLy8g6L+U5Zue5aSx6LSl57uT5p6c5oiW5YW25LuW5aSE55CG6YC76L6RCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LmVycm9yKDQwNCkuc2V0TWVzc2FnZSgi56eN5a2Q5paH5Lu25Yig6Zmk5aSx6LSlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb250cm9sbGVyCisgICAgQEdldE1hcHBpbmcKKyAgICBwdWJsaWMgUmVzdWx0IGxpc3RQb3N0cyhAUmVxdWVzdFBhcmFtKGRlZmF1bHRWYWx1ZSA9ICIxIikgaW50IHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFJlcXVlc3RQYXJhbShkZWZhdWx0VmFsdWUgPSAiNSIpIGludCBzaXplKSB7CisgICAgICAgIGludCBvZmZzZXQgPSAocGFnZSAtIDEpICogc2l6ZTsKKyAgICAgICAgTGlzdDxUT1JSRU5UPiBwYWdlZExpc3QgPSB0b3JyZW50TWFwcGVyLnNlbGVjdEFsbFRvcnJlbnRXaXRoUGFnZShvZmZzZXQsIHNpemUpOworICAgICAgICBpbnQgdG90YWwgPSB0b3JyZW50TWFwcGVyLmNvdW50QWxsVG9ycmVudCgpOworCisgICAgICAgIFBhZ2U8VE9SUkVOVD4gcGFnZVJlc3VsdCA9IG5ldyBQYWdlPD4ocGFnZSwgc2l6ZSk7CisgICAgICAgIHBhZ2VSZXN1bHQuc2V0UmVjb3JkcyhwYWdlZExpc3QpOworICAgICAgICBwYWdlUmVzdWx0LnNldFRvdGFsKHRvdGFsKTsKKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgicmVjb3JkcyIsIHBhZ2VSZXN1bHQuZ2V0UmVjb3JkcygpKQorICAgICAgICAgICAgICAgIC5kYXRhKCJ0b3RhbCIsIHBhZ2VSZXN1bHQuZ2V0VG90YWwoKSk7CisgICAgfQorCisgICAgLy8g6I635Y+W54m55a6a5YiG5Yy65LiL55qE56eN5a2Q77yI5YiG6aG154mI77yJCisgICAgQEdldE1hcHBpbmcoIi9nZXQvdG9ycmVudEJ5Q2F0ZWdvcnkve2NhdGVnb3J5fSIpCisgICAgcHVibGljIFJlc3VsdCBnZXRUb3JyZW50QnlDYXRlZ29yeSgKKyAgICAgICAgICAgIEBQYXRoVmFyaWFibGUoImNhdGVnb3J5IikgU3RyaW5nIGNhdGVnb3J5LAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbShkZWZhdWx0VmFsdWUgPSAiMSIpIGludCBwYWdlLAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbShkZWZhdWx0VmFsdWUgPSAiNSIpIGludCBzaXplKSB7CisKKyAgICAgICAgaW50IG9mZnNldCA9IChwYWdlIC0gMSkgKiBzaXplOworICAgICAgICBMaXN0PFRPUlJFTlQ+IHBhZ2VkTGlzdCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0VG9ycmVudEJ5Q2F0ZWdvcnlXaXRoUGFnZShjYXRlZ29yeSwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgaW50IHRvdGFsID0gdG9ycmVudE1hcHBlci5jb3VudEJ5Q2F0ZWdvcnkoY2F0ZWdvcnkpOworCisgICAgICAgIFBhZ2U8VE9SUkVOVD4gcGFnZVJlc3VsdCA9IG5ldyBQYWdlPD4ocGFnZSwgc2l6ZSk7CisgICAgICAgIHBhZ2VSZXN1bHQuc2V0UmVjb3JkcyhwYWdlZExpc3QpOworICAgICAgICBwYWdlUmVzdWx0LnNldFRvdGFsKHRvdGFsKTsKKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgicmVjb3JkcyIsIHBhZ2VSZXN1bHQuZ2V0UmVjb3JkcygpKQorICAgICAgICAgICAgICAgIC5kYXRhKCJ0b3RhbCIsIHBhZ2VSZXN1bHQuZ2V0VG90YWwoKSk7CisgICAgfQorCisgICAgLy8g5pCc57Si56eN5a2Q5YWz6ZSu5a2X77yI5YiG6aG154mI77yJCisgICAgQEdldE1hcHBpbmcoIi9nZXQvdG9ycmVudEJ5S2V5L3trZXl9IikKKyAgICBwdWJsaWMgUmVzdWx0IGdldFRvcnJlbnRCeUtleSgKKyAgICAgICAgICAgIEBQYXRoVmFyaWFibGUoImtleSIpIFN0cmluZyBrZXksCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKGRlZmF1bHRWYWx1ZSA9ICIxIikgaW50IHBhZ2UsCisgICAgICAgICAgICBAUmVxdWVzdFBhcmFtKGRlZmF1bHRWYWx1ZSA9ICI1IikgaW50IHNpemUpIHsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gKHBhZ2UgLSAxKSAqIHNpemU7CisgICAgICAgIExpc3Q8VE9SUkVOVD4gcGFnZWRMaXN0ID0gdG9ycmVudE1hcHBlci5zZWxlY3RUb3JyZW50QnlLZXlXaXRoUGFnZShrZXksIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGludCB0b3RhbCA9IHRvcnJlbnRNYXBwZXIuY291bnRCeUtleShrZXkpOworCisgICAgICAgIFBhZ2U8VE9SUkVOVD4gcGFnZVJlc3VsdCA9IG5ldyBQYWdlPD4ocGFnZSwgc2l6ZSk7CisgICAgICAgIHBhZ2VSZXN1bHQuc2V0UmVjb3JkcyhwYWdlZExpc3QpOworICAgICAgICBwYWdlUmVzdWx0LnNldFRvdGFsKHRvdGFsKTsKKworICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkKKyAgICAgICAgICAgICAgICAuZGF0YSgicmVjb3JkcyIsIHBhZ2VSZXN1bHQuZ2V0UmVjb3JkcygpKQorICAgICAgICAgICAgICAgIC5kYXRhKCJ0b3RhbCIsIHBhZ2VSZXN1bHQuZ2V0VG90YWwoKSk7CisgICAgfQorCisgICAgLy8g6I635Y+W5a+55bqU55So5oi356eN5a2Q77yI5YiG6aG154mI77yJCisgICAgQEdldE1hcHBpbmcoIi9nZXQvdG9ycmVudE15c2VsZiIpCisgICAgcHVibGljIFJlc3VsdCBnZXRUb3JyZW50QnlLZXkoCisgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oZGVmYXVsdFZhbHVlID0gIjEiKSBpbnQgcGFnZSwKKyAgICAgICAgICAgIEBSZXF1ZXN0UGFyYW0oZGVmYXVsdFZhbHVlID0gIjUiKSBpbnQgc2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVVNFUiB1c2VyID0gdXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgaW50IG9mZnNldCA9IChwYWdlIC0gMSkgKiBzaXplOworICAgICAgICBMaXN0PFRPUlJFTlQ+IHBhZ2VkTGlzdCA9IHRvcnJlbnRNYXBwZXIuc2VsZWN0VG9ycmVudEJ5VXNlcm5hbWVXaXRoUGFnZSh1c2VyLmdldFVzZXJuYW1lKCksIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGludCB0b3RhbCA9IHRvcnJlbnRNYXBwZXIuY291bnRCeVVzZXJuYW1lKHVzZXIuZ2V0VXNlcm5hbWUoKSk7CisKKyAgICAgICAgUGFnZTxUT1JSRU5UPiBwYWdlUmVzdWx0ID0gbmV3IFBhZ2U8PihwYWdlLCBzaXplKTsKKyAgICAgICAgcGFnZVJlc3VsdC5zZXRSZWNvcmRzKHBhZ2VkTGlzdCk7CisgICAgICAgIHBhZ2VSZXN1bHQuc2V0VG90YWwodG90YWwpOworCisgICAgICAgIHJldHVybiBSZXN1bHQub2soKQorICAgICAgICAgICAgICAgIC5kYXRhKCJyZWNvcmRzIiwgcGFnZVJlc3VsdC5nZXRSZWNvcmRzKCkpCisgICAgICAgICAgICAgICAgLmRhdGEoInRvdGFsIiwgcGFnZVJlc3VsdC5nZXRUb3RhbCgpKTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Vc2VyQ29udHJvbGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Vc2VyQ29udHJvbGxlci5qYXZhCmluZGV4IDkyNjVjZTcuLjQ1ODdhYmMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyLmphdmEKQEAgLTYsNDcgKzYsNTggQEAKIGltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5Lio7CiBpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLm1hcHBlci5Vc2VyTWFwcGVyOwogaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuSW52aXRlQ29kZU1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuU2l6ZUNhbGN1bGF0aW9uOwogaW1wb3J0IGpha2FydGEuYW5ub3RhdGlvbi5SZXNvdXJjZTsKK2ltcG9ydCBqYWthcnRhLnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmJpbmQuYW5ub3RhdGlvbi4qOwogaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS51dGlscy5SZXN1bHQ7CiBpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLkp3dFV0aWxzOwogaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVVNFUjsKKwogaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIEBSZXN0Q29udHJvbGxlcgogQFJlcXVlc3RNYXBwaW5nKCIvdXNlciIpCiBAQ3Jvc3NPcmlnaW4gLy/lkK/nlKjot6jln58KIHB1YmxpYyBjbGFzcyBVc2VyQ29udHJvbGxlciB7CiAKLSAgICBAUmVzb3VyY2UKKyAgICBAQXV0b3dpcmVkCiAgICAgcHJpdmF0ZSBVc2VyTWFwcGVyIHVzZXJNYXBwZXI7Ci0gICAgQFJlc291cmNlCisgICAgQEF1dG93aXJlZAogICAgIHByaXZhdGUgSW52aXRlQ29kZU1hcHBlciBpbnZpdGVDb2RlTWFwcGVyOwogCisKKyAgICAvL+S4quS6uuS4reW/g+iOt+WPlueUqOaIt+eZu+W9leS/oeaBrwogICAgIEBHZXRNYXBwaW5nKCIvaW5mbyIpIC8v6I635Y+WCi0gICAgcHVibGljIFJlc3VsdCBpbmZvKFN0cmluZyB0b2tlbikgewotICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBKd3RVdGlscy5nZXRDbGFpbUJ5VG9rZW4odG9rZW4pLmdldFN1YmplY3QoKTsKLSAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLmRhdGEoIm5hbWUiLCB1c2VybmFtZSk7CisgICAgcHVibGljIFJlc3VsdCBpbmZvKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFVTRVIgdXNlciA9IHRoaXMuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLmRhdGEoImluZm8iLCB1c2VyKTsKICAgICB9CiAKICAgICBAUG9zdE1hcHBpbmcoIi9sb2dpbiIpIC8v55So5oi355m75b2VCiAgICAgcHVibGljIFJlc3VsdCBsb2dpbihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewogICAgICAgICBVU0VSIHVzZXIgPSB1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodXNlcm5hbWUpOwogCi0gICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIOWwhueUqOaIt+i+k+WFpeeahOWvhueggei/m+ihjOWTiOW4jOWkhOeQhgotICAgICAgICAgICAgU3RyaW5nIGhhc2hlZFBhc3N3b3JkID0gdXNlci5oYXNoUGFzc3dvcmQocGFzc3dvcmQpOwotCi0gICAgICAgICAgICAvLyDmr5TovoPnlKjmiLfovpPlhaXnmoTlr4bnoIHlk4jluIzlgLzlkozmlbDmja7lupPkuK3nmoTlr4bnoIHlk4jluIzlgLwKLSAgICAgICAgICAgIGlmIChoYXNoZWRQYXNzd29yZC5lcXVhbHModXNlci5nZXRQYXNzd29yZCgpKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IEp3dFV0aWxzLmdlbmVyYXRlVG9rZW4odXNlci5nZXRVc2VybmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgidG9rZW4iLCB0b2tlbik7ICAvLyDov5Tlm57ku6TniYznu5nliY3nq68KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLnNldE1lc3NhZ2UoIuWvhueggemUmeivryIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICAvLyDmo4Dmn6XnlKjmiLfmmK/lkKblrZjlnKgKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5lcnJvcig0MDQpLnNldE1lc3NhZ2UoIueUqOaIt+S4jeWtmOWcqCIpOwogICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXNzd29yZCIgKyB1c2VyLmdldFBhc3N3b3JkKCkpOworCisgICAgICAgIC8vIOavlOi+g+eUqOaIt+i+k+WFpeWvhueggeWAvOaYr+WQpuato+ehrgorICAgICAgICBpZiAodXNlci5nZXRQYXNzd29yZCgpLmVxdWFscyhwYXNzd29yZCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IEp3dFV0aWxzLmdlbmVyYXRlVG9rZW4odXNlci5nZXRVc2VybmFtZSgpKTsKKworICAgICAgICAgICAgdXNlci5zZXRMYXN0TG9naW4obmV3IERhdGUoKSk7CisgICAgICAgICAgICB1c2VyTWFwcGVyLnVwZGF0ZVVzZXIodXNlcik7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCkuZGF0YSgidG9rZW4iLCB0b2tlbik7ICAvLyDov5Tlm57ku6TniYznu5nliY3nq68KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5zZXRNZXNzYWdlKCLlr4bnoIHplJnor68iKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBQb3N0TWFwcGluZygiL3JlZ2lzdCIpCkBAIC01NSwxMiArNjYsMTIgQEAKICAgICAgICAgaWYgKHVzZXJDaGVjayA9PSBudWxsKSB7CiAgICAgICAgICAgICAvL+iOt+WPlumCgOivt+eggQogICAgICAgICAgICAgSU5WSVRFX0NPREUgaW52aXRlQ29kZSA9IGludml0ZUNvZGVNYXBwZXIuc2VsZWN0QnlDb2RlKGNvZGUpOwotICAgICAgICAgICAgaWYoaW52aXRlQ29kZSAhPSBudWxsKXsKKyAgICAgICAgICAgIGlmIChpbnZpdGVDb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW52aXRlQ29kZS5nZXRJc1VzZWQoKSk7CiAKLSAgICAgICAgICAgICAgICBpZighaW52aXRlQ29kZS5nZXRJc1VzZWQoKSl7CisgICAgICAgICAgICAgICAgaWYgKCFpbnZpdGVDb2RlLmdldElzVXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIERhdGUgdGltZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFVTRVIgdXNlciA9IG5ldyBVU0VSKHVzZXJuYW1lLCBwYXNzd29yZCwgdGltZSkgOworICAgICAgICAgICAgICAgICAgICBVU0VSIHVzZXIgPSBuZXcgVVNFUih1c2VybmFtZSwgcGFzc3dvcmQsIHRpbWUpOwogCiAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXBwZXIuaW5zZXJ0VXNlcih1c2VyKTsKICAgICAgICAgICAgICAgICAgICAgaW52aXRlQ29kZU1hcHBlci51cGRhdGVDb2RlVXNlcihjb2RlKTsKQEAgLTgxLDkgKzkyLDQ2IEBACiAKICAgICB9CiAKLSAgICBAUG9zdE1hcHBpbmcoIi9sb2dvdXQiKQotICAgIHB1YmxpYyBSZXN1bHQgbG9nb3V0KFN0cmluZyB0b2tlbikgewotICAgICAgICByZXR1cm4gUmVzdWx0Lm9rKCk7CisgICAgLy/ojrflj5blhYHorrjkuIvovb3pop3luqbnmoTnm7jlhbPkv6Hmga8KKyAgICBAR2V0TWFwcGluZygiL2FsbG93RG93bmxvYWQiKQorICAgIHB1YmxpYyBSZXN1bHQgYWxsb3dEb3dubG9hZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBVU0VSIHVzZXIgPSB0aGlzLmdldFVzZXJJblJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgIC8vIOaAu+mineW6piDlt7Lnu4/kvb/nlKgg5Ymp5L2ZIOWNleS9jeaYr0dCCisgICAgICAgIGludCB0b3RhbFNpemUgPSBTaXplQ2FsY3VsYXRpb24uYnl0ZVRvR0IodXNlci5nZXRVcGxvYWQoKSk7CisgICAgICAgIGludCB1c2VkU2l6ZSA9IFNpemVDYWxjdWxhdGlvbi5ieXRlVG9HQih1c2VyLmdldERvd25sb2FkKCkpOworICAgICAgICBpbnQgbGVmdFNpemUgPSB0b3RhbFNpemUgLSB1c2VkU2l6ZTsKKworICAgICAgICAvLyDlsIblj5jph4/lsIHoo4XmiJBNYXAKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBkYXRhTWFwLnB1dCgidG90YWxTaXplIiwgdG90YWxTaXplKTsKKyAgICAgICAgZGF0YU1hcC5wdXQoInVzZWRTaXplIiwgdXNlZFNpemUpOworICAgICAgICBkYXRhTWFwLnB1dCgibGVmdFNpemUiLCBsZWZ0U2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLmRhdGEoZGF0YU1hcCk7CisgICAgfQorCisgICAgLy/kv67mlLnnlKjmiLflr4bnoIEKKyAgICBAUHV0TWFwcGluZygiL3Bhc3N3b3JkIikKKyAgICBwdWJsaWMgUmVzdWx0IHVwZGF0ZVBhc3N3b3JkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBAUmVxdWVzdEJvZHkgTWFwPFN0cmluZywgU3RyaW5nPiBwYXNzd29yZE1hcCkgeworICAgICAgICBVU0VSIHVzZXIgPSB0aGlzLmdldFVzZXJJblJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgU3RyaW5nIG9sZFBhc3N3b3JkID0gcGFzc3dvcmRNYXAuZ2V0KCJvbGRQYXNzd29yZCIpOworICAgICAgICBTdHJpbmcgbmV3UGFzc3dvcmQgPSBwYXNzd29yZE1hcC5nZXQoIm5ld1Bhc3N3b3JkIik7CisKKyAgICAgICAgaWYgKHVzZXIuZ2V0UGFzc3dvcmQoKS5lcXVhbHMob2xkUGFzc3dvcmQpKSB7CisgICAgICAgICAgICB1c2VyLnNldFBhc3N3b3JkKG5ld1Bhc3N3b3JkKTsKKyAgICAgICAgICAgIHVzZXJNYXBwZXIudXBkYXRlVXNlcih1c2VyKTsKKworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5vaygpLnNldE1lc3NhZ2UoIuS/ruaUueWvhueggeaIkOWKnyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHQuZXJyb3IoNDA0KS5zZXRNZXNzYWdlKCLljp/lr4bnoIHkuI3mraPnoa4iKTsKKyAgICB9CisKKworICAgIC8v5LuOaHR0cOivt+axguS4reiOt+WPluWIsOeUqOaItworICAgIHB1YmxpYyBVU0VSIGdldFVzZXJJblJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nIFVzZXJOYW1lID0gSnd0VXRpbHMuZ2V0Q2xhaW1CeVRva2VuKHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIikpLmdldFN1YmplY3QoKTsKKyAgICAgICAgcmV0dXJuIHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZShVc2VyTmFtZSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvRE9XTkxPQURfUkVDT1JELmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvRE9XTkxPQURfUkVDT1JELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0M2Y0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9ET1dOTE9BRF9SRUNPUkQuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKKworcHVibGljIGNsYXNzIERPV05MT0FEX1JFQ09SRCB7CisKKyAgICBwcml2YXRlIGludCBpZDsgLy8g5LiL6L296K6w5b2VSUQKKyAgICBwcml2YXRlIGludCB1c2VySWQ7IC8vIOS4i+i9veeUqOaIt0lECisgICAgcHJpdmF0ZSBpbnQgdG9ycmVudElkOyAvLyDor7fmsYLnmoTnp43lrZDotYTmupBJRAorICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsgLy8g5LiL6L2954q25oCB77yI5oiQ5Yqf44CB5aSx6LSl44CB57uI5q2i77yJCisgICAgcHJpdmF0ZSBMb2NhbERhdGVUaW1lIGRvd25sb2FkVGltZTsgLy8g5LiL6L295pe26Ze0CisgICAgcHJpdmF0ZSBTdHJpbmcgZG93bmxvYWRQYXRoOyAvLyDkuIvovb3ot6/lvoQKKworICAgIC8vIOaehOmAoOaWueazleOAgWdldHRlcuWSjHNldHRlcuecgeeVpQorCisgICAgcHVibGljIERPV05MT0FEX1JFQ09SRChpbnQgdXNlcklkLCBpbnQgdG9ycmVudElkLCBTdHJpbmcgc3RhdHVzLCBMb2NhbERhdGVUaW1lIGRvd25sb2FkVGltZSwgU3RyaW5nIGRvd25sb2FkUGF0aCkgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICAgICAgdGhpcy50b3JyZW50SWQgPSB0b3JyZW50SWQ7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICB0aGlzLmRvd25sb2FkVGltZSA9IGRvd25sb2FkVGltZTsKKyAgICAgICAgdGhpcy5kb3dubG9hZFBhdGggPSBkb3dubG9hZFBhdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9JTlZJVEVfQ09ERS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L0lOVklURV9DT0RFLmphdmEKaW5kZXggZDBhNWE1My4uYTM1ZGQ4OSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L0lOVklURV9DT0RFLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L0lOVklURV9DT0RFLmphdmEKQEAgLTQsNiArNCw3IEBACiAKIGltcG9ydCBqYWthcnRhLnBlcnNpc3RlbmNlLio7CiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKIEBUYWJsZShuYW1lID0gImludml0ZV9jb2RlIikKIHB1YmxpYyBjbGFzcyBJTlZJVEVfQ09ERSB7CkBAIC00Myw4ICs0NCwxMCBAQAogICAgIC8vIENvbnN0cnVjdG9yIChvcHRpb25hbCkKICAgICBwdWJsaWMgSU5WSVRFX0NPREUoKSB7fQogCi0gICAgcHVibGljIElOVklURV9DT0RFKFN0cmluZyBjb2RlLCBTdHJpbmcgZ2VuZXJhdGVVc2VyKSB7Ci0gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgLy9jb2Rl5pivMTDkvY3pmo/mnLrnlJ/miJDlr4bnoIEKKyAgICBwdWJsaWMgSU5WSVRFX0NPREUoU3RyaW5nIGdlbmVyYXRlVXNlcikgeworICAgICAgICBTdHJpbmcgdXVpZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgiLSIsICIiKTsKKyAgICAgICAgdGhpcy5jb2RlID0gdXVpZC5zdWJzdHJpbmcoMCwgOCk7CiAgICAgICAgIHRoaXMuZ2VuZXJhdGVVc2VyID0gZ2VuZXJhdGVVc2VyOwogICAgICAgICB0aGlzLmlzVXNlZCA9IGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9UT1JSRU5ULmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvVE9SUkVOVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmIyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvVE9SUkVOVC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eTsNCisNCitpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uSWRUeXBlOw0KK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUZpZWxkOw0KK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUlkOw0KK2ltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZU5hbWU7DQoraW1wb3J0IGpha2FydGEucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWU7DQoraW1wb3J0IGpha2FydGEucGVyc2lzdGVuY2UuR2VuZXJhdGlvblR5cGU7DQoraW1wb3J0IGpha2FydGEucGVyc2lzdGVuY2UuSWQ7DQoraW1wb3J0IGxvbWJvay5EYXRhOw0KK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsNCitpbXBvcnQgamF2YS51dGlsLkRhdGU7DQorDQorQERhdGENCitAVGFibGVOYW1lKCJ0b3JyZW50IikgLy8g5L2/55SoTXlCYXRpcy1QbHVz55qE5rOo6Kej5oyH5a6a6KGo5ZCNDQorcHVibGljIGNsYXNzIFRPUlJFTlQgew0KKw0KKyAgICBASWQNCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpDQorICAgIHByaXZhdGUgSW50ZWdlciBpZDsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9ycmVudE5hbWU7IC8vIOaWh+S7tuWQjQ0KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsgLy8g5o+P6L+wDQorICAgIHByaXZhdGUgU3RyaW5nIGNhdGVnb3J5OyAvLyDliIbnsbsNCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVnaW9uOyAvLyDlnLDljLoNCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x1dGlvbjsgLy8g5YiG6L6o546HDQorICAgIHByaXZhdGUgU3RyaW5nIHN1YnRpdGxlOyAvLyDlrZfluZXnirbmgIENCisNCisgICAgcHJpdmF0ZSBMb25nIHNpemU7IC8vIOenjeWtkOWvueW6lOaWh+S7tuWkp+Wwjw0KKyAgICBwcml2YXRlIFN0cmluZyBoYXNoOyAvLyB0b3JyZW5057yW56CBDQorICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOyAvLyDliJvlu7rnlKjmiLcNCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdGg7DQorICAgIHByaXZhdGUgaW50IGxpa2VfY291bnQ7DQorICAgIHByaXZhdGUgaW50IHJlcGxheV9jb3VudDsNCisNCisgICAgQFRhYmxlRmllbGQodmFsdWUgPSAiY3JlYXRlX3RpbWUiKSAvLyDkvb/nlKhAVGFibGVGaWVsZOazqOino+WkhOeQhuaXtumXtOWtl+autQ0KKyAgICBwcml2YXRlIERhdGUgY3JlYXRlVGltZTsgLy8g5Yib5bu65pe26Ze0DQorDQorICAgIC8vIOaehOmAoOWHveaVsA0KKyAgICBwdWJsaWMgVE9SUkVOVChTdHJpbmcgaGFzaCwgU3RyaW5nIHRvcnJlbnROYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHJlZ2lvbiwgU3RyaW5nIHJlc29sdXRpb24sIFN0cmluZyBzdWJ0aXRsZSwgTG9uZyBzaXplLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBmaWxlUGF0aCkgew0KKyAgICAgICAgdGhpcy5oYXNoID0gaGFzaDsNCisgICAgICAgIHRoaXMudG9ycmVudE5hbWUgPSB0b3JyZW50TmFtZTsNCisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCisgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsNCisgICAgICAgIHRoaXMucmVnaW9uID0gcmVnaW9uOw0KKyAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsNCisgICAgICAgIHRoaXMuc3VidGl0bGUgPSBzdWJ0aXRsZTsNCisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7DQorICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7DQorICAgICAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7DQorICAgICAgICB0aGlzLmxpa2VfY291bnQgPSAwOw0KKyAgICAgICAgdGhpcy5yZXBsYXlfY291bnQgPSAwOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldExpa2VDb3VudChpbnQgbGlrZV9jb3VudCkgew0KKyAgICAgICAgdGhpcy5saWtlX2NvdW50ID0gbGlrZV9jb3VudDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldExpa2VDb3VudCgpIHsNCisgICAgICAgIHJldHVybiB0aGlzLmxpa2VfY291bnQ7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1RvcnJlbnQuamF2YSBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9Ub3JyZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmM2ZDMuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1RvcnJlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLXBhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eTsNCi0NCi1pbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmFubm90YXRpb24uSWRUeXBlOw0KLWltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUZpZWxkOw0KLWltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZUlkOw0KLWltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuYW5ub3RhdGlvbi5UYWJsZU5hbWU7DQotaW1wb3J0IGxvbWJvay5EYXRhOw0KLWltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsNCi0NCi1ARGF0YQ0KLUBUYWJsZU5hbWUoInRvcnJlbnQiKQ0KLXB1YmxpYyBjbGFzcyBUb3JyZW50IHsNCi0gICAgQFRhYmxlSWQodmFsdWUgPSAiaWQiLCB0eXBlID0gSWRUeXBlLkFVVE8pDQotICAgIHByaXZhdGUgSW50ZWdlciBpZDsNCi0NCi0gICAgQFRhYmxlRmllbGQoInRvcnJlbnROYW1lIikgLy8g5piO56Gu5oyH5a6a5pWw5o2u5bqT5YiX5ZCNDQotICAgIHByaXZhdGUgU3RyaW5nIHRvcnJlbnROYW1lOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7DQotICAgIHByaXZhdGUgU3RyaW5nIHJlZ2lvbjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x1dGlvbjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3VidGl0bGU7DQotICAgIHByaXZhdGUgTG9uZyBzaXplOw0KLSAgICBwcml2YXRlIFN0cmluZyBoYXNoOw0KLQ0KLSAgICBwcml2YXRlIExvY2FsRGF0ZVRpbWUgY3JlYXRlVGltZTsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7DQotDQotICAgIEBUYWJsZUZpZWxkKCJmaWxlUGF0aCIpIC8vIOaYjuehruaMh+WumuaVsOaNruW6k+WIl+WQjQ0KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlUGF0aDsNCi0NCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGxpa2VDb3VudDsNCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHJlcGx5Q291bnQ7DQotDQotDQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9VU0VSLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9lbnRpdHkvVVNFUi5qYXZhCmluZGV4IGEzMzg0N2MuLmFjNTFlYjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS9VU0VSLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L1VTRVIuamF2YQpAQCAtMjcsMTAgKzI3LDEwIEBACiAgICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5EQVRFKQogICAgIHByaXZhdGUgRGF0ZSBsYXN0TG9naW47CiAKLSAgICBwcml2YXRlIGludCB1cGxvYWQ7Ci0gICAgcHJpdmF0ZSBpbnQgZG93bmxvYWQ7Ci0gICAgcHJpdmF0ZSBpbnQgc2hhcmVSYXRlOwotICAgIHByaXZhdGUgaW50IG1hZ2ljUG9pbnRzOworICAgIHByaXZhdGUgbG9uZyB1cGxvYWQ7CisgICAgcHJpdmF0ZSBsb25nIGRvd25sb2FkOworICAgIHByaXZhdGUgZG91YmxlIHNoYXJlUmF0ZTsvL+WIhuS6q+eOhyDliY3nq6/lsZXnpLrmlbDmja7lupTor6XkuLogOTAuMjMl6L+Z56eNCisgICAgcHJpdmF0ZSBsb25nIG1hZ2ljUG9pbnRzOy8vIOmtlOWKm+WAvAogCiAgICAgcHVibGljIGVudW0gQXV0aG9yaXR5IHsKICAgICAgICAgVVNFUiwgQURNSU4sIExJTUlULCBCQU4KQEAgLTg2LDIzICs4NiwyMyBAQAogICAgICAgICB0aGlzLmxhc3RMb2dpbiA9IGxhc3RMb2dpbjsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGdldFVwbG9hZCgpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRVcGxvYWQoKSB7CiAgICAgICAgIHJldHVybiB1cGxvYWQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0VXBsb2FkKGludCB1cGxvYWQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGxvYWQobG9uZyB1cGxvYWQpIHsKICAgICAgICAgdGhpcy51cGxvYWQgPSB1cGxvYWQ7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXREb3dubG9hZCgpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXREb3dubG9hZCgpIHsKICAgICAgICAgcmV0dXJuIGRvd25sb2FkOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldERvd25sb2FkKGludCBkb3dubG9hZCkgeworICAgIHB1YmxpYyB2b2lkIHNldERvd25sb2FkKGxvbmcgZG93bmxvYWQpIHsKICAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0U2hhcmVSYXRlKCkgeworICAgIHB1YmxpYyBkb3VibGUgZ2V0U2hhcmVSYXRlKCkgewogICAgICAgICByZXR1cm4gc2hhcmVSYXRlOwogICAgIH0KIApAQCAtMTEwLDggKzExMCw4IEBACiAgICAgICAgIHRoaXMuc2hhcmVSYXRlID0gc2hhcmVSYXRlOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0TWFnaWNQb2ludHMoKSB7Ci0gICAgICAgIHJldHVybiBtYWdpY1BvaW50czsKKyAgICBwdWJsaWMgbG9uZyBnZXRNYWdpY1BvaW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWFnaWNQb2ludHM7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TWFnaWNQb2ludHMoaW50IG1hZ2ljUG9pbnRzKSB7CkBAIC0xMjUsMzIgKzEyNSw0MSBAQAogICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CiAgICAgICAgIHRoaXMucmVnaXN0VGltZSA9IHJlZ2lzdFRpbWU7CiAKLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IGhhc2hQYXNzd29yZChwYXNzd29yZCk7OworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CiAKICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBBdXRob3JpdHkuVVNFUjsKICAgICAgICAgdGhpcy5sZXZlbCA9IDA7CiAgICAgICAgIHRoaXMubGFzdExvZ2luID0gbnVsbDsKICAgICAgICAgdGhpcy51cGxvYWQgPSAwOwogICAgICAgICB0aGlzLmRvd25sb2FkID0gMDsKLSAgICAgICAgdGhpcy5zaGFyZVJhdGUgPSAxMDA7CisgICAgICAgIHRoaXMuc2hhcmVSYXRlID0gMTsKICAgICAgICAgdGhpcy5tYWdpY1BvaW50cyA9IDA7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBoYXNoUGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyDkvb/nlKhTSEEtMjU2566X5rOVCi0gICAgICAgICAgICBNZXNzYWdlRGlnZXN0IGRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0yNTYiKTsKLSAgICAgICAgICAgIGJ5dGVbXSBoYXNoQnl0ZXMgPSBkaWdlc3QuZGlnZXN0KHBhc3N3b3JkLmdldEJ5dGVzKCkpOwotCi0gICAgICAgICAgICAvLyDlsIblrZfoioLmlbDnu4TovazmjaLkuLrljYHlha3ov5vliLblrZfnrKbkuLIKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaGV4U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoYnl0ZSBiIDogaGFzaEJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgaGV4U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJ4IiwgYikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaGV4U3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgaGFzaGluZyBwYXNzd29yZCIsIGUpOwotICAgICAgICB9CisgICAgLy/lr7nkuIrkvKDph4/kuIvovb3ph4/nmoTlpITnkIYg6L+U5Zue5pu05paw5ZCO55qE5pWw5o2u57uT5p6cCisgICAgcHVibGljIGxvbmcgdXBkYXRlVXBsb2FkKGxvbmcgYWRkVXBsb2FkKSB7CisgICAgICAgIHRoaXMudXBsb2FkICs9IGFkZFVwbG9hZDsKKyAgICAgICAgdGhpcy5zaGFyZVJhdGUgPSAoZG91YmxlKSB0aGlzLnVwbG9hZCAvIHRoaXMuZG93bmxvYWQ7CisgICAgICAgIHJldHVybiB1cGxvYWQ7CiAgICAgfQorCisgICAgcHVibGljIGxvbmcgdXBkYXRlRG93bmxvYWQobG9uZyBhZGREb3dubG9hZCkgeworICAgICAgICB0aGlzLmRvd25sb2FkICs9IGFkZERvd25sb2FkOworICAgICAgICB0aGlzLnNoYXJlUmF0ZSA9IChkb3VibGUpIHRoaXMudXBsb2FkIC8gdGhpcy5kb3dubG9hZDsKKyAgICAgICAgcmV0dXJuIGRvd25sb2FkOworICAgIH0KKworICAgIC8v55Sf5oiQ6YKA6K+356CB77yM6a2U5Yqb5YC85omj6ZmkCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVJbnZpdGVDb2RlKCkgeworICAgICAgICB0aGlzLm1hZ2ljUG9pbnRzIC09IDEwOworICAgIH0KKworICAgIC8vIOavj+Wkqei/kOihjOeahOiuoeeul+mtlOWKm+WAvOeoi+W6jworICAgIC8vIOa3u+WKoOenjeWtkO+8jOmqjOivgeWQjOS4gOeUqOaIt+eahOWFqOmDqOenjeWtkOWtmOa0u+S4juWQpgorICAgIHB1YmxpYyBsb25nIHVwZGF0ZU1hZ2ljUG9pbnRzKGxvbmcgYWRkTWFnaWNQb2ludHMpIHsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2VudGl0eS90ZXN0ZGF0YS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L3Rlc3RkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmQ4OGUuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vZW50aXR5L3Rlc3RkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLyBtb2RlbOexuyDotJ/otKPnrqHnkIbmlbDmja7lupPmlbDmja7lkoxzYueahOaYoOWwhAotCi1wYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyB0ZXN0ZGF0YSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Eb3dubG9hZFJlY29yZE1hcHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL0Rvd25sb2FkUmVjb3JkTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOGM5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Eb3dubG9hZFJlY29yZE1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLm1hcHBlcjsKKworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuRE9XTkxPQURfUkVDT1JEOworaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLkluc2VydDsKKworcHVibGljIGludGVyZmFjZSBEb3dubG9hZFJlY29yZE1hcHBlciB7CisgICAgQEluc2VydCgiSU5TRVJUIElOVE8gZG93bmxvYWRfcmVjb3JkICh1c2VybmFtZSwgdG9ycmVudF9pZCwgc3RhdHVzLCBkb3dubG9hZF90aW1lLCBkb3dubG9hZF9wYXRoKSAiICsKKyAgICAgICAgICAgICJWQUxVRVMgKCN7dXNlcm5hbWV9LCAje3RvcnJlbnRJZH0sICN7c3RhdHVzfSwgI3tkb3dubG9hZFRpbWV9LCAje2Rvd25sb2FkUGF0aH0pIikKKyAgICB2b2lkIGluc2VydERvd25sb2FkUmVjb3JkKERPV05MT0FEX1JFQ09SRCBkb3dubG9hZFJlY29yZCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvSW52aXRlQ29kZU1hcHBlci5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL0ludml0ZUNvZGVNYXBwZXIuamF2YQppbmRleCA2MTJjN2ZiLi5iNThlMDFiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvSW52aXRlQ29kZU1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9JbnZpdGVDb2RlTWFwcGVyLmphdmEKQEAgLTIsMTcgKzIsMjcgQEAKIAogaW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLm1hcHBlci5CYXNlTWFwcGVyOwogaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuSU5WSVRFX0NPREU7CitpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuSW5zZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLk1hcHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5TZWxlY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuVXBkYXRlOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLnNlcnZpY2UuYW5ub3RhdGlvbi5QdXRFeGNoYW5nZTsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBATWFwcGVyCiBwdWJsaWMgaW50ZXJmYWNlIEludml0ZUNvZGVNYXBwZXIgZXh0ZW5kcyBCYXNlTWFwcGVyPElOVklURV9DT0RFPiB7CiAgICAgLy/mn6Xor6IKICAgICBAU2VsZWN0KCJTRUxFQ1QgKiBGUk9NIGludml0ZV9jb2RlIFdIRVJFIGNvZGUgPSAje2NvZGV9IikKICAgICBJTlZJVEVfQ09ERSBzZWxlY3RCeUNvZGUoU3RyaW5nIGNvZGUpOwogCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSBpbnZpdGVfY29kZSBXSEVSRSBnZW5lcmF0ZVVzZXIgPSAje3VzZXJuYW1lfSIpCisgICAgTGlzdDxJTlZJVEVfQ09ERT4gc2VsZWN0QnlVc2VyKFN0cmluZyB1c2VybmFtZSk7CisKICAgICBAVXBkYXRlKCJVUERBVEUgaW52aXRlX2NvZGUgU0VUIGlzdXNlZCA9IHRydWUgV0hFUkUgY29kZSA9ICN7Y29kZX0iKQogICAgIGludCB1cGRhdGVDb2RlVXNlcihTdHJpbmcgY29kZSk7CisKKyAgICAvLyDmj5LlhaXmlrDmlbDmja4KKyAgICBASW5zZXJ0KCJJTlNFUlQgSU5UTyBpbnZpdGVfY29kZSAoY29kZSwgZ2VuZXJhdGVVc2VyLCBpc1VzZWQpIFZBTFVFUyAoI3tjb2RlfSwgI3tnZW5lcmF0ZVVzZXJ9LCAje2lzVXNlZH0pIikKKyAgICBpbnQgaW5zZXJ0SW52aXRlQ29kZShJTlZJVEVfQ09ERSBpbnZpdGVDb2RlKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvVG9ycmVudE1hcHBlci5qYXZhCmluZGV4IGZmNjEyYjMuLmI0ZWM0MDcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Ub3JyZW50TWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL1RvcnJlbnRNYXBwZXIuamF2YQpAQCAtMSw4ICsxLDc2IEBACiBwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXI7CiAKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuY29yZS5tYXBwZXIuQmFzZU1hcHBlcjsKLWltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlRvcnJlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuTWFwcGVyOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVE9SUkVOVDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy4qOwogCi1ATWFwcGVyCi1wdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRNYXBwZXIgZXh0ZW5kcyBCYXNlTWFwcGVyPFRvcnJlbnQ+IHt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRNYXBwZXIgZXh0ZW5kcyBCYXNlTWFwcGVyPFRPUlJFTlQ+IHsKKyAgICAvLyDmoLnmja5oYXNo5p+l6K+iVG9ycmVudAorICAgIEBTZWxlY3QoIlNFTEVDVCAqIEZST00gdG9ycmVudCBXSEVSRSBoYXNoID0gI3toYXNofSIpCisgICAgVE9SUkVOVCBzZWxlY3RCeUhhc2goU3RyaW5nIGhhc2gpOworCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50IFdIRVJFIGlkID0gI3tpZH0iKQorICAgIFRPUlJFTlQgc2VsZWN0QnlJRChpbnQgaWQpOworCisgICAgLy8gTWFwcGVy5o6l5Y+jCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50IE9SREVSIEJZIGNyZWF0ZV90aW1lIERFU0MgTElNSVQgI3tvZmZzZXR9LCAje3NpemV9IikKKyAgICBMaXN0PFRPUlJFTlQ+IHNlbGVjdEFsbFRvcnJlbnRXaXRoUGFnZShAUGFyYW0oIm9mZnNldCIpIGludCBvZmZzZXQsIEBQYXJhbSgic2l6ZSIpIGludCBzaXplKTsKKworICAgIEBTZWxlY3QoIlNFTEVDVCBDT1VOVCgqKSBGUk9NIHRvcnJlbnQiKQorICAgIGludCBjb3VudEFsbFRvcnJlbnQoKTsKKworICAgIEBTZWxlY3QoIlNFTEVDVCAqIEZST00gdG9ycmVudCBXSEVSRSBjYXRlZ29yeSA9ICN7Y2F0ZWdvcnl9IikKKyAgICBMaXN0PFRPUlJFTlQ+IHNlbGVjdFRvcnJlbnRCeUNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSk7CisKKyAgICBAU2VsZWN0KCJTRUxFQ1QgKiBGUk9NIHRvcnJlbnQgV0hFUkUgdG9ycmVudE5hbWUgTElLRSBDT05DQVQoJyUnLCAje2tleX0sICclJykiKQorICAgIExpc3Q8VE9SUkVOVD4gc2VsZWN0VG9ycmVudEJ5S2V5KFN0cmluZyBrZXkpOworCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50IFdIRVJFIHVzZXJuYW1lID0gI3t1c2VybmFtZX0iKQorICAgIExpc3Q8VE9SUkVOVD4gc2VsZWN0VG9ycmVudEJ5VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKTsKKworICAgIC8v5YiG6aG15p+l6K+i6YOo5YiGCisgICAgLy8g5ZyoVG9ycmVudE1hcHBlci5qYXZh5Lit5re75Yqg5Lul5LiL5pa55rOVCisKKyAgICAvLyDliIbpobXmn6Xor6LnibnlrprliIbnsbsKKyAgICBAU2VsZWN0KCJTRUxFQ1QgKiBGUk9NIHRvcnJlbnQgV0hFUkUgY2F0ZWdvcnkgPSAje2NhdGVnb3J5fSBPUkRFUiBCWSBjcmVhdGVfdGltZSBERVNDIExJTUlUICN7b2Zmc2V0fSwgI3tzaXplfSIpCisgICAgTGlzdDxUT1JSRU5UPiBzZWxlY3RUb3JyZW50QnlDYXRlZ29yeVdpdGhQYWdlKEBQYXJhbSgiY2F0ZWdvcnkiKSBTdHJpbmcgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXJhbSgib2Zmc2V0IikgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFBhcmFtKCJzaXplIikgaW50IHNpemUpOworCisgICAgQFNlbGVjdCgiU0VMRUNUIENPVU5UKCopIEZST00gdG9ycmVudCBXSEVSRSBjYXRlZ29yeSA9ICN7Y2F0ZWdvcnl9IikKKyAgICBpbnQgY291bnRCeUNhdGVnb3J5KEBQYXJhbSgiY2F0ZWdvcnkiKSBTdHJpbmcgY2F0ZWdvcnkpOworCisgICAgLy8g5YiG6aG15pCc57Si5YWz6ZSu5a2XCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50IFdIRVJFIHRvcnJlbnROYW1lIExJS0UgQ09OQ0FUKCclJywje2tleX0sJyUnKSBPUiBkZXNjcmlwdGlvbiBMSUtFIENPTkNBVCgnJScsI3trZXl9LCclJykgT1JERVIgQlkgY3JlYXRlX3RpbWUgREVTQyBMSU1JVCAje29mZnNldH0sICN7c2l6ZX0iKQorICAgIExpc3Q8VE9SUkVOVD4gc2VsZWN0VG9ycmVudEJ5S2V5V2l0aFBhZ2UoQFBhcmFtKCJrZXkiKSBTdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFBhcmFtKCJvZmZzZXQiKSBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFBhcmFtKCJzaXplIikgaW50IHNpemUpOworCisgICAgQFNlbGVjdCgiU0VMRUNUIENPVU5UKCopIEZST00gdG9ycmVudCBXSEVSRSB0b3JyZW50TmFtZSBMSUtFIENPTkNBVCgnJScsI3trZXl9LCclJykgT1IgZGVzY3JpcHRpb24gTElLRSBDT05DQVQoJyUnLCN7a2V5fSwnJScpIikKKyAgICBpbnQgY291bnRCeUtleShAUGFyYW0oImtleSIpIFN0cmluZyBrZXkpOworCisgICAgLy8g5YiG6aG15p+l6K+i55So5oi356eN5a2QCisgICAgQFNlbGVjdCgiU0VMRUNUICogRlJPTSB0b3JyZW50IFdIRVJFIHVzZXJuYW1lID0gI3t1c2VybmFtZX0gT1JERVIgQlkgY3JlYXRlX3RpbWUgREVTQyBMSU1JVCAje29mZnNldH0sICN7c2l6ZX0iKQorICAgIExpc3Q8VE9SUkVOVD4gc2VsZWN0VG9ycmVudEJ5VXNlcm5hbWVXaXRoUGFnZShAUGFyYW0oInVzZXJuYW1lIikgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGFyYW0oIm9mZnNldCIpIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXJhbSgic2l6ZSIpIGludCBzaXplKTsKKworICAgIEBTZWxlY3QoIlNFTEVDVCBDT1VOVCgqKSBGUk9NIHRvcnJlbnQgV0hFUkUgdXNlcm5hbWUgPSAje3VzZXJuYW1lfSIpCisgICAgaW50IGNvdW50QnlVc2VybmFtZShAUGFyYW0oInVzZXJuYW1lIikgU3RyaW5nIHVzZXJuYW1lKTsKKworICAgIC8vIOaPkuWFpVRvcnJlbnQKKyAgICBASW5zZXJ0KCJJTlNFUlQgSU5UTyB0b3JyZW50ICh0b3JyZW50TmFtZSwgZGVzY3JpcHRpb24sIGNhdGVnb3J5LCByZWdpb24sIHJlc29sdXRpb24sIHN1YnRpdGxlLCBzaXplLCBoYXNoLCB1c2VybmFtZSwgY3JlYXRlX3RpbWUsIGZpbGVQYXRoKSAiICsKKyAgICAgICAgICAgICJWQUxVRVMgKCN7dG9ycmVudE5hbWV9LCAje2Rlc2NyaXB0aW9ufSwgI3tjYXRlZ29yeX0sICN7cmVnaW9ufSwgI3tyZXNvbHV0aW9ufSwgI3tzdWJ0aXRsZX0sICN7c2l6ZX0sICN7aGFzaH0sICN7dXNlcm5hbWV9LCBDVVJSRU5UX1RJTUVTVEFNUCwgI3tmaWxlUGF0aH0pIikKKyAgICBpbnQgaW5zZXJ0VG9ycmVudChUT1JSRU5UIHRvcnJlbnQpOworCisgICAgLy8g5pu05pawVG9ycmVudOS/oeaBrworICAgIEBVcGRhdGUoIlVQREFURSB0b3JyZW50IFNFVCB0b3JyZW50TmFtZSA9ICN7dG9ycmVudE5hbWV9LCBkZXNjcmlwdGlvbiA9ICN7ZGVzY3JpcHRpb259LCBjYXRlZ29yeSA9ICN7Y2F0ZWdvcnl9LCAiICsKKyAgICAgICAgICAgICJ0YWdzID0gI3t0YWdzfSwgc2l6ZSA9ICN7c2l6ZX0sIHVzZXJuYW1lID0gI3t1c2VybmFtZX0gV0hFUkUgaGFzaCA9ICN7aGFzaH0iKQorICAgIGludCB1cGRhdGVUb3JyZW50KFRPUlJFTlQgdG9ycmVudCk7CisKKyAgICAvLyDliKDpmaRUb3JyZW50CisgICAgQERlbGV0ZSgiREVMRVRFIEZST00gdG9ycmVudCBXSEVSRSBpZCA9ICN7aWR9IikKKyAgICBpbnQgZGVsZXRlVG9ycmVudChpbnQgaWQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Vc2VyTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9tYXBwZXIvVXNlck1hcHBlci5qYXZhCmluZGV4IDAyNDgwN2UuLmYxN2QwZGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL21hcHBlci9Vc2VyTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vbWFwcGVyL1VzZXJNYXBwZXIuamF2YQpAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5JbnNlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5pYmF0aXMuYW5ub3RhdGlvbnMuTWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuaWJhdGlzLmFubm90YXRpb25zLlNlbGVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmliYXRpcy5hbm5vdGF0aW9ucy5VcGRhdGU7CiAKIEBNYXBwZXIKIHB1YmxpYyBpbnRlcmZhY2UgVXNlck1hcHBlciBleHRlbmRzIEJhc2VNYXBwZXI8VVNFUj4gewpAQCAtMjAsNCArMjEsMTcgQEAKICAgICBASW5zZXJ0KCJJTlNFUlQgSU5UTyB1c2VyICh1c2VybmFtZSwgcGFzc3dvcmQsIHJlZ2lzdFRpbWUpICIgKwogICAgICAgICAgICAgIlZBTFVFUyAoI3t1c2VybmFtZX0sICN7cGFzc3dvcmR9LCAje3JlZ2lzdFRpbWV9KSIpCiAgICAgaW50IGluc2VydFVzZXIoVVNFUiB1c2VyKTsKKworICAgIC8vIOabtOaWsOeUqOaIt+S/oeaBrworICAgIEBVcGRhdGUoIlVQREFURSB1c2VyIFNFVCAiICsKKyAgICAgICAgICAgICJwYXNzd29yZCA9ICN7cGFzc3dvcmR9LCAiICsKKyAgICAgICAgICAgICJhdXRob3JpdHkgPSAje2F1dGhvcml0eX0sICIgKworICAgICAgICAgICAgImxldmVsID0gI3tsZXZlbH0sICIgKworICAgICAgICAgICAgImxhc3RMb2dpbiA9ICN7bGFzdExvZ2lufSwgIiArCisgICAgICAgICAgICAidXBsb2FkID0gI3t1cGxvYWR9LCAiICsKKyAgICAgICAgICAgICJkb3dubG9hZCA9ICN7ZG93bmxvYWR9LCAiICsKKyAgICAgICAgICAgICJzaGFyZVJhdGUgPSAje3NoYXJlUmF0ZX0sICIgKworICAgICAgICAgICAgIm1hZ2ljUG9pbnRzID0gI3ttYWdpY1BvaW50c30gIiArCisgICAgICAgICAgICAiV0hFUkUgdXNlcm5hbWUgPSAje3VzZXJuYW1lfSIpCisgICAgaW50IHVwZGF0ZVVzZXIoVVNFUiB1c2VyKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvQ2xpZW50U2VydmljZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9DbGllbnRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljZGM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvQ2xpZW50U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuU2ltcGxlQ2xpZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50U3RhdGlzdGljOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CisKK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgQ2xpZW50U2VydmljZSB7CisgICAgU2ltcGxlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVDbGllbnQoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGRvd25sb2FkVG9ycmVudChTdHJpbmcgdG9ycmVudEZpbGVQYXRoLCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCisgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsgLy8g5L2/55So5pys5Zyw5Zyw5Z2ACisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIOW8gOWni+S4i+i9vXRvcnJlbnQKKyAgICAgICAgICAgIGNsaWVudC5kb3dubG9hZFRvcnJlbnQodG9ycmVudEZpbGVQYXRoLCBvdXRwdXREaXJlY3RvcnksIGFkZHJlc3MpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLkuIvovb3lrozmiJAiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8g5LiL6L295aSx6LSl77yM6L6T5Ye65byC5bi45L+h5oGvCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRvcnJlbnRTdGF0aXN0aWMgZ2V0U3RhdGlzdGljcyhTdHJpbmcgdG9ycmVudEZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVG9ycmVudFN0YXRpc3RpYyB0cyA9IGNsaWVudC5nZXRTdGF0aXN0aWNzKHRvcnJlbnRGaWxlUGF0aCk7CisgICAgICAgIHJldHVybiB0czsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9Ub3JyZW50U2VydmljZS5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9Ub3JyZW50U2VydmljZS5qYXZhCmluZGV4IGYzZDAyMjIuLjE4OTEwNjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvVG9ycmVudFNlcnZpY2UuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1RvcnJlbnRTZXJ2aWNlLmphdmEKQEAgLTEsMTAgKzEsMTAgQEAKIHBhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2U7CiAKIGltcG9ydCBjb20uYmFvbWlkb3UubXliYXRpc3BsdXMuZXh0ZW5zaW9uLnNlcnZpY2UuSVNlcnZpY2U7Ci1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5Ub3JyZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVE9SUkVOVDsKIAotcHVibGljIGludGVyZmFjZSBUb3JyZW50U2VydmljZSBleHRlbmRzIElTZXJ2aWNlPFRvcnJlbnQ+IHsKLSAgICBUb3JyZW50IGdldFRvcnJlbnRCeUlkKEludGVnZXIgaWQpOyAgLy8gQWRkIHRoaXMgbWV0aG9kCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRTZXJ2aWNlIGV4dGVuZHMgSVNlcnZpY2U8VE9SUkVOVD4geworICAgIFRPUlJFTlQgZ2V0VG9ycmVudEJ5SWQoSW50ZWdlciBpZCk7ICAvLyBBZGQgdGhpcyBtZXRob2QKICAgICB2b2lkIGluY3JlbWVudExpa2UoaW50IHBvc3RJZCk7CiAgICAgdm9pZCBpbmNyZW1lbnRSZXBseUNvdW50KGludCBwb3N0SWQpOwogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1RyYWNrZXJTZXJ2aWNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL1RyYWNrZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliYzk1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvVHJhY2tlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VkVG9ycmVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXI7CitpbXBvcnQgamFrYXJ0YS5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvL+WwgeijheeahOWvuXRyYWNrZXLnmoTmk43kvZwKK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgVHJhY2tlclNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBUcmFja2VyIHRyYWNrZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFRyYWNrZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8g5Yib5bu65LiA5LiqVHJhY2tlcuWvueixoe+8jOebkeWQrOerr+WPozY5NjkKKyAgICAgICAgdHJhY2tlciA9IG5ldyBUcmFja2VyKDY5NjkpOworCisgICAgICAgIC8vIOi/h+a7pOebruW9leS4i+eahC50b3JyZW505paH5Lu2CisgICAgICAgIEZpbGVuYW1lRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIudG9ycmVudCIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIOiOt+WPluW9k+WJjemhueebruagueebruW9leeahOi3r+W+hOW5tuaLvOaOpXRvcnJlbnRz5paH5Lu25aS56Lev5b6ECisgICAgICAgIFN0cmluZyB0b3JyZW50RGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgRmlsZS5zZXBhcmF0b3IgKyAidG9ycmVudHMiOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuaWh+S7tui3r+W+hDogIiArIHRvcnJlbnREaXJlY3RvcnkpOworCisgICAgICAgIC8vIOmBjeWOhuebruW9leS4reeahOaJgOaciXRvcnJlbnTmlofku7bvvIzkvKDpgJLnu5l0cmFja2VyCisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbmV3IEZpbGUodG9ycmVudERpcmVjdG9yeSkubGlzdEZpbGVzKGZpbHRlcikpIHsKKworICAgICAgICAgICAgVHJhY2tlZFRvcnJlbnQgdHQgPSB0cmFja2VyLmFubm91bmNlKFRyYWNrZWRUb3JyZW50LmxvYWQoZmlsZSkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLnp43lrZDmlofku7Y6ICIgKyB0dCk7CisgICAgICAgIH0KKworICAgICAgICAvLyDorr7nva7lhYHorrjmjqXmlLblpJbpg6h0b3JyZW50CisgICAgICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgICAgIC8vIOWQr+WKqHRyYWNrZXLmnI3liqEKKyAgICAgICAgdHJhY2tlci5zdGFydCh0cnVlKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3BUcmFja2VyKCkgeworICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmFja2VyLnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFRyYWNrZWRUb3JyZW50PiBnZXRUcmFja2VkVG9ycmVudHMoKSB7CisgICAgICAgIHJldHVybiB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpOworICAgIH0KKworICAgIHB1YmxpYyBUcmFja2VkVG9ycmVudCBnZXRUcmFja2VkVG9ycmVudChTdHJpbmcgaGFzaCkgeworICAgICAgICByZXR1cm4gdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudChoYXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhY2tlZFRvcnJlbnQgYWRkVHJhY2tlZFRvcnJlbnQoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisgICAgICAgIHJldHVybiB0cmFja2VyLmFubm91bmNlKFRyYWNrZWRUb3JyZW50LmxvYWQoZmlsZSkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL2ltcGwvVG9ycmVudFNlcnZpY2VJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9zZXJ2aWNlL2ltcGwvVG9ycmVudFNlcnZpY2VJbXBsLmphdmEKaW5kZXggYTZlYmE1NC4uMzI4MWQ4MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vc2VydmljZS9pbXBsL1RvcnJlbnRTZXJ2aWNlSW1wbC5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3NlcnZpY2UvaW1wbC9Ub3JyZW50U2VydmljZUltcGwuamF2YQpAQCAtMSwyNCArMSwyNCBAQAogcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5pbXBsOwogCiBpbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmV4dGVuc2lvbi5zZXJ2aWNlLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5Ub3JyZW50OworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVE9SUkVOVDsKIGltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlRvcnJlbnRNYXBwZXI7CiBpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuVG9ycmVudFNlcnZpY2U7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay50cmFuc2FjdGlvbi5hbm5vdGF0aW9uLlRyYW5zYWN0aW9uYWw7CiAKIEBTZXJ2aWNlCi1wdWJsaWMgY2xhc3MgVG9ycmVudFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGw8VG9ycmVudE1hcHBlciwgVG9ycmVudD4gaW1wbGVtZW50cyBUb3JyZW50U2VydmljZSB7CitwdWJsaWMgY2xhc3MgVG9ycmVudFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGw8VG9ycmVudE1hcHBlciwgVE9SUkVOVD4gaW1wbGVtZW50cyBUb3JyZW50U2VydmljZSB7CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVG9ycmVudCBnZXRUb3JyZW50QnlJZChJbnRlZ2VyIGlkKSB7CisgICAgcHVibGljIFRPUlJFTlQgZ2V0VG9ycmVudEJ5SWQoSW50ZWdlciBpZCkgewogICAgICAgICByZXR1cm4gdGhpcy5nZXRCeUlkKGlkKTsgLy8g55u05o6l6LCD55SoIE15QmF0aXMtUGx1cyDmj5DkvpvnmoQgZ2V0QnlJZCDmlrnms5UKICAgICB9CiAgICAgQE92ZXJyaWRlCiAgICAgQFRyYW5zYWN0aW9uYWwKICAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRMaWtlKGludCBwb3N0SWQpIHsKICAgICAgICAgdGhpcy51cGRhdGUobnVsbCwKLSAgICAgICAgICAgICAgICBuZXcgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy51cGRhdGUuVXBkYXRlV3JhcHBlcjxUb3JyZW50PigpCisgICAgICAgICAgICAgICAgbmV3IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmNvbmRpdGlvbnMudXBkYXRlLlVwZGF0ZVdyYXBwZXI8VE9SUkVOVD4oKQogICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJpZCIsIHBvc3RJZCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTcWwoImxpa2VfY291bnQgPSBsaWtlX2NvdW50ICsgMSIpCiAgICAgICAgICk7CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgQFRyYW5zYWN0aW9uYWwKICAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRSZXBseUNvdW50KGludCBwb3N0SWQpIHsKICAgICAgICAgdGhpcy51cGRhdGUobnVsbCwKLSAgICAgICAgICAgICAgICBuZXcgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy51cGRhdGUuVXBkYXRlV3JhcHBlcjxUb3JyZW50PigpCisgICAgICAgICAgICAgICAgbmV3IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmNvbmRpdGlvbnMudXBkYXRlLlVwZGF0ZVdyYXBwZXI8VE9SUkVOVD4oKQogICAgICAgICAgICAgICAgICAgICAgICAgLmVxKCJpZCIsIHBvc3RJZCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTcWwoInJlcGx5X2NvdW50ID0gcmVwbHlfY291bnQgKyAxIikKICAgICAgICAgKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL0p3dFV0aWxzLmphdmEgYi9zcmMvbWFpbi9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS91dGlscy9Kd3RVdGlscy5qYXZhCmluZGV4IDU3YmZmMzEuLjA3Mjg4MTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL0p3dFV0aWxzLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvSnd0VXRpbHMuamF2YQpAQCAtMSwxMyArMSwyMSBAQAogcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHM7CiAKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlVTRVI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLm1hcHBlci5Vc2VyTWFwcGVyOwogaW1wb3J0IGlvLmpzb253ZWJ0b2tlbi5DbGFpbXM7CiBpbXBvcnQgaW8uanNvbndlYnRva2VuLkp3dHM7CiBpbXBvcnQgaW8uanNvbndlYnRva2VuLlNpZ25hdHVyZUFsZ29yaXRobTsKK2ltcG9ydCBqYWthcnRhLmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uUmVzdENvbnRyb2xsZXI7CiAKIGltcG9ydCBqYXZheC54bWwuY3J5cHRvLkRhdGE7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiAKKwogcHVibGljIGNsYXNzIEp3dFV0aWxzIHsKKwogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZXhwaXJlID0gMzYwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlY3JldCA9ICJhYmNkZWZnZyI7CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL1Jlc3VsdC5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvUmVzdWx0LmphdmEKaW5kZXggMGJkYTdlYi4uNTI3ZmM0MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvUmVzdWx0LmphdmEKKysrIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvUmVzdWx0LmphdmEKQEAgLTIsNiArMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAorLy9BQUFBQUFBQUFBQUFBYWFhYWEKIHB1YmxpYyBjbGFzcyBSZXN1bHQgewogICAgIHByaXZhdGUgQm9vbGVhbiBzdWNjZXNzOwogICAgIHByaXZhdGUgSW50ZWdlciBjb2RlOwpAQCAtNzQsNCArNzUsOCBAQAogICAgICAgICB0aGlzLnNldERhdGEobWFwKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCl7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL1NpemVDYWxjdWxhdGlvbi5qYXZhIGIvc3JjL21haW4vamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vdXRpbHMvU2l6ZUNhbGN1bGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzZTM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL3V0aWxzL1NpemVDYWxjdWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHM7CisKKy8v5a6e546w5bCG5a2X6IqC5aSn5bCP6L2s5YyW5Li6R0IKK3B1YmxpYyBjbGFzcyBTaXplQ2FsY3VsYXRpb24geworCisgICAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZVRvR0IobG9uZyBieXRlcykgeworICAgICAgICByZXR1cm4gKGludCkgKGJ5dGVzIC8gMTAyNCAvIDEwMjQgLyAxMDI0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcyBiL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCmluZGV4IDczMGFmNWMuLjcwMzM4ZDMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCisrKyBiL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCkBAIC0yNiw0ICsyNiwxMiBAQAogCiAjIE15QmF0aXMtUGx1cyBwcm9wZXJ0aWVzCiBteWJhdGlzLXBsdXMubWFwcGVyLWxvY2F0aW9ucz1jbGFzc3BhdGg6L21hcHBlci8qLnhtbAotbXliYXRpcy1wbHVzLnR5cGUtYWxpYXNlcy1wYWNrYWdlPWNvbS5leGFtcGxlLmRlbW8ubW9kZWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitteWJhdGlzLXBsdXMudHlwZS1hbGlhc2VzLXBhY2thZ2U9Y29tLmV4YW1wbGUuZGVtby5tb2RlbAorCisjIFRyYWNrZXI/PworYml0dG9ycmVudC50cmFja2VyLnRvcnJlbnQtZGlyPS4vdG9ycmVudHMKKworIyA/Pz8/Pz8KK3NwcmluZy5zZXJ2bGV0Lm11bHRpcGFydC5lbmFibGVkPXRydWUKK3NwcmluZy5zZXJ2bGV0Lm11bHRpcGFydC5tYXgtZmlsZS1zaXplPTEwTUIKK3NwcmluZy5zZXJ2bGV0Lm11bHRpcGFydC5tYXgtcmVxdWVzdC1zaXplPTEwTUIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL0ludml0ZUNvZGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL0ludml0ZUNvZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMDBmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvSW52aXRlQ29kZVRlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uY29udHJvbGxlcjsKKworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuSU5WSVRFX0NPREU7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5VU0VSOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuSW52aXRlQ29kZU1hcHBlcjsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0ubWFwcGVyLlVzZXJNYXBwZXI7CitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLkp3dFV0aWxzOworaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS51dGlscy5SZXN1bHQ7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5SZXNwb25zZUVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitjbGFzcyBJbnZpdGVDb2RlVGVzdCB7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgSW52aXRlQ29kZU1hcHBlciBpbnZpdGVDb2RlTWFwcGVyOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIFVzZXJNYXBwZXIgdXNlck1hcHBlcjsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBVc2VyQ29udHJvbGxlciB1c2VyQ29udHJvbGxlcjsKKworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBJbmplY3RNb2NrcworICAgIHByaXZhdGUgSW52aXRlQ29kZUNvbnRyb2xsZXIgaW52aXRlQ29kZUNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIFVTRVIgdGVzdFVzZXI7CisgICAgcHJpdmF0ZSBJTlZJVEVfQ09ERSB0ZXN0SW52aXRlQ29kZTsKKworICAgIEBCZWZvcmVFYWNoCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLm9wZW5Nb2Nrcyh0aGlzKTsKKworICAgICAgICB0ZXN0VXNlciA9IG5ldyBVU0VSKCk7CisgICAgICAgIHRlc3RVc2VyLnNldFVzZXJuYW1lKCJ0ZXN0VXNlciIpOworICAgICAgICB0ZXN0VXNlci5zZXRNYWdpY1BvaW50cygxNSk7CisKKyAgICAgICAgdGVzdEludml0ZUNvZGUgPSBuZXcgSU5WSVRFX0NPREUodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIHRlc3RJbnZpdGVDb2RlLnNldENvZGUoIlRFU1RDT0RFMTIzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGdlbmVyYXRlSW52aXRlQ29kZV9TdWNjZXNzKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4odXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KSkudGhlblJldHVybih0ZXN0VXNlcik7CisgICAgICAgIHdoZW4oaW52aXRlQ29kZU1hcHBlci5pbnNlcnRJbnZpdGVDb2RlKGFueShJTlZJVEVfQ09ERS5jbGFzcykpKS50aGVuUmV0dXJuKDEpOworCisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gaW52aXRlQ29kZUNvbnRyb2xsZXIuZ2VuZXJhdGVJbnZpdGVDb2RlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldERhdGEoKS5nZXQoImludml0ZUNvZGUiKSk7CisgICAgICAgIHZlcmlmeSh1c2VyTWFwcGVyLCB0aW1lcygxKSkudXBkYXRlVXNlcih0ZXN0VXNlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGdlbmVyYXRlSW52aXRlQ29kZV9GYWlsX05vdEVub3VnaE1hZ2ljUG9pbnRzKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHRlc3RVc2VyLnNldE1hZ2ljUG9pbnRzKDUpOworICAgICAgICB3aGVuKHVzZXJDb250cm9sbGVyLmdldFVzZXJJblJlcXVlc3QocmVxdWVzdCkpLnRoZW5SZXR1cm4odGVzdFVzZXIpOworCisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gaW52aXRlQ29kZUNvbnRyb2xsZXIuZ2VuZXJhdGVJbnZpdGVDb2RlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNTdWNjZXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIuWFkeaNoumCgOivt+eggeWksei0pe+8jOmtlOWKm+WAvOS4jei2s+OAgiIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOworICAgICAgICB2ZXJpZnkoaW52aXRlQ29kZU1hcHBlciwgbmV2ZXIoKSkuaW5zZXJ0SW52aXRlQ29kZShhbnkoKSk7CisgICAgICAgIHZlcmlmeSh1c2VyTWFwcGVyLCBuZXZlcigpKS51cGRhdGVVc2VyKGFueSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgdXNlckludml0ZUNvZGVfU3VjY2VzcygpIHsKKyAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICBMaXN0PElOVklURV9DT0RFPiBpbnZpdGVDb2RlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnZpdGVDb2Rlcy5hZGQodGVzdEludml0ZUNvZGUpOworCisgICAgICAgIHdoZW4odXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KSkudGhlblJldHVybih0ZXN0VXNlcik7CisgICAgICAgIHdoZW4oaW52aXRlQ29kZU1hcHBlci5zZWxlY3RCeVVzZXIodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSkpLnRoZW5SZXR1cm4oaW52aXRlQ29kZXMpOworCisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gaW52aXRlQ29kZUNvbnRyb2xsZXIudXNlckludml0ZUNvZGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzU3VjY2VzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGludml0ZUNvZGVzLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgiaW52aXRlQ29kZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgdXNlckludml0ZUNvZGVfRW1wdHlMaXN0KCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4odXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KSkudGhlblJldHVybih0ZXN0VXNlcik7CisgICAgICAgIHdoZW4oaW52aXRlQ29kZU1hcHBlci5zZWxlY3RCeVVzZXIodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSkpLnRoZW5SZXR1cm4obmV3IEFycmF5TGlzdDw+KCkpOworCisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gaW52aXRlQ29kZUNvbnRyb2xsZXIudXNlckludml0ZUNvZGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzU3VjY2VzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKExpc3Q8Pz4pIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJpbnZpdGVDb2RlIikpLmlzRW1wdHkoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbW1lbnRDb250cm9sbGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9UT1JSRU5UQ29tbWVudENvbnRyb2xsZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Ub3JyZW50Q29tbWVudENvbnRyb2xsZXJUZXN0LmphdmEKcmVuYW1lIHRvIHNyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVE9SUkVOVENvbW1lbnRDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDU4NWE1NDYuLjQwYWJjNjMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbW1lbnRDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVE9SUkVOVENvbW1lbnRDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLio7DQogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7DQogDQotY2xhc3MgVG9ycmVudENvbW1lbnRDb250cm9sbGVyVGVzdCB7DQorY2xhc3MgVE9SUkVOVENvbW1lbnRDb250cm9sbGVyVGVzdCB7DQogDQogICAgIEBNb2NrDQogICAgIHByaXZhdGUgVG9ycmVudENvbW1lbnRTZXJ2aWNlIGNvbW1lbnRTZXJ2aWNlOw0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVE9SUkVOVENvbnRyb2xsZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1RPUlJFTlRDb250cm9sbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODNkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1RPUlJFTlRDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKK3BhY2thZ2UgY29tLnB0cC5wdHBsYXRmb3JtLmNvbnRyb2xsZXI7DQorDQoraW1wb3J0IGNvbS5iYW9taWRvdS5teWJhdGlzcGx1cy5jb3JlLmNvbmRpdGlvbnMucXVlcnkuUXVlcnlXcmFwcGVyOw0KK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uZW50aXR5LlRPUlJFTlQ7DQoraW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVG9ycmVudENvbW1lbnQ7DQoraW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5zZXJ2aWNlLlRvcnJlbnRDb21tZW50U2VydmljZTsNCitpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuVG9ycmVudFNlcnZpY2U7DQoraW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS51dGlscy5SZXN1bHQ7DQoraW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOw0KK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsNCitpbXBvcnQgb3JnLm1vY2tpdG8uSW5qZWN0TW9ja3M7DQoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7DQoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsNCisNCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuKjsNCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55Ow0KK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOw0KKw0KK2NsYXNzIFRPUlJFTlRDb250cm9sbGVyVGVzdCB7DQorDQorICAgIEBNb2NrDQorICAgIHByaXZhdGUgVG9ycmVudFNlcnZpY2UgdG9ycmVudFNlcnZpY2U7DQorDQorICAgIEBNb2NrDQorICAgIHByaXZhdGUgVG9ycmVudENvbW1lbnRTZXJ2aWNlIGNvbW1lbnRTZXJ2aWNlOw0KKw0KKyAgICBASW5qZWN0TW9ja3MNCisgICAgcHJpdmF0ZSBUb3JyZW50Q29udHJvbGxlciB0b3JyZW50Q29udHJvbGxlcjsNCisNCisgICAgQEJlZm9yZUVhY2gNCisgICAgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5vcGVuTW9ja3ModGhpcyk7DQorICAgIH0NCisNCisgICAgQFRlc3QNCisgICAgdm9pZCBnZXRUb3JyZW50QnlJZF9TaG91bGRSZXR1cm5Ub3JyZW50X1doZW5Ub3JyZW50RXhpc3RzKCkgew0KKyAgICAgICAgLy8gMS4g5L2/55So5p6E6YCg5Ye95pWw5Yib5bu65rWL6K+V5pWw5o2uDQorICAgICAgICBUT1JSRU5UIG1vY2tUT1JSRU5UID0gbmV3IFRPUlJFTlQoDQorICAgICAgICAgICAgICAgICJkM2IwNzM4NGQxMTNlZGVjNDllYWE2MjM4YWQ1ZmYwMCIsIC8vIGhhc2gNCisgICAgICAgICAgICAgICAgIlVidW50dSAyMi4wNCBJU08iLCAgICAgICAgICAgICAgICAvLyB0b3JyZW50TmFtZQ0KKyAgICAgICAgICAgICAgICAiT2ZmaWNpYWwgVWJ1bnR1IExpbnV4IGRpc3RyaWJ1dGlvbiIsIC8vIGRlc2NyaXB0aW9uDQorICAgICAgICAgICAgICAgICJTb2Z0d2FyZSIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F0ZWdvcnkNCisgICAgICAgICAgICAgICAgIue+juWbvSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lvbg0KKyAgICAgICAgICAgICAgICAiMTA4MHAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbg0KKyAgICAgICAgICAgICAgICAi5Lit5paH5a2X5bmVIiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0aXRsZQ0KKyAgICAgICAgICAgICAgICAyMDQ4TCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSAoMkdCKQ0KKyAgICAgICAgICAgICAgICAiYWRtaW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlcm5hbWUNCisgICAgICAgICAgICAgICAgIi9kb3dubG9hZHMvdWJ1bnR1LTIyLjA0LmlzbyIgICAgICAvLyBmaWxlUGF0aA0KKyAgICAgICAgKTsNCisgICAgICAgIG1vY2tUT1JSRU5ULnNldElkKDEpOw0KKyAgICAgICAgbW9ja1RPUlJFTlQuc2V0TGlrZUNvdW50KDIwMCk7DQorDQorICAgICAgICAvLyDmqKHmi5/nqbror4TorrrliJfooagNCisgICAgICAgIExpc3Q8VG9ycmVudENvbW1lbnQ+IGVtcHR5Q29tbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCisNCisgICAgICAgIC8vIDIuIOaooeaLn+acjeWKoeWxguihjOS4ug0KKyAgICAgICAgd2hlbih0b3JyZW50U2VydmljZS5nZXRCeUlkKDEpKS50aGVuUmV0dXJuKG1vY2tUT1JSRU5UKTsNCisgICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UubGlzdChhbnkoUXVlcnlXcmFwcGVyLmNsYXNzKSkpLnRoZW5SZXR1cm4oZW1wdHlDb21tZW50cyk7DQorDQorICAgICAgICAvLyAzLiDosIPnlKjmjqfliLblmajmlrnms5UNCisgICAgICAgIFJlc3VsdCByZXN1bHQgPSB0b3JyZW50Q29udHJvbGxlci5nZXRQb3N0KDEpOw0KKw0KKyAgICAgICAgLy8gNC4g6aqM6K+B57uT5p6cDQorICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXN1bHQuZ2V0Q29kZSgpKTsNCisgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldERhdGEoKS5nZXQoInRvcnJlbnQiKSk7DQorICAgICAgICBUT1JSRU5UIHJldHVybmVkVE9SUkVOVCA9IChUT1JSRU5UKSByZXN1bHQuZ2V0RGF0YSgpLmdldCgidG9ycmVudCIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVYnVudHUgMjIuMDQgSVNPIiwgcmV0dXJuZWRUT1JSRU5ULmdldFRvcnJlbnROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmV0dXJuZWRUT1JSRU5ULmdldExpa2VDb3VudCgpKTsNCisNCisgICAgICAgIC8vIDUuIOmqjOivgeacjeWKoeWxguiwg+eUqA0KKyAgICAgICAgdmVyaWZ5KHRvcnJlbnRTZXJ2aWNlLCB0aW1lcygxKSkuZ2V0QnlJZCgxKTsNCisgICAgICAgIHZlcmlmeShjb21tZW50U2VydmljZSwgdGltZXMoMSkpLmxpc3QoYW55KFF1ZXJ5V3JhcHBlci5jbGFzcykpOw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1RvcnJlbnRDb250cm9sbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRmYmZhLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVG9ycmVudENvbnRyb2xsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotcGFja2FnZSBjb20ucHRwLnB0cGxhdGZvcm0uY29udHJvbGxlcjsNCi0NCi1pbXBvcnQgY29tLmJhb21pZG91Lm15YmF0aXNwbHVzLmNvcmUuY29uZGl0aW9ucy5xdWVyeS5RdWVyeVdyYXBwZXI7DQotaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5lbnRpdHkuVG9ycmVudDsNCi1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLmVudGl0eS5Ub3JyZW50Q29tbWVudDsNCi1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnNlcnZpY2UuVG9ycmVudENvbW1lbnRTZXJ2aWNlOw0KLWltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0uc2VydmljZS5Ub3JyZW50U2VydmljZTsNCi1pbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsNCi1pbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkJlZm9yZUVhY2g7DQotaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0Ow0KLWltcG9ydCBvcmcubW9ja2l0by5JbmplY3RNb2NrczsNCi1pbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsNCi1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy4qOw0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7DQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7DQotDQotY2xhc3MgVG9ycmVudENvbnRyb2xsZXJUZXN0IHsNCi0NCi0gICAgQE1vY2sNCi0gICAgcHJpdmF0ZSBUb3JyZW50U2VydmljZSB0b3JyZW50U2VydmljZTsNCi0NCi0gICAgQE1vY2sNCi0gICAgcHJpdmF0ZSBUb3JyZW50Q29tbWVudFNlcnZpY2UgY29tbWVudFNlcnZpY2U7DQotDQotICAgIEBJbmplY3RNb2Nrcw0KLSAgICBwcml2YXRlIFRvcnJlbnRDb250cm9sbGVyIHRvcnJlbnRDb250cm9sbGVyOw0KLQ0KLSAgICBAQmVmb3JlRWFjaA0KLSAgICB2b2lkIHNldFVwKCkgew0KLSAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLm9wZW5Nb2Nrcyh0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBAVGVzdA0KLSAgICB2b2lkIGdldFRvcnJlbnRCeUlkX1Nob3VsZFJldHVyblRvcnJlbnRfV2hlblRvcnJlbnRFeGlzdHMoKSB7DQotICAgICAgICAvLyAxLiDmnoTpgKDmtYvor5XmlbDmja4NCi0gICAgICAgIFRvcnJlbnQgbW9ja1RvcnJlbnQgPSBuZXcgVG9ycmVudCgpOw0KLSAgICAgICAgbW9ja1RvcnJlbnQuc2V0SWQoMSk7DQotICAgICAgICBtb2NrVG9ycmVudC5zZXRUb3JyZW50TmFtZSgiVWJ1bnR1IDIyLjA0IElTTyIpOw0KLSAgICAgICAgbW9ja1RvcnJlbnQuc2V0RGVzY3JpcHRpb24oIk9mZmljaWFsIFVidW50dSBMaW51eCBkaXN0cmlidXRpb24iKTsNCi0gICAgICAgIG1vY2tUb3JyZW50LnNldENhdGVnb3J5KCJTb2Z0d2FyZSIpOw0KLSAgICAgICAgbW9ja1RvcnJlbnQuc2V0RmlsZVBhdGgoIi9kb3dubG9hZHMvdWJ1bnR1LTIyLjA0LmlzbyIpOw0KLSAgICAgICAgbW9ja1RvcnJlbnQuc2V0Q3JlYXRlVGltZShMb2NhbERhdGVUaW1lLm9mKDIwMjMsIDUsIDEsIDEwLCAwKSk7DQotICAgICAgICBtb2NrVG9ycmVudC5zZXRSZWdpb24oIue+juWbvSIpOw0KLSAgICAgICAgbW9ja1RvcnJlbnQuc2V0TGlrZUNvdW50KDIwMCk7DQotDQotICAgICAgICAvLyDmqKHmi5/nqbror4TorrrliJfooagNCi0gICAgICAgIExpc3Q8VG9ycmVudENvbW1lbnQ+IGVtcHR5Q29tbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsNCi0NCi0gICAgICAgIC8vIDIuIOaooeaLn+acjeWKoeWxguihjOS4ug0KLSAgICAgICAgd2hlbih0b3JyZW50U2VydmljZS5nZXRCeUlkKDEpKS50aGVuUmV0dXJuKG1vY2tUb3JyZW50KTsNCi0gICAgICAgIHdoZW4oY29tbWVudFNlcnZpY2UubGlzdChhbnkoUXVlcnlXcmFwcGVyLmNsYXNzKSkpLnRoZW5SZXR1cm4oZW1wdHlDb21tZW50cyk7DQotDQotICAgICAgICAvLyAzLiDosIPnlKjmjqfliLblmajmlrnms5UNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSB0b3JyZW50Q29udHJvbGxlci5nZXRQb3N0KDEpOw0KLQ0KLSAgICAgICAgLy8gNC4g6aqM6K+B57uT5p6cDQotICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXN1bHQuZ2V0Q29kZSgpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldERhdGEoKS5nZXQoInRvcnJlbnQiKSk7DQotICAgICAgICBUb3JyZW50IHJldHVybmVkVG9ycmVudCA9IChUb3JyZW50KSByZXN1bHQuZ2V0RGF0YSgpLmdldCgidG9ycmVudCIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVYnVudHUgMjIuMDQgSVNPIiwgcmV0dXJuZWRUb3JyZW50LmdldFRvcnJlbnROYW1lKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmV0dXJuZWRUb3JyZW50LmdldExpa2VDb3VudCgpKTsNCi0NCi0gICAgICAgIC8vIDUuIOmqjOivgeacjeWKoeWxguiwg+eUqA0KLSAgICAgICAgdmVyaWZ5KHRvcnJlbnRTZXJ2aWNlLCB0aW1lcygxKSkuZ2V0QnlJZCgxKTsNCi0gICAgICAgIHZlcmlmeShjb21tZW50U2VydmljZSwgdGltZXMoMSkpLmxpc3QoYW55KFF1ZXJ5V3JhcHBlci5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIEBUZXN0DQotICAgIHZvaWQgZ2V0VG9ycmVudERldGFpbHNfU2hvdWxkUmV0dXJuRXJyb3JfV2hlblRvcnJlbnROb3RFeGlzdHMoKSB7DQotICAgICAgICB3aGVuKHRvcnJlbnRTZXJ2aWNlLmdldEJ5SWQoOTk5KSkudGhlblJldHVybihudWxsKTsNCi0NCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSB0b3JyZW50Q29udHJvbGxlci5nZXRQb3N0KDk5OSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXN1bHQuZ2V0Q29kZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygi56eN5a2Q5LiN5a2Y5ZyoIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB2ZXJpZnkodG9ycmVudFNlcnZpY2UsIHRpbWVzKDEpKS5nZXRCeUlkKDk5OSk7DQotICAgICAgICB2ZXJpZnkoY29tbWVudFNlcnZpY2UsIG5ldmVyKCkpLmxpc3QoYW55KFF1ZXJ5V3JhcHBlci5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIEBUZXN0DQotICAgIHZvaWQgY3JlYXRlVG9ycmVudF9TaG91bGRTdWNjZXNzX1dpdGhWYWxpZERhdGEoKSB7DQotICAgICAgICBUb3JyZW50IG5ld1RvcnJlbnQgPSBuZXcgVG9ycmVudCgpOw0KLSAgICAgICAgbmV3VG9ycmVudC5zZXRUb3JyZW50TmFtZSgiTmV3IFRvcnJlbnQiKTsNCi0gICAgICAgIG5ld1RvcnJlbnQuc2V0RGVzY3JpcHRpb24oIlRlc3QgY3JlYXRpb24iKTsNCi0gICAgICAgIG5ld1RvcnJlbnQuc2V0RmlsZVBhdGgoIi9kb3dubG9hZHMvdGVzdC50b3JyZW50Iik7DQotICAgICAgICBuZXdUb3JyZW50LnNldFJlZ2lvbigi5Lit5Zu9Iik7DQotDQotICAgICAgICB3aGVuKHRvcnJlbnRTZXJ2aWNlLnNhdmUoYW55KFRvcnJlbnQuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsNCi0NCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSB0b3JyZW50Q29udHJvbGxlci5jcmVhdGVUb3JyZW50KG5ld1RvcnJlbnQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIuaIkOWKnyIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgdmVyaWZ5KHRvcnJlbnRTZXJ2aWNlLCB0aW1lcygxKSkuc2F2ZShhbnkoVG9ycmVudC5jbGFzcykpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXJUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2NvbS9wdHAvcHRwbGF0Zm9ybS9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IGViZTIzNTMuLmE0MTNiZGEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvY29tL3B0cC9wdHBsYXRmb3JtL2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9jb20vcHRwL3B0cGxhdGZvcm0vY29udHJvbGxlci9Vc2VyQ29udHJvbGxlclRlc3QuamF2YQpAQCAtNiwxMyArNiwxOSBAQAogaW1wb3J0IGNvbS5wdHAucHRwbGF0Zm9ybS5tYXBwZXIuVXNlck1hcHBlcjsKIGltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuSnd0VXRpbHM7CiBpbXBvcnQgY29tLnB0cC5wdHBsYXRmb3JtLnV0aWxzLlJlc3VsdDsKK2ltcG9ydCBjb20ucHRwLnB0cGxhdGZvcm0udXRpbHMuU2l6ZUNhbGN1bGF0aW9uOworaW1wb3J0IGlvLmpzb253ZWJ0b2tlbi5DbGFpbXM7CitpbXBvcnQgamFrYXJ0YS5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOwogaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwogaW1wb3J0IG9yZy5tb2NraXRvLkluamVjdE1vY2tzOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2VkU3RhdGljOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuKjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwpAQCAtMjYsMTY5ICszMiwyNDkgQEAKICAgICBwcml2YXRlIEludml0ZUNvZGVNYXBwZXIgaW52aXRlQ29kZU1hcHBlcjsKIAogICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBKd3RVdGlscyBqd3RVdGlsczsKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwogCiAgICAgQEluamVjdE1vY2tzCiAgICAgcHJpdmF0ZSBVc2VyQ29udHJvbGxlciB1c2VyQ29udHJvbGxlcjsKIAorICAgIHByaXZhdGUgVVNFUiB0ZXN0VXNlcjsKKyAgICBwcml2YXRlIElOVklURV9DT0RFIHRlc3RJbnZpdGVDb2RlOworCiAgICAgQEJlZm9yZUVhY2gKICAgICB2b2lkIHNldFVwKCkgewogICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMub3Blbk1vY2tzKHRoaXMpOworCisgICAgICAgIHRlc3RVc2VyID0gbmV3IFVTRVIoKTsKKyAgICAgICAgdGVzdFVzZXIuc2V0VXNlcm5hbWUoInRlc3RVc2VyIik7CisgICAgICAgIHRlc3RVc2VyLnNldFBhc3N3b3JkKCJ0ZXN0UGFzc3dvcmQiKTsKKyAgICAgICAgdGVzdFVzZXIuc2V0TGFzdExvZ2luKG5ldyBEYXRlKCkpOworICAgICAgICB0ZXN0VXNlci5zZXRVcGxvYWQoMTA3Mzc0MTgyNEwpOyAvLyAxR0IgaW4gYnl0ZXMKKyAgICAgICAgdGVzdFVzZXIuc2V0RG93bmxvYWQoNTM2ODcwOTEyTCk7IC8vIDAuNUdCIGluIGJ5dGVzCisKKyAgICAgICAgdGVzdEludml0ZUNvZGUgPSBuZXcgSU5WSVRFX0NPREUoInRlc3RVc2VyIik7CisgICAgICAgIHRlc3RJbnZpdGVDb2RlLnNldENvZGUoIlRFU1RDT0RFMTIzIik7CisgICAgICAgIHRlc3RJbnZpdGVDb2RlLnNldElzVXNlZChmYWxzZSk7CiAgICAgfQogCi0vLyAgICBAVGVzdAotLy8gICAgdm9pZCB0ZXN0TG9naW5fU3VjY2VzcygpIHsKLS8vICAgICAgICAvLyDlh4blpIfmtYvor5XmlbDmja4KLS8vICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSAidGVzdFVzZXIiOwotLy8gICAgICAgIFN0cmluZyBwYXNzd29yZCA9ICJ0ZXN0UGFzcyI7Ci0vLyAgICAgICAgU3RyaW5nIGhhc2hlZFBhc3N3b3JkID0gImhhc2hlZFRlc3RQYXNzIjsKLS8vICAgICAgICBTdHJpbmcgdG9rZW4gPSAiZ2VuZXJhdGVkVG9rZW4iOwotLy8KLS8vICAgICAgICAvLyDliJvlu7ogbW9jayDlr7nosaEKLS8vICAgICAgICBVU0VSIG1vY2tVc2VyID0gbW9jayhVU0VSLmNsYXNzKTsKLS8vICAgICAgICAvLyDkvb/nlKhNb2NraXRv5pa55byP5a6a5LmJ6KGM5Li6Ci0vLyAgICAgICAgd2hlbihtb2NrVXNlci5nZXRVc2VybmFtZSgpKS50aGVuUmV0dXJuKHVzZXJuYW1lKTsKLS8vICAgICAgICB3aGVuKG1vY2tVc2VyLmdldFBhc3N3b3JkKCkpLnRoZW5SZXR1cm4oaGFzaGVkUGFzc3dvcmQpOwotLy8gICAgICAgIC8vIOWmguaenCBoYXNoUGFzc3dvcmQg6ZyA6KaB6KKr6LCD55SoCi0vLyAgICAgICAgd2hlbihtb2NrVXNlci5oYXNoUGFzc3dvcmQocGFzc3dvcmQpKS50aGVuUmV0dXJuKGhhc2hlZFBhc3N3b3JkKTsKLS8vCi0vLyAgICAgICAgLy8g5qih5oufTWFwcGVy6KGM5Li6Ci0vLyAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodXNlcm5hbWUpKS50aGVuUmV0dXJuKG1vY2tVc2VyKTsKLS8vICAgICAgICB3aGVuKGp3dFV0aWxzLmdlbmVyYXRlVG9rZW4odXNlcm5hbWUpKS50aGVuUmV0dXJuKHRva2VuKTsKLS8vCi0vLyAgICAgICAgLy8g5omn6KGM5rWL6K+VCi0vLyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLmxvZ2luKHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0vLwotLy8gICAgICAgIC8vIOmqjOivgee7k+aenAotLy8gICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3VsdC5nZXRDb2RlKCkpOwotLy8gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbiwgcmVzdWx0LmdldERhdGEoKS5nZXQoInRva2VuIikpOwotLy8gICAgICAgIHZlcmlmeSh1c2VyTWFwcGVyLCB0aW1lcygxKSkuc2VsZWN0QnlVc2VybmFtZSh1c2VybmFtZSk7Ci0vLyAgICAgICAgdmVyaWZ5KGp3dFV0aWxzLCB0aW1lcygxKSkuZ2VuZXJhdGVUb2tlbih1c2VybmFtZSk7Ci0vLyAgICB9CisgICAgQFRlc3QKKyAgICB2b2lkIGluZm9fU3VjY2VzcygpIHsKKyAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICB3aGVuKHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIikpLnRoZW5SZXR1cm4oInZhbGlkVG9rZW4iKTsKKworICAgICAgICBDbGFpbXMgbW9ja0NsYWltcyA9IG1vY2soQ2xhaW1zLmNsYXNzKTsKKyAgICAgICAgd2hlbihtb2NrQ2xhaW1zLmdldFN1YmplY3QoKSkudGhlblJldHVybih0ZXN0VXNlci5nZXRVc2VybmFtZSgpKTsKKworICAgICAgICB0cnkgKE1vY2tlZFN0YXRpYzxKd3RVdGlscz4gbW9ja2VkSnd0VXRpbHMgPSBtb2NrU3RhdGljKEp3dFV0aWxzLmNsYXNzKSkgeworICAgICAgICAgICAgbW9ja2VkSnd0VXRpbHMud2hlbigoKSAtPiBKd3RVdGlscy5nZXRDbGFpbUJ5VG9rZW4oInZhbGlkVG9rZW4iKSkudGhlblJldHVybihtb2NrQ2xhaW1zKTsKKyAgICAgICAgICAgIHdoZW4odXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKHRlc3RVc2VyLmdldFVzZXJuYW1lKCkpKS50aGVuUmV0dXJuKHRlc3RVc2VyKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIuaW5mbyhyZXF1ZXN0KTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdFVzZXIsIHJlc3VsdC5nZXREYXRhKCkuZ2V0KCJpbmZvIikpOworICAgICAgICB9CisgICAgfQogCiAgICAgQFRlc3QKLSAgICB2b2lkIHRlc3RMb2dpbl9Vc2VyTm90Rm91bmQoKSB7Ci0gICAgICAgIFN0cmluZyB1c2VybmFtZSA9ICJub25FeGlzdFVzZXIiOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAiYW55UGFzcyI7CisgICAgdm9pZCBsb2dpbl9TdWNjZXNzKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4odXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKHRlc3RVc2VyLmdldFVzZXJuYW1lKCkpKS50aGVuUmV0dXJuKHRlc3RVc2VyKTsKIAotICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh1c2VybmFtZSkpLnRoZW5SZXR1cm4obnVsbCk7CisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIubG9naW4odGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSwgdGVzdFVzZXIuZ2V0UGFzc3dvcmQoKSk7CiAKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLmxvZ2luKHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldERhdGEoKS5nZXQoInRva2VuIikpOworICAgICAgICB2ZXJpZnkodXNlck1hcHBlciwgdGltZXMoMSkpLnVwZGF0ZVVzZXIodGVzdFVzZXIpOworICAgIH0KIAotICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICBAVGVzdAorICAgIHZvaWQgbG9naW5fRmFpbF9Xcm9uZ1Bhc3N3b3JkKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4odXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKHRlc3RVc2VyLmdldFVzZXJuYW1lKCkpKS50aGVuUmV0dXJuKHRlc3RVc2VyKTsKKworICAgICAgICAvLyBBY3QKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLmxvZ2luKHRlc3RVc2VyLmdldFVzZXJuYW1lKCksICJ3cm9uZ1Bhc3N3b3JkIik7CisKKyAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygi5a+G56CB6ZSZ6K+vIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHZlcmlmeSh1c2VyTWFwcGVyLCBuZXZlcigpKS51cGRhdGVVc2VyKGFueSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgbG9naW5fRmFpbF9Vc2VyTm90Rm91bmQoKSB7CisgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUoIm5vbmV4aXN0ZW50VXNlciIpKS50aGVuUmV0dXJuKG51bGwpOworCisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIubG9naW4oIm5vbmV4aXN0ZW50VXNlciIsICJhbnlQYXNzd29yZCIpOworCisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNTdWNjZXNzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIueUqOaIt+S4jeWtmOWcqCIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwogICAgIH0KIAotLy8gICAgQFRlc3QKLS8vICAgIHZvaWQgdGVzdExvZ2luX1dyb25nUGFzc3dvcmQoKSB7Ci0vLyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gInRlc3RVc2VyIjsKLS8vICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAid3JvbmdQYXNzIjsKLS8vICAgICAgICBTdHJpbmcgaGFzaGVkUGFzc3dvcmQgPSAiaGFzaGVkVGVzdFBhc3MiOwotLy8KLS8vICAgICAgICBVU0VSIG1vY2tVc2VyID0gbmV3IFVTRVIoKTsKLS8vICAgICAgICBtb2NrVXNlci5zZXRVc2VybmFtZSh1c2VybmFtZSk7Ci0vLyAgICAgICAgbW9ja1VzZXIuc2V0UGFzc3dvcmQoaGFzaGVkUGFzc3dvcmQpOwotLy8KLS8vICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh1c2VybmFtZSkpLnRoZW5SZXR1cm4obW9ja1VzZXIpOwotLy8gICAgICAgIHdoZW4obW9ja1VzZXIuaGFzaFBhc3N3b3JkKHBhc3N3b3JkKSkudGhlblJldHVybigid3JvbmdIYXNoIik7Ci0vLwotLy8gICAgICAgIFJlc3VsdCByZXN1bHQgPSB1c2VyQ29udHJvbGxlci5sb2dpbih1c2VybmFtZSwgcGFzc3dvcmQpOwotLy8KLS8vICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoIuWvhueggemUmeivryIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotLy8gICAgfQotCiAgICAgQFRlc3QKLSAgICB2b2lkIHRlc3RSZWdpc3Rlcl9TdWNjZXNzKCkgewotICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSAibmV3VXNlciI7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9ICJuZXdQYXNzIjsKLSAgICAgICAgU3RyaW5nIGNvZGUgPSAidmFsaWRDb2RlIjsKLSAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOworICAgIHZvaWQgcmVnaXN0X1N1Y2Nlc3MoKSB7CisgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUoIm5ld1VzZXIiKSkudGhlblJldHVybihudWxsKTsKKyAgICAgICAgd2hlbihpbnZpdGVDb2RlTWFwcGVyLnNlbGVjdEJ5Q29kZSgiVkFMSURDT0RFIikpLnRoZW5SZXR1cm4odGVzdEludml0ZUNvZGUpOwogCi0gICAgICAgIElOVklURV9DT0RFIG1vY2tJbnZpdGVDb2RlID0gbmV3IElOVklURV9DT0RFKCk7Ci0gICAgICAgIG1vY2tJbnZpdGVDb2RlLnNldElzVXNlZChmYWxzZSk7CisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIucmVnaXN0KCJuZXdVc2VyIiwgIm5ld1Bhc3N3b3JkIiwgIlZBTElEQ09ERSIpOwogCi0gICAgICAgIHdoZW4odXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKHVzZXJuYW1lKSkudGhlblJldHVybihudWxsKTsKLSAgICAgICAgd2hlbihpbnZpdGVDb2RlTWFwcGVyLnNlbGVjdEJ5Q29kZShjb2RlKSkudGhlblJldHVybihtb2NrSW52aXRlQ29kZSk7Ci0KLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLnJlZ2lzdCh1c2VybmFtZSwgcGFzc3dvcmQsIGNvZGUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3VsdC5nZXRDb2RlKCkpOworICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaXNTdWNjZXNzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIuaWsOW7uueUqOaIt+aIkOWKnyIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwogICAgICAgICB2ZXJpZnkodXNlck1hcHBlciwgdGltZXMoMSkpLmluc2VydFVzZXIoYW55KFVTRVIuY2xhc3MpKTsKLSAgICAgICAgdmVyaWZ5KGludml0ZUNvZGVNYXBwZXIsIHRpbWVzKDEpKS51cGRhdGVDb2RlVXNlcihjb2RlKTsKKyAgICAgICAgdmVyaWZ5KGludml0ZUNvZGVNYXBwZXIsIHRpbWVzKDEpKS51cGRhdGVDb2RlVXNlcigiVkFMSURDT0RFIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICB2b2lkIHRlc3RSZWdpc3Rlcl9Vc2VybmFtZUV4aXN0cygpIHsKLSAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gImV4aXN0aW5nVXNlciI7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9ICJhbnlQYXNzIjsKLSAgICAgICAgU3RyaW5nIGNvZGUgPSAiYW55Q29kZSI7CisgICAgdm9pZCByZWdpc3RfRmFpbF9Vc2VybmFtZUV4aXN0cygpIHsKKyAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh0ZXN0VXNlci5nZXRVc2VybmFtZSgpKSkudGhlblJldHVybih0ZXN0VXNlcik7CiAKLSAgICAgICAgVVNFUiBleGlzdGluZ1VzZXIgPSBuZXcgVVNFUigpOwotICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh1c2VybmFtZSkpLnRoZW5SZXR1cm4oZXhpc3RpbmdVc2VyKTsKKyAgICAgICAgLy8gQWN0CisgICAgICAgIFJlc3VsdCByZXN1bHQgPSB1c2VyQ29udHJvbGxlci5yZWdpc3QodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSwgImFueVBhc3N3b3JkIiwgImFueUNvZGUiKTsKIAotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIucmVnaXN0KHVzZXJuYW1lLCBwYXNzd29yZCwgY29kZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNTdWNjZXNzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIueUqOaIt+WQjeW3suWtmOWcqO+8jOazqOWGjOWksei0pSIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwogICAgICAgICB2ZXJpZnkodXNlck1hcHBlciwgbmV2ZXIoKSkuaW5zZXJ0VXNlcihhbnkoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICB2b2lkIHRlc3RSZWdpc3Rlcl9JbnZhbGlkQ29kZSgpIHsKLSAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gIm5ld1VzZXIiOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAibmV3UGFzcyI7Ci0gICAgICAgIFN0cmluZyBjb2RlID0gImludmFsaWRDb2RlIjsKKyAgICB2b2lkIHJlZ2lzdF9GYWlsX0ludmFsaWRDb2RlKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4odXNlck1hcHBlci5zZWxlY3RCeVVzZXJuYW1lKCJuZXdVc2VyIikpLnRoZW5SZXR1cm4obnVsbCk7CisgICAgICAgIHdoZW4oaW52aXRlQ29kZU1hcHBlci5zZWxlY3RCeUNvZGUoIklOVkFMSURDT0RFIikpLnRoZW5SZXR1cm4obnVsbCk7CiAKLSAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodXNlcm5hbWUpKS50aGVuUmV0dXJuKG51bGwpOwotICAgICAgICB3aGVuKGludml0ZUNvZGVNYXBwZXIuc2VsZWN0QnlDb2RlKGNvZGUpKS50aGVuUmV0dXJuKG51bGwpOworICAgICAgICAvLyBBY3QKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLnJlZ2lzdCgibmV3VXNlciIsICJuZXdQYXNzd29yZCIsICJJTlZBTElEQ09ERSIpOwogCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSB1c2VyQ29udHJvbGxlci5yZWdpc3QodXNlcm5hbWUsIHBhc3N3b3JkLCBjb2RlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXN1bHQuZ2V0Q29kZSgpKTsKKyAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygi6YKA6K+356CB5LiN5a2Y5Zyo77yM5rOo5YaM5aSx6LSlIiwgcmVzdWx0LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIHZlcmlmeSh1c2VyTWFwcGVyLCBuZXZlcigpKS5pbnNlcnRVc2VyKGFueSgpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHZvaWQgdGVzdFJlZ2lzdGVyX1VzZWRDb2RlKCkgewotICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSAibmV3VXNlciI7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9ICJuZXdQYXNzIjsKLSAgICAgICAgU3RyaW5nIGNvZGUgPSAidXNlZENvZGUiOworICAgIHZvaWQgcmVnaXN0X0ZhaWxfVXNlZENvZGUoKSB7CisgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgdGVzdEludml0ZUNvZGUuc2V0SXNVc2VkKHRydWUpOworICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSgibmV3VXNlciIpKS50aGVuUmV0dXJuKG51bGwpOworICAgICAgICB3aGVuKGludml0ZUNvZGVNYXBwZXIuc2VsZWN0QnlDb2RlKCJVU0VEQ09ERSIpKS50aGVuUmV0dXJuKHRlc3RJbnZpdGVDb2RlKTsKIAotICAgICAgICBJTlZJVEVfQ09ERSB1c2VkQ29kZSA9IG5ldyBJTlZJVEVfQ09ERSgpOwotICAgICAgICB1c2VkQ29kZS5zZXRJc1VzZWQodHJ1ZSk7CisgICAgICAgIC8vIEFjdAorICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIucmVnaXN0KCJuZXdVc2VyIiwgIm5ld1Bhc3N3b3JkIiwgIlVTRURDT0RFIik7CiAKLSAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodXNlcm5hbWUpKS50aGVuUmV0dXJuKG51bGwpOwotICAgICAgICB3aGVuKGludml0ZUNvZGVNYXBwZXIuc2VsZWN0QnlDb2RlKGNvZGUpKS50aGVuUmV0dXJuKHVzZWRDb2RlKTsKLQotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIucmVnaXN0KHVzZXJuYW1lLCBwYXNzd29yZCwgY29kZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIC8vIEFzc2VydAorICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNTdWNjZXNzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIumCgOivt+eggeW3sue7j+iiq+S9v+eUqO+8jOazqOWGjOWksei0pSIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwogICAgICAgICB2ZXJpZnkodXNlck1hcHBlciwgbmV2ZXIoKSkuaW5zZXJ0VXNlcihhbnkoKSk7CiAgICAgfQogCi0vLyAgICBAVGVzdAotLy8gICAgdm9pZCB0ZXN0R2V0VXNlckluZm9fU3VjY2VzcygpIHsKLS8vICAgICAgICBTdHJpbmcgdG9rZW4gPSAidmFsaWRUb2tlbiI7Ci0vLyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gInRlc3RVc2VyIjsKLS8vCi0vLyAgICAgICAgd2hlbihqd3RVdGlscy5nZXRDbGFpbUJ5VG9rZW4odG9rZW4pLmdldFN1YmplY3QoKSkudGhlblJldHVybih1c2VybmFtZSk7Ci0vLwotLy8gICAgICAgIFJlc3VsdCByZXN1bHQgPSB1c2VyQ29udHJvbGxlci5pbmZvKHRva2VuKTsKLS8vCi0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJuYW1lLCByZXN1bHQuZ2V0RGF0YSgpLmdldCgibmFtZSIpKTsKLS8vICAgIH0KKyAgICBAVGVzdAorICAgIHZvaWQgYWxsb3dEb3dubG9hZF9TdWNjZXNzKCkgeworICAgICAgICAvLyBBcnJhbmdlCisgICAgICAgIHdoZW4ocmVxdWVzdC5nZXRIZWFkZXIoIkF1dGhvcml6YXRpb24iKSkudGhlblJldHVybigidmFsaWRUb2tlbiIpOworCisgICAgICAgIENsYWltcyBtb2NrQ2xhaW1zID0gbW9jayhDbGFpbXMuY2xhc3MpOworICAgICAgICB3aGVuKG1vY2tDbGFpbXMuZ2V0U3ViamVjdCgpKS50aGVuUmV0dXJuKHRlc3RVc2VyLmdldFVzZXJuYW1lKCkpOworCisgICAgICAgIHRyeSAoTW9ja2VkU3RhdGljPEp3dFV0aWxzPiBtb2NrZWRKd3RVdGlscyA9IG1vY2tTdGF0aWMoSnd0VXRpbHMuY2xhc3MpKSB7CisgICAgICAgICAgICBtb2NrZWRKd3RVdGlscy53aGVuKCgpIC0+IEp3dFV0aWxzLmdldENsYWltQnlUb2tlbigidmFsaWRUb2tlbiIpKS50aGVuUmV0dXJuKG1vY2tDbGFpbXMpOworICAgICAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSkpLnRoZW5SZXR1cm4odGVzdFVzZXIpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSB1c2VyQ29udHJvbGxlci5hbGxvd0Rvd25sb2FkKHJlcXVlc3QpOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzU3VjY2VzcygpKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSA9IHJlc3VsdC5nZXREYXRhKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGF0YS5nZXQoInRvdGFsU2l6ZSIpKTsgLy8gMUdCCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGF0YS5nZXQoInVzZWRTaXplIikpOyAvLyAwLjVHQiAoYnV0IFNpemVDYWxjdWxhdGlvbi5ieXRlVG9HQiByb3VuZHMgZG93bikKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBkYXRhLmdldCgibGVmdFNpemUiKSk7IC8vIDAuNUdCIHJvdW5kZWQgdXAKKyAgICAgICAgfQorICAgIH0KIAogICAgIEBUZXN0Ci0gICAgdm9pZCB0ZXN0TG9nb3V0KCkgewotICAgICAgICBTdHJpbmcgdG9rZW4gPSAiYW55VG9rZW4iOworICAgIHZvaWQgdXBkYXRlUGFzc3dvcmRfU3VjY2VzcygpIHsKKyAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICB3aGVuKHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIikpLnRoZW5SZXR1cm4oInZhbGlkVG9rZW4iKTsKIAotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIubG9nb3V0KHRva2VuKTsKKyAgICAgICAgQ2xhaW1zIG1vY2tDbGFpbXMgPSBtb2NrKENsYWltcy5jbGFzcyk7CisgICAgICAgIHdoZW4obW9ja0NsYWltcy5nZXRTdWJqZWN0KCkpLnRoZW5SZXR1cm4odGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzdWx0LmdldENvZGUoKSk7CisgICAgICAgIHRyeSAoTW9ja2VkU3RhdGljPEp3dFV0aWxzPiBtb2NrZWRKd3RVdGlscyA9IG1vY2tTdGF0aWMoSnd0VXRpbHMuY2xhc3MpKSB7CisgICAgICAgICAgICBtb2NrZWRKd3RVdGlscy53aGVuKCgpIC0+IEp3dFV0aWxzLmdldENsYWltQnlUb2tlbigidmFsaWRUb2tlbiIpKS50aGVuUmV0dXJuKG1vY2tDbGFpbXMpOworCisgICAgICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh0ZXN0VXNlci5nZXRVc2VybmFtZSgpKSkudGhlblJldHVybih0ZXN0VXNlcik7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFzc3dvcmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBwYXNzd29yZE1hcC5wdXQoIm9sZFBhc3N3b3JkIiwgdGVzdFVzZXIuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgICAgICBwYXNzd29yZE1hcC5wdXQoIm5ld1Bhc3N3b3JkIiwgIm5ld1Bhc3N3b3JkMTIzIik7CisKKyAgICAgICAgICAgIC8vIEFjdAorICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IHVzZXJDb250cm9sbGVyLnVwZGF0ZVBhc3N3b3JkKHJlcXVlc3QsIHBhc3N3b3JkTWFwKTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIuS/ruaUueWvhueggeaIkOWKnyIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdmVyaWZ5KHVzZXJNYXBwZXIsIHRpbWVzKDEpKS51cGRhdGVVc2VyKHRlc3RVc2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCB1cGRhdGVQYXNzd29yZF9GYWlsX1dyb25nT2xkUGFzc3dvcmQoKSB7CisgICAgICAgIC8vIEFycmFuZ2UKKyAgICAgICAgd2hlbihyZXF1ZXN0LmdldEhlYWRlcigiQXV0aG9yaXphdGlvbiIpKS50aGVuUmV0dXJuKCJ2YWxpZFRva2VuIik7CisKKyAgICAgICAgLy8g5Yib5bu65qih5ouf55qEIENsYWltcyDlr7nosaEKKyAgICAgICAgQ2xhaW1zIG1vY2tDbGFpbXMgPSBtb2NrKENsYWltcy5jbGFzcyk7CisgICAgICAgIHdoZW4obW9ja0NsYWltcy5nZXRTdWJqZWN0KCkpLnRoZW5SZXR1cm4odGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSk7ICAvLyDmqKHmi58gZ2V0U3ViamVjdCgpIOi/lOWbnueUqOaIt+WQjQorCisgICAgICAgIHRyeSAoTW9ja2VkU3RhdGljPEp3dFV0aWxzPiBtb2NrZWRKd3RVdGlscyA9IG1vY2tTdGF0aWMoSnd0VXRpbHMuY2xhc3MpKSB7CisgICAgICAgICAgICAvLyDmqKHmi58gSnd0VXRpbHMuZ2V0Q2xhaW1CeVRva2VuIOi/lOWbnuaooeaLn+eahCBDbGFpbXMg5a+56LGhCisgICAgICAgICAgICBtb2NrZWRKd3RVdGlscy53aGVuKCgpIC0+IEp3dFV0aWxzLmdldENsYWltQnlUb2tlbigidmFsaWRUb2tlbiIpKS50aGVuUmV0dXJuKG1vY2tDbGFpbXMpOworCisgICAgICAgICAgICB3aGVuKHVzZXJNYXBwZXIuc2VsZWN0QnlVc2VybmFtZSh0ZXN0VXNlci5nZXRVc2VybmFtZSgpKSkudGhlblJldHVybih0ZXN0VXNlcik7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFzc3dvcmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBwYXNzd29yZE1hcC5wdXQoIm9sZFBhc3N3b3JkIiwgIndyb25nUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIHBhc3N3b3JkTWFwLnB1dCgibmV3UGFzc3dvcmQiLCAibmV3UGFzc3dvcmQxMjMiKTsKKworICAgICAgICAgICAgLy8gQWN0CisgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIudXBkYXRlUGFzc3dvcmQocmVxdWVzdCwgcGFzc3dvcmRNYXApOworCisgICAgICAgICAgICAvLyBBc3NlcnQKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc1N1Y2Nlc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIuWOn+WvhueggeS4jeato+ehriIsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdmVyaWZ5KHVzZXJNYXBwZXIsIG5ldmVyKCkpLnVwZGF0ZVVzZXIoYW55KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIGdldFVzZXJJblJlcXVlc3RfU3VjY2VzcygpIHsKKyAgICAgICAgLy8gQXJyYW5nZQorICAgICAgICB3aGVuKHJlcXVlc3QuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIikpLnRoZW5SZXR1cm4oInZhbGlkVG9rZW4iKTsKKyAgICAgICAgQ2xhaW1zIG1vY2tDbGFpbXMgPSBtb2NrKENsYWltcy5jbGFzcyk7CisgICAgICAgIHdoZW4obW9ja0NsYWltcy5nZXRTdWJqZWN0KCkpLnRoZW5SZXR1cm4odGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSk7ICAvLyDmqKHmi58gZ2V0U3ViamVjdCgpIOi/lOWbnueUqOaIt+WQjQorCisgICAgICAgIHRyeSAoTW9ja2VkU3RhdGljPEp3dFV0aWxzPiBtb2NrZWRKd3RVdGlscyA9IG1vY2tTdGF0aWMoSnd0VXRpbHMuY2xhc3MpKSB7CisgICAgICAgICAgICBtb2NrZWRKd3RVdGlscy53aGVuKCgpIC0+IEp3dFV0aWxzLmdldENsYWltQnlUb2tlbigidmFsaWRUb2tlbiIpKS50aGVuUmV0dXJuKG1vY2tDbGFpbXMpOworICAgICAgICAgICAgd2hlbih1c2VyTWFwcGVyLnNlbGVjdEJ5VXNlcm5hbWUodGVzdFVzZXIuZ2V0VXNlcm5hbWUoKSkpLnRoZW5SZXR1cm4odGVzdFVzZXIpOworCisgICAgICAgICAgICAvLyBBY3QKKyAgICAgICAgICAgIFVTRVIgcmVzdWx0ID0gdXNlckNvbnRyb2xsZXIuZ2V0VXNlckluUmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICAgICAgLy8gQXNzZXJ0CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdFVzZXIsIHJlc3VsdCk7CisgICAgICAgIH0KICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyLy5naXRpZ25vcmUgYi90dG9ycmVudC1tYXN0ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc3MDNhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyNSBAQAorIyBHaXQgaWdub3JlIHBhdHRlcm5zCisjIEF1dGhvcjogTWF4aW1lIFBldGF6em9uaSA8bXBldGF6em9uaUB0dXJuLmNvbT4KKworIyBJZ25vcmUgYnVpbGQgb3V0cHV0CisvYnVpbGQvKgorKi9idWlsZAorCisjIElnbm9yZSBKYXZhZG9jIG91dHB1dAorL2RvYy8qCisKKyMgSWdub3JlIGFueSBldmVudHVhbCBFY2xpcHNlIHByb2plY3QgZmlsZXMsIHRoZXNlIGRvbid0IGJlbG9uZyBpbiB0aGUKKyMgcmVwb3NpdG9yeS4KKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy8uc2V0dGluZ3MKKy8uaWRlYS93b3Jrc3BhY2UueG1sCisjIElnbm9yZSBjb21tb24gZWRpdG9yIHN3YXAgZmlsZXMKKyouc3dwCisqLmJhaworKn4KKyp+CisKKyNpZ25vcmUgaWRlYSB3b3Jrc3BhY2UgZmlsZSBhbmQgaWRlYSBtb2R1bGUgZmlsZXMKKyouaW1sCisuaWRlYS93b3Jrc3BhY2UueG1sCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvQ09QWUlORyBiL3R0b3JyZW50LW1hc3Rlci9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvQ09QWUlORwpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9JTlNUQUxMIGIvdHRvcnJlbnQtbWFzdGVyL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzMTIxZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9JTlNUQUxMCkBAIC0wLDAgKzEsMjggQEAKK0hvd3RvIGJ1aWxkIGFuZCB1c2UgdGhlIEJpdFRvcnJlbnQgbGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tCisKK1RoaXMgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQml0VG9ycmVudCBwcm90b2NvbCBpbXBsZW1lbnRzIGEgQml0VG9ycmVudAordHJhY2tlciAoYW4gSFRUUCBzZXJ2aWNlKSwgYW5kIGEgQml0VG9ycmVudCBjbGllbnQuIFRoZSBvbmx5IGRlcGVuZGVuY2llcyBvZgordGhlIEJpdFRvcnJlbnQgbGlicmFyeSBhcmU6CisKKyogdGhlIGxvZzRqIGxpYnJhcnkKKyogdGhlIHNsZjRqIGxvZ2dpbmcgbGlicmFyeQorKiB0aGUgU2ltcGxlSFRUUEZyYW1ld29yaworCitUaGVzZSBsaWJyYXJpZXMgYXJlIHByb3ZpZGVkIGluIHRoZSBsaWIvIGRpcmVjdG9yeSwgYW5kIGFyZSBhdXRvbWF0aWNhbGx5CitpbmNsdWRlZCBpbiB0aGUgSkFSIGZpbGUgY3JlYXRlZCBieSB0aGUgYnVpbGQgcHJvY2Vzcy4KKworCitCdWlsZGluZyB0aGUgZGlzdHJpYnV0aW9uIEpBUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2ltcGx5IGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICQgbXZuIHBhY2thZ2UKKworVG8gYnVpbGQgdGhlIGxpYnJhcnkncyBKQVIgZmlsZSAoaW4gdGhlIHRhcmdldC8gZGlyZWN0b3J5KS4gWW91IGNhbiB0aGVuIGltcG9ydAordGhpcyBKQVIgZmlsZSBpbnRvIHlvdXIgSmF2YSBwcm9qZWN0IGFuZCBzdGFydCB1c2luZyB0aGUgSmF2YSBCaXRUb3JyZW50CitsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL1JFQURNRS5tZCBiL3R0b3JyZW50LW1hc3Rlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllZjNjOAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9SRUFETUUubWQKQEAgLTAsMCArMSwxNTMgQEAKK1shW0pldEJyYWlucyB0ZWFtIHByb2plY3RdKGh0dHA6Ly9qYi5nZy9iYWRnZXMvdGVhbS5zdmcpXShodHRwczovL2NvbmZsdWVuY2UuamV0YnJhaW5zLmNvbS9kaXNwbGF5L0FMTC9KZXRCcmFpbnMrb24rR2l0SHViKQorCitUdG9ycmVudCwgYSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCaXRUb3JyZW50IHByb3RvY29sCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMjIyMgTm90ZQorSXQncyBUdG9ycmVudCBsaWJyYXJ5IHZlcnNpb24gMi4wIHdoaWNoIGhhcworYSBsb3Qgb2YgaW1wcm92ZW1lbnRzIGFuZCBtYXkgbm90IGJlIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uCisoc3RvcmVkIGluIFt2MS42IGJyYW5jaF0oaHR0cHM6Ly9naXRodWIuY29tL21wZXRhenpvbmkvdHRvcnJlbnQvdHJlZS92MS42KSkKKworU2VlIFt0aGlzIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vbXBldGF6em9uaS90dG9ycmVudC9pc3N1ZXMvMjEyKSBmb3IgZGV0YWlscyAKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKKyoqVHRvcnJlbnQqKiBpcyBhIHB1cmUtSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQml0VG9ycmVudCBwcm90b2NvbCwKK3Byb3ZpZGluZyBhIEJpdFRvcnJlbnQgdHJhY2tlciwgYSBCaXRUb3JyZW50IGNsaWVudCBhbmQgdGhlIHJlbGF0ZWQgVG9ycmVudAorbWV0YWluZm8gZmlsZXMgY3JlYXRpb24gYW5kIHBhcnNpbmcgY2FwYWJpbGl0aWVzLiBJdCBpcyBkZXNpZ25lZCB0byBiZSBlbWJlZGRlZAoraW50byBsYXJnZXIgYXBwbGljYXRpb25zLCBidXQgaXRzIGNvbXBvbmVudHMgY2FuIGFsc28gYmUgdXNlZCBhcyBzdGFuZGFsb25lCitwcm9ncmFtcy4KKworVHRvcnJlbnQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBCRVBzIChCaXRUb3JyZW50IGVuaGFuY2VtZW50IHByb3Bvc2Fscyk6CisKKyogYEJFUCMwMDAzYDogVGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiAgCisgIFRoaXMgaXMgdGhlIGJhc2Ugb2ZmaWNpYWwgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiwgd2hpY2ggVHRvcnJlbnQgaW1wbGVtZW50cworICBmdWxseS4KKyogYEJFUCMwMDEyYDogTXVsdGktdHJhY2tlciBtZXRhZGF0YSBleHRlbnNpb24gIAorICBGdWxsIHN1cHBvcnQgZm9yIHRoZSBgYW5ub3VuY2UtbGlzdGAgbWV0YS1pbmZvIGtleSBwcm92aWRpbmcgYSB0aWVyZWQgdHJhY2tlcgorICBsaXN0LgorKiBgQkVQIzAwMTVgOiBVRFAgVHJhY2tlciBQcm90b2NvbCBmb3IgQml0VG9ycmVudCAgCisgIFRoZSBVRFAgdHJhY2tlciBwcm90b2NvbCBpcyBmdWxseSBzdXBwb3J0ZWQgaW4gdGhlIEJpdFRvcnJlbnQgY2xpZW50IHRvIG1ha2UKKyAgYW5ub3VuY2UgcmVxdWVzdHMgdG8gVURQIHRyYWNrZXJzLiBVRFAgdHJhY2tlciBzdXBwb3J0IGl0c2VsZiBpcyBwbGFubmVkLgorKiBgQkVQIzAwMjBgOiBQZWVyIElEIGNvbnZlbnRpb25zICAKKyAgVHRvcnJlbnQgdXNlcyBgVE9gIGFzIHRoZSBjbGllbnQgaWRlbnRpZmljYXRpb24gc3RyaW5nLCBhbmQgY3VycmVudGx5IHVzZXMKKyAgdGhlIGAtVDAwMDQyLWAgY2xpZW50IElEIHByZWZpeC4KKyogYEJFUCMwMDIzYDogVHJhY2tlciBSZXR1cm5zIENvbXBhY3QgUGVlciBMaXN0cyAgCisgIENvbXBhY3QgcGVlciBsaXN0cyBhcmUgc3VwcG9ydGVkIGluIGJvdGggdGhlIGNsaWVudCBhbmQgdGhlIHRyYWNrZXIuCisgIEN1cnJlbnRseSB0aGUgdHJhY2tlciBvbmx5IHN1cHBvcnRzIHNlbmRpbmcgYmFjayBjb21wYWN0IHBlZXIgbGlzdHMKKyAgdG8gYW4gYW5ub3VuY2UgcmVxdWVzdC4KKworSGlzdG9yeQorLS0tLS0tLQorCitUaGlzIHRvb2wgc3VpdGUgd2FzIGltcGxlbWVudGVkIGFzIHBhcnQgb2YgVHVybidzIChodHRwOi8vd3d3LnR1cm4uY29tKSByZWxlYXNlCitkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgc3lzdGVtIGFuZCBpcyB1c2VkIHRvIGRpc3RyaWJ1dGUgbmV3IGJ1aWxkIHRhcmJhbGxzCit0byBhIGxhcmdlIG51bWJlciBvZiBtYWNoaW5lcyBpbnNpZGUgYSBkYXRhY2VudGVyIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlLgorQXQgdGhlIHRpbWUgdGhpcyBwcm9qZWN0IHdhcyBzdGFydGVkLCBmZXcgSmF2YSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCitCaXRUb3JyZW50IHByb3RvY29sIGV4aXN0ZWQgYW5kIHVuZm9ydHVuYXRlbHkgbm9uZSBvZiB0aGVtIGZpdCBvdXIgbmVlZHM6CisKKyogVnV6ZSdzLCB3aGljaCBpcyB2ZXJ5IGhhcmQgdG8gZXh0cmFjdCBmcm9tIHRoZWlyIGNvZGViYXNlLCBhbmQgdGh1cyBjb21wbGV4Cit0byByZS1pbnRlZ3JhdGUgaW50byBhbm90aGVyIGFwcGxpY2F0aW9uOworKiB0b3JyZW50NGosIHdoaWNoIGlzIGxhcmdlbHkgaW5jb21wbGV0ZSBhbmQgbm90IHVzYWJsZTsKKyogU25hcmsncywgd2hpY2ggaXMgb2xkLCBhbmQgdW5mb3J0dW5hdGVseSB1bnN0YWJsZTsKKyogYml0ZXh0LCB3aGljaCB3YXMgYWxzbyB1bmZvcnR1bmF0ZWx5IHVuc3RhYmxlLCBhbmQgZXh0cmVtZWx5IHNsb3cuCisKK1RoaXMgaW1wbGVtZW50YXRpb24gYWltcyBhdCBwcm92aWRpbmcgYSBkb3duLXRvLWVhcnRoLCBzaW1wbGUgdG8gdXNlIGxpYnJhcnkuCitObyBmYW5jeSBwcm90b2NvbCBleHRlbnNpb25zIGFyZSBpbXBsZW1lbnRlZCBoZXJlOiBqdXN0IHRoZSBiYXNpY3MgdGhhdCBhbGxvd3MKK2ZvciB0aGUgZXhjaGFuZ2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiBmaWxlcyB0aHJvdWdoIHRoZSBCaXRUb3JyZW50IHByb3RvY29sLgorCitIb3cgdG8gdXNlCistLS0tLS0tLS0tCisKKyMjIyBBcyBhIGxpYnJhcnkKKworIyMjIyBDbGllbnQgY29kZQorCitgYGBqYXZhCisvLyBGaXJzdCwgaW5zdGFudGlhdGUgdGhlIENsaWVudCBvYmplY3QuCitTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudCgpOworCisvLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhlIGNsaWVudCB3aWxsIGxpc3RlbiBvbiAoeW91IG1pZ2h0IG5lZWQgc29tZXRoaW5nCisvLyBlbHNlIHRoYW4gbG9jYWxob3N0IGhlcmUgYmVjYXVzZSBvdGhlciBwZWVycyBjYW5ub3QgY29ubmVjdCB0byBsb2NhbGhvc3QpLgorSW5ldEFkZHJlc3MgYWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpOworCisvL1N0YXJ0IGRvd25sb2FkLiBUaHJlYWQgaXMgYmxvY2tlZCBoZXJlCit0cnkgeworICBjbGllbnQuZG93bmxvYWRUb3JyZW50KCIvcGF0aC90by9maWxlZC50b3JyZW50IiwKKyAgICAgICAgICAiL3BhdGgvdG8vb3V0cHV0L2RpcmVjdG9yeSIsCisgICAgICAgICAgYWRkcmVzcyk7CisgIC8vZG93bmxvYWQgZmluaXNoZWQKK30gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgIC8vZG93bmxvYWQgZmFpbGVkLCBzZWUgZXhjZXB0aW9uIGZvciBkZXRhaWxzCisgIGUucHJpbnRTdGFja1RyYWNlKCk7Cit9CisvL0lmIHlvdSBkb24ndCB3YW50IHRvIHNlZWQgdGhlIHRvcnJlbnQgeW91IGNhbiBzdG9wIGNsaWVudAorY2xpZW50LnN0b3AoKTsKK2BgYAorCisjIyMjIFRyYWNrZXIgY29kZQorCitgYGBqYXZhCisvLyBGaXJzdCwgaW5zdGFudGlhdGUgYSBUcmFja2VyIG9iamVjdCB3aXRoIHRoZSBwb3J0IHlvdSB3YW50IGl0IHRvIGxpc3RlbiBvbi4KKy8vIFRoZSBkZWZhdWx0IHRyYWNrZXIgcG9ydCByZWNvbW1lbmRlZCBieSB0aGUgQml0VG9ycmVudCBwcm90b2NvbCBpcyA2OTY5LgorVHJhY2tlciB0cmFja2VyID0gbmV3IFRyYWNrZXIoNjk2OSk7CisKKy8vIFRoZW4sIGZvciBlYWNoIHRvcnJlbnQgeW91IHdpc2ggdG8gYW5ub3VuY2Ugb24gdGhpcyB0cmFja2VyLCBzaW1wbHkgY3JlYXRlZAorLy8gYSBUcmFja2VkVG9ycmVudCBvYmplY3QgYW5kIHBhc3MgaXQgdG8gdGhlIHRyYWNrZXIuYW5ub3VuY2UoKSBtZXRob2Q6CitGaWxlbmFtZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi50b3JyZW50Iik7CisgIH0KK307CisKK2ZvciAoRmlsZSBmIDogbmV3IEZpbGUoIi9wYXRoL3RvL3RvcnJlbnQvZmlsZXMiKS5saXN0RmlsZXMoZmlsdGVyKSkgeworICB0cmFja2VyLmFubm91bmNlKFRyYWNrZWRUb3JyZW50LmxvYWQoZikpOworfQorCisvL0Fsc28geW91IGNhbiBlbmFibGUgYWNjZXB0aW5nIGZvcmVpZ24gdG9ycmVudHMuCisvL2lmIHRyYWNrZXIgYWNjZXB0cyByZXF1ZXN0IGZvciB1bmtub3duIHRvcnJlbnQgaXQgc3RhcnRzIHRyYWNraW5nIHRoZSB0b3JyZW50IGF1dG9tYXRpY2FsbHkKK3RyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisvLyBPbmNlIGRvbmUsIHlvdSBqdXN0IGhhdmUgdG8gc3RhcnQgdGhlIHRyYWNrZXIncyBtYWluIG9wZXJhdGlvbiBsb29wOgordHJhY2tlci5zdGFydCh0cnVlKTsKKworLy8gWW91IGNhbiBzdG9wIHRoZSB0cmFja2VyIHdoZW4geW91J3JlIGRvbmUgd2l0aDoKK3RyYWNrZXIuc3RvcCgpOworYGBgCisKK0xpY2Vuc2UKKy0tLS0tLS0KKworVGhpcyBCaXRUb3JyZW50IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUKK0xpY2Vuc2UgdmVyc2lvbiAyLjAuIFNlZSBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KKworCitBdXRob3JzIGFuZCBjb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIE1heGltZSBQZXRhenpvbmkgPDxtcGV0YXp6b25pQHR1cm4uY29tPj4gKFBsYXRmb3JtIEVuZ2luZWVyIGF0IFR1cm4sIEluYykgIAorICBPcmlnaW5hbCBhdXRob3IsIG1haW4gZGV2ZWxvcGVyIGFuZCBtYWludGFpbmVyCisqIERhdmlkIEdpZmZpbiA8PGRhdmlkQGV0c3kuY29tPj4gIAorICBDb250cmlidXRlZCBwYXJhbGxlbCBoYXNoaW5nIGFuZCBtdWx0aS1maWxlIHRvcnJlbnQgc3VwcG9ydC4KKyogVGhvbWFzIFppbmsgPDx0aG9tYXMuemlua0B1bmkta29uc3RhbnouZGU+PiAgCisgIEZpeGVkIGEgcGllY2UgbGVuZ3RoIGNvbXB1dGF0aW9uIGlzc3VlIHdoZW4gdGhlIHRvdGFsIHRvcnJlbnQgc2l6ZSBpcyBhbgorICBleGFjdCBtdWx0aXBsZSBvZiB0aGUgcGllY2Ugc2l6ZS4KKyogSm9oYW4gUGFyZW50IDw8cGFyZW50X2pvaGFuQHlhaG9vLmNvbT4+ICAKKyAgRml4ZWQgYSBidWcgaW4gdW5mcmVzaCBwZWVyIGNvbGxlY3Rpb24gYW5kIGlzc3VlcyBvbiBkb3dubG9hZCBjb21wbGV0aW9uIG9uCisgIFdpbmRvd3MgcGxhdGZvcm1zLgorKiBEbWl0cml5IER1bWFuc2tpeSAgCisgIENvbnRyaWJ1dGVkIHRoZSBzd2l0Y2ggZnJvbSBBbnQgdG8gTWF2ZW4uCisqIEFsZXhleSBQdGFzaG5peSAgCisgIEZpeGVkIGFuIGludGVnZXIgb3ZlcmZsb3cgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIGEgdG9ycmVudCdzIGZ1bGwgc2l6ZS4KKworCitDYXZlYXRzCistLS0tLS0tCisKKyogQ2xpZW50IHdyaXRlIHBlcmZvcm1hbmNlIGlzIGEgYml0IHBvb3IsIG1haW5seSBkdWUgdG8gYSAodG9vPykgc2ltcGxlIHBpZWNlCisgIGNhY2hpbmcgYWxnb3JpdGhtLgorCitDb250cmlidXRpb25zIGFyZSB3ZWxjb21lIGluIGFsbCBhcmVhcywgZXZlbiBtb3JlIHNvIGZvciB0aGVzZSBmZXcgcG9pbnRzCithYm92ZSEKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9hc3NlbWJseS54bWwgYi90dG9ycmVudC1tYXN0ZXIvYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYXNzZW1ibHkueG1sCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNjI4YQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2RpbmcvcG9tLnhtbApAQCAtMCwwICsxLDE3IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC9iZW5jb2Rpbmc8L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWJlbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkRlY29kZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkRlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTJiM2FiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQi1lbmNvZGluZyBkZWNvZGVyLgorICoKKyAqIDxwPgorICogQSBiLWVuY29kZWQgYnl0ZSBzdHJlYW0gY2FuIHJlcHJlc2VudCBieXRlIGFycmF5cywgbnVtYmVycywgbGlzdHMgYW5kIG1hcHMKKyAqIChkaWN0aW9uYXJpZXMpLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBkZWNvZGVyIG9mIHN1Y2ggc3RyZWFtcyBpbnRvCisgKiB7QGxpbmsgQkVWYWx1ZX1zLgorICogPC9wPgorICoKKyAqIDxwPgorICogSW5zcGlyZWQgYnkgU25hcmsncyBpbXBsZW1lbnRhdGlvbi4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CZW5jb2RlIj5CLWVuY29kaW5nIHNwZWNpZmljYXRpb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBCRGVjb2RlciB7CisKKyAgLy8gVGhlIElucHV0U3RyZWFtIHRvIEJEZWNvZGUuCisgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47CisKKyAgLy8gVGhlIGxhc3QgaW5kaWNhdG9yIHJlYWQuCisgIC8vIFplcm8gaWYgdW5rbm93bi4KKyAgLy8gJzAnLi4nOScgaW5kaWNhdGVzIGEgYnl0ZVtdLgorICAvLyAnaScgaW5kaWNhdGVzIGFuIE51bWJlci4KKyAgLy8gJ2wnIGluZGljYXRlcyBhIExpc3QuCisgIC8vICdkJyBpbmRpY2F0ZXMgYSBNYXAuCisgIC8vICdlJyBpbmRpY2F0ZXMgZW5kIG9mIE51bWJlciwgTGlzdCBvciBNYXAgKG9ubHkgdXNlZCBpbnRlcm5hbGx5KS4KKyAgLy8gLTEgaW5kaWNhdGVzIGVuZCBvZiBzdHJlYW0uCisgIC8vIENhbGwgZ2V0TmV4dEluZGljYXRvciB0byBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgKHdpbGwgbmV2ZXIgcmV0dXJuIHplcm8pLgorICBwcml2YXRlIGludCBpbmRpY2F0b3IgPSAwOworCisgIC8qKgorICAgKiBJbml0aWFsaXplcyBhIG5ldyBCRGVjb2Rlci4KKyAgICoKKyAgICogPHA+CisgICAqIE5vdGhpbmcgaXMgcmVhZCBmcm9tIHRoZSBnaXZlbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4geWV0LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBpbiBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbS4KKyAgICovCisgIHB1YmxpYyBCRGVjb2RlcihJbnB1dFN0cmVhbSBpbikgeworICAgIHRoaXMuaW4gPSBpbjsKKyAgfQorCisgIC8qKgorICAgKiBEZWNvZGUgYSBCLWVuY29kZWQgc3RyZWFtLgorICAgKgorICAgKiA8cD4KKyAgICogQXV0b21hdGljYWxseSBpbnN0YW50aWF0ZXMgYSBuZXcgQkRlY29kZXIgZm9yIHRoZSBwcm92aWRlZCBpbnB1dCBzdHJlYW0KKyAgICogYW5kIGRlY29kZXMgaXRzIHJvb3QgbWVtYmVyLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBpbiBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQkVWYWx1ZSBiZGVjb2RlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgQkRlY29kZXIoaW4pLmJkZWNvZGUoKTsKKyAgfQorCisgIC8qKgorICAgKiBEZWNvZGUgYSBCLWVuY29kZWQgYnl0ZSBidWZmZXIuCisgICAqCisgICAqIDxwPgorICAgKiBBdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlcyBhIG5ldyBCRGVjb2RlciBmb3IgdGhlIHByb3ZpZGVkIGJ1ZmZlciBhbmQKKyAgICogZGVjb2RlcyBpdHMgcm9vdCBtZW1iZXIuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGRhdGEgVGhlIHtAbGluayBCeXRlQnVmZmVyfSB0byByZWFkIGZyb20uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJFVmFsdWUgYmRlY29kZShCeXRlQnVmZmVyIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEJEZWNvZGVyLmJkZWNvZGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuYXJyYXkoKSkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgd2hhdCB0aGUgbmV4dCBiLWVuY29kZWQgb2JqZWN0IHdpbGwgYmUgb24gdGhlIHN0cmVhbSBvciAtMQorICAgKiB3aGVuIHRoZSBlbmQgb2Ygc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAqCisgICAqIDxwPgorICAgKiBDYW4gcmV0dXJuIHNvbWV0aGluZyB1bmV4cGVjdGVkIChub3QgJzAnIC4uICc5JywgJ2knLCAnbCcgb3IgJ2QnKSB3aGVuCisgICAqIHRoZSBzdHJlYW0gaXNuJ3QgYi1lbmNvZGVkLgorICAgKiA8L3A+CisgICAqCisgICAqIFRoaXMgbWlnaHQgb3IgbWlnaHQgbm90IHJlYWQgb25lIGV4dHJhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLgorICAgKi8KKyAgcHJpdmF0ZSBpbnQgZ2V0TmV4dEluZGljYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHRoaXMuaW5kaWNhdG9yID09IDApIHsKKyAgICAgIHRoaXMuaW5kaWNhdG9yID0gaW4ucmVhZCgpOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3I7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgbmV4dCBpbmRpY2F0b3IgYW5kIHJldHVybnMgZWl0aGVyIG51bGwgd2hlbiB0aGUgc3RyZWFtCisgICAqIGhhcyBlbmRlZCBvciBiLWRlY29kZXMgdGhlIHJlc3Qgb2YgdGhlIHN0cmVhbSBhbmQgcmV0dXJucyB0aGUKKyAgICogYXBwcm9wcmlhdGUgQkVWYWx1ZSBlbmNvZGVkIG9iamVjdC4KKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIGJkZWNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICh0aGlzLmdldE5leHRJbmRpY2F0b3IoKSA9PSAtMSkKKyAgICAgIHJldHVybiBudWxsOworCisgICAgaWYgKHRoaXMuaW5kaWNhdG9yID49ICcwJyAmJiB0aGlzLmluZGljYXRvciA8PSAnOScpCisgICAgICByZXR1cm4gdGhpcy5iZGVjb2RlQnl0ZXMoKTsKKyAgICBlbHNlIGlmICh0aGlzLmluZGljYXRvciA9PSAnaScpCisgICAgICByZXR1cm4gdGhpcy5iZGVjb2RlTnVtYmVyKCk7CisgICAgZWxzZSBpZiAodGhpcy5pbmRpY2F0b3IgPT0gJ2wnKQorICAgICAgcmV0dXJuIHRoaXMuYmRlY29kZUxpc3QoKTsKKyAgICBlbHNlIGlmICh0aGlzLmluZGljYXRvciA9PSAnZCcpCisgICAgICByZXR1cm4gdGhpcy5iZGVjb2RlTWFwKCk7CisgICAgZWxzZQorICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgKCJVbmtub3duIGluZGljYXRvciAnIiArIHRoaXMuaW5kaWNhdG9yICsgIiciKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuZXh0IGItZW5jb2RlZCB2YWx1ZSBvbiB0aGUgc3RyZWFtIGFuZCBtYWtlcyBzdXJlIGl0IGlzIGEKKyAgICogYnl0ZSBhcnJheS4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIGl0IGlzIG5vdCBhIGItZW5jb2RlZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIEJFVmFsdWUgYmRlY29kZUJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIGludCBudW0gPSBjIC0gJzAnOworICAgIGlmIChudW0gPCAwIHx8IG51bSA+IDkpCisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiTnVtYmVyIGV4cGVjdGVkLCBub3QgJyIKKyAgICAgICAgICAgICAgKyAoY2hhcikgYyArICInIik7CisgICAgdGhpcy5pbmRpY2F0b3IgPSAwOworCisgICAgYyA9IHRoaXMucmVhZCgpOworICAgIGludCBpID0gYyAtICcwJzsKKyAgICB3aGlsZSAoaSA+PSAwICYmIGkgPD0gOSkgeworICAgICAgLy8gVGhpcyBjYW4gb3ZlcmZsb3chCisgICAgICBudW0gPSBudW0gKiAxMCArIGk7CisgICAgICBjID0gdGhpcy5yZWFkKCk7CisgICAgICBpID0gYyAtICcwJzsKKyAgICB9CisKKyAgICBpZiAoYyAhPSAnOicpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJDb2xvbiBleHBlY3RlZCwgbm90ICciICsKKyAgICAgICAgICAgICAgKGNoYXIpIGMgKyAiJyIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgQkVWYWx1ZShyZWFkKG51bSkpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5leHQgYi1lbmNvZGVkIHZhbHVlIG9uIHRoZSBzdHJlYW0gYW5kIG1ha2VzIHN1cmUgaXQgaXMgYQorICAgKiBudW1iZXIuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiBpdCBpcyBub3QgYSBudW1iZXIuCisgICAqLworICBwdWJsaWMgQkVWYWx1ZSBiZGVjb2RlTnVtYmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIGlmIChjICE9ICdpJykgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkV4cGVjdGVkICdpJywgbm90ICciICsKKyAgICAgICAgICAgICAgKGNoYXIpIGMgKyAiJyIpOworICAgIH0KKyAgICB0aGlzLmluZGljYXRvciA9IDA7CisKKyAgICBjID0gdGhpcy5yZWFkKCk7CisgICAgaWYgKGMgPT0gJzAnKSB7CisgICAgICBjID0gdGhpcy5yZWFkKCk7CisgICAgICBpZiAoYyA9PSAnZScpCisgICAgICAgIHJldHVybiBuZXcgQkVWYWx1ZShCaWdJbnRlZ2VyLlpFUk8pOworICAgICAgZWxzZQorICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiJ2UnIGV4cGVjdGVkIGFmdGVyIHplcm8sIiArCisgICAgICAgICAgICAgICAgIiBub3QgJyIgKyAoY2hhcikgYyArICInIik7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBtb3JlIHRoZSAyNTUgY2hhciBiaWcgaW50ZWdlcnMKKyAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsyNTZdOworICAgIGludCBvZmYgPSAwOworCisgICAgaWYgKGMgPT0gJy0nKSB7CisgICAgICBjID0gdGhpcy5yZWFkKCk7CisgICAgICBpZiAoYyA9PSAnMCcpCisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJOZWdhdGl2ZSB6ZXJvIG5vdCBhbGxvd2VkIik7CisgICAgICBjaGFyc1tvZmZdID0gJy0nOworICAgICAgb2ZmKys7CisgICAgfQorCisgICAgaWYgKGMgPCAnMScgfHwgYyA+ICc5JykKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKCJJbnZhbGlkIEludGVnZXIgc3RhcnQgJyIKKyAgICAgICAgICAgICAgKyAoY2hhcikgYyArICInIik7CisgICAgY2hhcnNbb2ZmXSA9IChjaGFyKSBjOworICAgIG9mZisrOworCisgICAgYyA9IHRoaXMucmVhZCgpOworICAgIGludCBpID0gYyAtICcwJzsKKyAgICB3aGlsZSAoaSA+PSAwICYmIGkgPD0gOSkgeworICAgICAgY2hhcnNbb2ZmXSA9IChjaGFyKSBjOworICAgICAgb2ZmKys7CisgICAgICBjID0gcmVhZCgpOworICAgICAgaSA9IGMgLSAnMCc7CisgICAgfQorCisgICAgaWYgKGMgIT0gJ2UnKQorICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkludGVnZXIgc2hvdWxkIGVuZCB3aXRoICdlJyIpOworCisgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGNoYXJzLCAwLCBvZmYpOworICAgIHJldHVybiBuZXcgQkVWYWx1ZShuZXcgQmlnSW50ZWdlcihzKSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmV4dCBiLWVuY29kZWQgdmFsdWUgb24gdGhlIHN0cmVhbSBhbmQgbWFrZXMgc3VyZSBpdCBpcyBhCisgICAqIGxpc3QuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiBpdCBpcyBub3QgYSBsaXN0LgorICAgKi8KKyAgcHVibGljIEJFVmFsdWUgYmRlY29kZUxpc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBjID0gdGhpcy5nZXROZXh0SW5kaWNhdG9yKCk7CisgICAgaWYgKGMgIT0gJ2wnKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiRXhwZWN0ZWQgJ2wnLCBub3QgJyIgKworICAgICAgICAgICAgICAoY2hhcikgYyArICInIik7CisgICAgfQorICAgIHRoaXMuaW5kaWNhdG9yID0gMDsKKworICAgIExpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgIGMgPSB0aGlzLmdldE5leHRJbmRpY2F0b3IoKTsKKyAgICB3aGlsZSAoYyAhPSAnZScpIHsKKyAgICAgIHJlc3VsdC5hZGQodGhpcy5iZGVjb2RlKCkpOworICAgICAgYyA9IHRoaXMuZ2V0TmV4dEluZGljYXRvcigpOworICAgIH0KKyAgICB0aGlzLmluZGljYXRvciA9IDA7CisKKyAgICByZXR1cm4gbmV3IEJFVmFsdWUocmVzdWx0KTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBuZXh0IGItZW5jb2RlZCB2YWx1ZSBvbiB0aGUgc3RyZWFtIGFuZCBtYWtlcyBzdXJlIGl0IGlzIGEKKyAgICogbWFwIChkaWN0aW9uYXJ5KS4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIGl0IGlzIG5vdCBhIG1hcC4KKyAgICovCisgIHB1YmxpYyBCRVZhbHVlIGJkZWNvZGVNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBjID0gdGhpcy5nZXROZXh0SW5kaWNhdG9yKCk7CisgICAgaWYgKGMgIT0gJ2QnKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiRXhwZWN0ZWQgJ2QnLCBub3QgJyIgKworICAgICAgICAgICAgICAoY2hhcikgYyArICInIik7CisgICAgfQorICAgIHRoaXMuaW5kaWNhdG9yID0gMDsKKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBjID0gdGhpcy5nZXROZXh0SW5kaWNhdG9yKCk7CisgICAgd2hpbGUgKGMgIT0gJ2UnKSB7CisgICAgICAvLyBEaWN0aW9uYXJ5IGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzLgorICAgICAgU3RyaW5nIGtleSA9IHRoaXMuYmRlY29kZSgpLmdldFN0cmluZygpOworCisgICAgICBCRVZhbHVlIHZhbHVlID0gdGhpcy5iZGVjb2RlKCk7CisgICAgICByZXN1bHQucHV0KGtleSwgdmFsdWUpOworCisgICAgICBjID0gdGhpcy5nZXROZXh0SW5kaWNhdG9yKCk7CisgICAgfQorICAgIHRoaXMuaW5kaWNhdG9yID0gMDsKKworICAgIHJldHVybiBuZXcgQkVWYWx1ZShyZXN1bHQpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIElucHV0U3RyZWFtIChhcyBpbnQpLgorICAgKgorICAgKiBAdGhyb3dzIEVPRkV4Y2VwdGlvbiBJZiBJbnB1dFN0cmVhbS5yZWFkKCkgcmV0dXJuZWQgLTEuCisgICAqLworICBwcml2YXRlIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgYyA9IHRoaXMuaW4ucmVhZCgpOworICAgIGlmIChjID09IC0xKQorICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworICAgIHJldHVybiBjOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBieXRlW10gY29udGFpbmluZyBsZW5ndGggdmFsaWQgYnl0ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IHplcm8uCisgICAqCisgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIElmIElucHV0U3RyZWFtLnJlYWQoKSByZXR1cm5lZCAtMSBiZWZvcmUgYWxsCisgICAqICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBieXRlcyBjb3VsZCBiZSByZWFkLiAgTm90ZSB0aGF0IHRoZSBieXRlW10gcmV0dXJuZWQgbWlnaHQgYmUKKyAgICogICAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoZW4gcmVxdWVzdGVkIGJ1dCB3aWxsIG9ubHkgY29udGFpbiBsZW5ndGggdmFsaWQgYnl0ZXMuICBUaGUKKyAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnl0ZVtdIHdpbGwgYmUgcmV1c2VkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFnYWluLgorICAgKi8KKyAgcHJpdmF0ZSBieXRlW10gcmVhZChpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5ndGhdOworCisgICAgaW50IHJlYWQgPSAwOworICAgIHdoaWxlIChyZWFkIDwgbGVuZ3RoKSB7CisgICAgICBpbnQgaSA9IHRoaXMuaW4ucmVhZChyZXN1bHQsIHJlYWQsIGxlbmd0aCAtIHJlYWQpOworICAgICAgaWYgKGkgPT0gLTEpCisgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKKyAgICAgIHJlYWQgKz0gaTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JFVmFsdWUuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvQkVWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWJjZjEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JFVmFsdWUuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5iY29kZWM7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQSB0eXBlLWFnbm9zdGljIGNvbnRhaW5lciBmb3IgQi1lbmNvZGVkIHZhbHVlcy4KKyAqCisgKiBi5Yqg5a+G5pa55rOV77yMYnTnp43lrZDmlofku7bkuK3lrZjlgqjmlbDmja7nmoTop4TliJkKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgQkVWYWx1ZSB7CisKKyAgLyoqCisgICAqIFRoZSBCLWVuY29kZWQgdmFsdWUgY2FuIGJlIGEgYnl0ZSBhcnJheSwgYSBOdW1iZXIsIGEgTGlzdCBvciBhIE1hcC4KKyAgICogTGlzdHMgYW5kIE1hcHMgY29udGFpbnMgQkVWYWx1ZXMgdG9vLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgdmFsdWU7CisKKyAgcHVibGljIEJFVmFsdWUoYnl0ZVtdIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgcHVibGljIEJFVmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlLmdldEJ5dGVzKCJVVEYtOCIpOworICB9CisKKyAgcHVibGljIEJFVmFsdWUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZW5jKQorICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWUuZ2V0Qnl0ZXMoZW5jKTsKKyAgfQorCisgIHB1YmxpYyBCRVZhbHVlKGludCB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSBuZXcgSW50ZWdlcih2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgQkVWYWx1ZShsb25nIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IG5ldyBMb25nKHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBCRVZhbHVlKE51bWJlciB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBCRVZhbHVlKExpc3Q8QkVWYWx1ZT4gdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgQkVWYWx1ZShNYXA8U3RyaW5nLCBCRVZhbHVlPiB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHRoaXMudmFsdWU7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgYSBTdHJpbmcsIGludGVycHJldGVkIGFzIFVURi04LgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIGJ5dGVbXS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiB0aGlzLmdldFN0cmluZygiVVRGLTgiKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBhIFN0cmluZywgaW50ZXJwcmV0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAqIGVuY29kaW5nLgorICAgKgorICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHRvIGludGVycHJldCB0aGUgYnl0ZXMgYXMgd2hlbiBjb252ZXJ0aW5nCisgICAqICAgICAgICAgICAgICAgICB0aGVtIGludG8gYSB7QGxpbmsgU3RyaW5nfS4KKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSBieXRlW10uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodGhpcy5nZXRCeXRlcygpLCBlbmNvZGluZyk7CisgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oY2NlLnRvU3RyaW5nKCkpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CisgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcih1ZWUudG9TdHJpbmcoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhpcyBCRVZhbHVlIGFzIGEgYnl0ZVtdLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIGJ5dGVbXS4KKyAgICovCisgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAoYnl0ZVtdKSB0aGlzLnZhbHVlOworICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uKGNjZS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgYSBOdW1iZXIuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGEge0BsaW5rIE51bWJlcn0uCisgICAqLworICBwdWJsaWMgTnVtYmVyIGdldE51bWJlcigpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIChOdW1iZXIpIHRoaXMudmFsdWU7CisgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oY2NlLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBzaG9ydC4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBpcyBub3QgYSB7QGxpbmsgTnVtYmVyfS4KKyAgICovCisgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydCgpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKS5zaG9ydFZhbHVlKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIEJFVmFsdWUgYXMgaW50LgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIHtAbGluayBOdW1iZXJ9LgorICAgKi8KKyAgcHVibGljIGludCBnZXRJbnQoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCkuaW50VmFsdWUoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBsb25nLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gSWYgdGhlIHZhbHVlIGlzIG5vdCBhIHtAbGluayBOdW1iZXJ9LgorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0TG9uZygpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKS5sb25nVmFsdWUoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBhIExpc3Qgb2YgQkVWYWx1ZXMuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGFuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgQXJyYXlMaXN0fS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgTGlzdDxCRVZhbHVlPiBnZXRMaXN0KCkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7CisgICAgICByZXR1cm4gKEFycmF5TGlzdDxCRVZhbHVlPikgdGhpcy52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkV4Y2VwdGVkIExpc3Q8QkV2YWx1ZT4gISIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgQkVWYWx1ZSBhcyBhIE1hcCBvZiBTdHJpbmcga2V5cyBhbmQgQkVWYWx1ZSB2YWx1ZXMuCisgICAqCisgICAqIEB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBJZiB0aGUgdmFsdWUgaXMgbm90IGEge0BsaW5rIEhhc2hNYXB9LgorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBCRVZhbHVlPiBnZXRNYXAoKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBIYXNoTWFwKSB7CisgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIEJFVmFsdWU+KSB0aGlzLnZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiRXhwZWN0ZWQgTWFwPFN0cmluZywgQkVWYWx1ZT4gISIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRW5jb2Rlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2Jjb2RlYy9CRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTk3MjAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0JFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEItZW5jb2RpbmcgZW5jb2Rlci4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIHRvIGVuY29kZSBvYmplY3RzIGFuZAorICoge0BsaW5rIEJFVmFsdWV9cyB0byBCLWVuY29kaW5nIGludG8gYSBwcm92aWRlZCBvdXRwdXQgc3RyZWFtLgorICogPC9wPgorICoKKyAqIDxwPgorICogSW5zcGlyZWQgYnkgU25hcmsncyBpbXBsZW1lbnRhdGlvbi4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CZW5jb2RlIj5CLWVuY29kaW5nIHNwZWNpZmljYXRpb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBCRW5jb2RlciB7CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZW5jb2RlKE9iamVjdCBvLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBpZiAobyBpbnN0YW5jZW9mIEJFVmFsdWUpIHsKKyAgICAgIG8gPSAoKEJFVmFsdWUpIG8pLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgIGJlbmNvZGUoKFN0cmluZykgbywgb3V0KTsKKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgIGJlbmNvZGUoKGJ5dGVbXSkgbywgb3V0KTsKKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgIGJlbmNvZGUoKE51bWJlcikgbywgb3V0KTsKKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICBiZW5jb2RlKChMaXN0PEJFVmFsdWU+KSBvLCBvdXQpOworICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgYmVuY29kZSgoTWFwPFN0cmluZywgQkVWYWx1ZT4pIG8sIG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBiZW5jb2RlOiAiICsKKyAgICAgICAgICAgICAgby5nZXRDbGFzcygpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShTdHJpbmcgcywgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnMgPSBzLmdldEJ5dGVzKCJVVEYtOCIpOworICAgIGJlbmNvZGUoYnMsIG91dCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShOdW1iZXIgbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBvdXQud3JpdGUoJ2knKTsKKyAgICBTdHJpbmcgcyA9IG4udG9TdHJpbmcoKTsKKyAgICBvdXQud3JpdGUocy5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgb3V0LndyaXRlKCdlJyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYmVuY29kZShMaXN0PEJFVmFsdWU+IGwsIE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBvdXQud3JpdGUoJ2wnKTsKKyAgICBmb3IgKEJFVmFsdWUgdmFsdWUgOiBsKSB7CisgICAgICBiZW5jb2RlKHZhbHVlLCBvdXQpOworICAgIH0KKyAgICBvdXQud3JpdGUoJ2UnKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZW5jb2RlKGJ5dGVbXSBicywgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbCA9IEludGVnZXIudG9TdHJpbmcoYnMubGVuZ3RoKTsKKyAgICBvdXQud3JpdGUobC5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgb3V0LndyaXRlKCc6Jyk7CisgICAgb3V0LndyaXRlKGJzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZW5jb2RlKE1hcDxTdHJpbmcsIEJFVmFsdWU+IG0sIE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBvdXQud3JpdGUoJ2QnKTsKKworICAgIC8vIEtleXMgbXVzdCBiZSBzb3J0ZWQuCisgICAgU2V0PFN0cmluZz4gcyA9IG0ua2V5U2V0KCk7CisgICAgTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocyk7CisgICAgQ29sbGVjdGlvbnMuc29ydChsKTsKKworICAgIGZvciAoU3RyaW5nIGtleSA6IGwpIHsKKyAgICAgIE9iamVjdCB2YWx1ZSA9IG0uZ2V0KGtleSk7CisgICAgICBiZW5jb2RlKGtleSwgb3V0KTsKKyAgICAgIGJlbmNvZGUodmFsdWUsIG91dCk7CisgICAgfQorCisgICAgb3V0LndyaXRlKCdlJyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgYmVuY29kZShNYXA8U3RyaW5nLCBCRVZhbHVlPiBtKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgQkVuY29kZXIuYmVuY29kZShtLCBiYW9zKTsKKyAgICBiYW9zLmNsb3NlKCk7CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChiYW9zLnRvQnl0ZUFycmF5KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0ludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9iZW5jb2Rpbmcvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9iY29kZWMvSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMGQxZGQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvYmNvZGVjL0ludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIEItZW5jb2RlZCBzdHJlYW0gY2Fubm90IGJlIGRlY29kZWQuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE7CisKKyAgcHVibGljIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvdGVzdC9qYXZhL0JEZWNvZGVyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2JlbmNvZGluZy9zcmMvdGVzdC9qYXZhL0JEZWNvZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGVmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvYmVuY29kaW5nL3NyYy90ZXN0L2phdmEvQkRlY29kZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAoraW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIEJEZWNvZGVyVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlY29kZU51bWJlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgdGVzdE51bWJlcigwKTsKKyAgICB0ZXN0TnVtYmVyKDEpOworICAgIHRlc3ROdW1iZXIoSW50ZWdlci5NQVhfVkFMVUUpOworICAgIHRlc3ROdW1iZXIoMTIzNDU2Nyk7CisgICAgdGVzdE51bWJlcigtMSk7CisgICAgdGVzdE51bWJlcigtMTAwKTsKKyAgICB0ZXN0TnVtYmVyKEludGVnZXIuTUlOX1ZBTFVFKTsKKyAgICB0ZXN0TnVtYmVyKExvbmcuTUFYX1ZBTFVFKTsKKyAgICB0ZXN0TnVtYmVyKExvbmcuTUlOX1ZBTFVFKTsKKworICAgIC8vYnkgc3BlY2lmaWNhdGlvbiBudW1iZXIgd2l0aCBsZWFkIHplcm8gaXQncyBpbmNvcnJlY3QgdmFsdWUKKyAgICB0ZXN0QmFkTnVtYmVyKCIwMCIpOworICAgIHRlc3RCYWROdW1iZXIoIjAxMjM0Iik7CisgICAgdGVzdEJhZE51bWJlcigiMDAwIik7CisgICAgdGVzdEJhZE51bWJlcigiMDAwMSIpOworCisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdEJhZE51bWJlcihTdHJpbmcgbnVtYmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBCRGVjb2Rlci5iZGVjb2RlKG51bWJlclRvQkVQQnl0ZXMobnVtYmVyKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZhaWwoIlZhbHVlICIgKyBudW1iZXIgKyAiIGlzIGluY29ycmVjdCBieSBCRVAgc3BlY2lmaWNhdGlvbiBidXQgaXMgd2FzIHBhcnNlZCBjb3JyZWN0bHkiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0ZXN0TnVtYmVyKGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEJEZWNvZGVyLmJkZWNvZGUobnVtYmVyVG9CRVBCeXRlcyh2YWx1ZSkpLmdldExvbmcoKSwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIG51bWJlclRvQkVQQnl0ZXMobG9uZyB2YWx1ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoKCJpIiArIHZhbHVlICsgImUiKS5nZXRCeXRlcygiQVNDSUkiKSk7CisgIH0KKworICBwcml2YXRlIEJ5dGVCdWZmZXIgbnVtYmVyVG9CRVBCeXRlcyhTdHJpbmcgdmFsdWUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKCgiaSIgKyB2YWx1ZSArICJlIikuZ2V0Qnl0ZXMoIkFTQ0lJIikpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcmVudC10b3JyZW50IGIvdHRvcnJlbnQtbWFzdGVyL2Jpbi90dG9yZW50LXRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5M2M0ZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcmVudC10b3JyZW50CkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworRVhFRklMRT0iJHswJS10b3JyZW50fSIKK01BSU5DTEFTUz0iY29tLnR1cm4udHRvcnJlbnQuY2xpLlRvcnJlbnRNYWluIiAiJHtFWEVGSUxFfSIgIiRAIgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2Jpbi90dG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyMWRlYQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQKQEAgLTAsMCArMSw3MyBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitFWEVDSkFSPSJ0dG9ycmVudC0qLXNoYWRlZC5qYXIiCisKK3JlYWxfcGF0aCgpIHsKKyAgICBjYXNlICQxIGluCisgICAgICAgIC8qKQorICAgICAgICAgICAgU0NSSVBUPSIkMSIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBQV0Q9YHB3ZGAKKyAgICAgICAgICAgIFNDUklQVD0iJFBXRC8kMSIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIENIQU5HRUQ9dHJ1ZQorICAgIHdoaWxlIFsgIlgkQ0hBTkdFRCIgIT0gIlgiIF0gOyBkbworICAgICAgICAjIENoYW5nZSBzcGFjZXMgdG8gIjoiIHNvIHRoZSB0b2tlbnMgY2FuIGJlIHBhcnNlZC4KKyAgICAgICAgU0FGRVNDUklQVD1gZWNobyAkU0NSSVBUIHwgc2VkIC1lICdzOyA7OjtnJ2AKKyAgICAgICAgIyBHZXQgdGhlIHJlYWwgcGF0aCB0byB0aGlzIHNjcmlwdCwgcmVzb2x2aW5nIGFueSBzeW1ib2xpYyBsaW5rcworICAgICAgICBUT0tFTlM9YGVjaG8gJFNBRkVTQ1JJUFQgfCBzZWQgLWUgJ3M7LzsgO2cnYAorICAgICAgICBSRUFMUEFUSD0KKyAgICAgICAgZm9yIEMgaW4gJFRPS0VOUzsgZG8KKyAgICAgICAgICAgICMgQ2hhbmdlIGFueSAiOiIgaW4gdGhlIHRva2VuIGJhY2sgdG8gYSBzcGFjZS4KKyAgICAgICAgICAgIEM9YGVjaG8gJEMgfCBzZWQgLWUgJ3M7OjsgO2cnYAorICAgICAgICAgICAgUkVBTFBBVEg9IiRSRUFMUEFUSC8kQyIKKyAgICAgICAgICAgICMgSWYgUkVBTFBBVEggaXMgYSBzeW0gbGluaywgcmVzb2x2ZSBpdC4gIExvb3AgZm9yIG5lc3RlZCBsaW5rcy4KKyAgICAgICAgICAgIHdoaWxlIFsgLWggIiRSRUFMUEFUSCIgXSA7IGRvCisgICAgICAgICAgICAgICAgTFM9ImBscyAtbGQgIiRSRUFMUEFUSCJgIgorICAgICAgICAgICAgICAgIExJTks9ImBleHByICIkTFMiIDogJy4qLT4gXCguKlwpJCdgIgorICAgICAgICAgICAgICAgIGlmIGV4cHIgIiRMSU5LIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICMgTElOSyBpcyBhYnNvbHV0ZS4KKyAgICAgICAgICAgICAgICAgICAgUkVBTFBBVEg9IiRMSU5LIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIyBMSU5LIGlzIHJlbGF0aXZlLgorICAgICAgICAgICAgICAgICAgICBSRUFMUEFUSD0iYGRpcm5hbWUgIiRSRUFMUEFUSCJgIiIvJExJTksiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgICAgICBpZiBbICIkUkVBTFBBVEgiID0gIiRTQ1JJUFQiIF0gOyB0aGVuCisgICAgICAgICAgICBDSEFOR0VEPSIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNDUklQVD0iJFJFQUxQQVRIIgorICAgICAgICBmaQorICAgIGRvbmUKKyAgICBlY2hvICIkUkVBTFBBVEgiCit9CisKK2Jhc2U9JChkaXJuYW1lICQocmVhbF9wYXRoICQwKSkKK0NQQVJHPSQoZmluZCAke2Jhc2V9Ly4uL2J1aWxkIC1uYW1lICIkRVhFQ0pBUiIgfCB0YWlsIC1uIDEpCitpZiBbIC16ICIkQ1BBUkciIF0gOyB0aGVuCisgICAgZWNobyAiVW5hYmxlIHRvIGZpbmQgJEVYRUNKQVIiCisgICAgZXhpdCAxCitmaQoraWYgWyAteiAiJE1BSU5DTEFTUyIgXSA7IHRoZW4KKyAgICBDUEFSRz0iLWphciAkQ1BBUkciCitlbHNlCisgICAgQ1BBUkc9Ii1jcCAkQ1BBUkcgJE1BSU5DTEFTUyIKK2ZpCitleGVjIGphdmEgJENQQVJHICIkQCIKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQtdHJhY2tlciBiL3R0b3JyZW50LW1hc3Rlci9iaW4vdHRvcnJlbnQtdHJhY2tlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJhY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2Jpbi90dG9ycmVudC10cmFja2VyCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworRVhFRklMRT0iJHswJS10cmFja2VyfSIKK01BSU5DTEFTUz0iY29tLnR1cm4udHRvcnJlbnQuY2xpLlRyYWNrZXJNYWluIiAiJHtFWEVGSUxFfSIgIiRAIgpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NsaS9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGI2YzkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY2xpL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisJPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisJCTxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorCQk8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8L3BhcmVudD4KKworCTxuYW1lPkphdmEgQml0VG9ycmVudCBsaWJyYXJ5IENMSTwvbmFtZT4KKwk8YXJ0aWZhY3RJZD50dG9ycmVudC1jbGk8L2FydGlmYWN0SWQ+CisJPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworCTxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdHJhY2tlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisKKwk8YnVpbGQ+CisJCTxkZWZhdWx0R29hbD5wYWNrYWdlPC9kZWZhdWx0R29hbD4KKworCQk8cGx1Z2lucz4KKwkJCTxwbHVnaW4+CisJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorCQkJCTxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQk8YXJjaGl2ZT4KKwkJCQkJCTxtYW5pZmVzdD4KKwkJCQkJCQk8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorCQkJCQkJPC9tYW5pZmVzdD4KKwkJCQkJPC9hcmNoaXZlPgorCQkJCQk8aW5jbHVkZXM+CisJCQkJCQk8aW5jbHVkZT4qKjwvaW5jbHVkZT4KKwkJCQkJPC9pbmNsdWRlcz4KKwkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQk8L3BsdWdpbj4KKworCQkJPHBsdWdpbj4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPnNoYWRlPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJCTxvdXRwdXRGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0tc2hhZGVkLmphcjwvb3V0cHV0RmlsZT4KKwkJCQkJCQk8dHJhbnNmb3JtZXJzPgorCQkJCQkJCQk8dHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5zaGFkZS5yZXNvdXJjZS5NYW5pZmVzdFJlc291cmNlVHJhbnNmb3JtZXIiPgorCQkJCQkJCQkJPG1hbmlmZXN0RW50cmllcz4KKwkJCQkJCQkJCQk8TWFpbi1DbGFzcz5jb20udHVybi50dG9ycmVudC5jbGkuQ2xpZW50TWFpbjwvTWFpbi1DbGFzcz4KKwkJCQkJCQkJCTwvbWFuaWZlc3RFbnRyaWVzPgorCQkJCQkJCQk8L3RyYW5zZm9ybWVyPgorCQkJCQkJCTwvdHJhbnNmb3JtZXJzPgorCQkJCQkJPC9jb25maWd1cmF0aW9uPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKwkJPC9wbHVnaW5zPgorCTwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY2xpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpL0NsaWVudE1haW4uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jbGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGkvQ2xpZW50TWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTY4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY2xpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpL0NsaWVudE1haW4uamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBUdXJuLCBJbmMuCisgKiA8cD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGk7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29tbXVuaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNpbXBsZUNsaWVudDsKK2ltcG9ydCBqYXJncy5nbnUuQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5VbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiBDb21tYW5kLWxpbmUgZW50cnktcG9pbnQgZm9yIHN0YXJ0aW5nIGEge0BsaW5rIENvbW11bmljYXRpb25NYW5hZ2VyfQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50TWFpbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2xpZW50TWFpbi5jbGFzcyk7CisKKyAgLyoqCisgICAqIERlZmF1bHQgZGF0YSBvdXRwdXQgZGlyZWN0b3J5LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX0RJUkVDVE9SWSA9ICIvdG1wIjsKKworICAvKioKKyAgICogUmV0dXJucyBhIHVzYWJsZSB7QGxpbmsgSW5ldDRBZGRyZXNzfSBmb3IgdGhlIGdpdmVuIGludGVyZmFjZSBuYW1lLgorICAgKgorICAgKiA8cD4KKyAgICogSWYgYW4gaW50ZXJmYWNlIG5hbWUgaXMgZ2l2ZW4sIHJldHVybiB0aGUgZmlyc3QgdXNhYmxlIElQdjQgYWRkcmVzcyBmb3IKKyAgICogdGhhdCBpbnRlcmZhY2UuIElmIG5vIGludGVyZmFjZSBuYW1lIGlzIGdpdmVuIG9yIGlmIHRoYXQgaW50ZXJmYWNlCisgICAqIGRvZXNuJ3QgaGF2ZSBhbiBJUHY0IGFkZHJlc3MsIHJldHVybidzIGxvY2FsaG9zdCBhZGRyZXNzIChpZiBJUHY0KS4KKyAgICogPC9wPgorICAgKgorICAgKiA8cD4KKyAgICogSXQgaXMgdW5kZXJzdG9vZCB0aGlzIG1ha2VzIHRoZSBjbGllbnQgSVB2NCBvbmx5LCBidXQgaXQgaXMgaW1wb3J0YW50IHRvCisgICAqIHJlbWVtYmVyIHRoYXQgbW9zdCBCaXRUb3JyZW50IGV4dGVuc2lvbnMgKGxpa2UgY29tcGFjdCBwZWVyIGxpc3RzIGZyb20KKyAgICogdHJhY2tlcnMgYW5kIFVEUCB0cmFja2VyIHN1cHBvcnQpIGFyZSBJUHY0LW9ubHkgYW55d2F5LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBpZmFjZSBUaGUgbmV0d29yayBpbnRlcmZhY2UgbmFtZS4KKyAgICogQHJldHVybiBBIHVzYWJsZSBJUHY0IGFkZHJlc3MgYXMgYSB7QGxpbmsgSW5ldDRBZGRyZXNzfS4KKyAgICogQHRocm93cyBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXhjZXB0aW9uIElmIG5vIElQdjQgYWRkcmVzcyB3YXMgYXZhaWxhYmxlCisgICAqIHRvIGJpbmQgb24uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBJbmV0NEFkZHJlc3MgZ2V0SVB2NEFkZHJlc3MoU3RyaW5nIGlmYWNlKQorICAgICAgICAgIHRocm93cyBTb2NrZXRFeGNlcHRpb24sIFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24sCisgICAgICAgICAgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgIGlmIChpZmFjZSAhPSBudWxsKSB7CisgICAgICBFbnVtZXJhdGlvbjxJbmV0QWRkcmVzcz4gYWRkcmVzc2VzID0KKyAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUoaWZhY2UpLmdldEluZXRBZGRyZXNzZXMoKTsKKyAgICAgIHdoaWxlIChhZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IGFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOworICAgICAgICBpZiAoYWRkciBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgeworICAgICAgICAgIHJldHVybiAoSW5ldDRBZGRyZXNzKSBhZGRyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgSW5ldEFkZHJlc3MgbG9jYWxob3N0ID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7CisgICAgaWYgKGxvY2FsaG9zdCBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgeworICAgICAgcmV0dXJuIChJbmV0NEFkZHJlc3MpIGxvY2FsaG9zdDsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqCisgICAqIERpc3BsYXkgcHJvZ3JhbSB1c2FnZSBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFByaW50U3RyZWFtfS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoUHJpbnRTdHJlYW0gcykgeworICAgIHMucHJpbnRsbigidXNhZ2U6IENsaWVudCBbb3B0aW9uc10gPHRvcnJlbnQ+Iik7CisgICAgcy5wcmludGxuKCk7CisgICAgcy5wcmludGxuKCJBdmFpbGFibGUgb3B0aW9uczoiKTsKKyAgICBzLnByaW50bG4oIiAgLWgsLS1oZWxwICAgICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgYW5kIGV4aXQuIik7CisgICAgcy5wcmludGxuKCIgIC1vLC0tb3V0cHV0IERJUiAgICAgICAgICAgIFJlYWQvd3JpdGUgZGF0YSB0byBkaXJlY3RvcnkgRElSLiIpOworICAgIHMucHJpbnRsbigiICAtaSwtLWlmYWNlIElGQUNFICAgICAgICAgICBCaW5kIHRvIGludGVyZmFjZSBJRkFDRS4iKTsKKyAgICBzLnByaW50bG4oIiAgLXMsLS1zZWVkIFNFQ09ORFMgICAgICAgICAgVGltZSB0byBzZWVkIGFmdGVyIGRvd25sb2FkaW5nIChkZWZhdWx0OiBpbmZpbml0ZWx5KS4iKTsKKyAgICBzLnByaW50bG4oIiAgLWQsLS1tYXgtZG93bmxvYWQgS0IvU0VDICAgTWF4IGRvd25sb2FkIHJhdGUgKGRlZmF1bHQ6IHVubGltaXRlZCkuIik7CisgICAgcy5wcmludGxuKCIgIC11LC0tbWF4LXVwbG9hZCBLQi9TRUMgICAgIE1heCB1cGxvYWQgcmF0ZSAoZGVmYXVsdDogdW5saW1pdGVkKS4iKTsKKyAgICBzLnByaW50bG4oKTsKKyAgfQorCisgIC8qKgorICAgKiBNYWluIGNsaWVudCBlbnRyeSBwb2ludCBmb3Igc3RhbmQtYWxvbmUgb3BlcmF0aW9uLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKAorICAgICAgICAgICAgbmV3IFBhdHRlcm5MYXlvdXQoIiVkIFslLTI1dF0gJS01cDogJW0lbiIpKSk7CisKKyAgICBDbWRMaW5lUGFyc2VyIHBhcnNlciA9IG5ldyBDbWRMaW5lUGFyc2VyKCk7CisgICAgQ21kTGluZVBhcnNlci5PcHRpb24gaGVscCA9IHBhcnNlci5hZGRCb29sZWFuT3B0aW9uKCdoJywgImhlbHAiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBvdXRwdXQgPSBwYXJzZXIuYWRkU3RyaW5nT3B0aW9uKCdvJywgIm91dHB1dCIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIGlmYWNlID0gcGFyc2VyLmFkZFN0cmluZ09wdGlvbignaScsICJpZmFjZSIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIHNlZWRUaW1lID0gcGFyc2VyLmFkZEludGVnZXJPcHRpb24oJ3MnLCAic2VlZCIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIG1heFVwbG9hZCA9IHBhcnNlci5hZGREb3VibGVPcHRpb24oJ3UnLCAibWF4LXVwbG9hZCIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIG1heERvd25sb2FkID0gcGFyc2VyLmFkZERvdWJsZU9wdGlvbignZCcsICJtYXgtZG93bmxvYWQiKTsKKworICAgIHRyeSB7CisgICAgICBwYXJzZXIucGFyc2UoYXJncyk7CisgICAgfSBjYXRjaCAoQ21kTGluZVBhcnNlci5PcHRpb25FeGNlcHRpb24gb2UpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihvZS5nZXRNZXNzYWdlKCkpOworICAgICAgdXNhZ2UoU3lzdGVtLmVycik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBEaXNwbGF5IGhlbHAgYW5kIGV4aXQgaWYgcmVxdWVzdGVkCisgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoKEJvb2xlYW4pIHBhcnNlci5nZXRPcHRpb25WYWx1ZShoZWxwKSkpIHsKKyAgICAgIHVzYWdlKFN5c3RlbS5vdXQpOworICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgfQorCisgICAgU3RyaW5nIG91dHB1dFZhbHVlID0gKFN0cmluZykgcGFyc2VyLmdldE9wdGlvblZhbHVlKG91dHB1dCwKKyAgICAgICAgICAgIERFRkFVTFRfT1VUUFVUX0RJUkVDVE9SWSk7CisgICAgU3RyaW5nIGlmYWNlVmFsdWUgPSAoU3RyaW5nKSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoaWZhY2UpOworICAgIGludCBzZWVkVGltZVZhbHVlID0gKEludGVnZXIpIHBhcnNlci5nZXRPcHRpb25WYWx1ZShzZWVkVGltZSwgLTEpOworCisgICAgU3RyaW5nW10gb3RoZXJBcmdzID0gcGFyc2VyLmdldFJlbWFpbmluZ0FyZ3MoKTsKKyAgICBpZiAob3RoZXJBcmdzLmxlbmd0aCAhPSAxKSB7CisgICAgICB1c2FnZShTeXN0ZW0uZXJyKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KCk7CisgICAgdHJ5IHsKKyAgICAgIEluZXQ0QWRkcmVzcyBpUHY0QWRkcmVzcyA9IGdldElQdjRBZGRyZXNzKGlmYWNlVmFsdWUpOworICAgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKG90aGVyQXJnc1swXSk7CisgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXRWYWx1ZSk7CisKKyAgICAgIGNsaWVudC5kb3dubG9hZFRvcnJlbnQoCisgICAgICAgICAgICAgIHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICBvdXRwdXRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICBpUHY0QWRkcmVzcyk7CisgICAgICBpZiAoc2VlZFRpbWVWYWx1ZSA+IDApIHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNlZWRUaW1lVmFsdWUgKiAxMDAwKTsKKyAgICAgIH0KKworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkZhdGFsIGVycm9yOiB7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIFN5c3RlbS5leGl0KDIpOworICAgIH0gZmluYWxseSB7CisgICAgICBjbGllbnQuc3RvcCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9Ub3JyZW50TWFpbi5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9Ub3JyZW50TWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjYzNTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY2xpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpL1RvcnJlbnRNYWluLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIFR1cm4sIEluYy4KKyAgPHA+CisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICA8cD4KKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIDxwPgorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaTsKKworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRDcmVhdG9yOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRQYXJzZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRTZXJpYWxpemVyOworaW1wb3J0IGphcmdzLmdudS5DbWRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmZpbGVmaWx0ZXIuVHJ1ZUZpbGVGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBDb21tYW5kLWxpbmUgZW50cnktcG9pbnQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0uCisgKi8KK3B1YmxpYyBjbGFzcyBUb3JyZW50TWFpbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVG9ycmVudE1haW4uY2xhc3MpOworCisgIC8qKgorICAgKiBEaXNwbGF5IHByb2dyYW0gdXNhZ2Ugb24gdGhlIGdpdmVuIHtAbGluayBQcmludFN0cmVhbX0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKFByaW50U3RyZWFtIHMpIHsKKyAgICB1c2FnZShzLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBEaXNwbGF5IGEgbWVzc2FnZSBhbmQgcHJvZ3JhbSB1c2FnZSBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFByaW50U3RyZWFtfS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoUHJpbnRTdHJlYW0gcywgU3RyaW5nIG1zZykgeworICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgcy5wcmludGxuKG1zZyk7CisgICAgICBzLnByaW50bG4oKTsKKyAgICB9CisKKyAgICBzLnByaW50bG4oInVzYWdlOiBUb3JyZW50IFtvcHRpb25zXSBbZmlsZXxkaXJlY3RvcnldIik7CisgICAgcy5wcmludGxuKCk7CisgICAgcy5wcmludGxuKCJBdmFpbGFibGUgb3B0aW9uczoiKTsKKyAgICBzLnByaW50bG4oIiAgLWgsLS1oZWxwICAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIGFuZCBleGl0LiIpOworICAgIHMucHJpbnRsbigiICAtdCwtLXRvcnJlbnQgRklMRSAgICAgVXNlIEZJTEUgdG8gcmVhZC93cml0ZSB0b3JyZW50IGZpbGUuIik7CisgICAgcy5wcmludGxuKCk7CisgICAgcy5wcmludGxuKCIgIC1jLC0tY3JlYXRlICAgICAgICAgICBDcmVhdGUgYSBuZXcgdG9ycmVudCBmaWxlIHVzaW5nICIgKworICAgICAgICAgICAgInRoZSBnaXZlbiBhbm5vdW5jZSBVUkwgYW5kIGRhdGEuIik7CisgICAgcy5wcmludGxuKCIgIC1sLC0tbGVuZ3RoICAgICAgICAgICBEZWZpbmUgdGhlIHBpZWNlIGxlbmd0aCBmb3IgaGFzaGluZyBkYXRhIik7CisgICAgcy5wcmludGxuKCIgIC1hLC0tYW5ub3VuY2UgICAgICAgICBUcmFja2VyIFVSTCAoY2FuIGJlIHJlcGVhdGVkKS4iKTsKKyAgICBzLnByaW50bG4oKTsKKyAgfQorCisgIC8qKgorICAgKiBUb3JyZW50IHJlYWRlciBhbmQgY3JlYXRvci4KKyAgICoKKyAgICogPHA+CisgICAqIFlvdSBjYW4gdXNlIHRoZSB7QGNvZGUgbWFpbigpfSBmdW5jdGlvbiBvZiB0aGlzIGNsYXNzIHRvIHJlYWQgb3IgY3JlYXRlCisgICAqIHRvcnJlbnQgZmlsZXMuIFNlZSB1c2FnZSBmb3IgZGV0YWlscy4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKAorICAgICAgICAgICAgbmV3IFBhdHRlcm5MYXlvdXQoIiUtNXA6ICVtJW4iKSkpOworCisgICAgQ21kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgQ21kTGluZVBhcnNlcigpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIGhlbHAgPSBwYXJzZXIuYWRkQm9vbGVhbk9wdGlvbignaCcsICJoZWxwIik7CisgICAgQ21kTGluZVBhcnNlci5PcHRpb24gZmlsZW5hbWUgPSBwYXJzZXIuYWRkU3RyaW5nT3B0aW9uKCd0JywgInRvcnJlbnQiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBjcmVhdGUgPSBwYXJzZXIuYWRkQm9vbGVhbk9wdGlvbignYycsICJjcmVhdGUiKTsKKyAgICBDbWRMaW5lUGFyc2VyLk9wdGlvbiBwaWVjZUxlbmd0aCA9IHBhcnNlci5hZGRJbnRlZ2VyT3B0aW9uKCdsJywgImxlbmd0aCIpOworICAgIENtZExpbmVQYXJzZXIuT3B0aW9uIGFubm91bmNlID0gcGFyc2VyLmFkZFN0cmluZ09wdGlvbignYScsICJhbm5vdW5jZSIpOworCisgICAgdHJ5IHsKKyAgICAgIHBhcnNlci5wYXJzZShhcmdzKTsKKyAgICB9IGNhdGNoIChDbWRMaW5lUGFyc2VyLk9wdGlvbkV4Y2VwdGlvbiBvZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKG9lLmdldE1lc3NhZ2UoKSk7CisgICAgICB1c2FnZShTeXN0ZW0uZXJyKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKworICAgIC8vIERpc3BsYXkgaGVscCBhbmQgZXhpdCBpZiByZXF1ZXN0ZWQKKyAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoaGVscCkpKSB7CisgICAgICB1c2FnZShTeXN0ZW0ub3V0KTsKKyAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIFN0cmluZyBmaWxlbmFtZVZhbHVlID0gKFN0cmluZykgcGFyc2VyLmdldE9wdGlvblZhbHVlKGZpbGVuYW1lKTsKKyAgICBpZiAoZmlsZW5hbWVWYWx1ZSA9PSBudWxsKSB7CisgICAgICB1c2FnZShTeXN0ZW0uZXJyLCAiVG9ycmVudCBmaWxlIG11c3QgYmUgcHJvdmlkZWQhIik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICBJbnRlZ2VyIHBpZWNlTGVuZ3RoVmFsID0gKEludGVnZXIpIHBhcnNlci5nZXRPcHRpb25WYWx1ZShwaWVjZUxlbmd0aCk7CisgICAgaWYgKHBpZWNlTGVuZ3RoVmFsID09IG51bGwpIHsKKyAgICAgIHBpZWNlTGVuZ3RoVmFsID0gVG9ycmVudENyZWF0b3IuREVGQVVMVF9QSUVDRV9MRU5HVEg7CisgICAgfSBlbHNlIHsKKyAgICAgIHBpZWNlTGVuZ3RoVmFsID0gcGllY2VMZW5ndGhWYWwgKiAxMDI0OworICAgIH0KKyAgICBsb2dnZXIuaW5mbygiVXNpbmcgcGllY2UgbGVuZ3RoIG9mIHt9IGJ5dGVzLiIsIHBpZWNlTGVuZ3RoVmFsKTsKKworICAgIEJvb2xlYW4gY3JlYXRlRmxhZyA9IChCb29sZWFuKSBwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoY3JlYXRlKTsKKworICAgIC8vRm9yIHJlcGVhdGVkIGFubm91bmNlIHVybHMKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBWZWN0b3I8U3RyaW5nPiBhbm5vdW5jZVVSTHMgPSAoVmVjdG9yPFN0cmluZz4pIHBhcnNlci5nZXRPcHRpb25WYWx1ZXMoYW5ub3VuY2UpOworCisgICAgU3RyaW5nW10gb3RoZXJBcmdzID0gcGFyc2VyLmdldFJlbWFpbmluZ0FyZ3MoKTsKKworICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNyZWF0ZUZsYWcpICYmCisgICAgICAgICAgICAob3RoZXJBcmdzLmxlbmd0aCAhPSAxIHx8IGFubm91bmNlVVJMcy5pc0VtcHR5KCkpKSB7CisgICAgICB1c2FnZShTeXN0ZW0uZXJyLCAiQW5ub3VuY2UgVVJMIGFuZCBhIGZpbGUgb3IgZGlyZWN0b3J5IG11c3QgYmUgIiArCisgICAgICAgICAgICAgICJwcm92aWRlZCB0byBjcmVhdGUgYSB0b3JyZW50IGZpbGUhIik7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisKKyAgICBPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY3JlYXRlRmxhZykpIHsKKyAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWVWYWx1ZSk7CisKKyAgICAgICAgLy9Qcm9jZXNzIHRoZSBhbm5vdW5jZSBVUkxzIGludG8gVVJJcworICAgICAgICBMaXN0PFVSST4gYW5ub3VuY2VVUklzID0gbmV3IEFycmF5TGlzdDxVUkk+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHVybCA6IGFubm91bmNlVVJMcykgeworICAgICAgICAgIGFubm91bmNlVVJJcy5hZGQobmV3IFVSSSh1cmwpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vQ3JlYXRlIHRoZSBhbm5vdW5jZS1saXN0IGFzIGEgbGlzdCBvZiBsaXN0cyBvZiBVUklzCisgICAgICAgIC8vQXNzdW1lIGFsbCB0aGUgVVJJJ3MgYXJlIGZpcnN0IHRpZXIgdHJhY2tlcnMKKyAgICAgICAgTGlzdDxMaXN0PFVSST4+IGFubm91bmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxVUkk+PigpOworICAgICAgICBhbm5vdW5jZUxpc3QuYWRkKGFubm91bmNlVVJJcyk7CisKKyAgICAgICAgRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShvdGhlckFyZ3NbMF0pOworICAgICAgICBpZiAoIXNvdXJjZS5leGlzdHMoKSB8fCAhc291cmNlLmNhblJlYWQoKSkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGFjY2VzcyBzb3VyY2UgZmlsZSBvciBkaXJlY3RvcnkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGNyZWF0b3IgPSBTdHJpbmcuZm9ybWF0KCIlcyAodHRvcnJlbnQpIiwKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpKTsKKworICAgICAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudDsKKyAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgTGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oRmlsZVV0aWxzLmxpc3RGaWxlcyhzb3VyY2UsIFRydWVGaWxlRmlsdGVyLlRSVUUsIFRydWVGaWxlRmlsdGVyLlRSVUUpKTsKKyAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGZpbGVzKTsKKyAgICAgICAgICB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHNvdXJjZSwgZmlsZXMsIGFubm91bmNlTGlzdC5nZXQoMCkuZ2V0KDApLCBhbm5vdW5jZUxpc3QsIGNyZWF0b3IsIHBpZWNlTGVuZ3RoVmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHNvdXJjZSwgbnVsbCwgYW5ub3VuY2VMaXN0LmdldCgwKS5nZXQoMCksIGFubm91bmNlTGlzdCwgY3JlYXRvciwgcGllY2VMZW5ndGhWYWwpOworICAgICAgICB9CisKKyAgICAgICAgZm9zLndyaXRlKG5ldyBUb3JyZW50U2VyaWFsaXplcigpLnNlcmlhbGl6ZSh0b3JyZW50KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlRnJvbUZpbGUobmV3IEZpbGUoZmlsZW5hbWVWYWx1ZSkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuZXJyb3IoInt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgU3lzdGVtLmV4aXQoMik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChmb3MgIT0gU3lzdGVtLm91dCkgeworICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmb3MpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9UcmFja2VyTWFpbi5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NsaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaS9UcmFja2VyTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTZlOTQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY2xpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpL1RyYWNrZXJNYWluLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VkVG9ycmVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCitpbXBvcnQgamFyZ3MuZ251LkNtZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBDb21tYW5kLWxpbmUgZW50cnktcG9pbnQgZm9yIHN0YXJ0aW5nIGEge0BsaW5rIFRyYWNrZXJ9CisgKi8KK3B1YmxpYyBjbGFzcyBUcmFja2VyTWFpbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKwkJTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlck1haW4uY2xhc3MpOworCisJLyoqCisJICogRGlzcGxheSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBnaXZlbiB7QGxpbmsgUHJpbnRTdHJlYW19LgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoUHJpbnRTdHJlYW0gcykgeworCQlzLnByaW50bG4oInVzYWdlOiBUcmFja2VyIFtvcHRpb25zXSBbZGlyZWN0b3J5XSIpOworCQlzLnByaW50bG4oKTsKKwkJcy5wcmludGxuKCJBdmFpbGFibGUgb3B0aW9uczoiKTsKKwkJcy5wcmludGxuKCIgIC1oLC0taGVscCAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBhbmQgZXhpdC4iKTsKKwkJcy5wcmludGxuKCIgIC1wLC0tcG9ydCBQT1JUICAgICAgICBCaW5kIHRvIHBvcnQgUE9SVC4iKTsKKwkJcy5wcmludGxuKCk7CisJfQorCisJLyoqCisJICogTWFpbiBmdW5jdGlvbiB0byBzdGFydCBhIHRyYWNrZXIuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcigKKwkJCW5ldyBQYXR0ZXJuTGF5b3V0KCIlZCBbJS0yNXRdICUtNXA6ICVtJW4iKSkpOworCisJCUNtZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IENtZExpbmVQYXJzZXIoKTsKKwkJQ21kTGluZVBhcnNlci5PcHRpb24gaGVscCA9IHBhcnNlci5hZGRCb29sZWFuT3B0aW9uKCdoJywgImhlbHAiKTsKKwkJQ21kTGluZVBhcnNlci5PcHRpb24gcG9ydCA9IHBhcnNlci5hZGRJbnRlZ2VyT3B0aW9uKCdwJywgInBvcnQiKTsKKworCQl0cnkgeworCQkJcGFyc2VyLnBhcnNlKGFyZ3MpOworCQl9IGNhdGNoIChDbWRMaW5lUGFyc2VyLk9wdGlvbkV4Y2VwdGlvbiBvZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKG9lLmdldE1lc3NhZ2UoKSk7CisJCQl1c2FnZShTeXN0ZW0uZXJyKTsKKwkJCVN5c3RlbS5leGl0KDEpOworCQl9CisKKwkJLy8gRGlzcGxheSBoZWxwIGFuZCBleGl0IGlmIHJlcXVlc3RlZAorCQlpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygoQm9vbGVhbilwYXJzZXIuZ2V0T3B0aW9uVmFsdWUoaGVscCkpKSB7CisJCQl1c2FnZShTeXN0ZW0ub3V0KTsKKwkJCVN5c3RlbS5leGl0KDApOworCQl9CisKKwkJSW50ZWdlciBwb3J0VmFsdWUgPSAoSW50ZWdlcilwYXJzZXIuZ2V0T3B0aW9uVmFsdWUocG9ydCwKKwkJCUludGVnZXIudmFsdWVPZihUcmFja2VyLkRFRkFVTFRfVFJBQ0tFUl9QT1JUKSk7CisKKwkJU3RyaW5nW10gb3RoZXJBcmdzID0gcGFyc2VyLmdldFJlbWFpbmluZ0FyZ3MoKTsKKworCQlpZiAob3RoZXJBcmdzLmxlbmd0aCA+IDEpIHsKKwkJCXVzYWdlKFN5c3RlbS5lcnIpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0KKworCQkvLyBHZXQgZGlyZWN0b3J5IGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50IG9yIGRlZmF1bHQgdG8gY3VycmVudAorCQkvLyBkaXJlY3RvcnkKKwkJU3RyaW5nIGRpcmVjdG9yeSA9IG90aGVyQXJncy5sZW5ndGggPiAwCisJCQk/IG90aGVyQXJnc1swXQorCQkJOiAiLiI7CisKKwkJRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisJCQkJcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi50b3JyZW50Iik7CisJCQl9CisJCX07CisKKwkJdHJ5IHsKKwkJCVRyYWNrZXIgdCA9IG5ldyBUcmFja2VyKHBvcnRWYWx1ZSk7CisKKwkJCUZpbGUgcGFyZW50ID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKKwkJCWZvciAoRmlsZSBmIDogcGFyZW50Lmxpc3RGaWxlcyhmaWx0ZXIpKSB7CisJCQkJbG9nZ2VyLmluZm8oIkxvYWRpbmcgdG9ycmVudCBmcm9tICIgKyBmLmdldE5hbWUoKSk7CisJCQkJdC5hbm5vdW5jZShUcmFja2VkVG9ycmVudC5sb2FkKGYpKTsKKwkJCX0KKworCQkJbG9nZ2VyLmluZm8oIlN0YXJ0aW5nIHRyYWNrZXIgd2l0aCB7fSBhbm5vdW5jZWQgdG9ycmVudHMuLi4iLAorCQkJCXQuZ2V0VHJhY2tlZFRvcnJlbnRzKCkuc2l6ZSgpKTsKKwkJCXQuc3RhcnQodHJ1ZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlsb2dnZXIuZXJyb3IoInt9IiwgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJU3lzdGVtLmV4aXQoMik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5YzNiOAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vcG9tLnhtbApAQCAtMCwwICsxLDI2IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC9jb21tb248L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWJlbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvQ29uc3RhbnRzLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxYmRhMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxMyBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBAYXV0aG9yIFNlcmdleS5QYWsKKyAqIERhdGU6IDkvMTkvMTMKKyAqIFRpbWU6IDI6NTcgUE0KKyAqLworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQU5OT1VOQ0VfSU5URVJWQUxfU0VDID0gMTU7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9TT0NLRVRfQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyA9IDEwMDAwMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTID0gMTAwMDA7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfQ09OTkVDVElPTl9DT1VOVCA9IDEwMDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgRU1QVFlfQlVGRkVSID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NFTEVDVE9SX1NFTEVDVF9USU1FT1VUX01JTExJUyA9IDEwMDAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NMRUFOVVBfUlVOX1RJTUVPVVRfTUlMTElTID0gMTIwMDAwOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfRU5DT0RJTkcgPSAiSVNPLTg4NTktMSI7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElFQ0VfSEFTSF9TSVpFID0gMjA7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24uamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRhNGQzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gZXh0ZW5kcyBUb3JyZW50SGFzaCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHVwbG9hZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHRoaXMgdG9ycmVudAorICAgKi8KKyAgbG9uZyBnZXRVcGxvYWRlZCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBkb3dubG9hZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHRoaXMgdG9ycmVudAorICAgKi8KKyAgbG9uZyBnZXREb3dubG9hZGVkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gZG93bmxvYWQgYnkgdGhlIGNsaWVudCBmb3IgdGhpcyB0b3JyZW50CisgICAqLworICBsb25nIGdldExlZnQoKTsKKworICAvKioKKyAgICogQHJldHVybiBhbGwgdHJhY2tlciBmb3IgYW5ub3VuY2UKKyAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sIj48L2E+CisgICAqLworICBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0QW5ub3VuY2VMaXN0KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbWFpbiBhbm5vdW5jZSB1cmwgZm9yIHRyYWNrZXIKKyAgICovCisgIFN0cmluZyBnZXRBbm5vdW5jZSgpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0ltbXV0YWJsZVRvcnJlbnRIYXNoLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL0ltbXV0YWJsZVRvcnJlbnRIYXNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0MDk4YwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vSW1tdXRhYmxlVG9ycmVudEhhc2guamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBJbW11dGFibGVUb3JyZW50SGFzaCBpbXBsZW1lbnRzIFRvcnJlbnRIYXNoIHsKKworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBoYXNoOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBoZXhIYXNoOworCisgIHB1YmxpYyBJbW11dGFibGVUb3JyZW50SGFzaChieXRlW10gaGFzaCkgeworICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgICAgdGhpcy5oZXhIYXNoID0gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKGhhc2gpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoaGFzaCwgaGFzaC5sZW5ndGgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIGhleEhhc2g7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vTG9nZ2VyVXRpbHMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vTG9nZ2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJlM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Mb2dnZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIExvZ2dlclV0aWxzIHsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgd2FybkFuZERlYnVnRGV0YWlscyhMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICBsb2dnZXIud2FybihtZXNzYWdlKTsKKyAgICBsb2dnZXIuZGVidWcoIiIsIHQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdhcm5BbmREZWJ1Z0RldGFpbHMoTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBhcmcsIFRocm93YWJsZSB0KSB7CisgICAgbG9nZ2VyLndhcm4obWVzc2FnZSwgYXJnKTsKKyAgICBsb2dnZXIuZGVidWcoIiIsIHQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdhcm5XaXRoTWVzc2FnZUFuZERlYnVnRGV0YWlscyhMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGFyZywgVGhyb3dhYmxlIHQpIHsKKyAgICBsb2dnZXIud2FybihtZXNzYWdlICsgIjogIiArICh0LmdldE1lc3NhZ2UoKSAhPSBudWxsID8gdC5nZXRNZXNzYWdlKCkgOiB0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgYXJnKTsKKyAgICBsb2dnZXIuZGVidWcoIiIsIHQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yQW5kRGVidWdEZXRhaWxzKExvZ2dlciBsb2dnZXIsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYXJnLCBUaHJvd2FibGUgdCkgeworICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlLCBhcmcpOworICAgIGxvZ2dlci5kZWJ1ZygiIiwgdCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3JBbmREZWJ1Z0RldGFpbHMoTG9nZ2VyIGxvZ2dlciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7CisgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpOworICAgIGxvZ2dlci5kZWJ1ZygiIiwgdCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9PcHRpb25hbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9PcHRpb25hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOWI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL09wdGlvbmFsLmphdmEKQEAgLTAsMCArMSw0NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgT3B0aW9uYWw8VD4geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbmFsPD8+IEVNUFRZID0gbmV3IE9wdGlvbmFsKCk7CisKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKworICBwdWJsaWMgT3B0aW9uYWwoQE5vdE51bGwgVCB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHByaXZhdGUgT3B0aW9uYWwoKSB7CisgICAgdGhpcy52YWx1ZSA9IG51bGw7CisgIH0KKworICBATm90TnVsbAorICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHN0YXRpYyA8VD4gT3B0aW9uYWw8VD4gb2YoQE51bGxhYmxlIFQgdmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IChPcHRpb25hbDxUPikgRU1QVFkgOiBuZXcgT3B0aW9uYWw8VD4odmFsdWUpOworICB9CisKKyAgQE5vdE51bGwKKyAgcHVibGljIFQgZ2V0KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24geworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiTm8gdmFsdWUgcHJlc2VudCIpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IG51bGw7CisgIH0KKworICBATm90TnVsbAorICBwdWJsaWMgVCBvckVsc2UoQE5vdE51bGwgVCBkZWZhdWx0VmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogZGVmYXVsdFZhbHVlOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGFpci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QYWlyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzMjVmMQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGFpci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitwdWJsaWMgY2xhc3MgUGFpcjxBLCBCPiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBBIG15Rmlyc3Q7CisgIHByaXZhdGUgZmluYWwgQiBteVNlY29uZDsKKworICBwdWJsaWMgUGFpcihBIGZpcnN0LCBCIHNlY29uZCkgeworICAgIG15Rmlyc3QgPSBmaXJzdDsKKyAgICBteVNlY29uZCA9IHNlY29uZDsKKyAgfQorCisgIHB1YmxpYyBBIGZpcnN0KCkgeworICAgIHJldHVybiBteUZpcnN0OworICB9CisKKyAgcHVibGljIEIgc2Vjb25kKCkgeworICAgIHJldHVybiBteVNlY29uZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICBQYWlyPD8sID8+IHBhaXIgPSAoUGFpcjw/LCA/PikgbzsKKworICAgIGlmICghbXlGaXJzdC5lcXVhbHMocGFpci5teUZpcnN0KSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBteVNlY29uZC5lcXVhbHMocGFpci5teVNlY29uZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbnQgcmVzdWx0ID0gbXlGaXJzdC5oYXNoQ29kZSgpOworICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbXlTZWNvbmQuaGFzaENvZGUoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJQYWlyeyIgKworICAgICAgICAgICAgIm15Rmlyc3Q9IiArIG15Rmlyc3QgKworICAgICAgICAgICAgIiwgbXlTZWNvbmQ9IiArIG15U2Vjb25kICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QZWVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BlZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmYwMGMwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9QZWVyLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworCisvKioKKyAqIEEgYmFzaWMgQml0VG9ycmVudCBwZWVyLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSBhIGNvbW1vbiBiYXNlIGZvciB0aGUgdHJhY2tlciBhbmQgY2xpZW50LCB3aGljaAorICogd291bGQgcHJlc3VtYWJseSBzdWJjbGFzcyBpdCB0byBleHRlbmQgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGZpZWxkcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworCisvLyBQZWVy77yI5a+5562J6IqC54K577yJ57G777yM55So5LqO6KGo56S65Y+C5LiO5paH5Lu25YWx5Lqr55qE5Y2V5Liq5a6i5oi356uv5oiW5pyN5Yqh5Zmo6IqC54K5CisvLyDln7rnoYBwZWVy57G777yM6KKrdHJhY2tlZCBwZWVy57un5om/CisvLyDlrp7njrDlip/og73vvJog6I635Y+W5ZCE5Liq57G75Z6L55qEcGVlcmlkCitwdWJsaWMgY2xhc3MgUGVlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQZWVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3M7Ly/lnLDlnYDlkoznq6/lj6MKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdElkOy8vIOagvOW8j+WMluS4uiAiSVA656uv5Y+jIiDnmoTlrZfnrKbkuLIKKworICBwcml2YXRlIEJ5dGVCdWZmZXIgcGVlcklkOy8vIOS4u+mUru+8jOWUr+S4gOagh+ivhgorICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBoZXhQZWVySWQ7CisgIHByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIGhleEluZm9IYXNoOworCisgIC8qKgorICAgKiBJbnN0YW50aWF0ZSBhIG5ldyBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgcGVlcidzIGFkZHJlc3MsIHdpdGggcG9ydC4KKyAgICovCisgIHB1YmxpYyBQZWVyKEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICB0aGlzKGFkZHJlc3MsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEluc3RhbnRpYXRlIGEgbmV3IHBlZXIuCisgICAqCisgICAqIEBwYXJhbSBpcCAgIFRoZSBwZWVyJ3MgSVAgYWRkcmVzcy4KKyAgICogQHBhcmFtIHBvcnQgVGhlIHBlZXIncyBwb3J0LgorICAgKi8KKyAgcHVibGljIFBlZXIoU3RyaW5nIGlwLCBpbnQgcG9ydCkgeworICAgIHRoaXMobmV3IEluZXRTb2NrZXRBZGRyZXNzKGlwLCBwb3J0KSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogSW5zdGFudGlhdGUgYSBuZXcgcGVlci4KKyAgICoKKyAgICogQHBhcmFtIGlwICAgICBUaGUgcGVlcidzIElQIGFkZHJlc3MuCisgICAqIEBwYXJhbSBwb3J0ICAgVGhlIHBlZXIncyBwb3J0LgorICAgKiBAcGFyYW0gcGVlcklkIFRoZSBieXRlLWVuY29kZWQgcGVlciBJRC4KKyAgICovCisgIHB1YmxpYyBQZWVyKFN0cmluZyBpcCwgaW50IHBvcnQsIEJ5dGVCdWZmZXIgcGVlcklkKSB7CisgICAgdGhpcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MoaXAsIHBvcnQpLCBwZWVySWQpOworICB9CisKKyAgLyoqCisgICAqIEluc3RhbnRpYXRlIGEgbmV3IHBlZXIuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBwZWVyJ3MgYWRkcmVzcywgd2l0aCBwb3J0LgorICAgKiBAcGFyYW0gcGVlcklkICBUaGUgYnl0ZS1lbmNvZGVkIHBlZXIgSUQuCisgICAqLworICBwdWJsaWMgUGVlcihJbmV0U29ja2V0QWRkcmVzcyBhZGRyZXNzLCBCeXRlQnVmZmVyIHBlZXJJZCkgeworICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgdGhpcy5ob3N0SWQgPSBTdHJpbmcuZm9ybWF0KCIlczolZCIsCisgICAgICAgICAgICB0aGlzLmFkZHJlc3MuZ2V0QWRkcmVzcygpLAorICAgICAgICAgICAgdGhpcy5hZGRyZXNzLmdldFBvcnQoKSk7CisKKyAgICB0aGlzLnNldFBlZXJJZChwZWVySWQpOworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBwZWVyIGhhcyBhIGtub3duIHBlZXIgSUQgeWV0IG9yIG5vdC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGhhc1BlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVySWQgIT0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSByYXcgcGVlciBJRCBhcyBhIHtAbGluayBCeXRlQnVmZmVyfS4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVySWQ7CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIGdldFBlZXJJZEFycmF5KCkgeworICAgIHJldHVybiBwZWVySWQgPT0gbnVsbCA/IG51bGwgOiBwZWVySWQuYXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgYSBwZWVyIElEIGZvciB0aGlzIHBlZXIgKHVzdWFsbHkgZHVyaW5nIGhhbmRzaGFrZSkuCisgICAqCisgICAqIEBwYXJhbSBwZWVySWQgVGhlIG5ldyBwZWVyIElEIGZvciB0aGlzIHBlZXIuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQZWVySWQoQnl0ZUJ1ZmZlciBwZWVySWQpIHsKKyAgICBpZiAocGVlcklkICE9IG51bGwpIHsKKyAgICAgIHRoaXMucGVlcklkID0gcGVlcklkOworICAgICAgdGhpcy5oZXhQZWVySWQgPSBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcocGVlcklkLmFycmF5KCkpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnBlZXJJZCA9IG51bGw7CisgICAgICB0aGlzLmhleFBlZXJJZCA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdQZWVySWQoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKHBlZXJJZC5hcnJheSgpLCBDb25zdGFudHMuQllURV9FTkNPRElORyk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgImNhbiBub3QgZ2V0IHBlZXIgaWQgYXMgc3RyaW5nIiwgZSk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgaGV4YWRlY2ltYWwtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwZWVyJ3MgSUQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhleFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5oZXhQZWVySWQ7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBzaG9ydGVuZWQgaGV4YWRlY2ltYWwtZW5jb2RlZCBwZWVyIElELgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRTaG9ydEhleFBlZXJJZCgpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiLi4lcyIsCisgICAgICAgICAgICB0aGlzLmhleFBlZXJJZC5zdWJzdHJpbmcodGhpcy5oZXhQZWVySWQubGVuZ3RoKCkgLSA2KS50b1VwcGVyQ2FzZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgcGVlcidzIElQIGFkZHJlc3MuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldElwKCkgeworICAgIHJldHVybiB0aGlzLmFkZHJlc3MuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIHBlZXIncyBJbmV0QWRkcmVzcy4KKyAgICovCisgIHB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyBnZXRBZGRyZXNzKCkgeworICAgIHJldHVybiB0aGlzLmFkZHJlc3M7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGlzIHBlZXIncyBwb3J0IG51bWJlci4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICByZXR1cm4gdGhpcy5hZGRyZXNzLmdldFBvcnQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoaXMgcGVlcidzIGhvc3QgaWRlbnRpZmllciAoImhvc3Q6cG9ydCIpLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRIb3N0SWRlbnRpZmllcigpIHsKKyAgICByZXR1cm4gdGhpcy5ob3N0SWQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGVlcidzIElQLgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSBnZXRSYXdJcCgpIHsKKyAgICBmaW5hbCBJbmV0QWRkcmVzcyBhZGRyZXNzID0gdGhpcy5hZGRyZXNzLmdldEFkZHJlc3MoKTsKKyAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gYWRkcmVzcy5nZXRBZGRyZXNzKCk7CisgIH0KKworCisgIC8qKgorICAgKiBUZWxscyBpZiB0d28gcGVlcnMgc2VlbSB0byBsb29rIGFsaWtlIChpLmUuIHRoZXkgaGF2ZSB0aGUgc2FtZSBJUCwgcG9ydAorICAgKiBhbmQgcGVlciBJRCBpZiB0aGV5IGhhdmUgb25lKS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGxvb2tzTGlrZShQZWVyIG90aGVyKSB7CisgICAgaWYgKG90aGVyID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5ob3N0SWQuZXF1YWxzKG90aGVyLmhvc3RJZCkgJiYgdGhpcy5nZXRQb3J0KCkgPT0gb3RoZXIuZ2V0UG9ydCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VG9ycmVudEhhc2goU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgdGhpcy5oZXhJbmZvSGFzaCA9IGhleEluZm9IYXNoOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gaGV4SW5mb0hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgUGVlciBwZWVyID0gKFBlZXIpIG87CisKKyAgICBpZiAoaGV4UGVlcklkID09IG51bGwgJiYgcGVlci5oZXhQZWVySWQgPT0gbnVsbCkgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKKworICAgIGlmIChoZXhQZWVySWQgIT0gbnVsbCA/ICFoZXhQZWVySWQuZXF1YWxzKHBlZXIuaGV4UGVlcklkKSA6IHBlZXIuaGV4UGVlcklkICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaGV4SW5mb0hhc2ggIT0gbnVsbCA/IGhleEluZm9IYXNoLmVxdWFscyhwZWVyLmhleEluZm9IYXNoKSA6IHBlZXIuaGV4SW5mb0hhc2ggPT0gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCisgICAgaWYgKGhleFBlZXJJZCA9PSBudWxsKSByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKworICAgIGludCByZXN1bHQgPSBoZXhQZWVySWQgIT0gbnVsbCA/IGhleFBlZXJJZC5oYXNoQ29kZSgpIDogMDsKKyAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChoZXhJbmZvSGFzaCAhPSBudWxsID8gaGV4SW5mb0hhc2guaGFzaENvZGUoKSA6IDApOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVlci4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiUGVlciAiICsgYWRkcmVzcyArICIgZm9yIHRvcnJlbnQgIiArIGhleEluZm9IYXNoOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BlZXJVSUQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vUGVlclVJRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzFiMDIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1BlZXJVSUQuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCisvKiDkv53lrZjnlKjmiLfnmoTlnLDlnYDnm7jlhbPkv6Hmga8KKyog5qCH6K+G5ZSv5LiA5LiA5Liq55So5oi35ZKM55So5oi355u45YWz55qEdG9ycmVudOWcsOWdgAorKiAqLworcHVibGljIGNsYXNzIFBlZXJVSUQgeworCisgIHByaXZhdGUgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgbXlBZGRyZXNzOy8vIOS/neWtmGlw5Zyw5Z2A77yM56uv5Y+j5Y+377yM5Li75py65ZCNCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15VG9ycmVudEhhc2g7Ly8g5qCH6K+G5ZSv5LiA55qEdG9ycmVudOaWh+S7tgorCisgIHB1YmxpYyBQZWVyVUlEKEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3MsIFN0cmluZyB0b3JyZW50SGFzaCkgeworICAgIG15QWRkcmVzcyA9IGFkZHJlc3M7CisgICAgbXlUb3JyZW50SGFzaCA9IHRvcnJlbnRIYXNoOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUb3JyZW50SGFzaCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50SGFzaDsKKyAgfQorCisgIHB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyBnZXRBZGRyZXNzKCkgeworICAgIHJldHVybiBteUFkZHJlc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworCisgICAgUGVlclVJRCBwZWVyVUlEID0gKFBlZXJVSUQpIG87CisKKyAgICBpZiAoIW15QWRkcmVzcy5lcXVhbHMocGVlclVJRC5teUFkZHJlc3MpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG15VG9ycmVudEhhc2guZXF1YWxzKHBlZXJVSUQubXlUb3JyZW50SGFzaCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbnQgcmVzdWx0ID0gbXlBZGRyZXNzLmhhc2hDb2RlKCk7CisgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBteVRvcnJlbnRIYXNoLmhhc2hDb2RlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiUGVlclVJRHsiICsKKyAgICAgICAgICAgICJhZGRyZXNzPSIgKyBteUFkZHJlc3MgKworICAgICAgICAgICAgIiwgdG9ycmVudCBoYXNoPSciICsgbXlUb3JyZW50SGFzaCArICdcJycgKworICAgICAgICAgICAgJ30nOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1N5c3RlbVRpbWVTZXJ2aWNlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1N5c3RlbVRpbWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1NWNkMQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vU3lzdGVtVGltZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworcHVibGljIGNsYXNzIFN5c3RlbVRpbWVTZXJ2aWNlIGltcGxlbWVudHMgVGltZVNlcnZpY2UgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBub3coKSB7CisgICAgcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICB9CisgIC8vIOi/lOWbnuiHqiBVbml4IOe6quWFg++8iDE5NzAtMDEtMDEgMDA6MDA6MDAgVVRD77yJIOS7peadpeeahOavq+enkuaVsO+8iGxvbmcg57G75Z6L77yJCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RpbWVTZXJ2aWNlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RpbWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MWZmZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVGltZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworLyoqCisgKiBBYnN0cmFjdCB0aW1lIHNlcnZpY2UuIFByb3ZpZGVzIGN1cnJlbnQgdGltZSBtaWxsaXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGltZVNlcnZpY2UgeworICAvKioKKyAgICogUHJvdmlkZXMgY3VycmVudCB0aW1lIG1pbGxpcy4KKyAgICoKKyAgICogQHJldHVybiBjdXJyZW50IHRpbWUuCisgICAqLworICBsb25nIG5vdygpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRDcmVhdG9yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRDcmVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkZTFlZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudENyZWF0b3IuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbi5NZXRhZGF0YUJ1aWxkZXI7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhS2V5cy4qOworCisvKioKKyAqIE9sZCBBUEkgZm9yIGNyZWF0aW5nIC50b3JyZW50IGZpbGVzLCB1c2Uge0BsaW5rIE1ldGFkYXRhQnVpbGRlcn0KKyAqIEBkZXByZWNhdGVkCisgKi8KK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgVG9ycmVudENyZWF0b3IgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVG9ycmVudENyZWF0b3IuY2xhc3MpOworCisgIC8qKgorICAgKiBUb3JyZW50IGZpbGUgcGllY2UgbGVuZ3RoIChpbiBieXRlcyksIHdlIHVzZSA1MTIga0IuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BJRUNFX0xFTkdUSCA9IDUxMiAqIDEwMjQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNISU5HX1RJTUVPVVRfU0VDID0gMTU7CisgIHB1YmxpYyBzdGF0aWMgaW50IEhBU0hJTkdfVEhSRUFEU19DT1VOVCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKTsKKworICBzdGF0aWMgeworICAgIFN0cmluZyB0aHJlYWRzID0gU3lzdGVtLmdldGVudigiVFRPUlJFTlRfSEFTSElOR19USFJFQURTIik7CisKKyAgICBpZiAodGhyZWFkcyAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnQgY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHRocmVhZHMpOworICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgVG9ycmVudENyZWF0b3IuSEFTSElOR19USFJFQURTX0NPVU5UID0gY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgLy8gUGFzcworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBIQVNISU5HX0VYRUNVVE9SID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChIQVNISU5HX1RIUkVBRFNfQ09VTlQsIG5ldyBUaHJlYWRGYWN0b3J5KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKEBOb3ROdWxsIGZpbmFsIFJ1bm5hYmxlIHIpIHsKKyAgICAgIGZpbmFsIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHIpOworICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorICB9KTsKKworICAvKioKKyAgICogQ3JlYXRlIGEge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IGZvciBhIGZpbGUuCisgICAqCisgICAqIDxwPgorICAgKiBIYXNoIHRoZSBnaXZlbiBmaWxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IHJlcHJlc2VudGluZworICAgKiB0aGUgVG9ycmVudCBtZXRhIGluZm8gYWJvdXQgdGhpcyBmaWxlLCBuZWVkZWQgZm9yIGFubm91bmNpbmcgYW5kL29yCisgICAqIHNoYXJpbmcgc2FpZCBmaWxlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBzb3VyY2UgICAgVGhlIGZpbGUgdG8gdXNlIGluIHRoZSB0b3JyZW50LgorICAgKiBAcGFyYW0gYW5ub3VuY2UgIFRoZSBhbm5vdW5jZSBVUkkgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGNyZWF0ZWRCeSBUaGUgY3JlYXRvcidzIG5hbWUsIG9yIGFueSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlCisgICAqICAgICAgICAgICAgICAgICAgdG9ycmVudCdzIGNyZWF0b3IuCisgICAqLworICBwdWJsaWMgc3RhdGljIFRvcnJlbnRNZXRhZGF0YSBjcmVhdGUoRmlsZSBzb3VyY2UsIFVSSSBhbm5vdW5jZSwgU3RyaW5nIGNyZWF0ZWRCeSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3JlYXRlKHNvdXJjZSwgbnVsbCwgYW5ub3VuY2UsIGNyZWF0ZWRCeSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0IGZvciBhIHNldCBvZiBmaWxlcy4KKyAgICoKKyAgICogPHA+CisgICAqIEhhc2ggdGhlIGdpdmVuIGZpbGVzIHRvIGNyZWF0ZSB0aGUgbXVsdGktZmlsZSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QKKyAgICogcmVwcmVzZW50aW5nIHRoZSBUb3JyZW50IG1ldGEtaW5mbyBhYm91dCB0aGVtLCBuZWVkZWQgZm9yIGFubm91bmNpbmcKKyAgICogYW5kL29yIHNoYXJpbmcgdGhlc2UgZmlsZXMuIFNpbmNlIHdlIGNyZWF0ZWQgdGhlIHRvcnJlbnQsIHdlJ3JlCisgICAqIGNvbnNpZGVyaW5nIHdlJ2xsIGJlIGEgZnVsbCBpbml0aWFsIHNlZWRlciBmb3IgaXQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBhcmVudCAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvciBsb2NhdGlvbiBvZiB0aGUgdG9ycmVudCBmaWxlcywKKyAgICogICAgICAgICAgICAgICAgICBhbHNvIHVzZWQgYXMgdGhlIHRvcnJlbnQncyBuYW1lLgorICAgKiBAcGFyYW0gZmlsZXMgICAgIFRoZSBmaWxlcyB0byBhZGQgaW50byB0aGlzIHRvcnJlbnQuCisgICAqIEBwYXJhbSBhbm5vdW5jZSAgVGhlIGFubm91bmNlIFVSSSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhpcyB0b3JyZW50LgorICAgKiBAcGFyYW0gY3JlYXRlZEJ5IFRoZSBjcmVhdG9yJ3MgbmFtZSwgb3IgYW55IHN0cmluZyBpZGVudGlmeWluZyB0aGUKKyAgICogICAgICAgICAgICAgICAgICB0b3JyZW50J3MgY3JlYXRvci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZShGaWxlIHBhcmVudCwgTGlzdDxGaWxlPiBmaWxlcywgVVJJIGFubm91bmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZWRCeSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShwYXJlbnQsIGZpbGVzLCBhbm5vdW5jZSwgbnVsbCwgY3JlYXRlZEJ5KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QgZm9yIGEgZmlsZS4KKyAgICoKKyAgICogPHA+CisgICAqIEhhc2ggdGhlIGdpdmVuIGZpbGUgdG8gY3JlYXRlIHRoZSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QgcmVwcmVzZW50aW5nCisgICAqIHRoZSBUb3JyZW50IG1ldGFpbmZvIGFib3V0IHRoaXMgZmlsZSwgbmVlZGVkIGZvciBhbm5vdW5jaW5nIGFuZC9vcgorICAgKiBzaGFyaW5nIHNhaWQgZmlsZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gc291cmNlICAgICAgIFRoZSBmaWxlIHRvIHVzZSBpbiB0aGUgdG9ycmVudC4KKyAgICogQHBhcmFtIGFubm91bmNlTGlzdCBUaGUgYW5ub3VuY2UgVVJJcyBvcmdhbml6ZWQgYXMgdGllcnMgdGhhdCB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBmb3IgdGhpcyB0b3JyZW50CisgICAqIEBwYXJhbSBjcmVhdGVkQnkgICAgVGhlIGNyZWF0b3IncyBuYW1lLCBvciBhbnkgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQncyBjcmVhdG9yLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUb3JyZW50TWV0YWRhdGEgY3JlYXRlKEZpbGUgc291cmNlLCBMaXN0PExpc3Q8VVJJPj4gYW5ub3VuY2VMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZWRCeSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShzb3VyY2UsIG51bGwsIG51bGwsIGFubm91bmNlTGlzdCwgY3JlYXRlZEJ5KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBvYmplY3QgZm9yIGEgc2V0IG9mIGZpbGVzLgorICAgKgorICAgKiA8cD4KKyAgICogSGFzaCB0aGUgZ2l2ZW4gZmlsZXMgdG8gY3JlYXRlIHRoZSBtdWx0aS1maWxlIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdAorICAgKiByZXByZXNlbnRpbmcgdGhlIFRvcnJlbnQgbWV0YS1pbmZvIGFib3V0IHRoZW0sIG5lZWRlZCBmb3IgYW5ub3VuY2luZworICAgKiBhbmQvb3Igc2hhcmluZyB0aGVzZSBmaWxlcy4gU2luY2Ugd2UgY3JlYXRlZCB0aGUgdG9ycmVudCwgd2UncmUKKyAgICogY29uc2lkZXJpbmcgd2UnbGwgYmUgYSBmdWxsIGluaXRpYWwgc2VlZGVyIGZvciBpdC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gc291cmNlICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9yIGxvY2F0aW9uIG9mIHRoZSB0b3JyZW50IGZpbGVzLAorICAgKiAgICAgICAgICAgICAgICAgICAgIGFsc28gdXNlZCBhcyB0aGUgdG9ycmVudCdzIG5hbWUuCisgICAqIEBwYXJhbSBmaWxlcyAgICAgICAgVGhlIGZpbGVzIHRvIGFkZCBpbnRvIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGFubm91bmNlTGlzdCBUaGUgYW5ub3VuY2UgVVJJcyBvcmdhbml6ZWQgYXMgdGllcnMgdGhhdCB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBmb3IgdGhpcyB0b3JyZW50CisgICAqIEBwYXJhbSBjcmVhdGVkQnkgICAgVGhlIGNyZWF0b3IncyBuYW1lLCBvciBhbnkgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQncyBjcmVhdG9yLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUb3JyZW50TWV0YWRhdGEgY3JlYXRlKEZpbGUgc291cmNlLCBMaXN0PEZpbGU+IGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFVSST4+IGFubm91bmNlTGlzdCwgU3RyaW5nIGNyZWF0ZWRCeSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3JlYXRlKHNvdXJjZSwgZmlsZXMsIG51bGwsIGFubm91bmNlTGlzdCwgY3JlYXRlZEJ5KTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IG9iamVjdCBmb3IgYSBzZXQgb2YgZmlsZXMuCisgICAqCisgICAqIDxwPgorICAgKiBIYXNoIHRoZSBnaXZlbiBmaWxlcyB0byBjcmVhdGUgdGhlIG11bHRpLWZpbGUge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gb2JqZWN0CisgICAqIHJlcHJlc2VudGluZyB0aGUgVG9ycmVudCBtZXRhLWluZm8gYWJvdXQgdGhlbSwgbmVlZGVkIGZvciBhbm5vdW5jaW5nCisgICAqIGFuZC9vciBzaGFyaW5nIHRoZXNlIGZpbGVzLiBTaW5jZSB3ZSBjcmVhdGVkIHRoZSB0b3JyZW50LCB3ZSdyZQorICAgKiBjb25zaWRlcmluZyB3ZSdsbCBiZSBhIGZ1bGwgaW5pdGlhbCBzZWVkZXIgZm9yIGl0LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb3IgbG9jYXRpb24gb2YgdGhlIHRvcnJlbnQgZmlsZXMsCisgICAqICAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2VkIGFzIHRoZSB0b3JyZW50J3MgbmFtZS4KKyAgICogQHBhcmFtIGZpbGVzICAgICAgICBUaGUgZmlsZXMgdG8gYWRkIGludG8gdGhpcyB0b3JyZW50LgorICAgKiBAcGFyYW0gYW5ub3VuY2UgICAgIFRoZSBhbm5vdW5jZSBVUkkgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGFubm91bmNlTGlzdCBUaGUgYW5ub3VuY2UgVVJJcyBvcmdhbml6ZWQgYXMgdGllcnMgdGhhdCB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBmb3IgdGhpcyB0b3JyZW50CisgICAqIEBwYXJhbSBjcmVhdGVkQnkgICAgVGhlIGNyZWF0b3IncyBuYW1lLCBvciBhbnkgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQncyBjcmVhdG9yLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUb3JyZW50TWV0YWRhdGEgY3JlYXRlKEZpbGUgcGFyZW50LCBMaXN0PEZpbGU+IGZpbGVzLCBVUkkgYW5ub3VuY2UsIExpc3Q8TGlzdDxVUkk+PiBhbm5vdW5jZUxpc3QsIFN0cmluZyBjcmVhdGVkQnkpCisgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZShwYXJlbnQsIGZpbGVzLCBhbm5vdW5jZSwgYW5ub3VuY2VMaXN0LCBjcmVhdGVkQnksIERFRkFVTFRfUElFQ0VfTEVOR1RIKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZShGaWxlIHBhcmVudCwgTGlzdDxGaWxlPiBmaWxlcywgVVJJIGFubm91bmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFVSST4+IGFubm91bmNlTGlzdCwgU3RyaW5nIGNyZWF0ZWRCeSwgZmluYWwgaW50IHBpZWNlU2l6ZSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3JlYXRlKHBhcmVudCwgZmlsZXMsIGFubm91bmNlLCBhbm5vdW5jZUxpc3QsIGNyZWF0ZWRCeSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwLCBwaWVjZVNpemUpOworICB9CisKKyAgLy9mb3IgdGVzdHMKKyAgLypwYWNrYWdlIGxvY2FsKi8KKyAgc3RhdGljIFRvcnJlbnRNZXRhZGF0YSBjcmVhdGUoRmlsZSBwYXJlbnQsIExpc3Q8RmlsZT4gZmlsZXMsIFVSSSBhbm5vdW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFVSST4+IGFubm91bmNlTGlzdCwgU3RyaW5nIGNyZWF0ZWRCeSwgbG9uZyBjcmVhdGlvblRpbWVTZWNzLCBmaW5hbCBpbnQgcGllY2VTaXplKQorICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHRvcnJlbnQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisKKyAgICBpZiAoYW5ub3VuY2UgIT0gbnVsbCkgeworICAgICAgdG9ycmVudC5wdXQoQU5OT1VOQ0UsIG5ldyBCRVZhbHVlKGFubm91bmNlLnRvU3RyaW5nKCkpKTsKKyAgICB9CisgICAgaWYgKGFubm91bmNlTGlzdCAhPSBudWxsKSB7CisgICAgICBMaXN0PEJFVmFsdWU+IHRpZXJzID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICAgIGZvciAoTGlzdDxVUkk+IHRyYWNrZXJzIDogYW5ub3VuY2VMaXN0KSB7CisgICAgICAgIExpc3Q8QkVWYWx1ZT4gdGllckluZm8gPSBuZXcgTGlua2VkTGlzdDxCRVZhbHVlPigpOworICAgICAgICBmb3IgKFVSSSB0cmFja2VyVVJJIDogdHJhY2tlcnMpIHsKKyAgICAgICAgICB0aWVySW5mby5hZGQobmV3IEJFVmFsdWUodHJhY2tlclVSSS50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgICAgdGllcnMuYWRkKG5ldyBCRVZhbHVlKHRpZXJJbmZvKSk7CisgICAgICB9CisgICAgICB0b3JyZW50LnB1dChBTk5PVU5DRV9MSVNULCBuZXcgQkVWYWx1ZSh0aWVycykpOworICAgIH0KKyAgICB0b3JyZW50LnB1dChDUkVBVElPTl9EQVRFX1NFQywgbmV3IEJFVmFsdWUoY3JlYXRpb25UaW1lU2VjcykpOworICAgIHRvcnJlbnQucHV0KENSRUFURURfQlksIG5ldyBCRVZhbHVlKGNyZWF0ZWRCeSkpOworCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG5ldyBUcmVlTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBpbmZvLnB1dChOQU1FLCBuZXcgQkVWYWx1ZShwYXJlbnQuZ2V0TmFtZSgpKSk7CisgICAgaW5mby5wdXQoUElFQ0VfTEVOR1RILCBuZXcgQkVWYWx1ZShwaWVjZVNpemUpKTsKKworICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgaW5mby5wdXQoRklMRV9MRU5HVEgsIG5ldyBCRVZhbHVlKHBhcmVudC5sZW5ndGgoKSkpOworICAgICAgaW5mby5wdXQoUElFQ0VTLCBuZXcgQkVWYWx1ZShoYXNoRmlsZShwYXJlbnQsIHBpZWNlU2l6ZSksCisgICAgICAgICAgICAgIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gZmlsZUluZm8gPSBuZXcgTGlua2VkTGlzdDxCRVZhbHVlPigpOworICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBmaWxlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgICAgICBmaWxlTWFwLnB1dChGSUxFX0xFTkdUSCwgbmV3IEJFVmFsdWUoZmlsZS5sZW5ndGgoKSkpOworCisgICAgICAgIExpbmtlZExpc3Q8QkVWYWx1ZT4gZmlsZVBhdGggPSBuZXcgTGlua2VkTGlzdDxCRVZhbHVlPigpOworICAgICAgICB3aGlsZSAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKHBhcmVudCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGZpbGVQYXRoLmFkZEZpcnN0KG5ldyBCRVZhbHVlKGZpbGUuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZU1hcC5wdXQoRklMRV9QQVRILCBuZXcgQkVWYWx1ZShmaWxlUGF0aCkpOworICAgICAgICBmaWxlSW5mby5hZGQobmV3IEJFVmFsdWUoZmlsZU1hcCkpOworICAgICAgfQorICAgICAgaW5mby5wdXQoRklMRVMsIG5ldyBCRVZhbHVlKGZpbGVJbmZvKSk7CisgICAgICBpbmZvLnB1dChQSUVDRVMsIG5ldyBCRVZhbHVlKGhhc2hGaWxlcyhmaWxlcywgcGllY2VTaXplKSwKKyAgICAgICAgICAgICAgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9CisgICAgdG9ycmVudC5wdXQoSU5GT19UQUJMRSwgbmV3IEJFVmFsdWUoaW5mbykpOworCisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgQkVuY29kZXIuYmVuY29kZShuZXcgQkVWYWx1ZSh0b3JyZW50KSwgYmFvcyk7CisgICAgcmV0dXJuIG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2UoYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIFNIQS0xIGhhc2hlcyBvZiBhIGZpbGUncyBwaWVjZXMuCisgICAqCisgICAqIDxwPgorICAgKiBIYXNoZXMgdGhlIGdpdmVuIGZpbGUgcGllY2UgYnkgcGllY2UgdXNpbmcgdGhlIGRlZmF1bHQgVG9ycmVudCBwaWVjZQorICAgKiBsZW5ndGggKHNlZSB7QGxpbmsgI0RFRkFVTFRfUElFQ0VfTEVOR1RIfSkgYW5kIHJldHVybnMgdGhlIGNvbmNhdGVuYXRpb24gb2YKKyAgICogdGhlc2UgaGFzaGVzLCBhcyBhIHN0cmluZy4KKyAgICogPC9wPgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGluZyBUb3JyZW50IG1ldGEtaW5mbyBzdHJ1Y3R1cmVzIGZyb20gYSBmaWxlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGhhc2guCisgICAqLworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGFzaEZpbGUoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBpbnQgcGllY2VTaXplKQorICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiBoYXNoRmlsZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChmaWxlKSwgcGllY2VTaXplKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBoYXNoRmlsZXMoZmluYWwgTGlzdDxGaWxlPiBmaWxlcywgZmluYWwgaW50IHBpZWNlU2l6ZSkKKyAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoZmlsZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0cyA9IG5ldyBMaW5rZWRMaXN0PEZ1dHVyZTxTdHJpbmc+PigpOworICAgIGxvbmcgbGVuZ3RoID0gMEw7CisKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUocGllY2VTaXplKTsKKworCisgICAgZmluYWwgQXRvbWljSW50ZWdlciB0aHJlYWRJZHggPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBmaW5hbCBTdHJpbmcgZmlyc3RGaWxlTmFtZSA9IGZpbGVzLmdldCgwKS5nZXROYW1lKCk7CisKKyAgICBTdHJpbmdCdWlsZGVyIGhhc2hlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgbG9nZ2VyLmRlYnVnKCJBbmFseXppbmcgbG9jYWwgZGF0YSBmb3Ige30gd2l0aCB7fSB0aHJlYWRzLi4uIiwKKyAgICAgICAgICAgICAgZmlsZS5nZXROYW1lKCksIEhBU0hJTkdfVEhSRUFEU19DT1VOVCk7CisKKyAgICAgIGxlbmd0aCArPSBmaWxlLmxlbmd0aCgpOworCisgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBmaXMuZ2V0Q2hhbm5lbCgpOworCisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAoY2hhbm5lbC5yZWFkKGJ1ZmZlcikgPiAwKSB7CisgICAgICAgICAgaWYgKGJ1ZmZlci5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSA9IHByZXBhcmVEYXRhRnJvbUJ1ZmZlcihidWZmZXIpOworCisgICAgICAgICAgICByZXN1bHRzLmFkZChIQVNISU5HX0VYRUNVVE9SLnN1Ym1pdChuZXcgQ2FsbGFibGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0TmFtZShTdHJpbmcuZm9ybWF0KCIlcyBoYXNoZXIgIyVkIiwgZmlyc3RGaWxlTmFtZSwgdGhyZWFkSWR4LmluY3JlbWVudEFuZEdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxsYWJsZUNodW5rSGFzaGVyKGRhdGEpLmNhbGwoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSA+PSBIQVNISU5HX1RIUkVBRFNfQ09VTlQpIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgaGFzaGVycywgb3RoZXJ3aXNlIHRoZXkgd2lsbCBzcGVuZCB0b28gbXVjaCBtZW1vcnkKKyAgICAgICAgICAgIHdhaXRGb3JIYXNoZXNUb0NhbGN1bGF0ZShyZXN1bHRzLCBoYXNoZXMpOworICAgICAgICAgICAgcmVzdWx0cy5jbGVhcigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgY2hhbm5lbC5jbG9zZSgpOworICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIYXNoIHRoZSBsYXN0IGJpdCwgaWYgYW55CisgICAgaWYgKGJ1ZmZlci5wb3NpdGlvbigpID4gMCkgeworICAgICAgYnVmZmVyLmxpbWl0KGJ1ZmZlci5wb3NpdGlvbigpKTsKKyAgICAgIGJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSA9IHByZXBhcmVEYXRhRnJvbUJ1ZmZlcihidWZmZXIpOworICAgICAgcmVzdWx0cy5hZGQoSEFTSElOR19FWEVDVVRPUi5zdWJtaXQobmV3IENhbGxhYmxlQ2h1bmtIYXNoZXIoZGF0YSkpKTsKKyAgICB9CisgICAgLy8gaGVyZSB3ZSBoYXZlIG9ubHkgYSBmZXcgaGFzaGVzIHRvIHdhaXQgZm9yIGNhbGN1bGF0aW9uCisgICAgd2FpdEZvckhhc2hlc1RvQ2FsY3VsYXRlKHJlc3VsdHMsIGhhc2hlcyk7CisKKyAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OworCisgICAgaW50IGV4cGVjdGVkUGllY2VzID0gKGludCkgKE1hdGguY2VpbCgKKyAgICAgICAgICAgIChkb3VibGUpIGxlbmd0aCAvIHBpZWNlU2l6ZSkpOworICAgIGxvZ2dlci5kZWJ1ZygiSGFzaGVkIHt9IGZpbGUocykgKHt9IGJ5dGVzKSBpbiB7fSBwaWVjZXMgKHt9IGV4cGVjdGVkKSBpbiB7fW1zLiIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIGZpbGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiUuMWYiLCBlbGFwc2VkIC8gMWU2KSwKKyAgICAgICAgICAgIH0pOworCisgICAgcmV0dXJuIGhhc2hlcy50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZUJ1ZmZlciBwcmVwYXJlRGF0YUZyb21CdWZmZXIoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ1ZmZlci5yZW1haW5pbmcoKSk7CisgICAgYnVmZmVyLm1hcmsoKTsKKyAgICBkYXRhLnB1dChidWZmZXIpOworICAgIGRhdGEuY2xlYXIoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckhhc2hlc1RvQ2FsY3VsYXRlKExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdHMsIFN0cmluZ0J1aWxkZXIgaGFzaGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgZm9yIChGdXR1cmU8U3RyaW5nPiBjaHVuayA6IHJlc3VsdHMpIHsKKyAgICAgICAgaGFzaGVzLmFwcGVuZChjaHVuay5nZXQoSEFTSElOR19USU1FT1VUX1NFQywgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBoYXNoaW5nIHRoZSB0b3JyZW50IGRhdGEhIiwgZWUpOworICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgidmVyeSBzbG93IGhhc2hpbmc6IHRvb2sgbW9yZSB0aGFuICVkIHNlY29uZHMgdG8gY2FsY3VsYXRlIHNldmVyYWwgcGllY2VzLiBDYW5jZWxsaW5nIiwgSEFTSElOR19USU1FT1VUX1NFQykpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBBIHtAbGluayBDYWxsYWJsZX0gdG8gaGFzaCBhIGRhdGEgY2h1bmsuCisgICAqCisgICAqIEBhdXRob3IgbXBldGF6em9uaQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FsbGFibGVDaHVua0hhc2hlciBpbXBsZW1lbnRzIENhbGxhYmxlPFN0cmluZz4geworCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGRhdGE7CisKKyAgICBDYWxsYWJsZUNodW5rSGFzaGVyKGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSkgeworICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICBieXRlW10gc2hhMUhhc2ggPSBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2godGhpcy5kYXRhLmFycmF5KCkpOworICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2hhMUhhc2gsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEZpbGUuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQzYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50RmlsZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBkZ2lmZmluCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFRvcnJlbnRGaWxlIHsKKworICBATm90TnVsbAorICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IHJlbGF0aXZlUGF0aDsKKyAgcHVibGljIGZpbmFsIGxvbmcgc2l6ZTsKKyAgQE5vdE51bGwKKyAgcHVibGljIGZpbmFsIE9wdGlvbmFsPFN0cmluZz4gbWQ1SGFzaDsKKworICBwdWJsaWMgVG9ycmVudEZpbGUoQE5vdE51bGwgTGlzdDxTdHJpbmc+IHJlbGF0aXZlUGF0aCwgbG9uZyBzaXplLCBATnVsbGFibGUgU3RyaW5nIG1kNUhhc2gpIHsKKyAgICB0aGlzLnJlbGF0aXZlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihyZWxhdGl2ZVBhdGgpOworICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgdGhpcy5tZDVIYXNoID0gT3B0aW9uYWwub2YobWQ1SGFzaCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aEFzU3RyaW5nKCkgeworICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBGaWxlLnNlcGFyYXRvcjsKKyAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gcmVsYXRpdmVQYXRoLml0ZXJhdG9yKCk7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgc2IuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRIYXNoLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRIYXNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhZTM0NQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudEhhc2guamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworcHVibGljIGludGVyZmFjZSBUb3JyZW50SGFzaCB7CisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGhhc2ggb2YgdGhlIEItZW5jb2RlZCBtZXRhLWluZm8gc3RydWN0dXJlIG9mIGEgdG9ycmVudC4KKyAgICovCisgIGJ5dGVbXSBnZXRJbmZvSGFzaCgpOworCisgIC8qKgorICAgKiBHZXQgdG9ycmVudCdzIGluZm8gaGFzaCAoYXMgYW4gaGV4YWRlY2ltYWwtY29kZWQgc3RyaW5nKS4KKyAgICovCisgIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50SW5mby5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzVmYzEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRJbmZvLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKKy8qKgorICogQGF1dGhvciBTZXJnZXkuUGFrCisgKiBEYXRlOiA4LzkvMTMKKyAqIFRpbWU6IDY6MDAgUE0KKyAqLworcHVibGljIGludGVyZmFjZSBUb3JyZW50SW5mbyBleHRlbmRzIFRvcnJlbnRIYXNoIHsKKworICAvKgorICAqIE51bWJlciBvZiBieXRlcyB1cGxvYWRlZCBieSB0aGUgY2xpZW50IGZvciB0aGlzIHRvcnJlbnQKKyAgKiAqLworICBsb25nIGdldFVwbG9hZGVkKCk7CisKKyAgLyoKKyAgKiBOdW1iZXIgb2YgYnl0ZXMgZG93bmxvYWRlZCBieSB0aGUgY2xpZW50IGZvciB0aGlzIHRvcnJlbnQKKyAgKiAqLworICBsb25nIGdldERvd25sb2FkZWQoKTsKKworICAvKgorICAqIE51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGRvd25sb2FkIGJ5IHRoZSBjbGllbnQgZm9yIHRoaXMgdG9ycmVudAorICAqICovCisgIGxvbmcgZ2V0TGVmdCgpOworCisgIGludCBnZXRQaWVjZUNvdW50KCk7CisKKyAgbG9uZyBnZXRQaWVjZVNpemUoaW50IHBpZWNlSWR4KTsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudExvZ2dlckZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudExvZ2dlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVhNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50TG9nZ2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGZpbmFsIGNsYXNzIFRvcnJlbnRMb2dnZXJGYWN0b3J5IHsKKworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU3RyaW5nIHN0YXRpY0xvZ2dlcnNOYW1lID0gbnVsbDsKKworICBwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICBTdHJpbmcgbmFtZSA9IHN0YXRpY0xvZ2dlcnNOYW1lOworICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7CisgICAgfQorICAgIHJldHVybiBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihuYW1lKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNMb2dnZXJzTmFtZShATnVsbGFibGUgU3RyaW5nIHN0YXRpY0xvZ2dlcnNOYW1lKSB7CisgICAgVG9ycmVudExvZ2dlckZhY3Rvcnkuc3RhdGljTG9nZ2Vyc05hbWUgPSBzdGF0aWNMb2dnZXJzTmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50TWV0YWRhdGEuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNmQxZQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSw3NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFByb3ZpZGVkIGFjY2VzcyB0byBhbGwgc3RvcmVkIGluZm8gaW4gLnRvcnJlbnQgZmlsZQorICoKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly93aWtpLnRoZW9yeS5vcmcvaW5kZXgucGhwL0JpdFRvcnJlbnRTcGVjaWZpY2F0aW9uI01ldGFpbmZvX0ZpbGVfU3RydWN0dXJlIj48L2E+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudE1ldGFkYXRhIGV4dGVuZHMgVG9ycmVudEhhc2ggeworCisgIC8qKgorICAgKiBAcmV0dXJuIGFsbCB0cmFja2VyIGZvciBhbm5vdW5jZQorICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDEyLmh0bWwiPjwvYT4KKyAgICovCisgIEBOdWxsYWJsZQorICBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0QW5ub3VuY2VMaXN0KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gbWFpbiBhbm5vdW5jZSB1cmwgZm9yIHRyYWNrZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbWFpbiBhbm5vdW5jZSBpcyBub3Qgc3BlY2lmaWVkCisgICAqLworICBATnVsbGFibGUKKyAgU3RyaW5nIGdldEFubm91bmNlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY3JlYXRpb24gZGF0ZSBvZiB0aGUgdG9ycmVudCBpbiB1bml4IGZvcm1hdAorICAgKi8KKyAgT3B0aW9uYWw8TG9uZz4gZ2V0Q3JlYXRpb25EYXRlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gZnJlZS1mb3JtIHRleHQgY29tbWVudCBvZiB0aGUgYXV0aG9yCisgICAqLworICBPcHRpb25hbDxTdHJpbmc+IGdldENvbW1lbnQoKTsKKworICAvKioKKyAgICogQHJldHVybiBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIHVzZWQgdG8gY3JlYXRlIC50b3JyZW50CisgICAqLworICBPcHRpb25hbDxTdHJpbmc+IGdldENyZWF0ZWRCeSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBpbiBlYWNoIHBpZWNlCisgICAqLworICBpbnQgZ2V0UGllY2VMZW5ndGgoKTsKKworICAvKioKKyAgICogQHJldHVybiBjb25jYXRlbmF0aW9uIG9mIGFsbCAyMC1ieXRlIFNIQTEgaGFzaCB2YWx1ZXMsIG9uZSBwZXIgcGllY2UuCisgICAqIFNvIHRoZSBsZW5ndGggb2YgdGhpcyBhcnJheSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMjAKKyAgICovCisgIGJ5dGVbXSBnZXRQaWVjZXNIYXNoZXMoKTsKKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgcHJpdmF0ZSB0b3JyZW50LiBJbiB0aGlzIGNhc2UgY2xpZW50IG11c3QgZ2V0IHBlZXJzIG9ubHkgZnJvbSB0cmFja2VyIGFuZAorICAgKiBtdXN0IGluaXRpYXRlIGNvbm5lY3Rpb25zIHRvIHBlZXJzIHJldHVybmVkIGZyb20gdGhlIHRyYWNrZXIuCisgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2JpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMjcuaHRtbCI+PC9hPgorICAgKi8KKyAgYm9vbGVhbiBpc1ByaXZhdGUoKTsKKworICAvKioKKyAgICogQHJldHVybiBjb3VudCBvZiBwaWVjZXMgaW4gdG9ycmVudAorICAgKi8KKyAgaW50IGdldFBpZWNlc0NvdW50KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc3RvcmUgYWxsIHRoZSBmaWxlcworICAgKi8KKyAgU3RyaW5nIGdldERpcmVjdG9yeU5hbWUoKTsKKworICAvKioKKyAgICogQHJldHVybiBsaXN0IG9mIGZpbGVzLCBzdG9yZWQgaW4gdGhpcyB0b3JyZW50CisgICAqLworICBMaXN0PFRvcnJlbnRGaWxlPiBnZXRGaWxlcygpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YUltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODMxZDAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRNZXRhZGF0YUltcGwuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVG9ycmVudE1ldGFkYXRhSW1wbCBpbXBsZW1lbnRzIFRvcnJlbnRNZXRhZGF0YSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbXlJbmZvSGFzaDsKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgZmluYWwgTGlzdDxMaXN0PFN0cmluZz4+IG15QW5ub3VuY2VMaXN0OworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteU1haW5Bbm5vdW5jZTsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIG15Q3JlYXRpb25EYXRlOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteUNvbW1lbnQ7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15Q3JlYXRlZEJ5OworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteU5hbWU7CisgIHByaXZhdGUgZmluYWwgTGlzdDxUb3JyZW50RmlsZT4gbXlGaWxlczsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlQaWVjZUNvdW50OworICBwcml2YXRlIGZpbmFsIGludCBteVBpZWNlTGVuZ3RoOworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBteVBpZWNlc0hhc2hlczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlIZXhTdHJpbmc7CisKKyAgVG9ycmVudE1ldGFkYXRhSW1wbChieXRlW10gaW5mb0hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIExpc3Q8TGlzdDxTdHJpbmc+PiBhbm5vdW5jZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1haW5Bbm5vdW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBsb25nIGNyZWF0aW9uRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlYXRlZEJ5LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VG9ycmVudEZpbGU+IGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwaWVjZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGludCBwaWVjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGllY2VzSGFzaGVzKSB7CisgICAgbXlJbmZvSGFzaCA9IGluZm9IYXNoOworICAgIG15QW5ub3VuY2VMaXN0ID0gYW5ub3VuY2VMaXN0OworICAgIG15TWFpbkFubm91bmNlID0gbWFpbkFubm91bmNlOworICAgIG15Q3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOworICAgIG15Q29tbWVudCA9IGNvbW1lbnQ7CisgICAgbXlDcmVhdGVkQnkgPSBjcmVhdGVkQnk7CisgICAgbXlOYW1lID0gbmFtZTsKKyAgICBteUZpbGVzID0gZmlsZXM7CisgICAgbXlQaWVjZUNvdW50ID0gcGllY2VDb3VudDsKKyAgICBteVBpZWNlTGVuZ3RoID0gcGllY2VMZW5ndGg7CisgICAgbXlQaWVjZXNIYXNoZXMgPSBwaWVjZXNIYXNoZXM7CisgICAgbXlIZXhTdHJpbmcgPSBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobXlJbmZvSGFzaCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlOYW1lKCkgeworICAgIHJldHVybiBteU5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8VG9ycmVudEZpbGU+IGdldEZpbGVzKCkgeworICAgIHJldHVybiBteUZpbGVzOworICB9CisKKyAgQE51bGxhYmxlCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IGdldEFubm91bmNlTGlzdCgpIHsKKyAgICByZXR1cm4gbXlBbm5vdW5jZUxpc3Q7CisgIH0KKworICBATnVsbGFibGUKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3VuY2UoKSB7CisgICAgcmV0dXJuIG15TWFpbkFubm91bmNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcHRpb25hbDxMb25nPiBnZXRDcmVhdGlvbkRhdGUoKSB7CisgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG15Q3JlYXRpb25EYXRlID09IC0xID8gbnVsbCA6IG15Q3JlYXRpb25EYXRlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRDb21tZW50KCkgeworICAgIHJldHVybiBPcHRpb25hbC5vZihteUNvbW1lbnQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcHRpb25hbDxTdHJpbmc+IGdldENyZWF0ZWRCeSgpIHsKKyAgICByZXR1cm4gT3B0aW9uYWwub2YobXlDcmVhdGVkQnkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UGllY2VMZW5ndGgoKSB7CisgICAgcmV0dXJuIG15UGllY2VMZW5ndGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRQaWVjZXNIYXNoZXMoKSB7CisgICAgcmV0dXJuIG15UGllY2VzSGFzaGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZSgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRQaWVjZXNDb3VudCgpIHsKKyAgICByZXR1cm4gbXlQaWVjZUNvdW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIG15SW5mb0hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gbXlIZXhTdHJpbmc7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhS2V5cy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50TWV0YWRhdGFLZXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0YTMzZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudE1ldGFkYXRhS2V5cy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uOworCitAU3VwcHJlc3NXYXJuaW5ncygiV2Vha2VyQWNjZXNzIikKK3B1YmxpYyBmaW5hbCBjbGFzcyBUb3JyZW50TWV0YWRhdGFLZXlzIHsKKworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNRDVfU1VNID0gIm1kNXN1bSI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfTEVOR1RIID0gImxlbmd0aCI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVTID0gImZpbGVzIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9QQVRIID0gInBhdGgiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1BBVEhfVVRGOCA9ICJwYXRoLnV0Zi04IjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09NTUVOVCA9ICJjb21tZW50IjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1JFQVRFRF9CWSA9ICJjcmVhdGVkIGJ5IjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1VOQ0UgPSAiYW5ub3VuY2UiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQSUVDRV9MRU5HVEggPSAicGllY2UgbGVuZ3RoIjsKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUElFQ0VTID0gInBpZWNlcyI7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENSRUFUSU9OX0RBVEVfU0VDID0gImNyZWF0aW9uIGRhdGUiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUklWQVRFID0gInByaXZhdGUiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FID0gIm5hbWUiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPX1RBQkxFID0gImluZm8iOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVU5DRV9MSVNUID0gImFubm91bmNlLWxpc3QiOworICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfTElTVCA9ICJ1cmwtbGlzdCI7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFBhcnNlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlYTUxOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkRlY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5JbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGFLZXlzLio7CisKK3B1YmxpYyBjbGFzcyBUb3JyZW50UGFyc2VyIHsKKworICBwdWJsaWMgVG9ycmVudE1ldGFkYXRhIHBhcnNlRnJvbUZpbGUoRmlsZSB0b3JyZW50RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gZmlsZUNvbnRlbnQgPSBGaWxlVXRpbHMucmVhZEZpbGVUb0J5dGVBcnJheSh0b3JyZW50RmlsZSk7CisgICAgcmV0dXJuIHBhcnNlKGZpbGVDb250ZW50KTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gbWV0YWRhdGEgYmluYXJ5IC50b3JyZW50IGNvbnRlbnQKKyAgICogQHJldHVybiBwYXJzZWQgbWV0YWRhdGEgb2JqZWN0LiBUaGlzIHBhcnNlciBhbHNvIHdyYXBzIHNpbmdsZSB0b3JyZW50IGFzIG11bHRpIHRvcnJlbnQgd2l0aCBvbmUgZmlsZQorICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gaWYgbWV0YWRhdGEgaGFzIGluY29ycmVjdCBCRVAgZm9ybWF0IG9yIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzCisgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiAgICAgICAgICBJdCdzIHdyYXBwZWQgaW8gZXhjZXB0aW9uIGZyb20gYmVwIGRlY29kZXIuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGV4Y2VwdGlvbiBkb2Vzbid0IG11c3QgdG8gdGhyb3cgaW8gZXhjZXB0aW9uIGJlY2F1c2UgcmVhZGluZyBmcm9tCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGFycmF5IGlucHV0IHN0cmVhbSBjYW5ub3QgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBwYXJzZShieXRlW10gbWV0YWRhdGEpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uLCBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBCRVZhbHVlPiBkaWN0aW9uYXJ5TWV0YWRhdGE7CisgICAgdHJ5IHsKKyAgICAgIGRpY3Rpb25hcnlNZXRhZGF0YSA9IEJEZWNvZGVyLmJkZWNvZGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1ldGFkYXRhKSkuZ2V0TWFwKCk7CisgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIGZpbmFsIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm9UYWJsZSA9IGdldFJlcXVpcmVkVmFsdWVPclRocm93RXhjZXB0aW9uKGRpY3Rpb25hcnlNZXRhZGF0YSwgSU5GT19UQUJMRSkuZ2V0TWFwKCk7CisKKyAgICBmaW5hbCBCRVZhbHVlIGNyZWF0aW9uRGF0ZVZhbHVlID0gZGljdGlvbmFyeU1ldGFkYXRhLmdldChDUkVBVElPTl9EQVRFX1NFQyk7CisgICAgZmluYWwgbG9uZyBjcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGVWYWx1ZSA9PSBudWxsID8gLTEgOiBjcmVhdGlvbkRhdGVWYWx1ZS5nZXRMb25nKCk7CisKKyAgICBmaW5hbCBTdHJpbmcgY29tbWVudCA9IGdldFN0cmluZ09yTnVsbChkaWN0aW9uYXJ5TWV0YWRhdGEsIENPTU1FTlQpOworICAgIGZpbmFsIFN0cmluZyBjcmVhdGVkQnkgPSBnZXRTdHJpbmdPck51bGwoZGljdGlvbmFyeU1ldGFkYXRhLCBDUkVBVEVEX0JZKTsKKyAgICBmaW5hbCBTdHJpbmcgYW5ub3VuY2VVcmwgPSBnZXRTdHJpbmdPck51bGwoZGljdGlvbmFyeU1ldGFkYXRhLCBBTk5PVU5DRSk7CisgICAgZmluYWwgTGlzdDxMaXN0PFN0cmluZz4+IHRyYWNrZXJzID0gZ2V0VHJhY2tlcnMoZGljdGlvbmFyeU1ldGFkYXRhKTsKKyAgICBmaW5hbCBpbnQgcGllY2VMZW5ndGggPSBnZXRSZXF1aXJlZFZhbHVlT3JUaHJvd0V4Y2VwdGlvbihpbmZvVGFibGUsIFBJRUNFX0xFTkdUSCkuZ2V0SW50KCk7CisgICAgZmluYWwgYnl0ZVtdIHBpZWNlc0hhc2hlcyA9IGdldFJlcXVpcmVkVmFsdWVPclRocm93RXhjZXB0aW9uKGluZm9UYWJsZSwgUElFQ0VTKS5nZXRCeXRlcygpOworCisgICAgZmluYWwgYm9vbGVhbiB0b3JyZW50Q29udGFpbnNNYW55RmlsZXMgPSBpbmZvVGFibGUuZ2V0KEZJTEVTKSAhPSBudWxsOworCisgICAgZmluYWwgU3RyaW5nIGRpck5hbWUgPSBnZXRSZXF1aXJlZFZhbHVlT3JUaHJvd0V4Y2VwdGlvbihpbmZvVGFibGUsIE5BTUUpLmdldFN0cmluZygpOworCisgICAgZmluYWwgTGlzdDxUb3JyZW50RmlsZT4gZmlsZXMgPSBwYXJzZUZpbGVzKGluZm9UYWJsZSwgdG9ycmVudENvbnRhaW5zTWFueUZpbGVzLCBkaXJOYW1lKTsKKworICAgIGlmIChwaWVjZXNIYXNoZXMubGVuZ3RoICUgQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRSAhPSAwKQorICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkluY29ycmVjdCBzaXplIG9mIHBpZWNlcyBoYXNoZXMiKTsKKworICAgIGZpbmFsIGludCBwaWVjZXNDb3VudCA9IHBpZWNlc0hhc2hlcy5sZW5ndGggLyBDb25zdGFudHMuUElFQ0VfSEFTSF9TSVpFOworCisgICAgYnl0ZVtdIGluZm9UYWJsZUJ5dGVzOworICAgIHRyeSB7CisgICAgICBpbmZvVGFibGVCeXRlcyA9IEJFbmNvZGVyLmJlbmNvZGUoaW5mb1RhYmxlKS5hcnJheSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVG9ycmVudE1ldGFkYXRhSW1wbCgKKyAgICAgICAgICAgIFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChpbmZvVGFibGVCeXRlcyksCisgICAgICAgICAgICB0cmFja2VycywKKyAgICAgICAgICAgIGFubm91bmNlVXJsLAorICAgICAgICAgICAgY3JlYXRpb25EYXRlLAorICAgICAgICAgICAgY29tbWVudCwKKyAgICAgICAgICAgIGNyZWF0ZWRCeSwKKyAgICAgICAgICAgIGRpck5hbWUsCisgICAgICAgICAgICBmaWxlcywKKyAgICAgICAgICAgIHBpZWNlc0NvdW50LAorICAgICAgICAgICAgcGllY2VMZW5ndGgsCisgICAgICAgICAgICBwaWVjZXNIYXNoZXMKKyAgICApOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFRvcnJlbnRGaWxlPiBwYXJzZUZpbGVzKE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm9UYWJsZSwgYm9vbGVhbiB0b3JyZW50Q29udGFpbnNNYW55RmlsZXMsIFN0cmluZyBuYW1lKSB0aHJvd3MgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgaWYgKCF0b3JyZW50Q29udGFpbnNNYW55RmlsZXMpIHsKKyAgICAgIGZpbmFsIEJFVmFsdWUgbWQ1U3VtID0gaW5mb1RhYmxlLmdldChNRDVfU1VNKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBUb3JyZW50RmlsZSgKKyAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuYW1lKSwKKyAgICAgICAgICAgICAgZ2V0UmVxdWlyZWRWYWx1ZU9yVGhyb3dFeGNlcHRpb24oaW5mb1RhYmxlLCBGSUxFX0xFTkdUSCkuZ2V0TG9uZygpLAorICAgICAgICAgICAgICBtZDVTdW0gPT0gbnVsbCA/IG51bGwgOiBtZDVTdW0uZ2V0U3RyaW5nKCkKKyAgICAgICkpOworICAgIH0KKworICAgIExpc3Q8VG9ycmVudEZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VG9ycmVudEZpbGU+KCk7CisgICAgZm9yIChCRVZhbHVlIGZpbGUgOiBpbmZvVGFibGUuZ2V0KEZJTEVTKS5nZXRMaXN0KCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGZpbGVJbmZvID0gZmlsZS5nZXRNYXAoKTsKKyAgICAgIExpc3Q8U3RyaW5nPiBwYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICBCRVZhbHVlIGZpbGVQYXRoTGlzdCA9IGZpbGVJbmZvLmdldChGSUxFX1BBVEhfVVRGOCk7CisgICAgICBpZiAoZmlsZVBhdGhMaXN0ID09IG51bGwpIHsKKyAgICAgICAgZmlsZVBhdGhMaXN0ID0gZmlsZUluZm8uZ2V0KEZJTEVfUEFUSCk7CisgICAgICB9CisgICAgICBmb3IgKEJFVmFsdWUgcGF0aEVsZW1lbnQgOiBmaWxlUGF0aExpc3QuZ2V0TGlzdCgpKSB7CisgICAgICAgIHBhdGguYWRkKHBhdGhFbGVtZW50LmdldFN0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEJFVmFsdWUgbWQ1U3VtID0gaW5mb1RhYmxlLmdldChNRDVfU1VNKTsKKyAgICAgIHJlc3VsdC5hZGQobmV3IFRvcnJlbnRGaWxlKAorICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICBmaWxlSW5mby5nZXQoRklMRV9MRU5HVEgpLmdldExvbmcoKSwKKyAgICAgICAgICAgICAgbWQ1U3VtID09IG51bGwgPyBudWxsIDogbWQ1U3VtLmdldFN0cmluZygpKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nT3JOdWxsKE1hcDxTdHJpbmcsIEJFVmFsdWU+IGRpY3Rpb25hcnlNZXRhZGF0YSwgU3RyaW5nIGtleSkgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIGZpbmFsIEJFVmFsdWUgdmFsdWUgPSBkaWN0aW9uYXJ5TWV0YWRhdGEuZ2V0KGtleSk7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBudWxsOworICAgIHJldHVybiB2YWx1ZS5nZXRTdHJpbmcoKTsKKyAgfQorCisgIEBOdWxsYWJsZQorICBwcml2YXRlIExpc3Q8TGlzdDxTdHJpbmc+PiBnZXRUcmFja2VycyhNYXA8U3RyaW5nLCBCRVZhbHVlPiBkaWN0aW9uYXJ5TWV0YWRhdGEpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBCRVZhbHVlIGFubm91bmNlTGlzdFZhbHVlID0gZGljdGlvbmFyeU1ldGFkYXRhLmdldChBTk5PVU5DRV9MSVNUKTsKKyAgICBpZiAoYW5ub3VuY2VMaXN0VmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgTGlzdDxCRVZhbHVlPiBhbm5vdW5jZUxpc3QgPSBhbm5vdW5jZUxpc3RWYWx1ZS5nZXRMaXN0KCk7CisgICAgTGlzdDxMaXN0PFN0cmluZz4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOworICAgIFNldDxTdHJpbmc+IGFsbFRyYWNrZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGZvciAoQkVWYWx1ZSB0diA6IGFubm91bmNlTGlzdCkgeworICAgICAgTGlzdDxCRVZhbHVlPiB0cmFja2VycyA9IHR2LmdldExpc3QoKTsKKyAgICAgIGlmICh0cmFja2Vycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIExpc3Q8U3RyaW5nPiB0aWVyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICBmb3IgKEJFVmFsdWUgdHJhY2tlciA6IHRyYWNrZXJzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB0cmFja2VyLmdldFN0cmluZygpOworICAgICAgICBpZiAoIWFsbFRyYWNrZXJzLmNvbnRhaW5zKHVybCkpIHsKKyAgICAgICAgICB0aWVyLmFkZCh1cmwpOworICAgICAgICAgIGFsbFRyYWNrZXJzLmFkZCh1cmwpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghdGllci5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFkZCh0aWVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEBOb3ROdWxsCisgIHByaXZhdGUgQkVWYWx1ZSBnZXRSZXF1aXJlZFZhbHVlT3JUaHJvd0V4Y2VwdGlvbihNYXA8U3RyaW5nLCBCRVZhbHVlPiBtYXAsIFN0cmluZyBrZXkpIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBCRVZhbHVlIHZhbHVlID0gbWFwLmdldChrZXkpOworICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgdGhyb3cgbmV3IEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24oIkludmFsaWQgbWV0YWRhdGEgZm9ybWF0LiBNYXAgZG9lc24ndCBjb250YWluIHJlcXVpcmVkIGZpZWxkICIgKyBrZXkpOworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U2VyaWFsaXplci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTI4N2EKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGFLZXlzLio7CisKK3B1YmxpYyBjbGFzcyBUb3JyZW50U2VyaWFsaXplciB7CisKKyAgcHVibGljIGJ5dGVbXSBzZXJpYWxpemUoVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1hcE1ldGFkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm9UYWJsZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKworICAgIFN0cmluZyBhbm5vdW5jZSA9IG1ldGFkYXRhLmdldEFubm91bmNlKCk7CisgICAgaWYgKGFubm91bmNlICE9IG51bGwpIG1hcE1ldGFkYXRhLnB1dChBTk5PVU5DRSwgbmV3IEJFVmFsdWUoYW5ub3VuY2UpKTsKKworICAgIHB1dE9wdGlvbmFsSWZQcmVzZW50KG1hcE1ldGFkYXRhLCBDT01NRU5ULCBtZXRhZGF0YS5nZXRDb21tZW50KCkpOworICAgIHB1dE9wdGlvbmFsSWZQcmVzZW50KG1hcE1ldGFkYXRhLCBDUkVBVEVEX0JZLCBtZXRhZGF0YS5nZXRDcmVhdGVkQnkoKSk7CisKKyAgICBpZiAobWV0YWRhdGEuZ2V0Q3JlYXRpb25EYXRlKCkuaXNQcmVzZW50KCkpCisgICAgICBtYXBNZXRhZGF0YS5wdXQoQ1JFQVRJT05fREFURV9TRUMsIG5ldyBCRVZhbHVlKG1ldGFkYXRhLmdldENyZWF0aW9uRGF0ZSgpLmdldCgpKSk7CisKKyAgICBMaXN0PEJFVmFsdWU+IGFubm91bmNlTGlzdCA9IGdldEFubm91bmNlTGlzdEFzQkVWYWx1ZXMobWV0YWRhdGEuZ2V0QW5ub3VuY2VMaXN0KCkpOworICAgIGlmIChhbm5vdW5jZUxpc3QgIT0gbnVsbCkgeworICAgICAgbWFwTWV0YWRhdGEucHV0KEFOTk9VTkNFX0xJU1QsIG5ldyBCRVZhbHVlKGFubm91bmNlTGlzdCkpOworICAgIH0KKyAgICBpbmZvVGFibGUucHV0KFBJRUNFX0xFTkdUSCwgbmV3IEJFVmFsdWUobWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKSkpOworICAgIGluZm9UYWJsZS5wdXQoUElFQ0VTLCBuZXcgQkVWYWx1ZShtZXRhZGF0YS5nZXRQaWVjZXNIYXNoZXMoKSkpOworICAgIGlmIChtZXRhZGF0YS5pc1ByaXZhdGUoKSkgeworICAgICAgaW5mb1RhYmxlLnB1dChQUklWQVRFLCBuZXcgQkVWYWx1ZSgxKSk7CisgICAgfQorCisgICAgaW5mb1RhYmxlLnB1dChOQU1FLCBuZXcgQkVWYWx1ZShtZXRhZGF0YS5nZXREaXJlY3RvcnlOYW1lKCkpKTsKKyAgICBpZiAobWV0YWRhdGEuZ2V0RmlsZXMoKS5zaXplKCkgPT0gMSkgeworICAgICAgZmluYWwgVG9ycmVudEZpbGUgdG9ycmVudEZpbGUgPSBtZXRhZGF0YS5nZXRGaWxlcygpLmdldCgwKTsKKyAgICAgIGluZm9UYWJsZS5wdXQoRklMRV9MRU5HVEgsIG5ldyBCRVZhbHVlKHRvcnJlbnRGaWxlLnNpemUpKTsKKyAgICAgIHB1dE9wdGlvbmFsSWZQcmVzZW50KGluZm9UYWJsZSwgTUQ1X1NVTSwgdG9ycmVudEZpbGUubWQ1SGFzaCk7CisgICAgfSBlbHNlIHsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEJFVmFsdWU+KCk7CisgICAgICBmb3IgKFRvcnJlbnRGaWxlIHRvcnJlbnRGaWxlIDogbWV0YWRhdGEuZ2V0RmlsZXMoKSkgeworICAgICAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBlbnRyeSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICAgICAgZW50cnkucHV0KEZJTEVfTEVOR1RILCBuZXcgQkVWYWx1ZSh0b3JyZW50RmlsZS5zaXplKSk7CisgICAgICAgIHB1dE9wdGlvbmFsSWZQcmVzZW50KGVudHJ5LCBNRDVfU1VNLCB0b3JyZW50RmlsZS5tZDVIYXNoKTsKKyAgICAgICAgZW50cnkucHV0KEZJTEVfUEFUSCwgbmV3IEJFVmFsdWUobWFwU3RyaW5nTGlzdFRvQkVWYWx1ZUxpc3QodG9ycmVudEZpbGUucmVsYXRpdmVQYXRoKSkpOworICAgICAgICBmaWxlcy5hZGQobmV3IEJFVmFsdWUoZW50cnkpKTsKKyAgICAgIH0KKyAgICAgIGluZm9UYWJsZS5wdXQoRklMRVMsIG5ldyBCRVZhbHVlKGZpbGVzKSk7CisgICAgfQorCisgICAgbWFwTWV0YWRhdGEucHV0KElORk9fVEFCTEUsIG5ldyBCRVZhbHVlKGluZm9UYWJsZSkpOworCisgICAgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCRW5jb2Rlci5iZW5jb2RlKG1hcE1ldGFkYXRhKTsKKyAgICByZXR1cm4gYnVmZmVyLmFycmF5KCk7CisgIH0KKworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBMaXN0PEJFVmFsdWU+IGdldEFubm91bmNlTGlzdEFzQkVWYWx1ZXMoQE51bGxhYmxlIExpc3Q8TGlzdDxTdHJpbmc+PiBhbm5vdW5jZUxpc3QpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBpZiAoYW5ub3VuY2VMaXN0ID09IG51bGwpIHJldHVybiBudWxsOworICAgIExpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworCisgICAgZm9yIChMaXN0PFN0cmluZz4gYW5ub3VuY2VUaWVyIDogYW5ub3VuY2VMaXN0KSB7CisgICAgICBMaXN0PEJFVmFsdWU+IHRpZXIgPSBtYXBTdHJpbmdMaXN0VG9CRVZhbHVlTGlzdChhbm5vdW5jZVRpZXIpOworICAgICAgaWYgKCF0aWVyLmlzRW1wdHkoKSkgcmVzdWx0LmFkZChuZXcgQkVWYWx1ZSh0aWVyKSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHJldHVybiBudWxsOworCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxCRVZhbHVlPiBtYXBTdHJpbmdMaXN0VG9CRVZhbHVlTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIExpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgIGZvciAoU3RyaW5nIHMgOiBsaXN0KSB7CisgICAgICByZXN1bHQuYWRkKG5ldyBCRVZhbHVlKHMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwdXRPcHRpb25hbElmUHJlc2VudChNYXA8U3RyaW5nLCBCRVZhbHVlPiBtYXAsIFN0cmluZyBrZXksIE9wdGlvbmFsPFN0cmluZz4gb3B0aW9uYWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBpZiAoIW9wdGlvbmFsLmlzUHJlc2VudCgpKSByZXR1cm47CisgICAgbWFwLnB1dChrZXksIG5ldyBCRVZhbHVlKG9wdGlvbmFsLmdldCgpKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U3RhdGlzdGljLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRTdGF0aXN0aWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY1NDkzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50U3RhdGlzdGljLmphdmEKQEAgLTAsMCArMSw3MiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworLyoqCisgKiBDbGFzcyBzdG9yZSBzdGF0aXN0aWMgZm9yIGRvd25sb2FkZWQsIHVwbG9hZGVkIGFuZCBsZWZ0IGJ5dGVzIGNvdW50LgorICovCitwdWJsaWMgY2xhc3MgVG9ycmVudFN0YXRpc3RpYyB7CisKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG15VXBsb2FkZWRCeXRlczsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG15RG93bmxvYWRlZEJ5dGVzOworICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbXlMZWZ0Qnl0ZXM7CisKKyAgcHVibGljIFRvcnJlbnRTdGF0aXN0aWMoKSB7CisgICAgbXlEb3dubG9hZGVkQnl0ZXMgPSBuZXcgQXRvbWljTG9uZygpOworICAgIG15VXBsb2FkZWRCeXRlcyA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgbXlMZWZ0Qnl0ZXMgPSBuZXcgQXRvbWljTG9uZygpOworICB9CisKKyAgcHVibGljIFRvcnJlbnRTdGF0aXN0aWMoVG9ycmVudFN0YXRpc3RpYyB0b3JyZW50U3RhdGlzdGljKXsKKyAgICBteURvd25sb2FkZWRCeXRlcyA9IG5ldyBBdG9taWNMb25nKHRvcnJlbnRTdGF0aXN0aWMuZ2V0RG93bmxvYWRlZEJ5dGVzKCkpOworICAgIG15VXBsb2FkZWRCeXRlcyA9IG5ldyBBdG9taWNMb25nKHRvcnJlbnRTdGF0aXN0aWMuZ2V0VXBsb2FkZWRCeXRlcygpKTsKKyAgICBteUxlZnRCeXRlcyA9IG5ldyBBdG9taWNMb25nKHRvcnJlbnRTdGF0aXN0aWMuZ2V0TGVmdEJ5dGVzKCkpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0VXBsb2FkZWRCeXRlcygpIHsKKyAgICByZXR1cm4gbXlVcGxvYWRlZEJ5dGVzLmdldCgpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0RG93bmxvYWRlZEJ5dGVzKCkgeworICAgIHJldHVybiBteURvd25sb2FkZWRCeXRlcy5nZXQoKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldExlZnRCeXRlcygpIHsKKyAgICByZXR1cm4gbXlMZWZ0Qnl0ZXMuZ2V0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRVcGxvYWRlZChsb25nIGRlbHRhKSB7CisgICAgbXlVcGxvYWRlZEJ5dGVzLmFkZEFuZEdldChkZWx0YSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGREb3dubG9hZGVkKGxvbmcgZGVsdGEpIHsKKyAgICBteURvd25sb2FkZWRCeXRlcy5hZGRBbmRHZXQoZGVsdGEpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkTGVmdChsb25nIGRlbHRhKSB7CisgICAgbXlMZWZ0Qnl0ZXMuYWRkQW5kR2V0KGRlbHRhKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldExlZnQobG9uZyB2YWx1ZSkgeworICAgIG15TGVmdEJ5dGVzLnNldCh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVcGxvYWRlZChsb25nIHZhbHVlKSB7CisgICAgbXlVcGxvYWRlZEJ5dGVzLnNldCh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZGVkKGxvbmcgdmFsdWUpIHsKKyAgICBteURvd25sb2FkZWRCeXRlcy5zZXQodmFsdWUpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0UGVyY2VudGFnZURvd25sb2FkZWQoKXsKKyAgICBsb25nIGRvd25sb2FkZWRCeXRlcyA9IGdldERvd25sb2FkZWRCeXRlcygpOworICAgIGxvbmcgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMoKTsKKyAgICByZXR1cm4gKGRvd25sb2FkZWRCeXRlcyAqIDEwMCkgLyB0b3RhbEJ5dGVzOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpeworICAgIHJldHVybiBnZXREb3dubG9hZGVkQnl0ZXMoKSArIGdldExlZnRCeXRlcygpOworICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRVdGlscy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQ2ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50VXRpbHMuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5kaWdlc3QuRGlnZXN0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgZmluYWwgY2xhc3MgVG9ycmVudFV0aWxzIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyW10gSEVYX1NZTUJPTFMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiIudG9DaGFyQXJyYXkoKTsKKworICAvKioKKyAgICogQHBhcmFtIGRhdGEgZm9yIGhhc2hpbmcKKyAgICogQHJldHVybiBzaGEgMSBoYXNoIG9mIHNwZWNpZmllZCBkYXRhCisgICAqLworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjYWxjdWxhdGVTaGExSGFzaChieXRlW10gZGF0YSkgeworICAgIHJldHVybiBEaWdlc3RVdGlscy5zaGExKGRhdGEpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnQgYSBieXRlIHN0cmluZyB0byBhIHN0cmluZyBjb250YWluaW5nIGFuIGhleGFkZWNpbWFsCisgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gYnl0ZXMgVGhlIGJ5dGUgYXJyYXkgdG8gY29udmVydC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ5dGVBcnJheVRvSGV4U3RyaW5nKGJ5dGVbXSBieXRlcykgeworICAgIGNoYXJbXSBoZXhDaGFycyA9IG5ldyBjaGFyW2J5dGVzLmxlbmd0aCAqIDJdOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgIGludCB2ID0gYnl0ZXNbal0gJiAweEZGOworICAgICAgaGV4Q2hhcnNbaiAqIDJdID0gSEVYX1NZTUJPTFNbdiA+Pj4gNF07CisgICAgICBoZXhDaGFyc1tqICogMiArIDFdID0gSEVYX1NZTUJPTFNbdiAmIDB4MEZdOworICAgIH0KKyAgICByZXR1cm4gbmV3IFN0cmluZyhoZXhDaGFycyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFja2VyTGVzc0luZm8oQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gaW5mb3JtYXRpb24pIHsKKyAgICByZXR1cm4gaW5mb3JtYXRpb24uZ2V0QW5ub3VuY2UoKSA9PSBudWxsICYmIGluZm9ybWF0aW9uLmdldEFubm91bmNlTGlzdCgpID09IG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRUb3JyZW50RmlsZU5hbWVzKFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIGZvciAoVG9ycmVudEZpbGUgdG9ycmVudEZpbGUgOiBtZXRhZGF0YS5nZXRGaWxlcygpKSB7CisgICAgICByZXN1bHQuYWRkKHRvcnJlbnRGaWxlLmdldFJlbGF0aXZlUGF0aEFzU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9Db21tb25IYXNoaW5nQ2FsY3VsYXRvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9Db21tb25IYXNoaW5nQ2FsY3VsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmNkMTcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0NvbW1vbkhhc2hpbmdDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBDb21tb25IYXNoaW5nQ2FsY3VsYXRvciB7CisKKyAgc3RhdGljIGZpbmFsIENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yIElOU1RBTkNFID0gbmV3IENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yKCk7CisKKyAgTGlzdDxMb25nPiBwcm9jZXNzRGF0YVNvdXJjZXMoTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzb3IgcHJvY2Vzc29yKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8TG9uZz4gc291cmNlc1NpemVzID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtwaWVjZVNpemVdOworICAgIGludCByZWFkID0gMDsKKyAgICBmb3IgKERhdGFTb3VyY2VIb2xkZXIgc291cmNlIDogc291cmNlcykgeworICAgICAgbG9uZyBzdHJlYW1TaXplID0gMDsKKyAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHNvdXJjZS5nZXRTdHJlYW0oKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgaW50IHJlYWRGcm9tU3RyZWFtID0gc3RyZWFtLnJlYWQoYnVmZmVyLCByZWFkLCBidWZmZXIubGVuZ3RoIC0gcmVhZCk7CisgICAgICAgICAgaWYgKHJlYWRGcm9tU3RyZWFtIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN0cmVhbVNpemUgKz0gcmVhZEZyb21TdHJlYW07CisgICAgICAgICAgcmVhZCArPSByZWFkRnJvbVN0cmVhbTsKKyAgICAgICAgICBpZiAocmVhZCA9PSBidWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhidWZmZXIpOworICAgICAgICAgICAgcmVhZCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBzb3VyY2UuY2xvc2UoKTsKKyAgICAgICAgc291cmNlc1NpemVzLmFkZChzdHJlYW1TaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlYWQgPiAwKSB7CisgICAgICBwcm9jZXNzb3IucHJvY2VzcyhBcnJheXMuY29weU9mKGJ1ZmZlciwgcmVhZCkpOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2VzU2l6ZXM7CisgIH0KKworICBpbnRlcmZhY2UgUHJvY2Vzc29yIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBuZXh0IHBpZWNlIGlzIHJlY2VpdmVkIGZyb20gZGF0YSBzb3VyY2UuIEFycmF5IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgKiBhZnRlciBpbnZvY2F0aW9uIHRoaXMgbWV0aG9kIChuZXh0IHBpZWNlIHdpbGwgYmUgcmVhZCBpbiBzYW1lIGFycmF5KS4gU28gbXVsdGktdGhyZWFkaW5nCisgICAgICogaW1wbGVtZW50YXRpb25zIG11c3QgY3JlYXRlIGNvcHkgb2YgYXJyYXkgYW5kIHdvcmsgd2l0aCB0aGUgY29weS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyBieXRlcyBmcm9tIGRhdGEgc291cmNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIGxlbmd0aCBvZiBhcnJheSBlcXVhbHMgcGllY2Ugc2l6ZSBleGNsdWRpbmcgbGFzdCBwaWVjZQorICAgICAqLworICAgIHZvaWQgcHJvY2VzcyhieXRlW10gYnVmZmVyKTsKKworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0RhdGFTb3VyY2VIb2xkZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vRGF0YVNvdXJjZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjEyZDgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0RhdGFTb3VyY2VIb2xkZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworcHVibGljIGludGVyZmFjZSBEYXRhU291cmNlSG9sZGVyIGV4dGVuZHMgQ2xvc2VhYmxlIHsKKworICAvKioKKyAgICogcHJvdmlkZXMge0BsaW5rIElucHV0U3RyZWFtfSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRlci4gSG9sZGVyIGNhbiBqdXN0IHN0b3JlIHJlZmVyZW5jZSB0byBzdHJlYW0gb3IgY3JlYXRlCisgICAqIG5ldyBzdHJlYW0gZnJvbSBzb21lIHNvdXJjZSAoZS5nLiB7QGxpbmsgamF2YS5pby5GaWxlSW5wdXRTdHJlYW19IGZyb20ge0BsaW5rIGphdmEuaW8uRmlsZX0pIG9uIGZpcnN0IGludm9jYXRpb24uCisgICAqCisgICAqIEByZXR1cm4ge0BsaW5rIElucHV0U3RyZWFtfSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRlci4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBpbyBlcnJvciBvY2N1cnMgaW4gY3JlYXRpbmcgbmV3IHN0cmVhbSBmcm9tIHNvdXJjZS4KKyAgICogICAgICAgICAgICAgICAgICAgICBJTyBleGNlcHRpb24gY2FuIGJlIHRocm93biBvbmx5IG9uIGZpcnN0IGludm9jYXRpb24KKyAgICovCisgIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9IYXNoaW5nUmVzdWx0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0hhc2hpbmdSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdlM2IyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9IYXNoaW5nUmVzdWx0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEhhc2hpbmdSZXN1bHQgeworCisgIHByaXZhdGUgZmluYWwgTGlzdDxieXRlW10+IGhhc2hlczsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PExvbmc+IHNvdXJjZVNpemVzOworCisgIHB1YmxpYyBIYXNoaW5nUmVzdWx0KExpc3Q8Ynl0ZVtdPiBoYXNoZXMsIExpc3Q8TG9uZz4gc291cmNlU2l6ZXMpIHsKKyAgICB0aGlzLmhhc2hlcyA9IGhhc2hlczsKKyAgICB0aGlzLnNvdXJjZVNpemVzID0gc291cmNlU2l6ZXM7CisgIH0KKworICBwdWJsaWMgTGlzdDxieXRlW10+IGdldEhhc2hlcygpIHsKKyAgICByZXR1cm4gaGFzaGVzOworICB9CisKKyAgcHVibGljIExpc3Q8TG9uZz4gZ2V0U291cmNlU2l6ZXMoKSB7CisgICAgcmV0dXJuIHNvdXJjZVNpemVzOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL01ldGFkYXRhQnVpbGRlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NZXRhZGF0YUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQwN2RhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NZXRhZGF0YUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFbmNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50UGFyc2VyOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YUtleXMuKjsKKworQFN1cHByZXNzV2FybmluZ3MoeyJ1bnVzZWQiLCAiV2Vha2VyQWNjZXNzIn0pCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFCdWlsZGVyIHsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1ldGFkYXRhQnVpbGRlci5jbGFzcyk7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0NSRUFURURfQlkgPSAidHRvcnJlbnQgbGlicmFyeSI7CisKKyAgLy9yb290IGRpY3Rpb25hcnkKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBTdHJpbmcgYW5ub3VuY2UgPSAiIjsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7CisgIHByaXZhdGUgbG9uZyBjcmVhdGlvbkRhdGUgPSAtMTsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9ICIiOworICBATm90TnVsbAorICBwcml2YXRlIFN0cmluZyBjcmVhdGVkQnkgPSBERUZBVUxUX0NSRUFURURfQlk7CisgIEBOb3ROdWxsCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHdlYlNlZWRVcmxMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgIC8vZW5kIHJvb3QgZGljdGlvbmFyeQorCisgIC8vaW5mbyBkaWN0aW9uYXJ5CisgIHByaXZhdGUgaW50IHBpZWNlTGVuZ3RoID0gNTEyICogMTAyNDsvLzUxMmtiIGJ5IGRlZmF1bHQKKyAgcHJpdmF0ZSBib29sZWFuIGlzUHJpdmF0ZSA9IGZhbHNlOworICBATm90TnVsbAorICBwcml2YXRlIExpc3Q8U3RyaW5nPiBmaWxlc1BhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgIEBOdWxsYWJsZQorICBwcml2YXRlIEhhc2hpbmdSZXN1bHQgaGFzaGluZ1Jlc3VsdCA9IG51bGw7CisgIEBOb3ROdWxsCisgIHByaXZhdGUgTGlzdDxEYXRhU291cmNlSG9sZGVyPiBkYXRhU291cmNlcyA9IG5ldyBBcnJheUxpc3Q8RGF0YVNvdXJjZUhvbGRlcj4oKTsKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5TmFtZSA9ICIiOworICAvL2VuZCBpbmZvIGRpY3Rpb25hcnkKKworICAvL2ZpZWxkcyB3aGljaCBzdG9yZSBzb21lIGludGVybmFsIGluZm9ybWF0aW9uCisgIEBOb3ROdWxsCisgIHByaXZhdGUgUGllY2VzSGFzaGVzQ2FsY3VsYXRvciBwaWVjZXNIYXNoZXNDYWxjdWxhdG9yID0gbmV3IFNpbmdsZVRocmVhZEhhc2hlc0NhbGN1bGF0b3IoKTsKKyAgLy9lbmQKKworICAvKioKKyAgICogc2V0IG1haW4gYW5ub3VuY2UgdHJhY2tlciBVUkwgaWYgeW91IHVzZSBzaW5nbGUgdHJhY2tlci4KKyAgICogSW4gY2FzZSB3aXRoIG1hbnkgdHJhY2tlcnMgdXNlIHtAbGluayAjYWRkVHJhY2tlcihTdHJpbmcpfQorICAgKiBhbmQge0BsaW5rICNuZXdUaWVyKCl9LiBUaGVuIGFzIG1haW4gYW5ub3VuY2Ugd2lsbCBiZSBzZWxlY3RlZCBmaXJzdCB0cmFja2VyLgorICAgKiBZb3UgY2FuIHNwZWNpZnkgbWFpbiBhbm5vdW5jZSB1c2luZyB0aGlzIG1ldGhvZCBmb3Igb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIKKyAgICogVG9ycmVudCBjbGllbnRzIHdoaWNoIHN1cHBvcnQgQkVQMTIgZXh0ZW5zaW9uIHdpbGwgaWdub3JlIG1haW4gYW5ub3VuY2UuCisgICAqCisgICAqIEBwYXJhbSBhbm5vdW5jZSBhbm5vdW5jZSBVUkwgZm9yIHRoZSB0cmFja2VyCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIHNldFRyYWNrZXIoU3RyaW5nIGFubm91bmNlKSB7CisgICAgdGhpcy5hbm5vdW5jZSA9IGFubm91bmNlOworICAgIHJldHVybiB0aGlzOworICB9CisKKworICAvKioKKyAgICogTXVsdGktdHJhY2tlciBNZXRhZGF0YSBFeHRlbnNpb24uIEFkZCBuZXcgdHJhY2tlciBVUkwgdG8gY3VycmVudCB0aWVyLgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBmaXJzdCB0aWVyIGF1dG9tYXRpY2FsbHkgaWYgaXQgZG9lc24ndCBleGlzdAorICAgKiBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4dGVuc2lvbiBpbiBkb2N1bWVudGF0aW9uCisgICAqIDxhIGhyZWY9Imh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDEyLmh0bWwiPmh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDEyLmh0bWw8L2E+CisgICAqCisgICAqIEBwYXJhbSB1cmwgdHJhY2tlciB1cmwKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgYWRkVHJhY2tlcihTdHJpbmcgdXJsKSB7CisgICAgaW5pdEZpcnN0VGllcigpOworICAgIGFubm91bmNlTGlzdC5nZXQoYW5ub3VuY2VMaXN0LnNpemUoKSAtIDEpLmFkZCh1cmwpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIE11bHRpLXRyYWNrZXIgTWV0YWRhdGEgRXh0ZW5zaW9uLiBBZGQgYWxsIHRyYWNrZXJzIHRvIGN1cnJlbnQgdGllci4KKyAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgZmlyc3QgdGllciBhdXRvbWF0aWNhbGx5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICogWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBleHRlbnNpb24gaW4gZG9jdW1lbnRhdGlvbgorICAgKiA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sIj5odHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxMi5odG1sPC9hPgorICAgKgorICAgKiBAcGFyYW0gdHJhY2tlcnMgY29sbGVjdGlvbnMgb2YgdHJhY2tlcnMgVVJMcworICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBhZGRUcmFja2VycyhDb2xsZWN0aW9uPFN0cmluZz4gdHJhY2tlcnMpIHsKKyAgICBpbml0Rmlyc3RUaWVyKCk7CisgICAgYW5ub3VuY2VMaXN0LmdldChhbm5vdW5jZUxpc3Quc2l6ZSgpIC0gMSkuYWRkQWxsKHRyYWNrZXJzKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBNdWx0aS10cmFja2VyIE1ldGFkYXRhIEV4dGVuc2lvbi4gQ3JlYXRlIG5ldyB0aWVyIGZvciBhZGRpbmcgdHJhY2tlciB1c2luZyB7QGxpbmsgI2FkZFRyYWNrZXIoU3RyaW5nKX0gbWV0aG9kCisgICAqIElmIHlvdSBkb24ndCBhZGQgYXQgbGVhc3Qgb25lIHRyYWNrZXIgb24gdGhlIHRpZXIgdGhpcyB0aWVyIHdpbGwgYmUgcmVtb3ZlZCBpbiBidWlsZGluZyBtZXRhZGF0YQorICAgKiBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4dGVuc2lvbiBpbiBkb2N1bWVudGF0aW9uCisgICAqIDxhIGhyZWY9Imh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDEyLmh0bWwiPmh0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDEyLmh0bWw8L2E+CisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIG5ld1RpZXIoKSB7CisgICAgYW5ub3VuY2VMaXN0LmFkZChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogV2ViIFNlZWRpbmcgTWV0YWRhdGEuCisgICAqIFdlYiBzZWVkaW5nIHVybCBhcyBkZWZpbmVkIGJ5IDxhIGhyZWY9J2h0dHA6Ly9iaXR0b3JyZW50Lm9yZy9iZXBzL2JlcF8wMDE5Lmh0bWwnPmJlcCAwMDE5PC9hPgorICAgKiBAcGFyYW0gdXJsIFVSTCB0byBhZGQgZm9yIHdlYiBzZWVkaW5nCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIGFkZFdlYlNlZWRVcmwoU3RyaW5nIHVybCkgIHsKKyAgICB3ZWJTZWVkVXJsTGlzdC5hZGQodXJsKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHRvcnJlbnQgaW4gc3RhbmRhcmQgVU5JWCBlcG9jaCBmb3JtYXQuCisgICAqCisgICAqIEBwYXJhbSBjcmVhdGlvblRpbWUgdGhlIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBVVEMuCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIHNldENyZWF0aW9uVGltZShpbnQgY3JlYXRpb25UaW1lKSB7CisgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvblRpbWU7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogU2V0IGZyZWUtZm9ybSB0ZXh0dWFsIGNvbW1lbnQgb2YgdGhlIGF1dGhvcgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgcHJvZ3JhbSBuYW1lIHdoaWNoIGlzIHVzZWQgZm9yIGNyZWF0aW5nIHRvcnJlbnQgZmlsZS4KKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0Q3JlYXRlZEJ5KFN0cmluZyBjcmVhdGVkQnkpIHsKKyAgICB0aGlzLmNyZWF0ZWRCeSA9IGNyZWF0ZWRCeTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBTZXQge0BsaW5rIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3J9IGluc3RhbmNlIGZvciBjYWxjdWxhdGluZyBoYXNoZXMuIEluIHJhcmUgY2FzZXMgdXNlcidzCisgICAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBpbmNyZWFzaW5nIGhhc2hpbmcgcGVyZm9ybWFuY2UKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0UGllY2VzSGFzaGVzQ2FsY3VsYXRvcihATm90TnVsbCBQaWVjZXNIYXNoZXNDYWxjdWxhdG9yIHBpZWNlc0hhc2hlc0NhbGN1bGF0b3IpIHsKKyAgICB0aGlzLnBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgPSBwaWVjZXNIYXNoZXNDYWxjdWxhdG9yOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFNldCBsZW5ndGggaW50IGJ5dGVzIG9mIG9uZSBwaWVjZS4gQnkgZGVmYXVsdCBpcyB1c2VkIDUxMktCLgorICAgKiBMYXJnZXIgcGllY2Ugc2l6ZSByZWR1Y2VzIHNpemUgb2YgLnRvcnJlbnQgZmlsZSBidXQgY2F1c2UgaW5lZmZpY2llbmN5CisgICAqICh0b3JyZW50LWNsaWVudCBuZWVkIHRvIGRvd25sb2FkIGZ1bGwgcGllY2UgZnJvbSBwZWVyIGZvciB2YWxpZGF0aW5nKQorICAgKiBhbmQgdG9vLXNtYWxsIHBpZWNlIHNpemVzIGNhdXNlIGxhcmdlIC50b3JyZW50IG1ldGFkYXRhIGZpbGUuCisgICAqIFJlY29tbWVuZGVkIHNpemUgaXMgYmV0d2VlbiAyNTZLQiBhbmQgMU1CLgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBzZXRQaWVjZUxlbmd0aChpbnQgcGllY2VMZW5ndGgpIHsKKyAgICB0aGlzLnBpZWNlTGVuZ3RoID0gcGllY2VMZW5ndGg7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc3RvcmUgYWxsIHRoZSBmaWxlcy4KKyAgICogSWYge0BsaW5rICNkaXJlY3RvcnlOYW1lfSBpc24ndCBlbXB0eSB0aGVuIG11bHRpLWZpbGUgdG9ycmVudCB3aWxsIGJlIGNyZWF0ZWQsIG90aGVyd2lzZSBzaW5nbGUtZmlsZQorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBzZXREaXJlY3RvcnlOYW1lKEBOb3ROdWxsIFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7CisgICAgdGhpcy5kaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5TmFtZTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBhZGQgY3VzdG9tIHNvdXJjZSBpbiB0b3JyZW50IHdpdGggY3VzdG9tIHBhdGguIFBhdGggY2FuIGJlIHNlcGFyYXRlZCB3aXRoIGFueSBzbGFzaC4KKyAgICoKKyAgICogQHBhcmFtIGNsb3NlQWZ0ZXJCdWlsZCBpZiB0cnVlIHRoZW4gc291cmNlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBhZnRlciB7QGxpbmsgI2J1aWxkKCl9IGludm9jYXRpb24KKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgYWRkRGF0YVNvdXJjZShATm90TnVsbCBJbnB1dFN0cmVhbSBkYXRhU291cmNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiBjbG9zZUFmdGVyQnVpbGQpIHsKKyAgICBjaGVja0hhc2hpbmdSZXN1bHRJc05vdFNldCgpOworICAgIGZpbGVzUGF0aHMuYWRkKHBhdGgpOworICAgIGRhdGFTb3VyY2VzLmFkZChuZXcgU3RyZWFtQmFzZWRIb2xkZXJJbXBsKGRhdGFTb3VyY2UsIGNsb3NlQWZ0ZXJCdWlsZCkpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIGFkZCBjdXN0b20gc291cmNlIGluIHRvcnJlbnQgd2l0aCBjdXN0b20gcGF0aC4gUGF0aCBjYW4gYmUgc2VwYXJhdGVkIHdpdGggYW55IHNsYXNoLgorICAgKi8KKyAgcHVibGljIE1ldGFkYXRhQnVpbGRlciBhZGREYXRhU291cmNlKEBOb3ROdWxsIElucHV0U3RyZWFtIGRhdGFTb3VyY2UsIFN0cmluZyBwYXRoKSB7CisgICAgYWRkRGF0YVNvdXJjZShkYXRhU291cmNlLCBwYXRoLCB0cnVlKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBhZGQgc3BlY2lmaWVkIGZpbGUgaW4gdG9ycmVudCB3aXRoIGN1c3RvbSBwYXRoLiBUaGUgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiAudG9ycmVudAorICAgKiBieSBzcGVjaWZpZWQgcGF0aC4gUGF0aCBjYW4gYmUgc2VwYXJhdGVkIHdpdGggYW55IHNsYXNoLiBJbiBjYXNlIG9mIHNpbmdsZS1maWxlIHRvcnJlbnQKKyAgICogdGhpcyBwYXRoIHdpbGwgYmUgdXNlZCBhcyBuYW1lIG9mIHNvdXJjZSBmaWxlCisgICAqLworICBwdWJsaWMgTWV0YWRhdGFCdWlsZGVyIGFkZEZpbGUoQE5vdE51bGwgRmlsZSBzb3VyY2UsIEBOb3ROdWxsIFN0cmluZyBwYXRoKSB7CisgICAgaWYgKCFzb3VyY2UuaXNGaWxlKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc291cmNlICsgIiBpcyBub3QgZXhpc3QiKTsKKyAgICB9CisgICAgY2hlY2tIYXNoaW5nUmVzdWx0SXNOb3RTZXQoKTsKKyAgICBmaWxlc1BhdGhzLmFkZChwYXRoKTsKKyAgICBkYXRhU291cmNlcy5hZGQobmV3IEZpbGVTb3VyY2VIb2xkZXIoc291cmNlKSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tIYXNoaW5nUmVzdWx0SXNOb3RTZXQoKSB7CisgICAgaWYgKGhhc2hpbmdSZXN1bHQgIT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFkZCBuZXcgc291cmNlIHdoZW4gaGFzaGVzIGFyZSBzZXQgbWFudWFsbHkiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogYWRkIHNwZWNpZmllZCBmaWxlIGluIHRvcnJlbnQuIEluIGNhc2Ugb2YgbXVsdGktdG9ycmVudCB0aGlzIGZpbGUgd2lsbCBiZSBkb3dubG9hZGVkIHRvCisgICAqIHtAbGluayAjZGlyZWN0b3J5TmFtZX0uIEluIHNpbmdsZS1maWxlIHRvcnJlbnQgdGhpcyBmaWxlIHdpbGwgYmUgZG93bmxvYWRlZCBpbiBkb3dubG9hZCBmb2xkZXIKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgYWRkRmlsZShATm90TnVsbCBGaWxlIHNvdXJjZSkgeworICAgIHJldHVybiBhZGRGaWxlKHNvdXJjZSwgc291cmNlLmdldE5hbWUoKSk7CisgIH0KKworICAvKioKKyAgICogYWxsb3cgdG8gY3JlYXRlIGluZm9ybWF0aW9uIGFib3V0IGZpbGVzIHZpYSBzcGVpY2lmaWVkIGhhc2hlcywgZmlsZXMgcGF0aHMgYW5kIGZpbGVzIGxlbmd0aHMuCisgICAqIFVzaW5nIG9mIHRoaXMgbWV0aG9kIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdXNpbmcgc291cmNlLWJhc2VkIG1ldGhvZHMKKyAgICogKHtAbGluayAjYWRkRmlsZShGaWxlKX0sIHtAbGluayAjYWRkRGF0YVNvdXJjZShJbnB1dFN0cmVhbSwgU3RyaW5nLCBib29sZWFuKX0sIGV0YworICAgKiBiZWNhdXNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSBjb25jYXQgdGhpcyBoYXNoZXMgYW5kIGNhbGN1bGF0ZWQgaGFzaGVzLgorICAgKiBlYWNoIGJ5dGUgYXJyYXkgaW4gaGFzaGVzIGxpc3Qgc2hvdWxkIGhhdmUge3tAbGluayBDb25zdGFudHMjUElFQ0VfSEFTSF9TSVpFfX0gbGVuZ3RoCisgICAqCisgICAqIEBwYXJhbSBoYXNoZXMgICAgICAgbGlzdCBvZiBmaWxlcyBoYXNoZXMgaW4gc2FtZSBvcmRlciBhcyBmaWxlcyBpbiBmaWxlcyBwYXRocyBsaXN0CisgICAqIEBwYXJhbSBmaWxlc1BhdGhzICAgbGlzdCBvZiBmaWxlcyBwYXRocworICAgKiBAcGFyYW0gZmlsZXNMZW5ndGhzIGxpc3Qgb2YgZmlsZXMgbGVuZ3RocyBpbiBzYW1lIG9yZGVyIGFzIGZpbGVzIGluIGZpbGVzIHBhdGhzIGxpc3QKKyAgICovCisgIHB1YmxpYyBNZXRhZGF0YUJ1aWxkZXIgc2V0RmlsZXNJbmZvKEBOb3ROdWxsIExpc3Q8Ynl0ZVtdPiBoYXNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb3ROdWxsIExpc3Q8U3RyaW5nPiBmaWxlc1BhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm90TnVsbCBMaXN0PExvbmc+IGZpbGVzTGVuZ3RocykgeworICAgIGlmIChkYXRhU291cmNlcy5zaXplKCkgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFkZCBoYXNoZXMtYmFzZWQgZmlsZXMgaW5mby4gU29tZSBkYXRhIHNvdXJjZXMgYWxyZWFkeSBhZGRlZCIpOworICAgIH0KKyAgICB0aGlzLmZpbGVzUGF0aHMuY2xlYXIoKTsKKyAgICB0aGlzLmZpbGVzUGF0aHMuYWRkQWxsKGZpbGVzUGF0aHMpOworICAgIHRoaXMuaGFzaGluZ1Jlc3VsdCA9IG5ldyBIYXNoaW5nUmVzdWx0KGhhc2hlcywgZmlsZXNMZW5ndGhzKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBtYXJrcyB0b3JyZW50IGFzIHByaXZhdGUKKyAgICoKKyAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAyNy5odG1sIj5odHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAyNy5odG1sPC9hPgorICAgKi8KKyAgcHVibGljIHZvaWQgZG9Qcml2YXRlKCkgeworICAgIGlzUHJpdmF0ZSA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogbWFya3MgdG9ycmVudCBhcyBwdWJsaWMKKyAgICoKKyAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAyNy5odG1sIj5odHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAyNy5odG1sPC9hPgorICAgKi8KKyAgcHVibGljIHZvaWQgZG9QdWJsaWMoKSB7CisgICAgaXNQcml2YXRlID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBuZXcge0BsaW5rIFRvcnJlbnRNZXRhZGF0YX0gaW5zdGFuY2Ugd2l0aCBidWlsZGVyJ3MgZmllbGRzCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgIGlmIElPIGVycm9yIG9jY3VycyBvbiByZWFkaW5nIGZyb20gc291cmNlIHN0cmVhbXMgYW5kIGZpbGVzCisgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGJ1aWxkZXIncyBzdGF0ZSBpcyBpbmNvcnJlY3QgKGUuZy4gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMpCisgICAqLworICBwdWJsaWMgVG9ycmVudE1ldGFkYXRhIGJ1aWxkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZShidWlsZEJpbmFyeSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBtZXRhZGF0YQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICBpZiBJTyBlcnJvciBvY2N1cnMgb24gcmVhZGluZyBmcm9tIHNvdXJjZSBzdHJlYW1zIGFuZCBmaWxlcworICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBidWlsZGVyJ3Mgc3RhdGUgaXMgaW5jb3JyZWN0IChlLmcuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKQorICAgKi8KKyAgcHVibGljIGJ5dGVbXSBidWlsZEJpbmFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBCRW5jb2Rlci5iZW5jb2RlKGJ1aWxkQkVQKCksIG91dCk7CisgICAgcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOworICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gQkVQLWVuY29kZWQgZGljdGlvbmFyeSBvZiBtZXRhZGF0YQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICBpZiBJTyBlcnJvciBvY2N1cnMgb24gcmVhZGluZyBmcm9tIHNvdXJjZSBzdHJlYW1zIGFuZCBmaWxlcworICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBidWlsZGVyJ3Mgc3RhdGUgaXMgaW5jb3JyZWN0IChlLmcuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzKQorICAgKi8KKyAgcHVibGljIEJFVmFsdWUgYnVpbGRCRVAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBidWlsZEFuZENsb3NlUmVzb3VyY2VzKCk7CisgIH0KKworICBwcml2YXRlIEJFVmFsdWUgYnVpbGRBbmRDbG9zZVJlc291cmNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBkb0J1aWxkKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNsb3NlQWxsU291cmNlcygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgQkVWYWx1ZSBkb0J1aWxkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBkcm9wRW1wdHlUaWVyc0Zyb21Bbm5vdW5jZSgpOworCisgICAgaWYgKGFubm91bmNlLmlzRW1wdHkoKSAmJiAhYW5ub3VuY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICBhbm5vdW5jZSA9IGFubm91bmNlTGlzdC5nZXQoMCkuZ2V0KDApOworICAgIH0KKyAgICBpZiAoZmlsZXNQYXRocy5zaXplKCkgPT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBtZXRhZGF0YSB3aXRob3V0IHNvdXJjZXMuIFVzZSBhZGRTb3VyY2UoKSBtZXRob2QgZm9yIGFkZGluZyBzb3VyY2VzIik7CisgICAgfQorICAgIGZpbmFsIGJvb2xlYW4gaXNTaW5nbGVNb2RlID0gZmlsZXNQYXRocy5zaXplKCkgPT0gMSAmJiBkaXJlY3RvcnlOYW1lLmlzRW1wdHkoKTsKKyAgICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBpZiAoIWRpcmVjdG9yeU5hbWUuaXNFbXB0eSgpKSB7CisgICAgICBuYW1lID0gZGlyZWN0b3J5TmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzU2luZ2xlTW9kZSkgeworICAgICAgICBuYW1lID0gZmlsZXNQYXRocy5nZXQoMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIHJlcXVpcmVkIGZpZWxkICduYW1lJy4gVXNlIHNldERpcmVjdG9yeU5hbWUoKSBtZXRob2QgZm9yIHNwZWNpZnlpbmcgbmFtZSBvZiB0b3JyZW50Iik7CisgICAgICB9CisgICAgfQorCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gdG9ycmVudCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBpZiAoIWFubm91bmNlLmlzRW1wdHkoKSkgdG9ycmVudC5wdXQoQU5OT1VOQ0UsIG5ldyBCRVZhbHVlKGFubm91bmNlKSk7CisgICAgaWYgKCFhbm5vdW5jZUxpc3QuaXNFbXB0eSgpKSB0b3JyZW50LnB1dChBTk5PVU5DRV9MSVNULCB3cmFwQW5ub3VuY2VMaXN0KCkpOworICAgIGlmIChjcmVhdGlvbkRhdGUgPiAwKSB7CisgICAgICB0b3JyZW50LnB1dChDUkVBVElPTl9EQVRFX1NFQywgbmV3IEJFVmFsdWUoY3JlYXRpb25EYXRlKSk7CisgICAgfQorCisgICAgaWYgKCFjb21tZW50LmlzRW1wdHkoKSkgdG9ycmVudC5wdXQoQ09NTUVOVCwgbmV3IEJFVmFsdWUoY29tbWVudCkpOworICAgIGlmICghY3JlYXRlZEJ5LmlzRW1wdHkoKSkgdG9ycmVudC5wdXQoQ1JFQVRFRF9CWSwgbmV3IEJFVmFsdWUoY3JlYXRlZEJ5KSk7CisgICAgaWYgKCF3ZWJTZWVkVXJsTGlzdC5pc0VtcHR5KCkpIHRvcnJlbnQucHV0KFVSTF9MSVNULCB3cmFwU3RyaW5nTGlzdCh3ZWJTZWVkVXJsTGlzdCkpOworCisgICAgSGFzaGluZ1Jlc3VsdCBoYXNoaW5nUmVzdWx0ID0gdGhpcy5oYXNoaW5nUmVzdWx0ID09IG51bGwgPworICAgICAgICAgICAgcGllY2VzSGFzaGVzQ2FsY3VsYXRvci5jYWxjdWxhdGVIYXNoZXMoZGF0YVNvdXJjZXMsIHBpZWNlTGVuZ3RoKSA6CisgICAgICAgICAgICB0aGlzLmhhc2hpbmdSZXN1bHQ7CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBpbmZvID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIGluZm8ucHV0KFBJRUNFX0xFTkdUSCwgbmV3IEJFVmFsdWUocGllY2VMZW5ndGgpKTsKKyAgICBpbmZvLnB1dChQSUVDRVMsIGNvbmNhdEhhc2hlcyhoYXNoaW5nUmVzdWx0LmdldEhhc2hlcygpKSk7CisgICAgaW5mby5wdXQoUFJJVkFURSwgbmV3IEJFVmFsdWUoaXNQcml2YXRlID8gMSA6IDApKTsKKyAgICBpbmZvLnB1dChOQU1FLCBuZXcgQkVWYWx1ZShuYW1lKSk7CisgICAgaWYgKGlzU2luZ2xlTW9kZSkgeworICAgICAgTG9uZyBzb3VyY2VTaXplID0gaGFzaGluZ1Jlc3VsdC5nZXRTb3VyY2VTaXplcygpLmdldCgwKTsKKyAgICAgIGluZm8ucHV0KEZJTEVfTEVOR1RILCBuZXcgQkVWYWx1ZShzb3VyY2VTaXplKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gZmlsZXMgPSBnZXRGaWxlc0xpc3QoaGFzaGluZ1Jlc3VsdCk7CisgICAgICBpbmZvLnB1dChGSUxFUywgbmV3IEJFVmFsdWUoZmlsZXMpKTsKKyAgICB9CisgICAgdG9ycmVudC5wdXQoSU5GT19UQUJMRSwgbmV3IEJFVmFsdWUoaW5mbykpOworCisgICAgcmV0dXJuIG5ldyBCRVZhbHVlKHRvcnJlbnQpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEJFVmFsdWU+IGdldEZpbGVzTGlzdChIYXNoaW5nUmVzdWx0IGhhc2hpbmdSZXN1bHQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBBcnJheUxpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCRVZhbHVlPigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNQYXRocy5zaXplKCk7IGkrKykgeworICAgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gZmlsZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICAgIExvbmcgc291cmNlU2l6ZSA9IGhhc2hpbmdSZXN1bHQuZ2V0U291cmNlU2l6ZXMoKS5nZXQoaSk7CisgICAgICBTdHJpbmcgZnVsbFBhdGggPSBmaWxlc1BhdGhzLmdldChpKTsKKyAgICAgIExpc3Q8QkVWYWx1ZT4gZmlsZVBhdGggPSBuZXcgQXJyYXlMaXN0PEJFVmFsdWU+KCk7CisgICAgICBmb3IgKFN0cmluZyBwYXRoIDogZnVsbFBhdGgucmVwbGFjZSgiXFwiLCAiLyIpLnNwbGl0KCIvIikpIHsKKyAgICAgICAgZmlsZVBhdGguYWRkKG5ldyBCRVZhbHVlKHBhdGgpKTsKKyAgICAgIH0KKyAgICAgIGZpbGUucHV0KEZJTEVfUEFUSCwgbmV3IEJFVmFsdWUoZmlsZVBhdGgpKTsKKyAgICAgIGZpbGUucHV0KEZJTEVfTEVOR1RILCBuZXcgQkVWYWx1ZShzb3VyY2VTaXplKSk7CisgICAgICByZXN1bHQuYWRkKG5ldyBCRVZhbHVlKGZpbGUpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgQkVWYWx1ZSBjb25jYXRIYXNoZXMoTGlzdDxieXRlW10+IGhhc2hlcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoYnl0ZVtdIGhhc2ggOiBoYXNoZXMpIHsKKyAgICAgIHNiLmFwcGVuZChuZXcgU3RyaW5nKGhhc2gsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgQkVWYWx1ZShzYi50b1N0cmluZygpLCBDb25zdGFudHMuQllURV9FTkNPRElORyk7CisgIH0KKworICBwcml2YXRlIEJFVmFsdWUgd3JhcFN0cmluZ0xpc3QoTGlzdDxTdHJpbmc+IGxzdCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIExpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICBmb3IoU3RyaW5nIHMgOiBsc3QpIHsKKyAgICAgIHJlc3VsdC5hZGQobmV3IEJFVmFsdWUocykpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEJFVmFsdWUocmVzdWx0KTsKKyAgfQorCisgIHByaXZhdGUgQkVWYWx1ZSB3cmFwQW5ub3VuY2VMaXN0KCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIExpc3Q8QkVWYWx1ZT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8QkVWYWx1ZT4oKTsKKyAgICBmb3IgKExpc3Q8U3RyaW5nPiB0aWVyIDogYW5ub3VuY2VMaXN0KSB7CisgICAgICByZXN1bHQuYWRkKHdyYXBTdHJpbmdMaXN0KHRpZXIpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBCRVZhbHVlKHJlc3VsdCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZHJvcEVtcHR5VGllcnNGcm9tQW5ub3VuY2UoKSB7CisgICAgSXRlcmF0b3I8TGlzdDxTdHJpbmc+PiBpdGVyYXRvciA9IGFubm91bmNlTGlzdC5pdGVyYXRvcigpOworICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiB0aWVyID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgaWYgKHRpZXIuaXNFbXB0eSgpKSB7CisgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjbG9zZUFsbFNvdXJjZXMoKSB7CisgICAgZm9yIChEYXRhU291cmNlSG9sZGVyIHNvdXJjZUhvbGRlciA6IGRhdGFTb3VyY2VzKSB7CisgICAgICB0cnkgeworICAgICAgICBzb3VyY2VIb2xkZXIuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgIGxvZ2dlci5lcnJvcigiRXJyb3IgaW4gY2xvc2luZyBkYXRhIHNvdXJjZSAiICsgc291cmNlSG9sZGVyLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5pdEZpcnN0VGllcigpIHsKKyAgICBpZiAoYW5ub3VuY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgbmV3VGllcigpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVTb3VyY2VIb2xkZXIgaW1wbGVtZW50cyBEYXRhU291cmNlSG9sZGVyIHsKKyAgICBATnVsbGFibGUKKyAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSBmaXM7CisgICAgQE5vdE51bGwKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgc291cmNlOworCisgICAgcHVibGljIEZpbGVTb3VyY2VIb2xkZXIoQE5vdE51bGwgRmlsZSBzb3VyY2UpIHsKKyAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKGZpcyA9PSBudWxsKSB7CisgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gIkRhdGEgc291cmNlIGZvciBmaWxlIHN0cmVhbSAiICsgZmlzOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbUJhc2VkSG9sZGVySW1wbCBpbXBsZW1lbnRzIERhdGFTb3VyY2VIb2xkZXIgeworICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc291cmNlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjbG9zZUFmdGVyQnVpbGQ7CisKKyAgICBwdWJsaWMgU3RyZWFtQmFzZWRIb2xkZXJJbXBsKElucHV0U3RyZWFtIHNvdXJjZSwgYm9vbGVhbiBjbG9zZUFmdGVyQnVpbGQpIHsKKyAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgdGhpcy5jbG9zZUFmdGVyQnVpbGQgPSBjbG9zZUFmdGVyQnVpbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgIHJldHVybiBzb3VyY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKGNsb3NlQWZ0ZXJCdWlsZCkgeworICAgICAgICBzb3VyY2UuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuICJEYXRhIHNvdXJjZSBmb3IgdXNlcidzIHN0cmVhbSAiICsgc291cmNlOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL011bHRpVGhyZWFkSGFzaGVzQ2FsY3VsYXRvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDZiNGIyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9NdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworcHVibGljIGNsYXNzIE11bHRpVGhyZWFkSGFzaGVzQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgeworCisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworICBwcml2YXRlIGZpbmFsIGludCBtYXhJbk1lbW9yeVBpZWNlczsKKworICBwdWJsaWMgTXVsdGlUaHJlYWRIYXNoZXNDYWxjdWxhdG9yKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciwgaW50IG1heEluTWVtb3J5UGllY2VzKSB7CisgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOworICAgIHRoaXMubWF4SW5NZW1vcnlQaWVjZXMgPSBtYXhJbk1lbW9yeVBpZWNlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSGFzaGluZ1Jlc3VsdCBjYWxjdWxhdGVIYXNoZXMoTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzLCBpbnQgcGllY2VTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIExpc3Q8Ynl0ZVtdPiBoYXNoZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBmaW5hbCBMaXN0PEZ1dHVyZTxieXRlW10+PiBmdXR1cmVzID0gbmV3IEFycmF5TGlzdDxGdXR1cmU8Ynl0ZVtdPj4oKTsKKyAgICBMaXN0PExvbmc+IHNvdXJjZXNTaXplcyA9IENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yLklOU1RBTkNFLnByb2Nlc3NEYXRhU291cmNlcygKKyAgICAgICAgICAgIHNvdXJjZXMsCisgICAgICAgICAgICBwaWVjZVNpemUsCisgICAgICAgICAgICBuZXcgQ29tbW9uSGFzaGluZ0NhbGN1bGF0b3IuUHJvY2Vzc29yKCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhmaW5hbCBieXRlW10gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXdhaXRIYXNoZXNDYWxjdWxhdGlvbkFuZFN0b3JlKGZ1dHVyZXMsIGhhc2hlcywgbWF4SW5NZW1vcnlQaWVjZXMpOworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXJDb3B5ID0gQXJyYXlzLmNvcHlPZihidWZmZXIsIGJ1ZmZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZ1dHVyZXMuYWRkKGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8Ynl0ZVtdPigpIHsKKyAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBjYWxsKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKGJ1ZmZlckNvcHkpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICk7CisgICAgYXdhaXRIYXNoZXNDYWxjdWxhdGlvbkFuZFN0b3JlKGZ1dHVyZXMsIGhhc2hlcywgMCk7CisKKyAgICByZXR1cm4gbmV3IEhhc2hpbmdSZXN1bHQoaGFzaGVzLCBzb3VyY2VzU2l6ZXMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGF3YWl0SGFzaGVzQ2FsY3VsYXRpb25BbmRTdG9yZShMaXN0PEZ1dHVyZTxieXRlW10+PiBmdXR1cmVzLCBMaXN0PGJ5dGVbXT4gaGFzaGVzLCBpbnQgY291bnQpIHsKKyAgICB3aGlsZSAoZnV0dXJlcy5zaXplKCkgPiBjb3VudCkgeworICAgICAgYnl0ZVtdIGhhc2g7CisgICAgICB0cnkgeworICAgICAgICBGdXR1cmU8Ynl0ZVtdPiBmdXR1cmUgPSBmdXR1cmVzLnJlbW92ZSgwKTsKKyAgICAgICAgaGFzaCA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICAgIGhhc2hlcy5hZGQoaGFzaCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1BpZWNlc0hhc2hlc0NhbGN1bGF0b3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vUGllY2VzSGFzaGVzQ2FsY3VsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTczOTYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1BpZWNlc0hhc2hlc0NhbGN1bGF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGllY2VzSGFzaGVzQ2FsY3VsYXRvciB7CisKKyAgLyoqCisgICAqIGNhbGN1bGF0ZXMgc2hhMSBoYXNoZXMgb2YgZWFjaCBjaHVuayB3aXRoIHNwZWNpZmllZCBwaWVjZSBzaXplCisgICAqIGFuZCByZXR1cm5zIGxpc3Qgb2YgaGFzaGVzIGFuZCBzdHJlYW0ncyBzaXplcy4gSWYgb25lIHN0cmVhbSBpcyBlbmRlZCBhbmQgcGllY2Ugc2l6ZSB0aHJlc2hvbGQgaXMgbm90IHJlYWNoZWQKKyAgICogaW1wbGVtZW50YXRpb24gbXVzdCByZWFkIGJ5dGVzIGZyb20gbmV4dCBzdHJlYW0KKyAgICogRm9yIGV4YW1wbGUgaWYgc291cmNlIGxpc3QgaXMgMyBzdHJlYW1zIHdpdGggbmV4dCBieXRlczoKKyAgICogZmlyc3Qgc3RyZWFtOiBbMSwyLDNdCisgICAqIHNlY29uZCBzdHJlYW06IFs0LDUsNiw3XQorICAgKiB0aGlyZCBzdHJlYW06IFs4LDldCisgICAqIGFuZCBwaWVjZVNpemUgPSA0CisgICAqIHJlc3VsdCBtdXN0IGNvbnRhaW4gc291cmNlIHNpemUgWzMsNCwyXSBhbmQgaGFzaGVzOiBbc2hhMSgxLDIsMyw0KSwgc2hhMSg1LDYsNyw4KSwgc2hhMSg5KV0KKyAgICoKKyAgICogQHBhcmFtIHNvdXJjZXMgICBsaXN0IG9mIGlucHV0IHN0cmVhbSdzIHByb3ZpZGVycworICAgKiBAcGFyYW0gcGllY2VTaXplIHNpemUgb2Ygb25lIHBpZWNlCisgICAqIEByZXR1cm4gc2VlIGFib3ZlCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSU8gZXJyb3Igb2NjdXJzIGluIHJlYWRpbmcgZnJvbSBzdHJlYW1zCisgICAqLworICBIYXNoaW5nUmVzdWx0IGNhbGN1bGF0ZUhhc2hlcyhMaXN0PERhdGFTb3VyY2VIb2xkZXI+IHNvdXJjZXMsIGludCBwaWVjZVNpemUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9TaW5nbGVUaHJlYWRIYXNoZXNDYWxjdWxhdG9yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL1NpbmdsZVRocmVhZEhhc2hlc0NhbGN1bGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQ2MzcyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9TaW5nbGVUaHJlYWRIYXNoZXNDYWxjdWxhdG9yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgU2luZ2xlVGhyZWFkSGFzaGVzQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgSGFzaGluZ1Jlc3VsdCBjYWxjdWxhdGVIYXNoZXMoTGlzdDxEYXRhU291cmNlSG9sZGVyPiBzb3VyY2VzLCBpbnQgcGllY2VTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIExpc3Q8Ynl0ZVtdPiBoYXNoZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBMaXN0PExvbmc+IHNvdXJjZXNTaXplcyA9IENvbW1vbkhhc2hpbmdDYWxjdWxhdG9yLklOU1RBTkNFLnByb2Nlc3NEYXRhU291cmNlcygKKyAgICAgICAgICAgIHNvdXJjZXMsCisgICAgICAgICAgICBwaWVjZVNpemUsCisgICAgICAgICAgICBuZXcgQ29tbW9uSGFzaGluZ0NhbGN1bGF0b3IuUHJvY2Vzc29yKCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhieXRlW10gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGhhc2ggPSBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2goYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBoYXNoZXMuYWRkKGhhc2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBuZXcgSGFzaGluZ1Jlc3VsdChoYXNoZXMsIHNvdXJjZXNTaXplcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vU3RyaW5nVXRpbHMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vU3RyaW5nVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU4YzhjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9jcmVhdGlvbi9TdHJpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLmNyZWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMgeworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oU3RyaW5nIGRlbGltaXRlciwgSXRlcmFibGU8PyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gaXRlcmFibGUpIHsKKyAgICBJdGVyYXRvcjw/IGV4dGVuZHMgQ2hhclNlcXVlbmNlPiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgc2IuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgfQorICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOworICAgIH0KKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL0Fubm91bmNlUmVxdWVzdE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE5MTEwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sOworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2VzLgorICog5YWs5ZGK6K+35rGC5raI5oGv55qE5Z+656GA5o6l5Y+j44CCCisgKgorICogPHA+CisgKiBUaGlzIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCBzdWJ0eXBlcyBvZiBhbm5vdW5jZSByZXF1ZXN0CisgKiBtZXNzYWdlcyBmb3IgdGhlIHZhcmlvdXMgdHJhY2tlciBwcm90b2NvbHMuCisgKiA8L3A+CisgKgorICogRm9yIGRldGFpbHMgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9Imh0dHBzOi8vd2lraS50aGVvcnkub3JnL2luZGV4LnBocC9CaXRUb3JyZW50U3BlY2lmaWNhdGlvbiNUcmFja2VyX1JlcXVlc3RfUGFyYW1ldGVycyI+PC9hPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgeworCisgIGludCBERUZBVUxUX05VTV9XQU5UID0gNTA7CisKKyAgLyoqCisgICAqIEFubm91bmNlIHJlcXVlc3QgZXZlbnQgdHlwZXMuCisgICAqCisgICAqIDxwPgorICAgKiBXaGVuIHRoZSBjbGllbnQgc3RhcnRzIGV4Y2hhbmdpbmcgb24gYSB0b3JyZW50LCBpdCBtdXN0IGNvbnRhY3QgdGhlCisgICAqIHRvcnJlbnQncyB0cmFja2VyIHdpdGggYSAnc3RhcnRlZCcgYW5ub3VuY2UgcmVxdWVzdCwgd2hpY2ggbm90aWZpZXMgdGhlCisgICAqIHRyYWNrZXIgdGhpcyBjbGllbnQgbm93IGV4Y2hhbmdlcyBvbiB0aGlzIHRvcnJlbnQgKGFuZCB0aHVzIGFsbG93cyB0aGUKKyAgICogdHJhY2tlciB0byByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHBlZXIgdG8gb3RoZXIgY2xpZW50cykuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIFdoZW4gdGhlIGNsaWVudCBzdG9wcyBleGNoYW5naW5nLCBvciB3aGVuIGl0cyBkb3dubG9hZCBjb21wbGV0ZXMsIGl0IG11c3QKKyAgICogYWxzbyBzZW5kIGEgc3BlY2lmaWMgYW5ub3VuY2UgcmVxdWVzdC4gT3RoZXJ3aXNlLCB0aGUgY2xpZW50IG11c3Qgc2VuZCBhbgorICAgKiBldmVudGxlc3MgKE5PTkUpLCBwZXJpb2RpYyBhbm5vdW5jZSByZXF1ZXN0IHRvIHRoZSB0cmFja2VyIGF0IGFuCisgICAqIGludGVydmFsIHNwZWNpZmllZCBieSB0aGUgdHJhY2tlciBpdHNlbGYsIGFsbG93aW5nIHRoZSB0cmFja2VyIHRvCisgICAqIHJlZnJlc2ggdGhpcyBwZWVyJ3Mgc3RhdHVzIGFuZCBhY2tub3dsZWRnZSB0aGF0IGl0IGlzIHN0aWxsIHRoZXJlLgorICAgKiA8L3A+CisgICAqLworICBlbnVtIFJlcXVlc3RFdmVudCB7CisgICAgTk9ORSgwKSwKKyAgICBDT01QTEVURUQoMSksCisgICAgU1RBUlRFRCgyKSwKKyAgICBTVE9QUEVEKDMpOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7CisKKyAgICBSZXF1ZXN0RXZlbnQoaW50IGlkKSB7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoKSB7CisgICAgICByZXR1cm4gdGhpcy5uYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0RXZlbnQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICBmb3IgKFJlcXVlc3RFdmVudCB0eXBlIDogUmVxdWVzdEV2ZW50LnZhbHVlcygpKSB7CisgICAgICAgIGlmICh0eXBlLm5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdEV2ZW50IGdldEJ5SWQoaW50IGlkKSB7CisgICAgICBmb3IgKFJlcXVlc3RFdmVudCB0eXBlIDogUmVxdWVzdEV2ZW50LnZhbHVlcygpKSB7CisgICAgICAgIGlmICh0eXBlLmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gU0hBMSBoYXNoIG9mIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiaW5mbyIga2V5IGluIC50b3JyZW50IGZpbGUKKyAgICovCisgIGJ5dGVbXSBnZXRJbmZvSGFzaCgpOworCisgIC8qKgorICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0BsaW5rICNnZXRJbmZvSGFzaH0gd2hlcmUgZWFjaCBieXRlIHJlcGxhY2VkIGJ5IGhleC1zdHJpbmcgdmFsdWUgd2l0aCBsZWFkIHplcm8KKyAgICogZm9yIGV4YW1wbGUgZm9yIGJ5dGUgYXJyYXkgWzEsIDIsIDE1LCAtMl0gdGhpcyBtZXRob2QgbXVzdCByZXR1cm4gMDEwMjBGRkUKKyAgICoKKyAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge0BsaW5rICNnZXRJbmZvSGFzaH0KKyAgICovCisgIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHBlZXIgaWQgZ2VuZXJhdGVkIGJ5IGN1cnJlbnQgY2xpZW50CisgICAqLworICBieXRlW10gZ2V0UGVlcklkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHtAbGluayAjZ2V0UGVlcklkfS4gSXQncyBzaW1pbGFybHkge0BsaW5rICNnZXRIZXhJbmZvSGFzaCgpfSBtZXRob2QKKyAgICovCisgIFN0cmluZyBnZXRIZXhQZWVySWQoKTsKKworICAvKioKKyAgICogQHJldHVybiBjdXJyZW50IGNsaWVudCBwb3J0IG9uIHdoaWNoIGl0IGxpc3RlbnMgZm9yIG5ldyBjb25uZWN0aW9ucworICAgKi8KKyAgaW50IGdldFBvcnQoKTsKKworICAvKioKKyAgICogQHJldHVybiBjb3VudCBvZiB1cGxvYWRlZCBieXRlcyBmb3IgY3VycmVudCB0b3JyZW50IGJ5IGN1cnJlbnQgcGVlciBhZnRlciBzZW5kaW5nIFNUQVJURUQgZXZlbnQgdG8gdGhlIHRyYWNrZXIKKyAgICovCisgIGxvbmcgZ2V0VXBsb2FkZWQoKTsKKworICAvKioKKyAgICogQHJldHVybiBjb3VudCBvZiBkb3dubG9hZGVkIGJ5dGVzIGZvciBjdXJyZW50IHRvcnJlbnQgYnkgY3VycmVudCBwZWVyIGFmdGVyIHNlbmRpbmcgU1RBUlRFRCBldmVudCB0byB0aGUgdHJhY2tlcgorICAgKi8KKyAgbG9uZyBnZXREb3dubG9hZGVkKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY291bnQgb2YgYnl0ZXMgd2hpY2ggY2xpZW50IG11c3QgYmUgZG93bmxvYWQKKyAgICovCisgIGxvbmcgZ2V0TGVmdCgpOworCisgIC8qKgorICAgKiBUZWxscyB0aGF0IGl0J3MgY29tcGFjdCByZXF1ZXN0LgorICAgKiBJbiB0aGlzIGNhc2UgdHJhY2tlciByZXR1cm4gY29tcGFjdCBwZWVycyBsaXN0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYWRkcmVzcyBhbmQgcG9ydCB3aXRob3V0IHBlZXIgaWQsCisgICAqIGJ1dCBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiBzb21lIHRyYWNrZXJzIGNhbiBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIKKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgY29tcGFjdCByZXF1ZXN0LgorICAgKi8KKyAgYm9vbGVhbiBpc0NvbXBhY3QoKTsKKworICAvKioKKyAgICogVGVsbHMgdGhhdCB0cmFja2VyIGNhbiBvbWl0IHBlZXIgaWQgZmllbGQgaW4gcmVzcG9uc2UuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYge0BsaW5rICNpc0NvbXBhY3QoKX0gbWV0aG9kCisgICAqIHJldHVybiB0cnVlCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFja2VyIGNhbiBvbWl0IHBlZXIgaWQKKyAgICovCisgIGJvb2xlYW4gY2FuT21pdFBlZXJJZCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGV2ZW50IG9mIGN1cnJlbnQgcmVxdWVzdAorICAgKi8KKyAgUmVxdWVzdEV2ZW50IGdldEV2ZW50KCk7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsLiBJZiBpdCdzIG5vdCBzcGVjaWZpZWQgdGhldCB0cmFja2VyIGdldCBpcCBhZGRyZXNzIGZyb20gcmVxdWVzdAorICAgKgorICAgKiBAcmV0dXJuIGN1cnJlbnQgY2xpZW50IGFkZHJlc3Mgb24gd2hpY2ggaXQgbGlzdGVucyBmb3IgbmV3IGNvbm5lY3Rpb25zCisgICAqLworICBTdHJpbmcgZ2V0SXAoKTsKKworICAvKioKKyAgICogT3B0aW9uYWwuIElmIGl0J3Mgbm90IHNwZWNpZmllZCAodmFsdWUgaXMgemVybyBvciBuZWdhdGl2ZSkgdHJhY2tlciByZXR1cm4gZGVmYXVsdCBwZWVycyBjb3VudC4gQXMgYSBydWxlIHRoaXMgY291bnQgaXMgNTAKKyAgICoKKyAgICogQHJldHVybiBjb3VudCBvZiBwZWVycyB3aGljaCBjbGllbnQgd2FudCB0byBnZXQgZnJvbSB0cmFja2VyCisgICAqLworICBpbnQgZ2V0TnVtV2FudCgpOworCisgIC8qKgorICAgKiBPcHRpb25hbC4gQ29udGFpbnMga2V5IG9mIGN1cnJlbnQgY2xpZW50LiBDbGllbnQgY2FuIHVzZSB0aGlzIGtleSBmb3IgY29uZmlybSBmb3IgdHJhY2tlciB0aGF0IGl0J3Mgb2xkIGNsaWVudAorICAgKiBhZnRlciBjaGFuZ2UgSVAgYWRkcmVzcworICAgKgorICAgKiBAcmV0dXJuIGtleSBvZiBjdXJyZW50IGNsaWVudC4KKyAgICovCisgIFN0cmluZyBnZXRLZXkoKTsKKworICAvKioKKyAgICogT3B0aW9uYWwuIElmIHByZXZpb3VzIHJlc3BvbnNlIGZyb20gdHJhY2tlciBjb250YWlucyB0cmFja2VyIGlkIGZpZWxkLCB0aGVuIGNsaWVudCBtdXN0IHNlbmQgdGhpcyB2YWx1ZSBoZXJlCisgICAqCisgICAqIEByZXR1cm4gcHJldmlvdXMgdHJhY2tlciBpZAorICAgKi8KKyAgU3RyaW5nIGdldFRyYWNrZXJJZCgpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL0Fubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL0Fubm91bmNlUmVzcG9uc2VNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliZjIxMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQmFzZSBpbnRlcmZhY2UgZm9yIGFubm91bmNlIHJlc3BvbnNlIG1lc3NhZ2VzLgorICoKKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3VidHlwZXMgb2YgYW5ub3VuY2UgcmVzcG9uc2UKKyAqIG1lc3NhZ2VzIGZvciB0aGUgdmFyaW91cyB0cmFja2VyIHByb3RvY29scy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGludGVyZmFjZSBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSB7CisKKyAgaW50IGdldEludGVydmFsKCk7CisKKyAgaW50IGdldENvbXBsZXRlKCk7CisKKyAgaW50IGdldEluY29tcGxldGUoKTsKKworICBMaXN0PFBlZXI+IGdldFBlZXJzKCk7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1BlZXJNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1BlZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmYmE2MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvUGVlck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDY5MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2w7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRJbmZvOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworLyoqCisgKiBCaXRUb3JyZW50IHBlZXIgcHJvdG9jb2wgbWVzc2FnZXMgcmVwcmVzZW50YXRpb25zLgorICoKKyAqIDxwPgorICogVGhpcyBjbGFzcyBhbmQgaXRzIDxlbT4qTWVzc2FnZXM8L2VtPiBzdWJjbGFzc2VzIHByb3ZpZGUgUE9KTworICogcmVwcmVzZW50YXRpb25zIG9mIHRoZSBwZWVyIHByb3RvY29sIG1lc3NhZ2VzLCBhbG9uZyB3aXRoIGVhc3kgcGFyc2luZyBmcm9tCisgKiBhbiBpbnB1dCBCeXRlQnVmZmVyIHRvIHF1aWNrbHkgZ2V0IGEgdXNhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGluY29taW5nCisgKiBtZXNzYWdlLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICogQHNlZSA8YSBocmVmPSJodHRwOi8vd2lraS50aGVvcnkub3JnL0JpdFRvcnJlbnRTcGVjaWZpY2F0aW9uI1BlZXJfd2lyZV9wcm90b2NvbF8uMjhUQ1AuMjkiPkJpdFRvcnJlbnQgcGVlciB3aXJlIHByb3RvY29sPC9hPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVlck1lc3NhZ2UgeworCisgIC8qKgorICAgKiBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBsZW5ndGggZmllbGQgaW4gYSBtZXNzYWdlIChvbmUgMzItYml0CisgICAqIGludGVnZXIpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSA9IDQ7CisKKyAgLyoqCisgICAqIE1lc3NhZ2UgdHlwZS4KKyAgICoKKyAgICogPHA+CisgICAqIE5vdGUgdGhhdCB0aGUga2VlcC1hbGl2ZSBtZXNzYWdlcyBkb24ndCBhY3R1YWxseSBoYXZlIGFuIHR5cGUgSUQgZGVmaW5lZAorICAgKiBpbiB0aGUgcHJvdG9jb2wgYXMgdGhleSBhcmUgb2YgbGVuZ3RoIDAuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBlbnVtIFR5cGUgeworICAgIEtFRVBfQUxJVkUoLTEpLAorICAgIENIT0tFKDApLAorICAgIFVOQ0hPS0UoMSksCisgICAgSU5URVJFU1RFRCgyKSwKKyAgICBOT1RfSU5URVJFU1RFRCgzKSwKKyAgICBIQVZFKDQpLAorICAgIEJJVEZJRUxEKDUpLAorICAgIFJFUVVFU1QoNiksCisgICAgUElFQ0UoNyksCisgICAgQ0FOQ0VMKDgpOworCisgICAgcHJpdmF0ZSBieXRlIGlkOworCisgICAgVHlwZShpbnQgaWQpIHsKKyAgICAgIHRoaXMuaWQgPSAoYnl0ZSkgaWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGJ5dGUgYykgeworICAgICAgcmV0dXJuIHRoaXMuaWQgPT0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBnZXRUeXBlQnl0ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXQoYnl0ZSBjKSB7CisgICAgICBmb3IgKFR5cGUgdCA6IFR5cGUudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKHQuZXF1YWxzKGMpKSB7CisgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YTsKKworICBwcml2YXRlIFBlZXJNZXNzYWdlKFR5cGUgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIHRoaXMuZGF0YS5yZXdpbmQoKTsKKyAgfQorCisgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHRoaXMudHlwZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEge0BsaW5rIEJ5dGVCdWZmZXJ9IGJhY2tlZCBieSB0aGUgc2FtZSBkYXRhIGFzIHRoaXMgbWVzc2FnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBkdXBsaWNhdGUgb2YgdGhlIGJ1ZmZlciBzdG9yZWQgaW4gdGhpcyB7QGxpbmsKKyAgICogUGVlck1lc3NhZ2V9IG9iamVjdCB0byBhbGxvdyBmb3IgbXVsdGlwbGUgY29uc3VtZXJzIHRvIHJlYWQgZnJvbSB0aGUKKyAgICogc2FtZSBtZXNzYWdlIHdpdGhvdXQgY29uZmxpY3RpbmcgYWNjZXNzIHRvIHRoZSBidWZmZXIncyBwb3NpdGlvbiwgbWFyaworICAgKiBhbmQgbGltaXQuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldERhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMuZGF0YS5kdXBsaWNhdGUoKTsKKyAgfQorCisgIC8qKgorICAgKiBWYWxpZGF0ZSB0aGF0IHRoaXMgbWVzc2FnZSBtYWtlcyBzZW5zZSBmb3IgdGhlIHRvcnJlbnQgaXQncyByZWxhdGVkIHRvLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgb3ZlcmxvYWRlZCBieSBkaXN0aW5jdCBtZXNzYWdlIHR5cGVzLCB3aGVyZQorICAgKiBpdCBtYWtlcyBzZW5zZS4gT3RoZXJ3aXNlLCBpdCBkZWZhdWx0cyB0byB0cnVlLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSB0b3JyZW50IFRoZSB0b3JyZW50IHRoaXMgbWVzc2FnZSBpcyBhYm91dC4KKyAgICovCisgIHB1YmxpYyBQZWVyTWVzc2FnZSB2YWxpZGF0ZShUb3JyZW50SW5mbyB0b3JyZW50KQorICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiB0aGlzLmdldFR5cGUoKS5uYW1lKCk7CisgIH0KKworICAvKioKKyAgICogUGFyc2UgdGhlIGdpdmVuIGJ1ZmZlciBpbnRvIGEgcGVlciBwcm90b2NvbCBtZXNzYWdlLgorICAgKgorICAgKiA8cD4KKyAgICogUGFyc2VzIHRoZSBwcm92aWRlZCBieXRlIGFycmF5IGFuZCBidWlsZHMgdGhlIGNvcnJlc3BvbmRpbmcgUGVlck1lc3NhZ2UKKyAgICogc3ViY2xhc3Mgb2JqZWN0LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBidWZmZXIgIFRoZSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtZXNzYWdlIGRhdGEuCisgICAqIEBwYXJhbSB0b3JyZW50IFRoZSB0b3JyZW50IHRoaXMgbWVzc2FnZSBpcyBhYm91dC4KKyAgICogQHJldHVybiBBIFBlZXJNZXNzYWdlIHN1YmNsYXNzIGluc3RhbmNlLgorICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIFdoZW4gdGhlIG1lc3NhZ2UgaXMgaW52YWxpZCwgY2FuJ3QgYmUgcGFyc2VkIG9yCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgbWF0Y2ggdGhlIHByb3RvY29sIHJlcXVpcmVtZW50cy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgUGVlck1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsIFRvcnJlbnRJbmZvIHRvcnJlbnQpCisgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBpbnQgbGVuZ3RoID0gYnVmZmVyLmdldEludCgpOworICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgcmV0dXJuIEtlZXBBbGl2ZU1lc3NhZ2UucGFyc2UoYnVmZmVyLCB0b3JyZW50KTsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCAhPSBidWZmZXIucmVtYWluaW5nKCkpIHsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiTWVzc2FnZSBzaXplIGRpZCBub3QgbWF0Y2ggYW5ub3VuY2VkICIgKworICAgICAgICAgICAgICAic2l6ZSEiLCAwKTsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUgPSBUeXBlLmdldChidWZmZXIuZ2V0KCkpOworICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBtZXNzYWdlIElEISIsCisgICAgICAgICAgICAgIGJ1ZmZlci5wb3NpdGlvbigpIC0gMSk7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIENIT0tFOgorICAgICAgICByZXR1cm4gQ2hva2VNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgVU5DSE9LRToKKyAgICAgICAgcmV0dXJuIFVuY2hva2VNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgSU5URVJFU1RFRDoKKyAgICAgICAgcmV0dXJuIEludGVyZXN0ZWRNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgTk9UX0lOVEVSRVNURUQ6CisgICAgICAgIHJldHVybiBOb3RJbnRlcmVzdGVkTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIEhBVkU6CisgICAgICAgIHJldHVybiBIYXZlTWVzc2FnZS5wYXJzZShidWZmZXIuc2xpY2UoKSwgdG9ycmVudCk7CisgICAgICBjYXNlIEJJVEZJRUxEOgorICAgICAgICByZXR1cm4gQml0ZmllbGRNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgUkVRVUVTVDoKKyAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGNhc2UgUElFQ0U6CisgICAgICAgIHJldHVybiBQaWVjZU1lc3NhZ2UucGFyc2UoYnVmZmVyLnNsaWNlKCksIHRvcnJlbnQpOworICAgICAgY2FzZSBDQU5DRUw6CisgICAgICAgIHJldHVybiBDYW5jZWxNZXNzYWdlLnBhcnNlKGJ1ZmZlci5zbGljZSgpLCB0b3JyZW50KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lc3NhZ2UgdHlwZSBzaG91bGQgaGF2ZSAiICsKKyAgICAgICAgICAgICAgICAiYmVlbiBwcm9wZXJseSBkZWZpbmVkIGJ5IG5vdy4iKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUGFyc2VFeGNlcHRpb24geworCisgICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOworCisgICAgcHVibGljIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKFBlZXJNZXNzYWdlIG0pIHsKKyAgICAgIHN1cGVyKCJNZXNzYWdlICIgKyBtICsgIiBpcyBub3QgdmFsaWQhIiwgMCk7CisgICAgfQorCisgIH0KKworCisgIC8qKgorICAgKiBLZWVwIGFsaXZlIG1lc3NhZ2UuCisgICAqCisgICAqIDxsZW49MDAwMD4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2VlcEFsaXZlTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAwOworCisgICAgcHJpdmF0ZSBLZWVwQWxpdmVNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICBzdXBlcihUeXBlLktFRVBfQUxJVkUsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBLZWVwQWxpdmVNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SW5mbyB0b3JyZW50KSB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgcmV0dXJuIChLZWVwQWxpdmVNZXNzYWdlKSBuZXcgS2VlcEFsaXZlTWVzc2FnZShidWZmZXIpCisgICAgICAgICAgICAgIC52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEtlZXBBbGl2ZU1lc3NhZ2UgY3JhZnQoKSB7CisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBLZWVwQWxpdmVNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KEtlZXBBbGl2ZU1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIHJldHVybiBuZXcgS2VlcEFsaXZlTWVzc2FnZShidWZmZXIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDaG9rZSBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDE+PGlkPTA+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIENob2tlTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAxOworCisgICAgcHJpdmF0ZSBDaG9rZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKKyAgICAgIHN1cGVyKFR5cGUuQ0hPS0UsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDaG9rZU1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudEluZm8gdG9ycmVudCkgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiAoQ2hva2VNZXNzYWdlKSBuZXcgQ2hva2VNZXNzYWdlKGJ1ZmZlcikKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2hva2VNZXNzYWdlIGNyYWZ0KCkgeworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgQ2hva2VNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KENob2tlTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLkNIT0tFLmdldFR5cGVCeXRlKCkpOworICAgICAgcmV0dXJuIG5ldyBDaG9rZU1lc3NhZ2UoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVW5jaG9rZSBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDE+PGlkPTE+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIFVuY2hva2VNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDE7CisKKyAgICBwcml2YXRlIFVuY2hva2VNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICBzdXBlcihUeXBlLlVOQ0hPS0UsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVbmNob2tlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gKFVuY2hva2VNZXNzYWdlKSBuZXcgVW5jaG9rZU1lc3NhZ2UoYnVmZmVyKQorICAgICAgICAgICAgICAudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVbmNob2tlTWVzc2FnZSBjcmFmdCgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIFVuY2hva2VNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KFVuY2hva2VNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuVU5DSE9LRS5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIHJldHVybiBuZXcgVW5jaG9rZU1lc3NhZ2UoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSW50ZXJlc3RlZCBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDE+PGlkPTI+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyZXN0ZWRNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDE7CisKKyAgICBwcml2YXRlIEludGVyZXN0ZWRNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICBzdXBlcihUeXBlLklOVEVSRVNURUQsIGJ1ZmZlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnRlcmVzdGVkTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gKEludGVyZXN0ZWRNZXNzYWdlKSBuZXcgSW50ZXJlc3RlZE1lc3NhZ2UoYnVmZmVyKQorICAgICAgICAgICAgICAudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnRlcmVzdGVkTWVzc2FnZSBjcmFmdCgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIEludGVyZXN0ZWRNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KEludGVyZXN0ZWRNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuSU5URVJFU1RFRC5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIHJldHVybiBuZXcgSW50ZXJlc3RlZE1lc3NhZ2UoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTm90IGludGVyZXN0ZWQgbWVzc2FnZS4KKyAgICoKKyAgICogPGxlbj0wMDAxPjxpZD0zPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBOb3RJbnRlcmVzdGVkTWVzc2FnZSBleHRlbmRzIFBlZXJNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX1NJWkUgPSAxOworCisgICAgcHJpdmF0ZSBOb3RJbnRlcmVzdGVkTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgc3VwZXIoVHlwZS5OT1RfSU5URVJFU1RFRCwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vdEludGVyZXN0ZWRNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudEluZm8gdG9ycmVudCkgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiAoTm90SW50ZXJlc3RlZE1lc3NhZ2UpIG5ldyBOb3RJbnRlcmVzdGVkTWVzc2FnZShidWZmZXIpCisgICAgICAgICAgICAgIC52YWxpZGF0ZSh0b3JyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vdEludGVyZXN0ZWRNZXNzYWdlIGNyYWZ0KCkgeworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgTm90SW50ZXJlc3RlZE1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQoTm90SW50ZXJlc3RlZE1lc3NhZ2UuQkFTRV9TSVpFKTsKKyAgICAgIGJ1ZmZlci5wdXQoUGVlck1lc3NhZ2UuVHlwZS5OT1RfSU5URVJFU1RFRC5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIHJldHVybiBuZXcgTm90SW50ZXJlc3RlZE1lc3NhZ2UoYnVmZmVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGF2ZSBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDU+PGlkPTQ+PHBpZWNlIGluZGV4PXh4eHg+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEhhdmVNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDU7CisKKyAgICBwcml2YXRlIGludCBwaWVjZTsKKworICAgIHByaXZhdGUgSGF2ZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBwaWVjZSkgeworICAgICAgc3VwZXIoVHlwZS5IQVZFLCBidWZmZXIpOworICAgICAgdGhpcy5waWVjZSA9IHBpZWNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGllY2VJbmRleCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBpZWNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBIYXZlTWVzc2FnZSB2YWxpZGF0ZShUb3JyZW50SW5mbyB0b3JyZW50KQorICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmICh0aGlzLnBpZWNlID49IDAgJiYgdGhpcy5waWVjZSA8IHRvcnJlbnQuZ2V0UGllY2VDb3VudCgpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBIYXZlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbmV3IEhhdmVNZXNzYWdlKGJ1ZmZlciwgYnVmZmVyLmdldEludCgpKQorICAgICAgICAgICAgICAudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBIYXZlTWVzc2FnZSBjcmFmdChpbnQgcGllY2UpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIEhhdmVNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0SW50KEhhdmVNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuSEFWRS5nZXRUeXBlQnl0ZSgpKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQocGllY2UpOworICAgICAgcmV0dXJuIG5ldyBIYXZlTWVzc2FnZShidWZmZXIsIHBpZWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiICMiICsgdGhpcy5nZXRQaWVjZUluZGV4KCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEJpdGZpZWxkIG1lc3NhZ2UuCisgICAqCisgICAqIDxsZW49MDAwMStYPjxpZD01PjxiaXRmaWVsZD4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQml0ZmllbGRNZXNzYWdlIGV4dGVuZHMgUGVlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfU0laRSA9IDE7CisKKyAgICBwcml2YXRlIEJpdFNldCBiaXRmaWVsZDsKKworICAgIHByaXZhdGUgQml0ZmllbGRNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyLCBCaXRTZXQgYml0ZmllbGQpIHsKKyAgICAgIHN1cGVyKFR5cGUuQklURklFTEQsIGJ1ZmZlcik7CisgICAgICB0aGlzLmJpdGZpZWxkID0gYml0ZmllbGQ7CisgICAgfQorCisgICAgcHVibGljIEJpdFNldCBnZXRCaXRmaWVsZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmJpdGZpZWxkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCaXRmaWVsZE1lc3NhZ2UgdmFsaWRhdGUoVG9ycmVudEluZm8gdG9ycmVudCkKKyAgICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAodGhpcy5iaXRmaWVsZC5sZW5ndGgoKSA8PSB0b3JyZW50LmdldFBpZWNlQ291bnQoKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQml0ZmllbGRNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBCaXRTZXQgYml0ZmllbGQgPSBuZXcgQml0U2V0KGJ1ZmZlci5yZW1haW5pbmcoKSAqIDgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXIucmVtYWluaW5nKCkgKiA4OyBpKyspIHsKKyAgICAgICAgaWYgKChidWZmZXIuZ2V0KGkgLyA4KSAmICgxIDw8ICg3IC0gKGkgJSA4KSkpKSA+IDApIHsKKyAgICAgICAgICBiaXRmaWVsZC5zZXQoaSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBCaXRmaWVsZE1lc3NhZ2UoYnVmZmVyLCBiaXRmaWVsZCkKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQml0ZmllbGRNZXNzYWdlIGNyYWZ0KEJpdFNldCBhdmFpbGFibGVQaWVjZXMpIHsKKyAgICAgIGludCBsZW4gPSBhdmFpbGFibGVQaWVjZXMubGVuZ3RoKCkgLyA4OworICAgICAgaWYgKGF2YWlsYWJsZVBpZWNlcy5sZW5ndGgoKSAlIDggPiAwKSBsZW4rKzsKKyAgICAgIGJ5dGVbXSBiaXRmaWVsZCA9IG5ldyBieXRlW2xlbl07CisgICAgICBmb3IgKGludCBpID0gYXZhaWxhYmxlUGllY2VzLm5leHRTZXRCaXQoMCk7IGkgPj0gMDsKKyAgICAgICAgICAgaSA9IGF2YWlsYWJsZVBpZWNlcy5uZXh0U2V0Qml0KGkgKyAxKSkgeworICAgICAgICBiaXRmaWVsZFtpIC8gOF0gfD0gMSA8PCAoNyAtIChpICUgOCkpOworICAgICAgfQorCisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBCaXRmaWVsZE1lc3NhZ2UuQkFTRV9TSVpFICsgYml0ZmllbGQubGVuZ3RoKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQoQml0ZmllbGRNZXNzYWdlLkJBU0VfU0laRSArIGJpdGZpZWxkLmxlbmd0aCk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuQklURklFTEQuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICBidWZmZXIucHV0KEJ5dGVCdWZmZXIud3JhcChiaXRmaWVsZCkpOworICAgICAgcmV0dXJuIG5ldyBCaXRmaWVsZE1lc3NhZ2UoYnVmZmVyLCBhdmFpbGFibGVQaWVjZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIiArIHRoaXMuZ2V0Qml0ZmllbGQoKS5jYXJkaW5hbGl0eSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXF1ZXN0IG1lc3NhZ2UuCisgICAqCisgICAqIDxsZW49MDAwMTM+PGlkPTY+PHBpZWNlIGluZGV4PjxibG9jayBvZmZzZXQ+PGJsb2NrIGxlbmd0aD4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdE1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gMTM7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGJsb2NrIHNpemUgaXMgMl4xNCBieXRlcywgb3IgMTZrQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFUVVFU1RfU0laRSA9IDE2Mzg0OworCisgICAgLyoqCisgICAgICogTWF4IGJsb2NrIHJlcXVlc3Qgc2l6ZSBpcyAyXjE3IGJ5dGVzLCBvciAxMzFrQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUkVRVUVTVF9TSVpFID0gMTMxMDcyOworCisgICAgcHJpdmF0ZSBpbnQgcGllY2U7CisgICAgcHJpdmF0ZSBpbnQgb2Zmc2V0OworICAgIHByaXZhdGUgaW50IGxlbmd0aDsKKyAgICBwcml2YXRlIGxvbmcgbXlTZW5kVGltZTsKKworICAgIHByaXZhdGUgUmVxdWVzdE1lc3NhZ2UoQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBwaWVjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgIHN1cGVyKFR5cGUuUkVRVUVTVCwgYnVmZmVyKTsKKyAgICAgIHRoaXMucGllY2UgPSBwaWVjZTsKKyAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICBteVNlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQaWVjZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLnBpZWNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFNlbmRUaW1lKCkgeworICAgICAgcmV0dXJuIG15U2VuZFRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVuZXcoKSB7CisgICAgICBteVNlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RNZXNzYWdlIHZhbGlkYXRlKFRvcnJlbnRJbmZvIHRvcnJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHRoaXMucGllY2UgPj0gMCAmJiB0aGlzLnBpZWNlIDwgdG9ycmVudC5nZXRQaWVjZUNvdW50KCkgJiYKKyAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aCA8PQorICAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0UGllY2VTaXplKHRoaXMucGllY2UpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0TWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpbnQgcGllY2UgPSBidWZmZXIuZ2V0SW50KCk7CisgICAgICBpbnQgb2Zmc2V0ID0gYnVmZmVyLmdldEludCgpOworICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICAgIHJldHVybiBuZXcgUmVxdWVzdE1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwKKyAgICAgICAgICAgICAgb2Zmc2V0LCBsZW5ndGgpLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdE1lc3NhZ2UgY3JhZnQoaW50IHBpZWNlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBSZXF1ZXN0TWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChSZXF1ZXN0TWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dChQZWVyTWVzc2FnZS5UeXBlLlJFUVVFU1QuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICBidWZmZXIucHV0SW50KHBpZWNlKTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQob2Zmc2V0KTsKKyAgICAgIGJ1ZmZlci5wdXRJbnQobGVuZ3RoKTsKKyAgICAgIHJldHVybiBuZXcgUmVxdWVzdE1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIyIgKyB0aGlzLmdldFBpZWNlKCkgKworICAgICAgICAgICAgICAiICgiICsgdGhpcy5nZXRMZW5ndGgoKSArICJAIiArIHRoaXMuZ2V0T2Zmc2V0KCkgKyAiKSI7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBpZWNlIG1lc3NhZ2UuCisgICAqCisgICAqIDxsZW49MDAwOStYPjxpZD03PjxwaWVjZSBpbmRleD48YmxvY2sgb2Zmc2V0PjxibG9jayBkYXRhPgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQaWVjZU1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gOTsKKworICAgIHByaXZhdGUgaW50IHBpZWNlOworICAgIHByaXZhdGUgaW50IG9mZnNldDsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgYmxvY2s7CisKKyAgICBwcml2YXRlIFBpZWNlTWVzc2FnZShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IHBpZWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIEJ5dGVCdWZmZXIgYmxvY2spIHsKKyAgICAgIHN1cGVyKFR5cGUuUElFQ0UsIGJ1ZmZlcik7CisgICAgICB0aGlzLnBpZWNlID0gcGllY2U7CisgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICAgIHRoaXMuYmxvY2sgPSBibG9jazsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBpZWNlKCkgeworICAgICAgcmV0dXJuIHRoaXMucGllY2U7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5vZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0QmxvY2soKSB7CisgICAgICByZXR1cm4gdGhpcy5ibG9jazsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGllY2VNZXNzYWdlIHZhbGlkYXRlKFRvcnJlbnRJbmZvIHRvcnJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHRoaXMucGllY2UgPj0gMCAmJiB0aGlzLnBpZWNlIDwgdG9ycmVudC5nZXRQaWVjZUNvdW50KCkgJiYKKyAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKyB0aGlzLmJsb2NrLmxpbWl0KCkgPD0KKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldFBpZWNlU2l6ZSh0aGlzLnBpZWNlKSkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGllY2VNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpbnQgcGllY2UgPSBidWZmZXIuZ2V0SW50KCk7CisgICAgICBpbnQgb2Zmc2V0ID0gYnVmZmVyLmdldEludCgpOworICAgICAgQnl0ZUJ1ZmZlciBibG9jayA9IGJ1ZmZlci5zbGljZSgpOworICAgICAgcmV0dXJuIG5ldyBQaWVjZU1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwgb2Zmc2V0LCBibG9jaykKKyAgICAgICAgICAgICAgLnZhbGlkYXRlKHRvcnJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGllY2VNZXNzYWdlIGNyYWZ0KGludCBwaWVjZSwgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgcmV0dXJuIG5ldyBQaWVjZU1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwgb2Zmc2V0LCBDb25zdGFudHMuRU1QVFlfQlVGRkVSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgY3JlYXRlQnVmZmVyV2l0aEhlYWRlckZvck1lc3NhZ2UoaW50IHBpZWNlLCBpbnQgb2Zmc2V0LCBpbnQgYmxvY2tTaXplKSB7CisgICAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIE1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyBQaWVjZU1lc3NhZ2UuQkFTRV9TSVpFICsgYmxvY2tTaXplKTsKKyAgICAgIHJlc3VsdC5wdXRJbnQoUGllY2VNZXNzYWdlLkJBU0VfU0laRSArIGJsb2NrU2l6ZSk7CisgICAgICByZXN1bHQucHV0KFBlZXJNZXNzYWdlLlR5cGUuUElFQ0UuZ2V0VHlwZUJ5dGUoKSk7CisgICAgICByZXN1bHQucHV0SW50KHBpZWNlKTsKKyAgICAgIHJlc3VsdC5wdXRJbnQob2Zmc2V0KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAjIiArIHRoaXMuZ2V0UGllY2UoKSArCisgICAgICAgICAgICAgICIgKCIgKyB0aGlzLmdldEJsb2NrKCkuY2FwYWNpdHkoKSArICJAIiArIHRoaXMuZ2V0T2Zmc2V0KCkgKyAiKSI7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENhbmNlbCBtZXNzYWdlLgorICAgKgorICAgKiA8bGVuPTAwMDEzPjxpZD04PjxwaWVjZSBpbmRleD48YmxvY2sgb2Zmc2V0PjxibG9jayBsZW5ndGg+CisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbmNlbE1lc3NhZ2UgZXh0ZW5kcyBQZWVyTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIGludCBwaWVjZTsKKyAgICBwcml2YXRlIGludCBvZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbGVuZ3RoOworCisgICAgcHJpdmF0ZSBDYW5jZWxNZXNzYWdlKEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgcGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgIHN1cGVyKFR5cGUuQ0FOQ0VMLCBidWZmZXIpOworICAgICAgdGhpcy5waWVjZSA9IHBpZWNlOworICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBpZWNlKCkgeworICAgICAgcmV0dXJuIHRoaXMucGllY2U7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisgICAgICByZXR1cm4gdGhpcy5vZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENhbmNlbE1lc3NhZ2UgdmFsaWRhdGUoVG9ycmVudEluZm8gdG9ycmVudCkKKyAgICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAodGhpcy5waWVjZSA+PSAwICYmIHRoaXMucGllY2UgPCB0b3JyZW50LmdldFBpZWNlQ291bnQoKSAmJgorICAgICAgICAgICAgICB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoIDw9CisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXRQaWVjZVNpemUodGhpcy5waWVjZSkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENhbmNlbE1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcnJlbnRJbmZvIHRvcnJlbnQpIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpbnQgcGllY2UgPSBidWZmZXIuZ2V0SW50KCk7CisgICAgICBpbnQgb2Zmc2V0ID0gYnVmZmVyLmdldEludCgpOworICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5nZXRJbnQoKTsKKyAgICAgIHJldHVybiBuZXcgQ2FuY2VsTWVzc2FnZShidWZmZXIsIHBpZWNlLAorICAgICAgICAgICAgICBvZmZzZXQsIGxlbmd0aCkudmFsaWRhdGUodG9ycmVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDYW5jZWxNZXNzYWdlIGNyYWZ0KGludCBwaWVjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKAorICAgICAgICAgICAgICBNRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgQ2FuY2VsTWVzc2FnZS5CQVNFX1NJWkUpOworICAgICAgYnVmZmVyLnB1dEludChDYW5jZWxNZXNzYWdlLkJBU0VfU0laRSk7CisgICAgICBidWZmZXIucHV0KFBlZXJNZXNzYWdlLlR5cGUuQ0FOQ0VMLmdldFR5cGVCeXRlKCkpOworICAgICAgYnVmZmVyLnB1dEludChwaWVjZSk7CisgICAgICBidWZmZXIucHV0SW50KG9mZnNldCk7CisgICAgICBidWZmZXIucHV0SW50KGxlbmd0aCk7CisgICAgICByZXR1cm4gbmV3IENhbmNlbE1lc3NhZ2UoYnVmZmVyLCBwaWVjZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIyIgKyB0aGlzLmdldFBpZWNlKCkgKworICAgICAgICAgICAgICAiICgiICsgdGhpcy5nZXRMZW5ndGgoKSArICJAIiArIHRoaXMuZ2V0T2Zmc2V0KCkgKyAiKSI7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1RyYWNrZXJNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL1RyYWNrZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyNTgzNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvVHJhY2tlck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogQml0VG9ycmVudCB0cmFja2VyIHByb3RvY29sIG1lc3NhZ2VzIHJlcHJlc2VudGF0aW9ucy4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgYW5kIGl0cyA8ZW0+KlRyYWNrZXJNZXNzYWdlPC9lbT4gc3ViY2xhc3NlcyBwcm92aWRlIFBPSk8KKyAqIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgdHJhY2tlciBwcm90b2NvbCBtZXNzYWdlcywgZm9yIGF0IGxlYXN0IEhUVFAgYW5kIFVEUAorICogdHJhY2tlcnMnIHByb3RvY29scywgYWxvbmcgd2l0aCBlYXN5IHBhcnNpbmcgZnJvbSBhbiBpbnB1dCBCeXRlQnVmZmVyIHRvCisgKiBxdWlja2x5IGdldCBhIHVzYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmNvbWluZyBtZXNzYWdlLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhY2tlck1lc3NhZ2UgeworCisgIC8qKgorICAgKiBNZXNzYWdlIHR5cGUuCisgICAqLworICBwdWJsaWMgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOKC0xKSwKKyAgICBDT05ORUNUX1JFUVVFU1QoMCksCisgICAgQ09OTkVDVF9SRVNQT05TRSgwKSwKKyAgICBBTk5PVU5DRV9SRVFVRVNUKDEpLAorICAgIEFOTk9VTkNFX1JFU1BPTlNFKDEpLAorICAgIFNDUkFQRV9SRVFVRVNUKDIpLAorICAgIFNDUkFQRV9SRVNQT05TRSgyKSwKKyAgICBFUlJPUigzKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGlkOworCisgICAgVHlwZShpbnQgaWQpIHsKKyAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBkYXRhOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGJhc2UgdHJhY2tlciBtZXNzYWdlIHR5cGUuCisgICAqCisgICAqIEBwYXJhbSB0eXBlIFRoZSBtZXNzYWdlIHR5cGUuCisgICAqIEBwYXJhbSBkYXRhIEEgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgYmluYXJ5IGRhdGEgb2YgdGhlIG1lc3NhZ2UgKGEKKyAgICogICAgICAgICAgICAgQi1lbmNvZGVkIG1hcCwgYSBVRFAgcGFja2V0IGRhdGEsIGV0Yy4pLgorICAgKi8KKyAgcHJvdGVjdGVkIFRyYWNrZXJNZXNzYWdlKFR5cGUgdHlwZSwgQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkgeworICAgICAgdGhpcy5kYXRhLnJld2luZCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgdHJhY2tlciBtZXNzYWdlLgorICAgKi8KKyAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdGhpcy50eXBlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGVuY29kZWQgYmluYXJ5IGRhdGEgZm9yIHRoaXMgbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldERhdGEoKSB7CisgICAgcmV0dXJuIHRoaXMuZGF0YTsKKyAgfQorCisgIC8qKgorICAgKiBHZW5lcmljIGV4Y2VwdGlvbiBmb3IgbWVzc2FnZSBmb3JtYXQgYW5kIG1lc3NhZ2UgdmFsaWRhdGlvbiBleGNlcHRpb25zLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE7CisKKyAgICBwdWJsaWMgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICBzdXBlcihzLCBjYXVzZSk7CisgICAgfQorCisgIH0KKworCisgIC8qKgorICAgKiBCYXNlIGludGVyZmFjZSBmb3IgY29ubmVjdGlvbiByZXF1ZXN0IG1lc3NhZ2VzLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3VidHlwZXMgb2YgY29ubmVjdGlvbiByZXF1ZXN0CisgICAqIG1lc3NhZ2VzIGZvciB0aGUgdmFyaW91cyB0cmFja2VyIHByb3RvY29scy4KKyAgICogPC9wPgorICAgKgorICAgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblJlcXVlc3RNZXNzYWdlIHsKKworICB9CisKKworICAvKioKKyAgICogQmFzZSBpbnRlcmZhY2UgZm9yIGNvbm5lY3Rpb24gcmVzcG9uc2UgbWVzc2FnZXMuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCBzdWJ0eXBlcyBvZiBjb25uZWN0aW9uCisgICAqIHJlc3BvbnNlIG1lc3NhZ2VzIGZvciB0aGUgdmFyaW91cyB0cmFja2VyIHByb3RvY29scy4KKyAgICogPC9wPgorICAgKgorICAgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblJlc3BvbnNlTWVzc2FnZSB7CisKKyAgfQorCisKKyAgLyoqCisgICAqIEJhc2UgaW50ZXJmYWNlIGZvciB0cmFja2VyIGVycm9yIG1lc3NhZ2VzLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgc3VidHlwZXMgb2YgdHJhY2tlciBlcnJvcgorICAgKiBtZXNzYWdlcyBmb3IgdGhlIHZhcmlvdXMgdHJhY2tlciBwcm90b2NvbHMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQGF1dGhvciBtcGV0YXp6b25pCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIEVycm9yTWVzc2FnZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFyaW91cyB0cmFja2VyIGVycm9yIHN0YXRlcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZXNlIGVycm9ycyBhcmUgcmVwb3J0ZWQgYnkgdGhlIHRyYWNrZXIgdG8gYSBjbGllbnQgd2hlbiBleHBlY3RlZAorICAgICAqIHBhcmFtZXRlcnMgb3IgY29uZGl0aW9ucyBhcmUgbm90IHByZXNlbnQgd2hpbGUgcHJvY2Vzc2luZyBhbgorICAgICAqIGFubm91bmNlIHJlcXVlc3QgZnJvbSBhIEJpdFRvcnJlbnQgY2xpZW50LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBlbnVtIEZhaWx1cmVSZWFzb24geworICAgICAgVU5LTk9XTl9UT1JSRU5UKCJUaGUgcmVxdWVzdGVkIHRvcnJlbnQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyB0cmFja2VyIiksCisgICAgICBNSVNTSU5HX0hBU0goIk1pc3NpbmcgaW5mbyBoYXNoIiksCisgICAgICBNSVNTSU5HX1BFRVJfSUQoIk1pc3NpbmcgcGVlciBJRCIpLAorICAgICAgTUlTU0lOR19QT1JUKCJNaXNzaW5nIHBvcnQiKSwKKyAgICAgIElOVkFMSURfRVZFTlQoIlVuZXhwZWN0ZWQgZXZlbnQgZm9yIHBlZXIgc3RhdGUiKSwKKyAgICAgIE5PVF9JTVBMRU1FTlRFRCgiRmVhdHVyZSBub3QgaW1wbGVtZW50ZWQiKTsKKworICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgRmFpbHVyZVJlYXNvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7CisgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIGdldFJlYXNvbigpOworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNTE4NQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMzEzIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBUaGUgYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgSFRUUCB0cmFja2VyIHByb3RvY29sLgorICogYW5ub3VuY2Xor7fmsYLljIXlkKvnmoTkv6Hmga8KKyAqIDxwPgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2UgaW4gdGhlIEhUVFAgdHJhY2tlcgorICogcHJvdG9jb2wuIEl0IGRvZXNuJ3QgYWRkIGFueSBzcGVjaWZpYyBmaWVsZHMgY29tcGFyZWQgdG8gdGhlIGdlbmVyaWMKKyAqIGFubm91bmNlIHJlcXVlc3QgbWVzc2FnZSwgYnV0IGl0IHByb3ZpZGVzIHRoZSBtZWFucyB0byBwYXJzZSBzdWNoCisgKiBtZXNzYWdlcyBhbmQgY3JhZnQgdGhlbS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGV4dGVuZHMgSFRUUFRyYWNrZXJNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5mb0hhc2g7CisgIHByaXZhdGUgZmluYWwgUGVlciBwZWVyOworICBwcml2YXRlIGZpbmFsIGxvbmcgdXBsb2FkZWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBkb3dubG9hZGVkOworICBwcml2YXRlIGZpbmFsIGxvbmcgbGVmdDsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbXBhY3Q7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBub1BlZXJJZDsKKyAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0RXZlbnQgZXZlbnQ7CisgIHByaXZhdGUgZmluYWwgaW50IG51bVdhbnQ7CisKKyAgcHJpdmF0ZSBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGluZm9IYXNoLCBQZWVyIHBlZXIsIGxvbmcgdXBsb2FkZWQsIGxvbmcgZG93bmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlZnQsIGJvb2xlYW4gY29tcGFjdCwgYm9vbGVhbiBub1BlZXJJZCwgUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1XYW50KSB7CisgICAgc3VwZXIoVHlwZS5BTk5PVU5DRV9SRVFVRVNULCBkYXRhKTsKKyAgICB0aGlzLmluZm9IYXNoID0gaW5mb0hhc2g7CisgICAgdGhpcy5wZWVyID0gcGVlcjsKKyAgICB0aGlzLmRvd25sb2FkZWQgPSBkb3dubG9hZGVkOworICAgIHRoaXMudXBsb2FkZWQgPSB1cGxvYWRlZDsKKyAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgIHRoaXMuY29tcGFjdCA9IGNvbXBhY3Q7CisgICAgdGhpcy5ub1BlZXJJZCA9IG5vUGVlcklkOworICAgIHRoaXMuZXZlbnQgPSBldmVudDsKKyAgICB0aGlzLm51bVdhbnQgPSBudW1XYW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIHRoaXMuaW5mb0hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHRoaXMuaW5mb0hhc2gpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0UGVlcklkKCkgeworICAgIHJldHVybiB0aGlzLnBlZXIuZ2V0UGVlcklkQXJyYXkoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyLmdldEhleFBlZXJJZCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyLmdldFBvcnQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRVcGxvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy51cGxvYWRlZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXREb3dubG9hZGVkKCkgeworICAgIHJldHVybiB0aGlzLmRvd25sb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0TGVmdCgpIHsKKyAgICByZXR1cm4gdGhpcy5sZWZ0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQ29tcGFjdCgpIHsKKyAgICByZXR1cm4gdGhpcy5jb21wYWN0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGNhbk9taXRQZWVySWQoKSB7CisgICAgcmV0dXJuIHRoaXMubm9QZWVySWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlcXVlc3RFdmVudCBnZXRFdmVudCgpIHsKKyAgICByZXR1cm4gdGhpcy5ldmVudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldElwKCkgeworICAgIHJldHVybiB0aGlzLnBlZXIuZ2V0SXAoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldE51bVdhbnQoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtV2FudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRUcmFja2VySWQoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkIHRoZSBhbm5vdW5jZSByZXF1ZXN0IFVSTCBmb3IgdGhlIGdpdmVuIHRyYWNrZXIgYW5ub3VuY2UgVVJMLgorICAgKgorICAgKiBAcGFyYW0gdHJhY2tlckFubm91bmNlVVJMIFRoZSB0cmFja2VyJ3MgYW5ub3VuY2UgVVJMLgorICAgKiBAcmV0dXJuIFRoZSBVUkwgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYW5ub3VuY2UgcmVxdWVzdCBVUkwuCisgICAqLworICAgLy8g5p6E6YCgIGFubm91bmNl6K+35rGC55qEdXJsCisgIHB1YmxpYyBVUkwgYnVpbGRBbm5vdW5jZVVSTChVUkwgdHJhY2tlckFubm91bmNlVVJMKQorICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgIFN0cmluZyBiYXNlID0gdHJhY2tlckFubm91bmNlVVJMLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQnVpbGRlciB1cmwgPSBuZXcgU3RyaW5nQnVpbGRlcihiYXNlKTsKKyAgICB1cmwuYXBwZW5kKGJhc2UuY29udGFpbnMoIj8iKSA/ICImIiA6ICI/IikKKyAgICAgICAgICAgIC5hcHBlbmQoImluZm9faGFzaD0iKQorICAgICAgICAgICAgLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyh0aGlzLmdldEluZm9IYXNoKCksIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSwKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKQorICAgICAgICAgICAgLmFwcGVuZCgiJnBlZXJfaWQ9IikKKyAgICAgICAgICAgIC5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcodGhpcy5nZXRQZWVySWQoKSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpLAorICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQllURV9FTkNPRElORykpCisgICAgICAgICAgICAuYXBwZW5kKCImcG9ydD0iKS5hcHBlbmQodGhpcy5nZXRQb3J0KCkpCisgICAgICAgICAgICAuYXBwZW5kKCImdXBsb2FkZWQ9IikuYXBwZW5kKHRoaXMuZ2V0VXBsb2FkZWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiZkb3dubG9hZGVkPSIpLmFwcGVuZCh0aGlzLmdldERvd25sb2FkZWQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiZsZWZ0PSIpLmFwcGVuZCh0aGlzLmdldExlZnQoKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiZjb21wYWN0PSIpLmFwcGVuZCh0aGlzLmlzQ29tcGFjdCgpID8gMSA6IDApCisgICAgICAgICAgICAuYXBwZW5kKCImbm9fcGVlcl9pZD0iKS5hcHBlbmQodGhpcy5jYW5PbWl0UGVlcklkKCkgPyAxIDogMCk7CisKKyAgICBpZiAodGhpcy5nZXRFdmVudCgpICE9IG51bGwgJiYKKyAgICAgICAgICAgICFSZXF1ZXN0RXZlbnQuTk9ORS5lcXVhbHModGhpcy5nZXRFdmVudCgpKSkgeworICAgICAgdXJsLmFwcGVuZCgiJmV2ZW50PSIpLmFwcGVuZCh0aGlzLmdldEV2ZW50KCkuZ2V0RXZlbnROYW1lKCkpOworICAgIH0KKworICAgIGlmICh0aGlzLmdldElwKCkgIT0gbnVsbCkgeworICAgICAgdXJsLmFwcGVuZCgiJmlwPSIpLmFwcGVuZCh0aGlzLmdldElwKCkpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVVJMKHVybC50b1N0cmluZygpKTsKKyAgfQorCisgIC8vIOino+aekO+8iHBhcnNl77yJdHJhY2tlcuivt+axggorICAvLyDlsIZUcmFja2Vy5pS25Yiw55qEQue8lueggeivt+axguaVsOaNruino+aekOS4uue7k+aehOWMlua2iOaBr+WvueixoeOAggorICBwdWJsaWMgc3RhdGljIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHBhcnNlKEJFVmFsdWUgZGVjb2RlZCkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGVjb2RlZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVjb2RlIHRyYWNrZXIgbWVzc2FnZSAobm90IEItZW5jb2RlZD8pISIpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcyA9IGRlY29kZWQuZ2V0TWFwKCk7CisKKyAgICBpZiAoIXBhcmFtcy5jb250YWluc0tleSgiaW5mb19oYXNoIikpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlLkZhaWx1cmVSZWFzb24uTUlTU0lOR19IQVNILmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgaWYgKCFwYXJhbXMuY29udGFpbnNLZXkoInBlZXJfaWQiKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UuRmFpbHVyZVJlYXNvbi5NSVNTSU5HX1BFRVJfSUQuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBpZiAoIXBhcmFtcy5jb250YWluc0tleSgicG9ydCIpKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgIEVycm9yTWVzc2FnZS5GYWlsdXJlUmVhc29uLk1JU1NJTkdfUE9SVC5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBieXRlW10gaW5mb0hhc2ggPSBwYXJhbXMuZ2V0KCJpbmZvX2hhc2giKS5nZXRCeXRlcygpOworICAgICAgYnl0ZVtdIHBlZXJJZCA9IHBhcmFtcy5nZXQoInBlZXJfaWQiKS5nZXRCeXRlcygpOworICAgICAgaW50IHBvcnQgPSBwYXJhbXMuZ2V0KCJwb3J0IikuZ2V0SW50KCk7CisKKyAgICAgIC8vIERlZmF1bHQgJ3VwbG9hZGVkJyBhbmQgJ2Rvd25sb2FkZWQnIHRvIDAgaWYgdGhlIGNsaWVudCBkb2VzCisgICAgICAvLyBub3QgcHJvdmlkZSBpdCAoYWx0aG91Z2ggaXQgc2hvdWxkLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMpLgorICAgICAgbG9uZyB1cGxvYWRlZCA9IDA7CisgICAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KCJ1cGxvYWRlZCIpKSB7CisgICAgICAgIHVwbG9hZGVkID0gcGFyYW1zLmdldCgidXBsb2FkZWQiKS5nZXRMb25nKCk7CisgICAgICB9CisKKyAgICAgIGxvbmcgZG93bmxvYWRlZCA9IDA7CisgICAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KCJkb3dubG9hZGVkIikpIHsKKyAgICAgICAgZG93bmxvYWRlZCA9IHBhcmFtcy5nZXQoImRvd25sb2FkZWQiKS5nZXRMb25nKCk7CisgICAgICB9CisKKyAgICAgIC8vIERlZmF1bHQgJ2xlZnQnIHRvIC0xIHRvIGF2b2lkIHBlZXJzIGVudGVyaW5nIHRoZSBDT01QTEVURUQKKyAgICAgIC8vIHN0YXRlIHdoZW4gdGhleSBkb24ndCBwcm92aWRlIHRoZSAnbGVmdCcgcGFyYW1ldGVyLgorICAgICAgbG9uZyBsZWZ0ID0gLTE7CisgICAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KCJsZWZ0IikpIHsKKyAgICAgICAgbGVmdCA9IHBhcmFtcy5nZXQoImxlZnQiKS5nZXRMb25nKCk7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gY29tcGFjdCA9IGZhbHNlOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgiY29tcGFjdCIpKSB7CisgICAgICAgIGNvbXBhY3QgPSBwYXJhbXMuZ2V0KCJjb21wYWN0IikuZ2V0SW50KCkgPT0gMTsKKyAgICAgIH0KKworICAgICAgYm9vbGVhbiBub1BlZXJJZCA9IGZhbHNlOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgibm9fcGVlcl9pZCIpKSB7CisgICAgICAgIG5vUGVlcklkID0gcGFyYW1zLmdldCgibm9fcGVlcl9pZCIpLmdldEludCgpID09IDE7CisgICAgICB9CisKKyAgICAgIGludCBudW1XYW50ID0gQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5ERUZBVUxUX05VTV9XQU5UOworICAgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgibnVtd2FudCIpKSB7CisgICAgICAgIG51bVdhbnQgPSBwYXJhbXMuZ2V0KCJudW13YW50IikuZ2V0SW50KCk7CisgICAgICB9CisKKyAgICAgIFN0cmluZyBpcCA9IG51bGw7CisgICAgICBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KCJpcCIpKSB7CisgICAgICAgIGlwID0gcGFyYW1zLmdldCgiaXAiKS5nZXRTdHJpbmcoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworICAgICAgfQorCisgICAgICBSZXF1ZXN0RXZlbnQgZXZlbnQgPSBSZXF1ZXN0RXZlbnQuTk9ORTsKKyAgICAgIGlmIChwYXJhbXMuY29udGFpbnNLZXkoImV2ZW50IikpIHsKKyAgICAgICAgZXZlbnQgPSBSZXF1ZXN0RXZlbnQuZ2V0QnlOYW1lKHBhcmFtcy5nZXQoImV2ZW50IikKKyAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBuZXcgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UoQ29uc3RhbnRzLkVNUFRZX0JVRkZFUiwgaW5mb0hhc2gsCisgICAgICAgICAgICAgIG5ldyBQZWVyKGlwLCBwb3J0LCBCeXRlQnVmZmVyLndyYXAocGVlcklkKSksCisgICAgICAgICAgICAgIHVwbG9hZGVkLCBkb3dubG9hZGVkLCBsZWZ0LCBjb21wYWN0LCBub1BlZXJJZCwKKyAgICAgICAgICAgICAgZXZlbnQsIG51bVdhbnQpOworICAgIH0gY2F0Y2ggKEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gaWJlZSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIHRyYWNrZXIgcmVxdWVzdCEiLCBpYmVlKTsKKyAgICB9CisgIH0KKworICAvLyDliJvlu7rkv6Hmga8KKyAgLy/lsIZKYXZh57G75Z6L5Y+C5pWw6L2s5o2i5Li6Que8lueggeWtl+WFuAorICBwdWJsaWMgc3RhdGljIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGNyYWZ0KGJ5dGVbXSBpbmZvSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGVlcklkLCBpbnQgcG9ydCwgbG9uZyB1cGxvYWRlZCwgbG9uZyBkb3dubG9hZGVkLCBsb25nIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb21wYWN0LCBib29sZWFuIG5vUGVlcklkLCBSZXF1ZXN0RXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlwLCBpbnQgbnVtV2FudCkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBwYXJhbXMucHV0KCJpbmZvX2hhc2giLCBuZXcgQkVWYWx1ZShpbmZvSGFzaCkpOworICAgIHBhcmFtcy5wdXQoInBlZXJfaWQiLCBuZXcgQkVWYWx1ZShwZWVySWQpKTsKKyAgICBwYXJhbXMucHV0KCJwb3J0IiwgbmV3IEJFVmFsdWUocG9ydCkpOworICAgIHBhcmFtcy5wdXQoInVwbG9hZGVkIiwgbmV3IEJFVmFsdWUodXBsb2FkZWQpKTsKKyAgICBwYXJhbXMucHV0KCJkb3dubG9hZGVkIiwgbmV3IEJFVmFsdWUoZG93bmxvYWRlZCkpOworICAgIHBhcmFtcy5wdXQoImxlZnQiLCBuZXcgQkVWYWx1ZShsZWZ0KSk7CisgICAgcGFyYW1zLnB1dCgiY29tcGFjdCIsIG5ldyBCRVZhbHVlKGNvbXBhY3QgPyAxIDogMCkpOworICAgIHBhcmFtcy5wdXQoIm5vX3BlZXJfaWQiLCBuZXcgQkVWYWx1ZShub1BlZXJJZCA/IDEgOiAwKSk7CisKKyAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgcGFyYW1zLnB1dCgiZXZlbnQiLAorICAgICAgICAgICAgICBuZXcgQkVWYWx1ZShldmVudC5nZXRFdmVudE5hbWUoKSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9CisKKyAgICBpZiAoaXAgIT0gbnVsbCkgeworICAgICAgcGFyYW1zLnB1dCgiaXAiLAorICAgICAgICAgICAgICBuZXcgQkVWYWx1ZShpcCwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9CisKKyAgICBpZiAobnVtV2FudCAhPSBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLkRFRkFVTFRfTlVNX1dBTlQpIHsKKyAgICAgIHBhcmFtcy5wdXQoIm51bXdhbnQiLCBuZXcgQkVWYWx1ZShudW1XYW50KSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSgKKyAgICAgICAgICAgIEJFbmNvZGVyLmJlbmNvZGUocGFyYW1zKSwKKyAgICAgICAgICAgIGluZm9IYXNoLCBuZXcgUGVlcihpcCwgcG9ydCwgQnl0ZUJ1ZmZlci53cmFwKHBlZXJJZCkpLAorICAgICAgICAgICAgdXBsb2FkZWQsIGRvd25sb2FkZWQsIGxlZnQsIGNvbXBhY3QsIG5vUGVlcklkLCBldmVudCwgbnVtV2FudCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI1ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC9odHRwL0hUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVzcG9uc2VNZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworCisvKioKKyAqIFRoZSBhbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlIGZyb20gYW4gSFRUUCB0cmFja2VyLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgSFRUUFRyYWNrZXJNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgeworCisgIHByaXZhdGUgZmluYWwgaW50IGludGVydmFsOworICBwcml2YXRlIGZpbmFsIGludCBjb21wbGV0ZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5jb21wbGV0ZTsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlZXI+IHBlZXJzOworICBwcml2YXRlIFN0cmluZyBoZXhJbmZvSGFzaDsKKworICBwcml2YXRlIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgTGlzdDxQZWVyPiBwZWVycykgeworICAgIHN1cGVyKFR5cGUuQU5OT1VOQ0VfUkVTUE9OU0UsIGRhdGEpOworICAgIHRoaXMuaW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICB0aGlzLmNvbXBsZXRlID0gY29tcGxldGU7CisgICAgdGhpcy5pbmNvbXBsZXRlID0gaW5jb21wbGV0ZTsKKyAgICB0aGlzLnBlZXJzID0gcGVlcnM7CisgIH0KKworICBwcml2YXRlIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgTGlzdDxQZWVyPiBwZWVycywgU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgdGhpcyhkYXRhLCBpbnRlcnZhbCwgY29tcGxldGUsIGluY29tcGxldGUsIHBlZXJzKTsKKyAgICB0aGlzLmhleEluZm9IYXNoID0gaGV4SW5mb0hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRJbnRlcnZhbCgpIHsKKyAgICByZXR1cm4gdGhpcy5pbnRlcnZhbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldENvbXBsZXRlKCkgeworICAgIHJldHVybiB0aGlzLmNvbXBsZXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW5jb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5pbmNvbXBsZXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFBlZXI+IGdldFBlZXJzKCkgeworICAgIHJldHVybiB0aGlzLnBlZXJzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gdGhpcy5oZXhJbmZvSGFzaDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHBhcnNlKEJFVmFsdWUgZGVjb2RlZCkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGVjb2RlZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVjb2RlIHRyYWNrZXIgbWVzc2FnZSAobm90IEItZW5jb2RlZD8pISIpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcyA9IGRlY29kZWQuZ2V0TWFwKCk7CisKKyAgICBpZiAocGFyYW1zLmdldCgiaW50ZXJ2YWwiKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIlRyYWNrZXIgbWVzc2FnZSBtaXNzaW5nIG1hbmRhdG9yeSBmaWVsZCAnaW50ZXJ2YWwnISIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBMaXN0PFBlZXI+IHBlZXJzOworCisgICAgICB0cnkgeworICAgICAgICAvLyBGaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBhIGNvbXBhY3QgcmVzcG9uc2UsIHNpbmNlIHdlIGFza2VkCisgICAgICAgIC8vIGZvciBpdC4KKyAgICAgICAgcGVlcnMgPSB0b1BlZXJMaXN0KHBhcmFtcy5nZXQoInBlZXJzIikuZ2V0Qnl0ZXMoKSk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGliZWUpIHsKKyAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHBlZXIgbGlzdCwgbm9uLWNvbXBhY3QgcmVzcG9uc2UsIGluIGNhc2UgdGhlCisgICAgICAgIC8vIHRyYWNrZXIgZGlkIG5vdCBzdXBwb3J0IGNvbXBhY3QgcmVzcG9uc2VzLgorICAgICAgICBwZWVycyA9IHRvUGVlckxpc3QocGFyYW1zLmdldCgicGVlcnMiKS5nZXRMaXN0KCkpOworICAgICAgfQorCisgICAgICBpZiAocGFyYW1zLmdldCgidG9ycmVudElkZW50aWZpZXIiKSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBuZXcgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKENvbnN0YW50cy5FTVBUWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgcGFyYW1zLmdldCgiaW50ZXJ2YWwiKS5nZXRJbnQoKSwKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0KCJjb21wbGV0ZSIpICE9IG51bGwgPyBwYXJhbXMuZ2V0KCJjb21wbGV0ZSIpLmdldEludCgpIDogMCwKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0KCJpbmNvbXBsZXRlIikgIT0gbnVsbCA/IHBhcmFtcy5nZXQoImluY29tcGxldGUiKS5nZXRJbnQoKSA6IDAsCisgICAgICAgICAgICAgICAgcGVlcnMsIHBhcmFtcy5nZXQoInRvcnJlbnRJZGVudGlmaWVyIikuZ2V0U3RyaW5nKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoQ29uc3RhbnRzLkVNUFRZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0KCJpbnRlcnZhbCIpLmdldEludCgpLAorICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoImNvbXBsZXRlIikgIT0gbnVsbCA/IHBhcmFtcy5nZXQoImNvbXBsZXRlIikuZ2V0SW50KCkgOiAwLAorICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoImluY29tcGxldGUiKSAhPSBudWxsID8gcGFyYW1zLmdldCgiaW5jb21wbGV0ZSIpLmdldEludCgpIDogMCwKKyAgICAgICAgICAgICAgICBwZWVycyk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbiBpYmVlKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkludmFsaWQgcmVzcG9uc2UgIiArCisgICAgICAgICAgICAgICJmcm9tIHRyYWNrZXIhIiwgaWJlZSk7CisgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gdWhlKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkludmFsaWQgcGVlciAiICsKKyAgICAgICAgICAgICAgImluIHRyYWNrZXIgcmVzcG9uc2UhIiwgdWhlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQnVpbGQgYSBwZWVyIGxpc3QgYXMgYSBsaXN0IG9mIHtAbGluayBQZWVyfXMgZnJvbSB0aGUKKyAgICogYW5ub3VuY2UgcmVzcG9uc2UncyBwZWVyIGxpc3QgKGluIG5vbi1jb21wYWN0IG1vZGUpLgorICAgKgorICAgKiBAcGFyYW0gcGVlcnMgVGhlIGxpc3Qgb2Yge0BsaW5rIEJFVmFsdWV9cyBkaWN0aW9uYXJpZXMgZGVzY3JpYmluZyB0aGUKKyAgICogICAgICAgICAgICAgIHBlZXJzIGZyb20gdGhlIGFubm91bmNlIHJlc3BvbnNlLgorICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBQZWVyfXMgcmVwcmVzZW50aW5nIHRoZQorICAgKiBwZWVycycgYWRkcmVzc2VzLiBQZWVyIElEcyBhcmUgbG9zdCwgYnV0IHRoZXkgYXJlIG5vdCBjcnVjaWFsLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxQZWVyPiB0b1BlZXJMaXN0KExpc3Q8QkVWYWx1ZT4gcGVlcnMpCisgICAgICAgICAgdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24geworICAgIExpc3Q8UGVlcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8UGVlcj4oKTsKKworICAgIGZvciAoQkVWYWx1ZSBwZWVyIDogcGVlcnMpIHsKKyAgICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBlZXJJbmZvID0gcGVlci5nZXRNYXAoKTsKKyAgICAgIHJlc3VsdC5hZGQobmV3IFBlZXIoCisgICAgICAgICAgICAgIHBlZXJJbmZvLmdldCgiaXAiKS5nZXRTdHJpbmcoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpLAorICAgICAgICAgICAgICBwZWVySW5mby5nZXQoInBvcnQiKS5nZXRJbnQoKSkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQnVpbGQgYSBwZWVyIGxpc3QgYXMgYSBsaXN0IG9mIHtAbGluayBQZWVyfXMgZnJvbSB0aGUKKyAgICogYW5ub3VuY2UgcmVzcG9uc2UncyBiaW5hcnkgY29tcGFjdCBwZWVyIGxpc3QuCisgICAqCisgICAqIEBwYXJhbSBkYXRhIFRoZSBieXRlcyByZXByZXNlbnRpbmcgdGhlIGNvbXBhY3QgcGVlciBsaXN0IGZyb20gdGhlCisgICAqICAgICAgICAgICAgIGFubm91bmNlIHJlc3BvbnNlLgorICAgKiBAcmV0dXJuIEEge0BsaW5rIExpc3R9IG9mIHtAbGluayBQZWVyfXMgcmVwcmVzZW50aW5nIHRoZQorICAgKiBwZWVycycgYWRkcmVzc2VzLiBQZWVyIElEcyBhcmUgbG9zdCwgYnV0IHRoZXkgYXJlIG5vdCBjcnVjaWFsLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxQZWVyPiB0b1BlZXJMaXN0KGJ5dGVbXSBkYXRhKQorICAgICAgICAgIHRocm93cyBJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgaWYgKGRhdGEubGVuZ3RoICUgNiAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZEJFbmNvZGluZ0V4Y2VwdGlvbigiSW52YWxpZCBwZWVycyAiICsKKyAgICAgICAgICAgICAgImJpbmFyeSBpbmZvcm1hdGlvbiBzdHJpbmchIik7CisgICAgfQorCisgICAgTGlzdDxQZWVyPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxQZWVyPigpOworICAgIEJ5dGVCdWZmZXIgcGVlcnMgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoIC8gNjsgaSsrKSB7CisgICAgICBieXRlW10gaXBCeXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgcGVlcnMuZ2V0KGlwQnl0ZXMpOworICAgICAgSW5ldEFkZHJlc3MgaXAgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaXBCeXRlcyk7CisgICAgICBpbnQgcG9ydCA9CisgICAgICAgICAgICAgICgweEZGICYgKGludCkgcGVlcnMuZ2V0KCkpIDw8IDggfAorICAgICAgICAgICAgICAgICAgICAgICgweEZGICYgKGludCkgcGVlcnMuZ2V0KCkpOworICAgICAgcmVzdWx0LmFkZChuZXcgUGVlcihuZXcgSW5ldFNvY2tldEFkZHJlc3MoaXAsIHBvcnQpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBDcmFmdCBhIGNvbXBhY3QgYW5ub3VuY2UgcmVzcG9uc2UgbWVzc2FnZSB3aXRoIGEgdG9ycmVudCBpZGVudGlmaWVyLgorICAgKgorICAgKiBAcGFyYW0gaW50ZXJ2YWwKKyAgICogQHBhcmFtIGNvbXBsZXRlCisgICAqIEBwYXJhbSBpbmNvbXBsZXRlCisgICAqIEBwYXJhbSBwZWVycworICAgKi8KKyAgcHVibGljIHN0YXRpYyBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgY3JhZnQoaW50IGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGxldGUsIGludCBpbmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBlZXI+IHBlZXJzLCBTdHJpbmcgaGV4SW5mb0hhc2gpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gcmVzcG9uc2UgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgcmVzcG9uc2UucHV0KCJpbnRlcnZhbCIsIG5ldyBCRVZhbHVlKGludGVydmFsKSk7CisgICAgcmVzcG9uc2UucHV0KCJjb21wbGV0ZSIsIG5ldyBCRVZhbHVlKGNvbXBsZXRlKSk7CisgICAgcmVzcG9uc2UucHV0KCJpbmNvbXBsZXRlIiwgbmV3IEJFVmFsdWUoaW5jb21wbGV0ZSkpOworICAgIGlmIChoZXhJbmZvSGFzaCAhPSBudWxsKSB7CisgICAgICByZXNwb25zZS5wdXQoInRvcnJlbnRJZGVudGlmaWVyIiwgbmV3IEJFVmFsdWUoaGV4SW5mb0hhc2gpKTsKKyAgICB9CisKKyAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHBlZXJzLnNpemUoKSAqIDYpOworICAgIGZvciAoUGVlciBwZWVyIDogcGVlcnMpIHsKKyAgICAgIGJ5dGVbXSBpcCA9IHBlZXIuZ2V0UmF3SXAoKTsKKyAgICAgIGlmIChpcCA9PSBudWxsIHx8IGlwLmxlbmd0aCAhPSA0KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZGF0YS5wdXQoaXApOworICAgICAgZGF0YS5wdXRTaG9ydCgoc2hvcnQpIHBlZXIuZ2V0UG9ydCgpKTsKKyAgICB9CisgICAgcmVzcG9uc2UucHV0KCJwZWVycyIsIG5ldyBCRVZhbHVlKEFycmF5cy5jb3B5T2YoZGF0YS5hcnJheSgpLCBkYXRhLnBvc2l0aW9uKCkpKSk7CisKKyAgICByZXR1cm4gbmV3IEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSgKKyAgICAgICAgICAgIEJFbmNvZGVyLmJlbmNvZGUocmVzcG9uc2UpLAorICAgICAgICAgICAgaW50ZXJ2YWwsIGNvbXBsZXRlLCBpbmNvbXBsZXRlLCBwZWVycywgaGV4SW5mb0hhc2gpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQVHJhY2tlckVycm9yTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiM2QxYTcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLkVycm9yTWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQW4gZXJyb3IgbWVzc2FnZSBmcm9tIGFuIEhUVFAgdHJhY2tlci4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlIGV4dGVuZHMgSFRUUFRyYWNrZXJNZXNzYWdlCisgICAgICAgIGltcGxlbWVudHMgRXJyb3JNZXNzYWdlIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWFzb247CisKKyAgcHJpdmF0ZSBIVFRQVHJhY2tlckVycm9yTWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsIFN0cmluZyByZWFzb24pIHsKKyAgICBzdXBlcihUeXBlLkVSUk9SLCBkYXRhKTsKKyAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZWFzb247CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlIHBhcnNlKEJFVmFsdWUgZGVjb2RlZCkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGVjb2RlZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVjb2RlIHRyYWNrZXIgbWVzc2FnZSAobm90IEItZW5jb2RlZD8pISIpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcyA9IGRlY29kZWQuZ2V0TWFwKCk7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBIVFRQVHJhY2tlckVycm9yTWVzc2FnZSgKKyAgICAgICAgICAgICAgQ29uc3RhbnRzLkVNUFRZX0JVRkZFUiwKKyAgICAgICAgICAgICAgcGFyYW1zLmdldCgiZmFpbHVyZSByZWFzb24iKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGliZWUpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCB0cmFja2VyIGVycm9yICIgKworICAgICAgICAgICAgICAibWVzc2FnZSEiLCBpYmVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlIGNyYWZ0KAorICAgICAgICAgIEVycm9yTWVzc2FnZS5GYWlsdXJlUmVhc29uIHJlYXNvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UuY3JhZnQocmVhc29uLmdldE1lc3NhZ2UoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlIGNyYWZ0KFN0cmluZyByZWFzb24pCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgcGFyYW1zLnB1dCgiZmFpbHVyZSByZWFzb24iLAorICAgICAgICAgICAgbmV3IEJFVmFsdWUocmVhc29uLCBDb25zdGFudHMuQllURV9FTkNPRElORykpOworICAgIHJldHVybiBuZXcgSFRUUFRyYWNrZXJFcnJvck1lc3NhZ2UoCisgICAgICAgICAgICBCRW5jb2Rlci5iZW5jb2RlKHBhcmFtcyksCisgICAgICAgICAgICByZWFzb24pOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUFRyYWNrZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5YzJiYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQVHJhY2tlck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgSFRUUCB0cmFja2VyIG1lc3NhZ2VzLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSFRUUFRyYWNrZXJNZXNzYWdlIGV4dGVuZHMgVHJhY2tlck1lc3NhZ2UgeworCisgIHByb3RlY3RlZCBIVFRQVHJhY2tlck1lc3NhZ2UoVHlwZSB0eXBlLCBCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICBzdXBlcih0eXBlLCBkYXRhKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSFRUUFRyYWNrZXJNZXNzYWdlIHBhcnNlKElucHV0U3RyZWFtIGRhdGEpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgQkVWYWx1ZSBkZWNvZGVkID0gQkRlY29kZXIuYmRlY29kZShkYXRhKTsKKyAgICBpZiAoZGVjb2RlZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBkZWNvZGUgdHJhY2tlciBtZXNzYWdlIChub3QgQi1lbmNvZGVkPykhOiAiKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcnNlKGRlY29kZWQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBIVFRQVHJhY2tlck1lc3NhZ2UgcGFyc2UoQkVWYWx1ZSBkZWNvZGVkKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiBwYXJhbXMgPSBkZWNvZGVkLmdldE1hcCgpOworCisgICAgaWYgKHBhcmFtcy5jb250YWluc0tleSgiaW5mb19oYXNoIikpIHsKKyAgICAgIHJldHVybiBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5wYXJzZShkZWNvZGVkKTsKKyAgICB9IGVsc2UgaWYgKHBhcmFtcy5jb250YWluc0tleSgicGVlcnMiKSkgeworICAgICAgcmV0dXJuIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5wYXJzZShkZWNvZGVkKTsKKyAgICB9IGVsc2UgaWYgKHBhcmFtcy5jb250YWluc0tleSgiZmFpbHVyZSByZWFzb24iKSkgeworICAgICAgcmV0dXJuIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlLnBhcnNlKGRlY29kZWQpOworICAgIH0KKworICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBIVFRQIHRyYWNrZXIgbWVzc2FnZSEiKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1M2IwMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0NEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworCisvKioKKyAqIFRoZSBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2UgZm9yIHRoZSBVRFAgdHJhY2tlciBwcm90b2NvbC4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgZXh0ZW5kcyBVRFBUcmFja2VyTWVzc2FnZS5VRFBUcmFja2VyUmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgaW1wbGVtZW50cyBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX0FOTk9VTkNFX1JFUVVFU1RfTUVTU0FHRV9TSVpFID0gOTg7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbm5lY3Rpb25JZDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgYWN0aW9uSWQgPSBUeXBlLkFOTk9VTkNFX1JFUVVFU1QuZ2V0SWQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJhbnNhY3Rpb25JZDsKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5mb0hhc2g7CisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHBlZXJJZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGRvd25sb2FkZWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyB1cGxvYWRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGxlZnQ7CisgIHByaXZhdGUgZmluYWwgUmVxdWVzdEV2ZW50IGV2ZW50OworICBwcml2YXRlIGZpbmFsIEluZXRBZGRyZXNzIGlwOworICBwcml2YXRlIGZpbmFsIGludCBudW1XYW50OworICBwcml2YXRlIGZpbmFsIGludCBrZXk7CisgIHByaXZhdGUgZmluYWwgc2hvcnQgcG9ydDsKKworICBwcml2YXRlIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLCBsb25nIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2FjdGlvbklkLCBieXRlW10gaW5mb0hhc2gsIGJ5dGVbXSBwZWVySWQsIGxvbmcgZG93bmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdXBsb2FkZWQsIGxvbmcgbGVmdCwgUmVxdWVzdEV2ZW50IGV2ZW50LCBJbmV0QWRkcmVzcyBpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXksIGludCBudW1XYW50LCBzaG9ydCBwb3J0KSB7CisgICAgc3VwZXIoVHlwZS5BTk5PVU5DRV9SRVFVRVNULCBkYXRhKTsKKyAgICB0aGlzLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICB0aGlzLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIHRoaXMuaW5mb0hhc2ggPSBpbmZvSGFzaDsKKyAgICB0aGlzLnBlZXJJZCA9IHBlZXJJZDsKKyAgICB0aGlzLmRvd25sb2FkZWQgPSBkb3dubG9hZGVkOworICAgIHRoaXMudXBsb2FkZWQgPSB1cGxvYWRlZDsKKyAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgIHRoaXMuZXZlbnQgPSBldmVudDsKKyAgICB0aGlzLmlwID0gaXA7CisgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgdGhpcy5udW1XYW50ID0gbnVtV2FudDsKKyAgICB0aGlzLnBvcnQgPSBwb3J0OworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEFjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIHRoaXMuaW5mb0hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHRoaXMuaW5mb0hhc2gpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0UGVlcklkKCkgeworICAgIHJldHVybiB0aGlzLnBlZXJJZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleFBlZXJJZCgpIHsKKyAgICByZXR1cm4gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHRoaXMucGVlcklkKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgcmV0dXJuIHRoaXMucG9ydDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRVcGxvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy51cGxvYWRlZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXREb3dubG9hZGVkKCkgeworICAgIHJldHVybiB0aGlzLmRvd25sb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0TGVmdCgpIHsKKyAgICByZXR1cm4gdGhpcy5sZWZ0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQ29tcGFjdCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBjYW5PbWl0UGVlcklkKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXF1ZXN0RXZlbnQgZ2V0RXZlbnQoKSB7CisgICAgcmV0dXJuIHRoaXMuZXZlbnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKKyAgICByZXR1cm4gdGhpcy5pcC50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0TnVtV2FudCgpIHsKKyAgICByZXR1cm4gdGhpcy5udW1XYW50OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFRyYWNrZXJJZCgpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBkYXRhKQorICAgICAgICAgIHRocm93cyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgaWYgKGRhdGEucmVtYWluaW5nKCkgIT0gVURQX0FOTk9VTkNFX1JFUVVFU1RfTUVTU0FHRV9TSVpFKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGFubm91bmNlIHJlcXVlc3QgbWVzc2FnZSBzaXplISIpOworICAgIH0KKworICAgIGxvbmcgY29ubmVjdGlvbklkID0gZGF0YS5nZXRMb25nKCk7CisKKyAgICBpZiAoZGF0YS5nZXRJbnQoKSAhPSBUeXBlLkFOTk9VTkNFX1JFUVVFU1QuZ2V0SWQoKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhY3Rpb24gY29kZSBmb3IgYW5ub3VuY2UgcmVxdWVzdCEiKTsKKyAgICB9CisKKyAgICBpbnQgdHJhbnNhY3Rpb25JZCA9IGRhdGEuZ2V0SW50KCk7CisgICAgYnl0ZVtdIGluZm9IYXNoID0gbmV3IGJ5dGVbMjBdOworICAgIGRhdGEuZ2V0KGluZm9IYXNoKTsKKyAgICBieXRlW10gcGVlcklkID0gbmV3IGJ5dGVbMjBdOworICAgIGRhdGEuZ2V0KHBlZXJJZCk7CisgICAgbG9uZyBkb3dubG9hZGVkID0gZGF0YS5nZXRMb25nKCk7CisgICAgbG9uZyB1cGxvYWRlZCA9IGRhdGEuZ2V0TG9uZygpOworICAgIGxvbmcgbGVmdCA9IGRhdGEuZ2V0TG9uZygpOworCisgICAgUmVxdWVzdEV2ZW50IGV2ZW50ID0gUmVxdWVzdEV2ZW50LmdldEJ5SWQoZGF0YS5nZXRJbnQoKSk7CisgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgZXZlbnQgdHlwZSBpbiBhbm5vdW5jZSByZXF1ZXN0ISIpOworICAgIH0KKworICAgIEluZXRBZGRyZXNzIGlwID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGlwQnl0ZXMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgIGRhdGEuZ2V0KGlwQnl0ZXMpOworICAgICAgaXAgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaXBCeXRlcyk7CisgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gdWhlKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIElQIGFkZHJlc3MgaW4gYW5ub3VuY2UgcmVxdWVzdCEiKTsKKyAgICB9CisKKyAgICBpbnQga2V5ID0gZGF0YS5nZXRJbnQoKTsKKyAgICBpbnQgbnVtV2FudCA9IGRhdGEuZ2V0SW50KCk7CisgICAgc2hvcnQgcG9ydCA9IGRhdGEuZ2V0U2hvcnQoKTsKKworICAgIHJldHVybiBuZXcgVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZShkYXRhLAorICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGluZm9IYXNoLAorICAgICAgICAgICAgcGVlcklkLAorICAgICAgICAgICAgZG93bmxvYWRlZCwKKyAgICAgICAgICAgIHVwbG9hZGVkLAorICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgaXAsCisgICAgICAgICAgICBrZXksCisgICAgICAgICAgICBudW1XYW50LAorICAgICAgICAgICAgcG9ydCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgY3JhZnQobG9uZyBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNhY3Rpb25JZCwgYnl0ZVtdIGluZm9IYXNoLCBieXRlW10gcGVlcklkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVwbG9hZGVkLCBsb25nIGxlZnQsIFJlcXVlc3RFdmVudCBldmVudCwgSW5ldEFkZHJlc3MgaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5LCBpbnQgbnVtV2FudCwgaW50IHBvcnQpIHsKKyAgICBpZiAoaW5mb0hhc2gubGVuZ3RoICE9IDIwIHx8IHBlZXJJZC5sZW5ndGggIT0gMjApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBpZiAoIShpcCBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgSVB2NCBhZGRyZXNzZXMgYXJlICIgKworICAgICAgICAgICAgICAic3VwcG9ydGVkIGJ5IHRoZSBVRFAgdHJhY2VyIHByb3RvY29sISIpOworICAgIH0KKworICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoVURQX0FOTk9VTkNFX1JFUVVFU1RfTUVTU0FHRV9TSVpFKTsKKyAgICBkYXRhLnB1dExvbmcoY29ubmVjdGlvbklkKTsKKyAgICBkYXRhLnB1dEludChUeXBlLkFOTk9VTkNFX1JFUVVFU1QuZ2V0SWQoKSk7CisgICAgZGF0YS5wdXRJbnQodHJhbnNhY3Rpb25JZCk7CisgICAgZGF0YS5wdXQoaW5mb0hhc2gpOworICAgIGRhdGEucHV0KHBlZXJJZCk7CisgICAgZGF0YS5wdXRMb25nKGRvd25sb2FkZWQpOworICAgIGRhdGEucHV0TG9uZyhsZWZ0KTsKKyAgICBkYXRhLnB1dExvbmcodXBsb2FkZWQpOworICAgIGRhdGEucHV0SW50KGV2ZW50LmdldElkKCkpOworICAgIGRhdGEucHV0KGlwLmdldEFkZHJlc3MoKSk7CisgICAgZGF0YS5wdXRJbnQoa2V5KTsKKyAgICBkYXRhLnB1dEludChudW1XYW50KTsKKyAgICBkYXRhLnB1dFNob3J0KChzaG9ydCkgcG9ydCk7CisgICAgcmV0dXJuIG5ldyBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW5mb0hhc2gsCisgICAgICAgICAgICBwZWVySWQsCisgICAgICAgICAgICBkb3dubG9hZGVkLAorICAgICAgICAgICAgdXBsb2FkZWQsCisgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICBpcCwKKyAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgIG51bVdhbnQsCisgICAgICAgICAgICAoc2hvcnQpIHBvcnQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjVjMzRiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlc3BvbnNlTWVzc2FnZTsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhlIGFubm91bmNlIHJlc3BvbnNlIG1lc3NhZ2UgZm9yIHRoZSBVRFAgdHJhY2tlciBwcm90b2NvbC4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlCisgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZQorICAgICAgICBpbXBsZW1lbnRzIEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX0FOTk9VTkNFX1JFU1BPTlNFX01JTl9NRVNTQUdFX1NJWkUgPSAyMDsKKworICBwcml2YXRlIGZpbmFsIGludCBhY3Rpb25JZCA9IFR5cGUuQU5OT1VOQ0VfUkVTUE9OU0UuZ2V0SWQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJhbnNhY3Rpb25JZDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW50ZXJ2YWw7CisgIHByaXZhdGUgZmluYWwgaW50IGNvbXBsZXRlOworICBwcml2YXRlIGZpbmFsIGludCBpbmNvbXBsZXRlOworICBwcml2YXRlIGZpbmFsIExpc3Q8UGVlcj4gcGVlcnM7CisKKyAgcHJpdmF0ZSBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZShCeXRlQnVmZmVyIGRhdGEsIGludCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgTGlzdDxQZWVyPiBwZWVycykgeworICAgIHN1cGVyKFR5cGUuQU5OT1VOQ0VfUkVRVUVTVCwgZGF0YSk7CisgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOworICAgIHRoaXMuaW5jb21wbGV0ZSA9IGluY29tcGxldGU7CisgICAgdGhpcy5wZWVycyA9IHBlZXJzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuYWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRJbnRlcnZhbCgpIHsKKyAgICByZXR1cm4gdGhpcy5pbnRlcnZhbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldENvbXBsZXRlKCkgeworICAgIHJldHVybiB0aGlzLmNvbXBsZXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0SW5jb21wbGV0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5pbmNvbXBsZXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PFBlZXI+IGdldFBlZXJzKCkgeworICAgIHJldHVybiB0aGlzLnBlZXJzOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgZGF0YSkKKyAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIGlmIChkYXRhLnJlbWFpbmluZygpIDwgVURQX0FOTk9VTkNFX1JFU1BPTlNFX01JTl9NRVNTQUdFX1NJWkUgfHwKKyAgICAgICAgICAgIChkYXRhLnJlbWFpbmluZygpIC0gVURQX0FOTk9VTkNFX1JFU1BPTlNFX01JTl9NRVNTQUdFX1NJWkUpICUgNiAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGFubm91bmNlIHJlc3BvbnNlIG1lc3NhZ2Ugc2l6ZSEiKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5nZXRJbnQoKSAhPSBUeXBlLkFOTk9VTkNFX1JFU1BPTlNFLmdldElkKCkpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgYWN0aW9uIGNvZGUgZm9yIGFubm91bmNlIHJlc3BvbnNlISIpOworICAgIH0KKworICAgIGludCB0cmFuc2FjdGlvbklkID0gZGF0YS5nZXRJbnQoKTsKKyAgICBpbnQgaW50ZXJ2YWwgPSBkYXRhLmdldEludCgpOworICAgIGludCBpbmNvbXBsZXRlID0gZGF0YS5nZXRJbnQoKTsKKyAgICBpbnQgY29tcGxldGUgPSBkYXRhLmdldEludCgpOworCisgICAgTGlzdDxQZWVyPiBwZWVycyA9IG5ldyBMaW5rZWRMaXN0PFBlZXI+KCk7CisgICAgaW50IHRvdGFsUGVlcnNJblJlc3BvbnNlID0gZGF0YS5yZW1haW5pbmcoKSAvIDY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbFBlZXJzSW5SZXNwb25zZTsgaSsrKSB7CisgICAgICB0cnkgeworICAgICAgICBieXRlW10gaXBCeXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgICBkYXRhLmdldChpcEJ5dGVzKTsKKyAgICAgICAgSW5ldEFkZHJlc3MgaXAgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaXBCeXRlcyk7CisgICAgICAgIGludCBwb3J0ID0KKyAgICAgICAgICAgICAgICAoMHhGRiAmIChpbnQpIGRhdGEuZ2V0KCkpIDw8IDggfAorICAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYgJiAoaW50KSBkYXRhLmdldCgpKTsKKyAgICAgICAgcGVlcnMuYWRkKG5ldyBQZWVyKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpcCwgcG9ydCkpKTsKKyAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgeworICAgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkludmFsaWQgSVAgYWRkcmVzcyBpbiBhbm5vdW5jZSByZXF1ZXN0ISIpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcgVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICAgICAgICAgIGNvbXBsZXRlLAorICAgICAgICAgICAgaW5jb21wbGV0ZSwKKyAgICAgICAgICAgIHBlZXJzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgY3JhZnQoaW50IHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsLCBpbnQgY29tcGxldGUsIGludCBpbmNvbXBsZXRlLCBMaXN0PFBlZXI+IHBlZXJzKSB7CisgICAgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlcgorICAgICAgICAgICAgLmFsbG9jYXRlKFVEUF9BTk5PVU5DRV9SRVNQT05TRV9NSU5fTUVTU0FHRV9TSVpFICsgNiAqIHBlZXJzLnNpemUoKSk7CisgICAgZGF0YS5wdXRJbnQoVHlwZS5BTk5PVU5DRV9SRVNQT05TRS5nZXRJZCgpKTsKKyAgICBkYXRhLnB1dEludCh0cmFuc2FjdGlvbklkKTsKKyAgICBkYXRhLnB1dEludChpbnRlcnZhbCk7CisKKyAgICAvKioKKyAgICAgKiBMZWVjaGVycyAoaW5jb21wbGV0ZSkgYXJlIGZpcnN0LCBiZWZvcmUgc2VlZGVycyAoY29tcGxldGUpIGluIHRoZSBwYWNrZXQuCisgICAgICovCisgICAgZGF0YS5wdXRJbnQoaW5jb21wbGV0ZSk7CisgICAgZGF0YS5wdXRJbnQoY29tcGxldGUpOworCisgICAgZm9yIChQZWVyIHBlZXIgOiBwZWVycykgeworICAgICAgYnl0ZVtdIGlwID0gcGVlci5nZXRSYXdJcCgpOworICAgICAgaWYgKGlwID09IG51bGwgfHwgaXAubGVuZ3RoICE9IDQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGRhdGEucHV0KGlwKTsKKyAgICAgIGRhdGEucHV0U2hvcnQoKHNob3J0KSBwZWVyLmdldFBvcnQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZShkYXRhLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludGVydmFsLAorICAgICAgICAgICAgY29tcGxldGUsCisgICAgICAgICAgICBpbmNvbXBsZXRlLAorICAgICAgICAgICAgcGVlcnMpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5Yjk4MQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisKKy8qKgorICogVGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgVURQIHRyYWNrZXIgcHJvdG9jb2wuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBVRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgZXh0ZW5kcyBVRFBUcmFja2VyTWVzc2FnZS5VRFBUcmFja2VyUmVxdWVzdE1lc3NhZ2UKKyAgICAgICAgaW1wbGVtZW50cyBUcmFja2VyTWVzc2FnZS5Db25uZWN0aW9uUmVxdWVzdE1lc3NhZ2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfQ09OTkVDVF9SRVFVRVNUX01FU1NBR0VfU0laRSA9IDE2OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVEUF9DT05ORUNUX1JFUVVFU1RfTUFHSUMgPSAweDQxNzI3MTAxOTgwTDsKKworICBwcml2YXRlIGZpbmFsIGxvbmcgY29ubmVjdGlvbklkID0gVURQX0NPTk5FQ1RfUkVRVUVTVF9NQUdJQzsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgYWN0aW9uSWQgPSBUeXBlLkNPTk5FQ1RfUkVRVUVTVC5nZXRJZCgpOworICBwcml2YXRlIGZpbmFsIGludCB0cmFuc2FjdGlvbklkOworCisgIHByaXZhdGUgVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlKEJ5dGVCdWZmZXIgZGF0YSwgaW50IHRyYW5zYWN0aW9uSWQpIHsKKyAgICBzdXBlcihUeXBlLkNPTk5FQ1RfUkVRVUVTVCwgZGF0YSk7CisgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRBY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy5hY3Rpb25JZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFRyYW5zYWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25JZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgZGF0YSkKKyAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIGlmIChkYXRhLnJlbWFpbmluZygpICE9IFVEUF9DT05ORUNUX1JFUVVFU1RfTUVTU0FHRV9TSVpFKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGNvbm5lY3QgcmVxdWVzdCBtZXNzYWdlIHNpemUhIik7CisgICAgfQorCisgICAgaWYgKGRhdGEuZ2V0TG9uZygpICE9IFVEUF9DT05ORUNUX1JFUVVFU1RfTUFHSUMpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgY29ubmVjdGlvbiBJRCBpbiBjb25uZWN0aW9uIHJlcXVlc3QhIik7CisgICAgfQorCisgICAgaWYgKGRhdGEuZ2V0SW50KCkgIT0gVHlwZS5DT05ORUNUX1JFUVVFU1QuZ2V0SWQoKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhY3Rpb24gY29kZSBmb3IgY29ubmVjdGlvbiByZXF1ZXN0ISIpOworICAgIH0KKworICAgIHJldHVybiBuZXcgVURQQ29ubmVjdFJlcXVlc3RNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICBkYXRhLmdldEludCgpIC8vIHRyYW5zYWN0aW9uSWQKKyAgICApOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UgY3JhZnQoaW50IHRyYW5zYWN0aW9uSWQpIHsKKyAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyCisgICAgICAgICAgICAuYWxsb2NhdGUoVURQX0NPTk5FQ1RfUkVRVUVTVF9NRVNTQUdFX1NJWkUpOworICAgIGRhdGEucHV0TG9uZyhVRFBfQ09OTkVDVF9SRVFVRVNUX01BR0lDKTsKKyAgICBkYXRhLnB1dEludChUeXBlLkNPTk5FQ1RfUkVRVUVTVC5nZXRJZCgpKTsKKyAgICBkYXRhLnB1dEludCh0cmFuc2FjdGlvbklkKTsKKyAgICByZXR1cm4gbmV3IFVEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZShkYXRhLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTZiM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisKKy8qKgorICogVGhlIGNvbm5lY3Rpb24gcmVzcG9uc2UgbWVzc2FnZSBmb3IgdGhlIFVEUCB0cmFja2VyIHByb3RvY29sLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZQorICAgICAgICBleHRlbmRzIFVEUFRyYWNrZXJNZXNzYWdlLlVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UKKyAgICAgICAgaW1wbGVtZW50cyBUcmFja2VyTWVzc2FnZS5Db25uZWN0aW9uUmVzcG9uc2VNZXNzYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVURQX0NPTk5FQ1RfUkVTUE9OU0VfTUVTU0FHRV9TSVpFID0gMTY7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgYWN0aW9uSWQgPSBUeXBlLkNPTk5FQ1RfUkVTUE9OU0UuZ2V0SWQoKTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdHJhbnNhY3Rpb25JZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbm5lY3Rpb25JZDsKKworICBwcml2YXRlIFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UoQnl0ZUJ1ZmZlciBkYXRhLCBpbnQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29ubmVjdGlvbklkKSB7CisgICAgc3VwZXIoVHlwZS5DT05ORUNUX1JFU1BPTlNFLCBkYXRhKTsKKyAgICB0aGlzLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuYWN0aW9uSWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRUcmFuc2FjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uSWQ7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbklkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlIHBhcnNlKEJ5dGVCdWZmZXIgZGF0YSkKKyAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIGlmIChkYXRhLnJlbWFpbmluZygpICE9IFVEUF9DT05ORUNUX1JFU1BPTlNFX01FU1NBR0VfU0laRSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBjb25uZWN0IHJlc3BvbnNlIG1lc3NhZ2Ugc2l6ZSEiKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5nZXRJbnQoKSAhPSBUeXBlLkNPTk5FQ1RfUkVTUE9OU0UuZ2V0SWQoKSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBhY3Rpb24gY29kZSBmb3IgY29ubmVjdGlvbiByZXNwb25zZSEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIGRhdGEuZ2V0SW50KCksIC8vIHRyYW5zYWN0aW9uSWQKKyAgICAgICAgICAgIGRhdGEuZ2V0TG9uZygpIC8vIGNvbm5lY3Rpb25JZAorICAgICk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UgY3JhZnQoaW50IHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbm5lY3Rpb25JZCkgeworICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIKKyAgICAgICAgICAgIC5hbGxvY2F0ZShVRFBfQ09OTkVDVF9SRVNQT05TRV9NRVNTQUdFX1NJWkUpOworICAgIGRhdGEucHV0SW50KFR5cGUuQ09OTkVDVF9SRVNQT05TRS5nZXRJZCgpKTsKKyAgICBkYXRhLnB1dEludCh0cmFuc2FjdGlvbklkKTsKKyAgICBkYXRhLnB1dExvbmcoY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gbmV3IFVEUENvbm5lY3RSZXNwb25zZU1lc3NhZ2UoZGF0YSwKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBjb25uZWN0aW9uSWQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyRXJyb3JNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyRXJyb3JNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NjE3NwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUFRyYWNrZXJFcnJvck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50czsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworCisvKioKKyAqIFRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgVURQIHRyYWNrZXIgcHJvdG9jb2wuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBVRFBUcmFja2VyRXJyb3JNZXNzYWdlCisgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZQorICAgICAgICBpbXBsZW1lbnRzIFRyYWNrZXJNZXNzYWdlLkVycm9yTWVzc2FnZSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9UUkFDS0VSX0VSUk9SX01JTl9NRVNTQUdFX1NJWkUgPSA4OworCisgIHByaXZhdGUgZmluYWwgaW50IGFjdGlvbklkID0gVHlwZS5FUlJPUi5nZXRJZCgpOworICBwcml2YXRlIGZpbmFsIGludCB0cmFuc2FjdGlvbklkOworICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWFzb247CisKKyAgcHJpdmF0ZSBVRFBUcmFja2VyRXJyb3JNZXNzYWdlKEJ5dGVCdWZmZXIgZGF0YSwgaW50IHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uKSB7CisgICAgc3VwZXIoVHlwZS5FUlJPUiwgZGF0YSk7CisgICAgdGhpcy50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEFjdGlvbklkKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25JZCgpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbklkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgeworICAgIHJldHVybiB0aGlzLnJlYXNvbjsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVURQVHJhY2tlckVycm9yTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGRhdGEpCisgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSA8IFVEUF9UUkFDS0VSX0VSUk9SX01JTl9NRVNTQUdFX1NJWkUpIHsKKyAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkludmFsaWQgdHJhY2tlciBlcnJvciBtZXNzYWdlIHNpemUhIik7CisgICAgfQorCisgICAgaWYgKGRhdGEuZ2V0SW50KCkgIT0gVHlwZS5FUlJPUi5nZXRJZCgpKSB7CisgICAgICB0aHJvdyBuZXcgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICJJbnZhbGlkIGFjdGlvbiBjb2RlIGZvciB0cmFja2VyIGVycm9yISIpOworICAgIH0KKworICAgIGludCB0cmFuc2FjdGlvbklkID0gZGF0YS5nZXRJbnQoKTsKKyAgICBieXRlW10gcmVhc29uQnl0ZXMgPSBuZXcgYnl0ZVtkYXRhLnJlbWFpbmluZygpXTsKKyAgICBkYXRhLmdldChyZWFzb25CeXRlcyk7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBVRFBUcmFja2VyRXJyb3JNZXNzYWdlKGRhdGEsCisgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG5ldyBTdHJpbmcocmVhc29uQnl0ZXMsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKQorICAgICAgKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSBlcnJvciBtZXNzYWdlISIsIHVlZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBVRFBUcmFja2VyRXJyb3JNZXNzYWdlIGNyYWZ0KGludCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIGJ5dGVbXSByZWFzb25CeXRlcyA9IHJlYXNvbi5nZXRCeXRlcyhDb25zdGFudHMuQllURV9FTkNPRElORyk7CisgICAgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlcgorICAgICAgICAgICAgLmFsbG9jYXRlKFVEUF9UUkFDS0VSX0VSUk9SX01JTl9NRVNTQUdFX1NJWkUgKworICAgICAgICAgICAgICAgICAgICByZWFzb25CeXRlcy5sZW5ndGgpOworICAgIGRhdGEucHV0SW50KFR5cGUuRVJST1IuZ2V0SWQoKSk7CisgICAgZGF0YS5wdXRJbnQodHJhbnNhY3Rpb25JZCk7CisgICAgZGF0YS5wdXQocmVhc29uQnl0ZXMpOworICAgIHJldHVybiBuZXcgVURQVHJhY2tlckVycm9yTWVzc2FnZShkYXRhLAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHJlYXNvbik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUFRyYWNrZXJNZXNzYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODAxNGIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL3VkcC9VRFBUcmFja2VyTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wudWRwOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBVRFAgdHJhY2tlciBtZXNzYWdlcy4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFVEUFRyYWNrZXJNZXNzYWdlIGV4dGVuZHMgVHJhY2tlck1lc3NhZ2UgeworCisgIHByaXZhdGUgVURQVHJhY2tlck1lc3NhZ2UoVHlwZSB0eXBlLCBCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICBzdXBlcih0eXBlLCBkYXRhKTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWN0aW9uSWQoKTsKKworICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFRyYW5zYWN0aW9uSWQoKTsKKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFVEUFRyYWNrZXJSZXF1ZXN0TWVzc2FnZQorICAgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9NSU5fUkVRVUVTVF9QQUNLRVRfU0laRSA9IDE2OworCisgICAgcHJvdGVjdGVkIFVEUFRyYWNrZXJSZXF1ZXN0TWVzc2FnZShUeXBlIHR5cGUsIEJ5dGVCdWZmZXIgZGF0YSkgeworICAgICAgc3VwZXIodHlwZSwgZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVRFBUcmFja2VyUmVxdWVzdE1lc3NhZ2UgcGFyc2UoQnl0ZUJ1ZmZlciBkYXRhKQorICAgICAgICAgICAgdGhyb3dzIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmIChkYXRhLnJlbWFpbmluZygpIDwgVURQX01JTl9SRVFVRVNUX1BBQ0tFVF9TSVpFKSB7CisgICAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBwYWNrZXQgc2l6ZSEiKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBVRFAgcmVxdWVzdCBwYWNrZXRzIGFsd2F5cyBzdGFydCB3aXRoIHRoZSBjb25uZWN0aW9uIElEICg4IGJ5dGVzKSwKKyAgICAgICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3Rpb24gKDQgYnl0ZXMpLiBFeHRyYWN0IHRoZSBhY3Rpb24gY29kZQorICAgICAgICogYWNjb3JkaW5nbHkuCisgICAgICAgKi8KKyAgICAgIGRhdGEubWFyaygpOworICAgICAgZGF0YS5nZXRMb25nKCk7CisgICAgICBpbnQgYWN0aW9uID0gZGF0YS5nZXRJbnQoKTsKKyAgICAgIGRhdGEucmVzZXQoKTsKKworICAgICAgaWYgKGFjdGlvbiA9PSBUeXBlLkNPTk5FQ1RfUkVRVUVTVC5nZXRJZCgpKSB7CisgICAgICAgIHJldHVybiBVRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2UucGFyc2UoZGF0YSk7CisgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBUeXBlLkFOTk9VTkNFX1JFUVVFU1QuZ2V0SWQoKSkgeworICAgICAgICByZXR1cm4gVURQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5wYXJzZShkYXRhKTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmtub3duIFVEUCB0cmFja2VyICIgKworICAgICAgICAgICAgICAicmVxdWVzdCBtZXNzYWdlISIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZQorICAgICAgICAgIGV4dGVuZHMgVURQVHJhY2tlck1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9NSU5fUkVTUE9OU0VfUEFDS0VUX1NJWkUgPSA4OworCisgICAgcHJvdGVjdGVkIFVEUFRyYWNrZXJSZXNwb25zZU1lc3NhZ2UoVHlwZSB0eXBlLCBCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUsIGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZSBwYXJzZShCeXRlQnVmZmVyIGRhdGEpCisgICAgICAgICAgICB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKGRhdGEucmVtYWluaW5nKCkgPCBVRFBfTUlOX1JFU1BPTlNFX1BBQ0tFVF9TSVpFKSB7CisgICAgICAgIHRocm93IG5ldyBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBwYWNrZXQgc2l6ZSEiKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBVRFAgcmVzcG9uc2UgcGFja2V0cyBhbHdheXMgc3RhcnQgd2l0aCB0aGUgYWN0aW9uICg0IGJ5dGVzKSwgc28KKyAgICAgICAqIHdlIGNhbiBleHRyYWN0IGl0IGltbWVkaWF0ZWx5LgorICAgICAgICovCisgICAgICBkYXRhLm1hcmsoKTsKKyAgICAgIGludCBhY3Rpb24gPSBkYXRhLmdldEludCgpOworICAgICAgZGF0YS5yZXNldCgpOworCisgICAgICBpZiAoYWN0aW9uID09IFR5cGUuQ09OTkVDVF9SRVNQT05TRS5nZXRJZCgpKSB7CisgICAgICAgIHJldHVybiBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlLnBhcnNlKGRhdGEpOworICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gVHlwZS5BTk5PVU5DRV9SRVNQT05TRS5nZXRJZCgpKSB7CisgICAgICAgIHJldHVybiBVRFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5wYXJzZShkYXRhKTsKKyAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFR5cGUuRVJST1IuZ2V0SWQoKSkgeworICAgICAgICByZXR1cm4gVURQVHJhY2tlckVycm9yTWVzc2FnZS5wYXJzZShkYXRhKTsKKyAgICAgIH0KKworICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmtub3duIFVEUCB0cmFja2VyICIgKworICAgICAgICAgICAgICAicmVzcG9uc2UgbWVzc2FnZSEiKTsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50UGFyc2VyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9Ub3JyZW50UGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTU5NjkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOworCitAVGVzdAorcHVibGljIGNsYXNzIFRvcnJlbnRQYXJzZXJUZXN0IHsKKworICBwcml2YXRlIFRvcnJlbnRQYXJzZXIgbXlUb3JyZW50UGFyc2VyOworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgbXlUb3JyZW50UGFyc2VyID0gbmV3IFRvcnJlbnRQYXJzZXIoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU51bGxBbm5vdW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFwPFN0cmluZywgQkVWYWx1ZT4gbWV0YWRhdGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm9UYWJsZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKyAgICBpbmZvVGFibGUucHV0KFRvcnJlbnRNZXRhZGF0YUtleXMuUElFQ0VTLCBuZXcgQkVWYWx1ZShuZXcgYnl0ZVsyMF0pKTsKKyAgICBpbmZvVGFibGUucHV0KFRvcnJlbnRNZXRhZGF0YUtleXMuUElFQ0VfTEVOR1RILCBuZXcgQkVWYWx1ZSg1MTIpKTsKKworICAgIGluZm9UYWJsZS5wdXQoVG9ycmVudE1ldGFkYXRhS2V5cy5GSUxFX0xFTkdUSCwgbmV3IEJFVmFsdWUoMTApKTsKKyAgICBpbmZvVGFibGUucHV0KFRvcnJlbnRNZXRhZGF0YUtleXMuTkFNRSwgbmV3IEJFVmFsdWUoImZpbGUudHh0IikpOworCisgICAgbWV0YWRhdGFNYXAucHV0KFRvcnJlbnRNZXRhZGF0YUtleXMuSU5GT19UQUJMRSwgbmV3IEJFVmFsdWUoaW5mb1RhYmxlKSk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlKEJFbmNvZGVyLmJlbmNvZGUobWV0YWRhdGFNYXApLmFycmF5KCkpOworCisgICAgYXNzZXJ0TnVsbChtZXRhZGF0YS5nZXRBbm5vdW5jZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHBhcnNlVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFwPFN0cmluZywgQkVWYWx1ZT4gbWV0YWRhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+IGluZm9UYWJsZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsKKworICAgIG1ldGFkYXRhLnB1dCgiYW5ub3VuY2UiLCBuZXcgQkVWYWx1ZSgiaHR0cDovL2xvY2FsaG9zdC9hbm5vdW5jZSIpKTsKKworICAgIGluZm9UYWJsZS5wdXQoInBpZWNlIGxlbmd0aCIsIG5ldyBCRVZhbHVlKDQpKTsKKworICAgIGluZm9UYWJsZS5wdXQoInBpZWNlcyIsIG5ldyBCRVZhbHVlKG5ldyBieXRlWzEwMF0pKTsKKyAgICBpbmZvVGFibGUucHV0KCJuYW1lIiwgbmV3IEJFVmFsdWUoInRlc3QuZmlsZSIpKTsKKyAgICBpbmZvVGFibGUucHV0KCJsZW5ndGgiLCBuZXcgQkVWYWx1ZSgxOSkpOworCisgICAgbWV0YWRhdGEucHV0KCJpbmZvIiwgbmV3IEJFVmFsdWUoaW5mb1RhYmxlKSk7CisKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhID0gbXlUb3JyZW50UGFyc2VyLnBhcnNlKEJFbmNvZGVyLmJlbmNvZGUobWV0YWRhdGEpLmFycmF5KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpLCA0KTsKKyAgICBhc3NlcnRFcXVhbHModG9ycmVudE1ldGFkYXRhLmdldEFubm91bmNlKCksICJodHRwOi8vbG9jYWxob3N0L2Fubm91bmNlIik7CisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnRNZXRhZGF0YS5nZXREaXJlY3RvcnlOYW1lKCksICJ0ZXN0LmZpbGUiKTsKKyAgICBhc3NlcnROdWxsKHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZUxpc3QoKSk7CisKKyAgICBMaXN0PEJFVmFsdWU+IGFubm91bmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8QkVWYWx1ZT4oKTsKKyAgICBhbm5vdW5jZUxpc3QuYWRkKG5ldyBCRVZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEJFVmFsdWUoImh0dHA6Ly9sb2NhbGhvc3QvYW5ub3VuY2UiKSkpKTsKKyAgICBhbm5vdW5jZUxpc3QuYWRkKG5ldyBCRVZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEJFVmFsdWUoImh0dHA6Ly9zZWNvbmQvYW5ub3VuY2UiKSkpKTsKKyAgICBtZXRhZGF0YS5wdXQoImFubm91bmNlLWxpc3QiLCBuZXcgQkVWYWx1ZShhbm5vdW5jZUxpc3QpKTsKKworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGFXaXRoQW5ub3VuY2VMaXN0ID0gbXlUb3JyZW50UGFyc2VyLnBhcnNlKEJFbmNvZGVyLmJlbmNvZGUobWV0YWRhdGEpLmFycmF5KCkpOworCisgICAgZmluYWwgTGlzdDxMaXN0PFN0cmluZz4+IGFjdHVhbEFubm91bmNlTGlzdCA9IHRvcnJlbnRNZXRhZGF0YVdpdGhBbm5vdW5jZUxpc3QuZ2V0QW5ub3VuY2VMaXN0KCk7CisgICAgYXNzZXJ0Tm90TnVsbChhY3R1YWxBbm5vdW5jZUxpc3QpOworICAgIGFzc2VydEVxdWFscyhhY3R1YWxBbm5vdW5jZUxpc3QuZ2V0KDApLmdldCgwKSwgImh0dHA6Ly9sb2NhbGhvc3QvYW5ub3VuY2UiKTsKKyAgICBhc3NlcnRFcXVhbHMoYWN0dWFsQW5ub3VuY2VMaXN0LmdldCgxKS5nZXQoMCksICJodHRwOi8vc2Vjb25kL2Fubm91bmNlIik7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGJhZEJFUEZvcm1hdFRlc3QoKSB7CisgICAgdHJ5IHsKKyAgICAgIG15VG9ycmVudFBhcnNlci5wYXJzZSgiYWJjZCIuZ2V0Qnl0ZXMoKSk7CisgICAgICBmYWlsKCJUaGlzIG1ldGhvZCBtdXN0IHRocm93IGludmFsaWQgYmVuY29kaW5nIGV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgLy9pdCdzIG9rYXkKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBtaXNzaW5nUmVxdWlyZWRGaWVsZFRlc3QoKSB7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCRVZhbHVlPigpOworICAgIG1hcC5wdXQoImluZm8iLCBuZXcgQkVWYWx1ZShuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCkpKTsKKworICAgIHRyeSB7CisgICAgICBteVRvcnJlbnRQYXJzZXIucGFyc2UoQkVuY29kZXIuYmVuY29kZShtYXApLmFycmF5KCkpOworICAgICAgZmFpbCgiVGhpcyBtZXRob2QgbXVzdCB0aHJvdyBpbnZhbGlkIGJlbmNvZGluZyBleGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQkVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vaXQncyBva2F5CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgZmFpbCgiIiwgZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRVdGlsc1Rlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzYyMmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICBDb3B5cmlnaHQgKEMpIDIwMTYgUGhpbGlwcCBIZW5rZWwKKyAgPHA+CisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICA8cD4KKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIDxwPgorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbjsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBUb3JyZW50VXRpbHNUZXN0IHsKKworICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnMgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVG9IZXhXaXRoTnVsbCgpIHsKKyAgICAvL25vaW5zcGVjdGlvbiBSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkLENvbnN0YW50Q29uZGl0aW9ucworICAgIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhudWxsKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1RvSGV4V2l0aEVtcHR5Qnl0ZUFycmF5KCkgeworICAgIGFzc2VydEVxdWFscygiIiwgVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG5ldyBieXRlWzBdKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNUb0hleFdpdGhTaW5nbGVCeXRlKCkgeworICAgIGFzc2VydEVxdWFscygiQkMiLCBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobmV3IGJ5dGVbXXsKKyAgICAgICAgICAgIChieXRlKSAweEJDCisgICAgfSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVG9IZXhXaXRoWmVyb0J5dGUoKSB7CisgICAgYXNzZXJ0RXF1YWxzKCIwMCIsIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhuZXcgYnl0ZVsxXSkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVG9IZXhXaXRoTGVhZGluZ1plcm8oKSB7CisgICAgYXNzZXJ0RXF1YWxzKCIwMDUzRkYiLCBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobmV3IGJ5dGVbXXsKKyAgICAgICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4RkYKKyAgICB9KSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNUb0hleFRyYWlsaW5nWmVybygpIHsKKyAgICBhc3NlcnRFcXVhbHMoIkFBMDA0NTAwIiwgVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKG5ldyBieXRlW117CisgICAgICAgICAgICAoYnl0ZSkgMHhBQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDQ1LCAoYnl0ZSkgMHgwMAorICAgIH0pKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1RvSGV4QWxsU3ltYm9scygpIHsKKyAgICBhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODlBQkNERUYiLCBUb3JyZW50VXRpbHMuYnl0ZUFycmF5VG9IZXhTdHJpbmcobmV3IGJ5dGVbXXsKKyAgICAgICAgICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4NDUsIChieXRlKSAweDY3LAorICAgICAgICAgICAgKGJ5dGUpIDB4ODksIChieXRlKSAweEFCLCAoYnl0ZSkgMHhDRCwgKGJ5dGUpIDB4RUYKKyAgICB9KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vSGFzaGVzQ2FsY3VsYXRvcnNUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0hhc2hlc0NhbGN1bGF0b3JzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmNhNzcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL0hhc2hlc0NhbGN1bGF0b3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5jcmVhdGlvbjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBIYXNoZXNDYWxjdWxhdG9yc1Rlc3QgeworCisgIHByaXZhdGUgTGlzdDw/IGV4dGVuZHMgUGllY2VzSGFzaGVzQ2FsY3VsYXRvcj4gaW1wbGVtZW50YXRpb25zOworICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBpbXBsZW1lbnRhdGlvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IFNpbmdsZVRocmVhZEhhc2hlc0NhbGN1bGF0b3IoKSwKKyAgICAgICAgICAgIG5ldyBNdWx0aVRocmVhZEhhc2hlc0NhbGN1bGF0b3IoZXhlY3V0b3IsIDMpLAorICAgICAgICAgICAgbmV3IE11bHRpVGhyZWFkSGFzaGVzQ2FsY3VsYXRvcihleGVjdXRvciwgMjApLAorICAgICAgICAgICAgbmV3IE11bHRpVGhyZWFkSGFzaGVzQ2FsY3VsYXRvcihleGVjdXRvciwgMSkKKyAgICApOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgIGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMTAsIFRpbWVVbml0LlNFQ09ORFMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVtcHR5U291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PGJ5dGVbXT4gc291cmNlQnl0ZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXsxLCAyfSk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117fSk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117MywgNH0pOworCisgICAgSGFzaGluZ1Jlc3VsdCBleHBlY3RlZCA9IG5ldyBIYXNoaW5nUmVzdWx0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSkpLAorICAgICAgICAgICAgYXNMaXN0KDJMLCAwTCwgMkwpCisgICAgKTsKKyAgICB2ZXJpZnlJbXBsZW1lbnRhdGlvbnNSZXN1bHRzKHNvdXJjZUJ5dGVzLCA1MTIsIGV4cGVjdGVkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1zQXNQaWVjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxieXRlW10+IHNvdXJjZUJ5dGVzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7CisgICAgc291cmNlQnl0ZXMuYWRkKG5ldyBieXRlW117MSwgMiwgMywgNH0pOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezUsIDYsIDcsIDh9KTsKKworICAgIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQgPSBuZXcgSGFzaGluZ1Jlc3VsdChhc0xpc3QoCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSksCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXs1LCA2LCA3LCA4fSkpLAorICAgICAgICAgICAgYXNMaXN0KDRMLCA0TCkKKyAgICApOworICAgIHZlcmlmeUltcGxlbWVudGF0aW9uc1Jlc3VsdHMoc291cmNlQnl0ZXMsIDQsIGV4cGVjdGVkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkaW5nTm90RnVsbHlCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8Ynl0ZVtdPiBzb3VyY2VCeXRlcyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDd9KTsKKyAgICBIYXNoaW5nUmVzdWx0IGV4cGVjdGVkID0gbmV3IEhhc2hpbmdSZXN1bHQoYXNMaXN0KAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117MSwgMiwgMywgNCwgNX0pLAorICAgICAgICAgICAgVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117NiwgN30pKSwKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoN0wpCisgICAgKTsKKworICAgIGZpbmFsIGludCBtYXhUb1JlYWQgPSAyOworICAgIExpc3Q8SGFzaGluZ1Jlc3VsdD4gaGFzaGluZ1Jlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PEhhc2hpbmdSZXN1bHQ+KCk7CisgICAgZm9yIChQaWVjZXNIYXNoZXNDYWxjdWxhdG9yIGltcGxlbWVudGF0aW9uIDogaW1wbGVtZW50YXRpb25zKSB7CisgICAgICBMaXN0PERhdGFTb3VyY2VIb2xkZXI+IHNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PERhdGFTb3VyY2VIb2xkZXI+KCk7CisgICAgICBmb3IgKGJ5dGVbXSBzb3VyY2VCeXRlIDogc291cmNlQnl0ZXMpIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc291cmNlQnl0ZSkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChsZW4gPD0gbWF4VG9SZWFkKSB7CisgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3MgPj0gY291bnQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYXZhaWwgPSBjb3VudCAtIHBvczsKKyAgICAgICAgICAgIGlmIChsZW4gPiBhdmFpbCkgeworICAgICAgICAgICAgICBsZW4gPSBhdmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBwb3MsIGIsIG9mZiwgbWF4VG9SZWFkKTsKKyAgICAgICAgICAgIHBvcyArPSBtYXhUb1JlYWQ7CisgICAgICAgICAgICByZXR1cm4gbWF4VG9SZWFkOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc291cmNlcy5hZGQobmV3IERhdGFTb3VyY2VIb2xkZXIoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CisgICAgICBoYXNoaW5nUmVzdWx0cy5hZGQoaW1wbGVtZW50YXRpb24uY2FsY3VsYXRlSGFzaGVzKHNvdXJjZXMsIDUpKTsKKyAgICB9CisgICAgZm9yIChIYXNoaW5nUmVzdWx0IGFjdHVhbCA6IGhhc2hpbmdSZXN1bHRzKSB7CisgICAgICBhc3NlcnRIYXNoaW5nUmVzdWx0KGFjdHVhbCwgZXhwZWN0ZWQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXaXRoU21hbGxTb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIExpc3Q8Ynl0ZVtdPiBzb3VyY2VCeXRlcyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezAsIDEsIDIsIDMsIDQsIDUsIDR9KTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXstMSwgLTJ9KTsKKyAgICBzb3VyY2VCeXRlcy5hZGQobmV3IGJ5dGVbXXs2LCA3LCA4LCA5LCAxMH0pOworICAgIHNvdXJjZUJ5dGVzLmFkZChuZXcgYnl0ZVtdezEsIDIsIDMsIDR9KTsKKworICAgIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQgPSBuZXcgSGFzaGluZ1Jlc3VsdChhc0xpc3QoCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXswLCAxLCAyLCAzLCA0LCA1fSksCisgICAgICAgICAgICBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2gobmV3IGJ5dGVbXXs0LCAtMSwgLTIsIDYsIDcsIDh9KSwKKyAgICAgICAgICAgIFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChuZXcgYnl0ZVtdezksIDEwLCAxLCAyLCAzLCA0fSkpLAorICAgICAgICAgICAgYXNMaXN0KDdMLCAyTCwgNUwsIDRMKQorICAgICk7CisgICAgdmVyaWZ5SW1wbGVtZW50YXRpb25zUmVzdWx0cyhzb3VyY2VCeXRlcywgNiwgZXhwZWN0ZWQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZUxhcmdlU291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGludCBzaXplID0gMTAyNCAqIDEwMjQgKiAxMDA7Ly8xMDBtYgorICAgIGJ5dGVbXSBzb3VyY2VCeXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgIExpc3Q8Ynl0ZVtdPiBoYXNoZXMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4oKTsKKyAgICBmaW5hbCBpbnQgcGllY2VTaXplID0gMTI4ICogMTAyNDsvLzEyOGtiCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VCeXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgc291cmNlQnl0ZXNbaV0gPSAoYnl0ZSkgKGkgKiBpKTsKKyAgICAgIGlmIChpICUgcGllY2VTaXplID09IDAgJiYgaSA+IDApIHsKKyAgICAgICAgYnl0ZVtdIGZvckhhc2hpbmcgPSBBcnJheXMuY29weU9mUmFuZ2Uoc291cmNlQnl0ZXMsIGkgLSBwaWVjZVNpemUsIGkpOworICAgICAgICBoYXNoZXMuYWRkKFRvcnJlbnRVdGlscy5jYWxjdWxhdGVTaGExSGFzaChmb3JIYXNoaW5nKSk7CisgICAgICB9CisgICAgfQorICAgIGhhc2hlcy5hZGQoVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKAorICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKHNvdXJjZUJ5dGVzLCBoYXNoZXMuc2l6ZSgpICogcGllY2VTaXplLCBzaXplKQorICAgICkpOworCisgICAgSGFzaGluZ1Jlc3VsdCBleHBlY3RlZCA9IG5ldyBIYXNoaW5nUmVzdWx0KGhhc2hlcywgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgobG9uZykgc2l6ZSkpOworCisgICAgdmVyaWZ5SW1wbGVtZW50YXRpb25zUmVzdWx0cyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNvdXJjZUJ5dGVzKSwgcGllY2VTaXplLCBleHBlY3RlZCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5SW1wbGVtZW50YXRpb25zUmVzdWx0cyhMaXN0PGJ5dGVbXT4gc291cmNlQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWVjZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxIYXNoaW5nUmVzdWx0PiBoYXNoaW5nUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8SGFzaGluZ1Jlc3VsdD4oKTsKKyAgICBmb3IgKFBpZWNlc0hhc2hlc0NhbGN1bGF0b3IgaW1wbGVtZW50YXRpb24gOiBpbXBsZW1lbnRhdGlvbnMpIHsKKyAgICAgIExpc3Q8RGF0YVNvdXJjZUhvbGRlcj4gc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8RGF0YVNvdXJjZUhvbGRlcj4oKTsKKyAgICAgIGZvciAoYnl0ZVtdIHNvdXJjZUJ5dGUgOiBzb3VyY2VCeXRlcykgeworICAgICAgICBhZGRTb3VyY2Uoc291cmNlQnl0ZSwgc291cmNlcyk7CisgICAgICB9CisgICAgICBoYXNoaW5nUmVzdWx0cy5hZGQoaW1wbGVtZW50YXRpb24uY2FsY3VsYXRlSGFzaGVzKHNvdXJjZXMsIHBpZWNlU2l6ZSkpOworICAgIH0KKyAgICBmb3IgKEhhc2hpbmdSZXN1bHQgYWN0dWFsIDogaGFzaGluZ1Jlc3VsdHMpIHsKKyAgICAgIGFzc2VydEhhc2hpbmdSZXN1bHQoYWN0dWFsLCBleHBlY3RlZCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEhhc2hpbmdSZXN1bHQoSGFzaGluZ1Jlc3VsdCBhY3R1YWwsIEhhc2hpbmdSZXN1bHQgZXhwZWN0ZWQpIHsKKworICAgIGFzc2VydEVxdWFscyhhY3R1YWwuZ2V0SGFzaGVzKCkuc2l6ZSgpLCBleHBlY3RlZC5nZXRIYXNoZXMoKS5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmdldEhhc2hlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsLmdldEhhc2hlcygpLmdldChpKSwgZXhwZWN0ZWQuZ2V0SGFzaGVzKCkuZ2V0KGkpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbC5nZXRTb3VyY2VTaXplcygpLCBleHBlY3RlZC5nZXRTb3VyY2VTaXplcygpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRTb3VyY2UoYnl0ZVtdIGJ5dGVzLCBMaXN0PERhdGFTb3VyY2VIb2xkZXI+IHNvdXJjZXMpIHsKKyAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworICAgIHNvdXJjZXMuYWRkKG5ldyBEYXRhU291cmNlSG9sZGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgfQorICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL01ldGFkYXRhQnVpbGRlclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vY3JlYXRpb24vTWV0YWRhdGFCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2IyNWEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL2NyZWF0aW9uL01ldGFkYXRhQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb24uY3JlYXRpb247CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJFVmFsdWU7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YUtleXMuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnROdWxsOworCitAVGVzdAorcHVibGljIGNsYXNzIE1ldGFkYXRhQnVpbGRlclRlc3QgeworCisgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUZpbGVNb2RlV2l0aE9uZUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1hcCA9IG5ldyBNZXRhZGF0YUJ1aWxkZXIoKQorICAgICAgICAgICAgLnNldERpcmVjdG9yeU5hbWUoInJvb3QiKQorICAgICAgICAgICAgLmFkZERhdGFTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW117MSwgMn0pLCAicGF0aC9zb21lX2ZpbGUiLCB0cnVlKQorICAgICAgICAgICAgLmJ1aWxkQkVQKCkuZ2V0TWFwKCk7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG1hcC5nZXQoSU5GT19UQUJMRSkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KE5BTUUpLmdldFN0cmluZygpLCAicm9vdCIpOworICAgIExpc3Q8QkVWYWx1ZT4gZmlsZXMgPSBpbmZvLmdldChGSUxFUykuZ2V0TGlzdCgpOworICAgIGFzc2VydEVxdWFscyhmaWxlcy5zaXplKCksIDEpOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IGZpbGUgPSBmaWxlcy5nZXQoMCkuZ2V0TWFwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZpbGUuZ2V0KEZJTEVfTEVOR1RIKS5nZXRJbnQoKSwgMik7CisKKyAgICBTdHJpbmdCdWlsZGVyIHBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIEl0ZXJhdG9yPEJFVmFsdWU+IGl0ZXJhdG9yID0gZmlsZS5nZXQoRklMRV9QQVRIKS5nZXRMaXN0KCkuaXRlcmF0b3IoKTsKKyAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoaXRlcmF0b3IubmV4dCgpLmdldFN0cmluZygpKTsKKyAgICB9CisgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgcGF0aC5hcHBlbmQoIi8iKS5hcHBlbmQoaXRlcmF0b3IubmV4dCgpLmdldFN0cmluZygpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKHBhdGgudG9TdHJpbmcoKSwgInBhdGgvc29tZV9maWxlIik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRXaXRoU3BlY2lmaWVkSGFzaGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlW10gZXhwZWN0ZWRIYXNoID0gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKG5ldyBieXRlW117MSwgMiwgM30pOworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhQnVpbGRlcigpCisgICAgICAgICAgICAuc2V0UGllY2VzSGFzaGVzQ2FsY3VsYXRvcihuZXcgUGllY2VzSGFzaGVzQ2FsY3VsYXRvcigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyBIYXNoaW5nUmVzdWx0IGNhbGN1bGF0ZUhhc2hlcyhMaXN0PERhdGFTb3VyY2VIb2xkZXI+IHNvdXJjZXMsIGludCBwaWVjZVNpemUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic2hvdWxkIG5vdCBiZSBpbnZva2VkIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuc2V0RmlsZXNJbmZvKAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGV4cGVjdGVkSGFzaCksCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCg0MkwpKQorICAgICAgICAgICAgLnNldFBpZWNlTGVuZ3RoKDUxMikKKyAgICAgICAgICAgIC5zZXRUcmFja2VyKCJodHRwOi8vbG9jYWxob3N0OjEyMzQ2IikKKyAgICAgICAgICAgIC5idWlsZEJFUCgpLmdldE1hcCgpOworCisgICAgYXNzZXJ0RXF1YWxzKG1ldGFkYXRhLmdldChBTk5PVU5DRSkuZ2V0U3RyaW5nKCksICJodHRwOi8vbG9jYWxob3N0OjEyMzQ2Iik7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG1ldGFkYXRhLmdldChJTkZPX1RBQkxFKS5nZXRNYXAoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoUElFQ0VTKS5nZXRCeXRlcygpLCBleHBlY3RlZEhhc2gpOworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChOQU1FKS5nZXRTdHJpbmcoKSwgImZpbGUiKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoRklMRV9MRU5HVEgpLmdldExvbmcoKSwgNDIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgYnl0ZVtdIGRhdGEgPSB7MSwgMiwgMTIsIDQsIDV9OworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhQnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRGF0YVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSksICJzaW5nbGVGaWxlLnR4dCIsIHRydWUpCisgICAgICAgICAgICAuc2V0VHJhY2tlcigiaHR0cDovL2xvY2FsaG9zdDoxMjM0NiIpCisgICAgICAgICAgICAuYnVpbGRCRVAoKS5nZXRNYXAoKTsKKyAgICBhc3NlcnRFcXVhbHMobWV0YWRhdGEuZ2V0KEFOTk9VTkNFKS5nZXRTdHJpbmcoKSwgImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNDYiKTsKKyAgICBhc3NlcnROdWxsKG1ldGFkYXRhLmdldChDUkVBVElPTl9EQVRFX1NFQykpOworICAgIGFzc2VydE51bGwobWV0YWRhdGEuZ2V0KENPTU1FTlQpKTsKKyAgICBhc3NlcnRFcXVhbHMobWV0YWRhdGEuZ2V0KENSRUFURURfQlkpLmdldFN0cmluZygpLCAidHRvcnJlbnQgbGlicmFyeSIpOworCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG1ldGFkYXRhLmdldChJTkZPX1RBQkxFKS5nZXRNYXAoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoUElFQ0VTKS5nZXRCeXRlcygpLmxlbmd0aCAvIENvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkUsIDEpOworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChQSUVDRV9MRU5HVEgpLmdldEludCgpLCA1MTIgKiAxMDI0KTsKKworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChGSUxFX0xFTkdUSCkuZ2V0SW50KCksIGRhdGEubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoTkFNRSkuZ2V0U3RyaW5nKCksICJzaW5nbGVGaWxlLnR4dCIpOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaWxlV2l0aE9uZUZpbGVWYWx1ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgYnl0ZVtdIGRhdGEgPSB7MzQsIDIsIDEyLCA0LCA1fTsKKyAgICBMaXN0PFN0cmluZz4gcGF0aHMgPSBBcnJheXMuYXNMaXN0KCJ1bml4L3BhdGgiLCAid2luXFxwYXRoIik7CisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGFCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGREYXRhU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgcGF0aHMuZ2V0KDApLCB0cnVlKQorICAgICAgICAgICAgLmFkZERhdGFTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpLCBwYXRocy5nZXQoMSksIHRydWUpCisgICAgICAgICAgICAuc2V0RGlyZWN0b3J5TmFtZSgiZG93bmxvYWREaXJOYW1lIikKKyAgICAgICAgICAgIC5idWlsZEJFUCgpLmdldE1hcCgpOworCisgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gaW5mbyA9IG1ldGFkYXRhLmdldChJTkZPX1RBQkxFKS5nZXRNYXAoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5mby5nZXQoUElFQ0VTKS5nZXRCeXRlcygpLmxlbmd0aCwgQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRSk7CisgICAgYXNzZXJ0RXF1YWxzKGluZm8uZ2V0KFBJRUNFX0xFTkdUSCkuZ2V0SW50KCksIDUxMiAqIDEwMjQpOworICAgIGFzc2VydEVxdWFscyhpbmZvLmdldChOQU1FKS5nZXRTdHJpbmcoKSwgImRvd25sb2FkRGlyTmFtZSIpOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChCRVZhbHVlIHZhbHVlIDogaW5mby5nZXQoRklMRVMpLmdldExpc3QoKSkgeworICAgICAgTWFwPFN0cmluZywgQkVWYWx1ZT4gZmlsZUluZm8gPSB2YWx1ZS5nZXRNYXAoKTsKKyAgICAgIFN0cmluZyBwYXRoID0gcGF0aHMuZ2V0KGlkeCk7CisgICAgICBpZHgrKzsKKyAgICAgIFN0cmluZ1tdIHNwbGl0ID0gcGF0aC5zcGxpdCgiWy9cXFxcXSIpOworICAgICAgTGlzdDxCRVZhbHVlPiBsaXN0ID0gZmlsZUluZm8uZ2V0KEZJTEVfUEFUSCkuZ2V0TGlzdCgpOworCisgICAgICBhc3NlcnRFcXVhbHMoZmlsZUluZm8uZ2V0KEZJTEVfTEVOR1RIKS5nZXRJbnQoKSwgZGF0YS5sZW5ndGgpOworICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpLCBzcGxpdC5sZW5ndGgpOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0KGkpLmdldFN0cmluZygpLCBzcGxpdFtpXSk7CisgICAgICB9CisgICAgfQorCisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvaHR0cC9IVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2VUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTJhMTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvY29tbW9uL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL3Byb3RvY29sL2h0dHAvSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHA7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVuY29kZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFyc2VUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFja2VyTWVzc2FnZS5NZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICBNYXA8U3RyaW5nLCBCRVZhbHVlPiB0cmFja2VyUmVzcG9uc2UgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgdHJhY2tlclJlc3BvbnNlLnB1dCgiaW50ZXJ2YWwiLCBuZXcgQkVWYWx1ZSg1KSk7CisgICAgdHJhY2tlclJlc3BvbnNlLnB1dCgiY29tcGxldGUiLCBuZXcgQkVWYWx1ZSgxKSk7CisgICAgdHJhY2tlclJlc3BvbnNlLnB1dCgiaW5jb21wbGV0ZSIsIG5ldyBCRVZhbHVlKDApKTsKKworICAgIFN0cmluZyBpcCA9ICIxOTIuMTY4LjEuMSI7CisgICAgaW50IHBvcnQgPSA2ODgxOworICAgIEluZXRTb2NrZXRBZGRyZXNzIHBlZXJBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGlwLCBwb3J0KTsKKyAgICBCeXRlQnVmZmVyIGJpbmFyeVBlZXJBZGRyZXNzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg2KTsKKyAgICBiaW5hcnlQZWVyQWRkcmVzcy5wdXQocGVlckFkZHJlc3MuZ2V0QWRkcmVzcygpLmdldEFkZHJlc3MoKSk7CisgICAgYmluYXJ5UGVlckFkZHJlc3MucHV0U2hvcnQoKHNob3J0KSBwb3J0KTsKKyAgICB0cmFja2VyUmVzcG9uc2UucHV0KCJwZWVycyIsIG5ldyBCRVZhbHVlKGJpbmFyeVBlZXJBZGRyZXNzLmFycmF5KCkpKTsKKworICAgIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZSBwYXJzZWRSZXNwb25zZSA9IChIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UpIEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5wYXJzZSgKKyAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShCRW5jb2Rlci5iZW5jb2RlKHRyYWNrZXJSZXNwb25zZSkuYXJyYXkoKSkpOworCisgICAgYXNzZXJ0RXF1YWxzKHBhcnNlZFJlc3BvbnNlLmdldEludGVydmFsKCksIDUpOworICAgIGFzc2VydEVxdWFscyhwYXJzZWRSZXNwb25zZS5nZXRDb21wbGV0ZSgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0SW5jb21wbGV0ZSgpLCAwKTsKKyAgICBMaXN0PFBlZXI+IHBlZXJzID0gcGFyc2VkUmVzcG9uc2UuZ2V0UGVlcnMoKTsKKyAgICBhc3NlcnRFcXVhbHMocGVlcnMuc2l6ZSgpLCAxKTsKKyAgICBQZWVyIHBlZXIgPSBwZWVycy5nZXQoMCk7CisgICAgYXNzZXJ0RXF1YWxzKHBlZXIuZ2V0SXAoKSwgaXApOworICAgIGFzc2VydEVxdWFscyhwZWVyLmdldFBvcnQoKSwgcG9ydCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NvbW1vbi9wcm90b2NvbC91ZHAvVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5ZjgxYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9jb21tb24vc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vcHJvdG9jb2wvdWRwL1VEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBTcGVjaWZpY2F0aW9uIG9mIFVEUCBhbm5vdW5jZSBwcm90b2NvbDoKKyAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxNS5odG1sIj5odHRwOi8vd3d3LmJpdHRvcnJlbnQub3JnL2JlcHMvYmVwXzAwMTUuaHRtbDwvYT4KKyAqLworcHVibGljIGNsYXNzIFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlVGVzdCB7CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcGFyc2VUZXN0KCkgdGhyb3dzIFRyYWNrZXJNZXNzYWdlLk1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIGludCBwZWVyc0NvdW50ID0gMzsKKyAgICBCeXRlQnVmZmVyIHJlc3BvbnNlID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgyMCArIHBlZXJzQ291bnQgKiA2KTsKKyAgICByZXNwb25zZS5wdXRJbnQoMSk7Ly9hbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlIGlkZW50aWZpZXIKKyAgICByZXNwb25zZS5wdXRJbnQoMyk7Ly90cmFuc2FjdGlvbl9pZAorICAgIHJlc3BvbnNlLnB1dEludCg1KTsvL2ludGVydmFsCisgICAgcmVzcG9uc2UucHV0SW50KDEpOy8vaW5jb21wbGV0ZQorICAgIHJlc3BvbnNlLnB1dEludCgyKTsvL2NvbXBsZXRlCisKKworICAgIFN0cmluZyBpcFByZWZpeCA9ICIxOTIuMTY4LjEuMSI7CisgICAgZmluYWwgaW50IGZpcnN0UG9ydCA9IDY4ODE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZWVyc0NvdW50OyBpKyspIHsKKyAgICAgIFN0cmluZyBpcCA9IGlwUHJlZml4ICsgaTsKKyAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHBlZXJBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGlwLCBmaXJzdFBvcnQpOworICAgICAgcmVzcG9uc2UucHV0KHBlZXJBZGRyZXNzLmdldEFkZHJlc3MoKS5nZXRBZGRyZXNzKCkpOworICAgICAgcmVzcG9uc2UucHV0U2hvcnQoKHNob3J0KSAoZmlyc3RQb3J0ICsgaSkpOworICAgIH0KKworICAgIHJlc3BvbnNlLnJld2luZCgpOworICAgIFVEUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHBhcnNlZFJlc3BvbnNlID0gVURQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UucGFyc2UocmVzcG9uc2UpOworICAgIGFzc2VydEVxdWFscyhwYXJzZWRSZXNwb25zZS5nZXRBY3Rpb25JZCgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0VHJhbnNhY3Rpb25JZCgpLCAzKTsKKyAgICBhc3NlcnRFcXVhbHMocGFyc2VkUmVzcG9uc2UuZ2V0SW50ZXJ2YWwoKSwgNSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcnNlZFJlc3BvbnNlLmdldENvbXBsZXRlKCksIDIpOworICAgIGFzc2VydEVxdWFscyhwYXJzZWRSZXNwb25zZS5nZXRJbmNvbXBsZXRlKCksIDEpOworICAgIExpc3Q8UGVlcj4gcGVlcnMgPSBwYXJzZWRSZXNwb25zZS5nZXRQZWVycygpOworICAgIGFzc2VydEVxdWFscyhwZWVycy5zaXplKCksIHBlZXJzQ291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVlcnNDb3VudDsgaSsrKSB7CisgICAgICBQZWVyIHBlZXIgPSBwZWVycy5nZXQoaSk7CisgICAgICBhc3NlcnRFcXVhbHMocGVlci5nZXRJcCgpLCBpcFByZWZpeCArIGkpOworICAgICAgYXNzZXJ0RXF1YWxzKHBlZXIuZ2V0UG9ydCgpLCBmaXJzdFBvcnQgKyBpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzk5NGIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9wb20ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxuYW1lPnR0b3JyZW50L25ldHdvcms8L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LW5ldHdvcms8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC10ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQWNjZXB0QXR0YWNobWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0FjY2VwdEF0dGFjaG1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JhNjUyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0FjY2VwdEF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXB0QXR0YWNobWVudCB7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY2hhbm5lbCBsaXN0ZW5lciBmYWN0b3J5IGZvciBjcmVhdGUgbGlzdGVuZXJzIGZvciBuZXcgY29ubmVjdGlvbnMKKyAgICovCisgIENoYW5uZWxMaXN0ZW5lckZhY3RvcnkgZ2V0Q2hhbm5lbExpc3RlbmVyRmFjdG9yeSgpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQWNjZXB0QXR0YWNobWVudEltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9BY2NlcHRBdHRhY2htZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQWNjZXB0QXR0YWNobWVudEltcGwuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBBY2NlcHRBdHRhY2htZW50SW1wbCBpbXBsZW1lbnRzIEFjY2VwdEF0dGFjaG1lbnQsIFRpbWVvdXRBdHRhY2htZW50IHsKKworICBwcml2YXRlIGZpbmFsIENoYW5uZWxMaXN0ZW5lckZhY3RvcnkgbXlDaGFubmVsTGlzdGVuZXJGYWN0b3J5OworCisgIHB1YmxpYyBBY2NlcHRBdHRhY2htZW50SW1wbChDaGFubmVsTGlzdGVuZXJGYWN0b3J5IGNoYW5uZWxMaXN0ZW5lckZhY3RvcnkpIHsKKyAgICB0aGlzLm15Q2hhbm5lbExpc3RlbmVyRmFjdG9yeSA9IGNoYW5uZWxMaXN0ZW5lckZhY3Rvcnk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENoYW5uZWxMaXN0ZW5lckZhY3RvcnkgZ2V0Q2hhbm5lbExpc3RlbmVyRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbXlDaGFubmVsTGlzdGVuZXJGYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVGltZW91dEVsYXBzZWQobG9uZyBjdXJyZW50VGltZU1pbGxpcykgeworICAgIHJldHVybiBmYWxzZTsvL2FjY2VwdCBhdHRhY2htZW50IGRvZXNuJ3QgY2xvc2VkIGJ5IHRpbWVvdXQKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb21tdW5pY2F0ZWROb3cobG9uZyBjdXJyZW50VGltZU1pbGxpcykgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGltZW91dEVsYXBzZWQoU29ja2V0Q2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9DaGFubmVsTGlzdGVuZXJGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ2hhbm5lbExpc3RlbmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTExMWMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ2hhbm5lbExpc3RlbmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitwdWJsaWMgaW50ZXJmYWNlIENoYW5uZWxMaXN0ZW5lckZhY3RvcnkgeworCisgIENvbm5lY3Rpb25MaXN0ZW5lciBuZXdDaGFubmVsTGlzdGVuZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3RUYXNrLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA2ODczCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3RUYXNrLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0VGFzayBpbXBsZW1lbnRzIFRpbWVvdXRBdHRhY2htZW50LCBSZWFkQXR0YWNobWVudCB7CisKKyAgcHJpdmF0ZSBsb25nIGxhc3RDb21tdW5pY2F0aW9uVGltZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbXlUaW1lb3V0TWlsbGlzOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteUhvc3Q7CisgIHByaXZhdGUgZmluYWwgaW50IG15UG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgbXlDb25uZWN0aW9uTGlzdGVuZXI7CisKKyAgcHVibGljIENvbm5lY3RUYXNrKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lciwgbG9uZyBsYXN0Q29tbXVuaWNhdGlvblRpbWUsIGludCB0aW1lb3V0TWlsbGlzKSB7CisgICAgdGhpcy5teUhvc3QgPSBob3N0OworICAgIHRoaXMubXlQb3J0ID0gcG9ydDsKKyAgICB0aGlzLm15Q29ubmVjdGlvbkxpc3RlbmVyID0gY29ubmVjdGlvbkxpc3RlbmVyOworICAgIHRoaXMubXlUaW1lb3V0TWlsbGlzID0gdGltZW91dE1pbGxpczsKKyAgICB0aGlzLmxhc3RDb21tdW5pY2F0aW9uVGltZSA9IGxhc3RDb21tdW5pY2F0aW9uVGltZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICByZXR1cm4gbXlIb3N0OworICB9CisKKyAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgIHJldHVybiBteVBvcnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIENvbm5lY3Rpb25MaXN0ZW5lciBnZXRDb25uZWN0aW9uTGlzdGVuZXIoKSB7CisgICAgcmV0dXJuIG15Q29ubmVjdGlvbkxpc3RlbmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJDb25uZWN0VGFza3siICsKKyAgICAgICAgICAgICJteUhvc3Q9JyIgKyBteUhvc3QgKyAnXCcnICsKKyAgICAgICAgICAgICIsIG15UG9ydD0iICsgbXlQb3J0ICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1RpbWVvdXRFbGFwc2VkKGxvbmcgY3VycmVudFRpbWVNaWxsaXMpIHsKKyAgICBsb25nIG1pblRpbWVGb3JLZWVwQWxpdmUgPSBjdXJyZW50VGltZU1pbGxpcyAtIG15VGltZW91dE1pbGxpczsKKyAgICByZXR1cm4gbWluVGltZUZvcktlZXBBbGl2ZSA+IGxhc3RDb21tdW5pY2F0aW9uVGltZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjb21tdW5pY2F0ZWROb3cobG9uZyBjdXJyZW50VGltZU1pbGxpcykgeworICAgIGxhc3RDb21tdW5pY2F0aW9uVGltZSA9IGN1cnJlbnRUaW1lTWlsbGlzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uVGltZW91dEVsYXBzZWQoU29ja2V0Q2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG15Q29ubmVjdGlvbkxpc3RlbmVyLm9uRXJyb3IoY2hhbm5lbCwgbmV3IFNvY2tldFRpbWVvdXRFeGNlcHRpb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGNhNTcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworCisgIHB1YmxpYyBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmNTg4OAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyIHsKKworICAvKioKKyAgICogaW52b2tlZCB3aGVuIHNwZWNpZmllZCBzb2NrZXQgY2hhbm5lbCBjb250YWlucyBhbnkgZGF0YQorICAgKgorICAgKiBAcGFyYW0gc29ja2V0Q2hhbm5lbCBzcGVjaWZpZWQgc29ja2V0IGNoYW5uZWwgd2l0aCBkYXRhCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBvbk5ld0RhdGFBdmFpbGFibGUoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIGludm9rZWQgd2hlbiBnZXQgbmV3IGNvbm5lY3Rpb24KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgc3BlY2lmaWVkIHNvY2tldCBjaGFubmVsCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogaW52b2tlZCB3aGVuIGFuIGVycm9yIG9jY3VycworICAgKgorICAgKiBAcGFyYW0gc29ja2V0Q2hhbm5lbCBzcGVjaWZpZWQgY2hhbm5lbCwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2hhbm5lbAorICAgKiBAcGFyYW0gZXggICAgICAgICAgICBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBvbkVycm9yKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGV4KSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzAwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5UaW1lU2VydmljZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzLio7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5Db25zdGFudHMuREVGQVVMVF9DTEVBTlVQX1JVTl9USU1FT1VUX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzLkRFRkFVTFRfU0VMRUNUT1JfU0VMRUNUX1RJTUVPVVRfTUlMTElTOworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbk1hbmFnZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29ubmVjdGlvbk1hbmFnZXIuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CisgIHByaXZhdGUgZmluYWwgVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBDb25uZWN0aW9uV29ya2VyIG15Q29ubmVjdGlvbldvcmtlcjsKKyAgcHJpdmF0ZSBpbnQgbXlCaW5kUG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTWFuYWdlckNvbnRleHQgbXlDb250ZXh0OworICBwcml2YXRlIHZvbGF0aWxlIFNlcnZlclNvY2tldENoYW5uZWwgbXlTZXJ2ZXJTb2NrZXRDaGFubmVsOworICBwcml2YXRlIHZvbGF0aWxlIEZ1dHVyZTw/PiBteVdvcmtlckZ1dHVyZTsKKyAgcHJpdmF0ZSBmaW5hbCBOZXdDb25uZWN0aW9uQWxsb3dlciBteUluY29taW5nQ29ubmVjdGlvbkFsbG93ZXI7CisgIHByaXZhdGUgZmluYWwgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbXlPdXRnb2luZ0Nvbm5lY3Rpb25BbGxvd2VyOworICBwcml2YXRlIGZpbmFsIFRpbWVvdXRTdG9yYWdlIHNvY2tldFRpbWVvdXRTdG9yYWdlID0gbmV3IFRpbWVvdXRTdG9yYWdlSW1wbCgpOworICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gYWxyZWFkeUluaXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBteVNlbmRCdWZmZXJTaXplOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlSZWNlaXZlQnVmZmVyU2l6ZTsKKworICBwdWJsaWMgQ29ubmVjdGlvbk1hbmFnZXIoQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lU2VydmljZSB0aW1lU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIG5ld0luY29taW5nQ29ubmVjdGlvbkFsbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdDb25uZWN0aW9uQWxsb3dlciBuZXdPdXRnb2luZ0Nvbm5lY3Rpb25BbGxvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JGYWN0b3J5IHNlbGVjdG9yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgbXlTZW5kQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgbXlSZWNlaXZlQnVmZmVyU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLm15U2VuZEJ1ZmZlclNpemUgPSBteVNlbmRCdWZmZXJTaXplOworICAgIHRoaXMubXlSZWNlaXZlQnVmZmVyU2l6ZSA9IG15UmVjZWl2ZUJ1ZmZlclNpemU7CisgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yRmFjdG9yeS5uZXdTZWxlY3RvcigpOworICAgIHRoaXMubXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICAgIG15Q29udGV4dCA9IGNvbnRleHQ7CisgICAgdGhpcy5teUluY29taW5nQ29ubmVjdGlvbkFsbG93ZXIgPSBuZXdJbmNvbWluZ0Nvbm5lY3Rpb25BbGxvd2VyOworICAgIHRoaXMubXlPdXRnb2luZ0Nvbm5lY3Rpb25BbGxvd2VyID0gbmV3T3V0Z29pbmdDb25uZWN0aW9uQWxsb3dlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGluaXRBbmRSdW5Xb3JrZXIoU2VydmVyQ2hhbm5lbFJlZ2lzdGVyIHNlcnZlckNoYW5uZWxSZWdpc3RlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGJvb2xlYW4gd2FzSW5pdCA9IGFscmVhZHlJbml0LmdldEFuZFNldCh0cnVlKTsKKworICAgIGlmICh3YXNJbml0KSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0aW9uIG1hbmFnZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICB9CisKKyAgICBteVNlcnZlclNvY2tldENoYW5uZWwgPSBzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIuY2hhbm5lbEZvcihzZWxlY3Rvcik7CisgICAgbXlTZXJ2ZXJTb2NrZXRDaGFubmVsLnJlZ2lzdGVyKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfQUNDRVBULCBuZXcgQWNjZXB0QXR0YWNobWVudEltcGwobXlDb250ZXh0KSk7CisgICAgbXlCaW5kUG9ydCA9IG15U2VydmVyU29ja2V0Q2hhbm5lbC5zb2NrZXQoKS5nZXRMb2NhbFBvcnQoKTsKKyAgICBTdHJpbmcgc2VydmVyTmFtZSA9IG15U2VydmVyU29ja2V0Q2hhbm5lbC5zb2NrZXQoKS50b1N0cmluZygpOworICAgIG15Q29ubmVjdGlvbldvcmtlciA9IG5ldyBDb25uZWN0aW9uV29ya2VyKHNlbGVjdG9yLCBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IEludmFsaWRLZXlQcm9jZXNzb3IoKSwKKyAgICAgICAgICAgIG5ldyBBY2NlcHRhYmxlS2V5UHJvY2Vzc29yKHNlbGVjdG9yLCBzZXJ2ZXJOYW1lLCBteVRpbWVTZXJ2aWNlLCBteUluY29taW5nQ29ubmVjdGlvbkFsbG93ZXIsIHNvY2tldFRpbWVvdXRTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICBteVNlbmRCdWZmZXJTaXplLCBteVJlY2VpdmVCdWZmZXJTaXplKSwKKyAgICAgICAgICAgIG5ldyBDb25uZWN0YWJsZUtleVByb2Nlc3NvcihzZWxlY3RvciwgbXlUaW1lU2VydmljZSwgc29ja2V0VGltZW91dFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgIG15U2VuZEJ1ZmZlclNpemUsIG15UmVjZWl2ZUJ1ZmZlclNpemUpLAorICAgICAgICAgICAgbmV3IFJlYWRhYmxlS2V5UHJvY2Vzc29yKHNlcnZlck5hbWUpLAorICAgICAgICAgICAgbmV3IFdyaXRhYmxlS2V5UHJvY2Vzc29yKCkpLCBERUZBVUxUX1NFTEVDVE9SX1NFTEVDVF9USU1FT1VUX01JTExJUywgREVGQVVMVF9DTEVBTlVQX1JVTl9USU1FT1VUX01JTExJUywKKyAgICAgICAgICAgIG15VGltZVNlcnZpY2UsCisgICAgICAgICAgICBuZXcgQ2xlYW51cEtleVByb2Nlc3NvcihteVRpbWVTZXJ2aWNlKSwKKyAgICAgICAgICAgIG15T3V0Z29pbmdDb25uZWN0aW9uQWxsb3dlcik7CisgICAgbXlXb3JrZXJGdXR1cmUgPSBteUNvbnRleHQuZ2V0RXhlY3V0b3IoKS5zdWJtaXQobXlDb25uZWN0aW9uV29ya2VyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yU2VsZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIENvbm5lY3Rpb25Xb3JrZXIgd29ya2VyTG9jYWwgPSBteUNvbm5lY3Rpb25Xb3JrZXI7CisgICAgY2hlY2tUaGF0V29ya2VySXNJbml0KHdvcmtlckxvY2FsKTsKKyAgICB3b3JrZXJMb2NhbC5zZXRTZWxlY3RvclNlbGVjdFRpbWVvdXQodGltZW91dCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tUaGF0V29ya2VySXNJbml0KENvbm5lY3Rpb25Xb3JrZXIgd29ya2VyKSB7CisgICAgaWYgKHdvcmtlciA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIG1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkISIpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gb2ZmZXJDb25uZWN0KENvbm5lY3RUYXNrIGNvbm5lY3RUYXNrLCBpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBpZiAobXlDb25uZWN0aW9uV29ya2VyID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG15Q29ubmVjdGlvbldvcmtlci5vZmZlckNvbm5lY3QoY29ubmVjdFRhc2ssIHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG9mZmVyV3JpdGUoV3JpdGVUYXNrIHdyaXRlVGFzaywgaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgaWYgKG15Q29ubmVjdGlvbldvcmtlciA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBteUNvbm5lY3Rpb25Xb3JrZXIub2ZmZXJXcml0ZSh3cml0ZVRhc2ssIHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgfQorCisKKyAgcHVibGljIGludCBnZXRCaW5kUG9ydCgpIHsKKyAgICByZXR1cm4gbXlCaW5kUG9ydDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgIGxvZ2dlci5kZWJ1ZygidHJ5IGNsb3NlIGNvbm5lY3Rpb24gbWFuYWdlci4uLiIpOworICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gdHJ1ZTsKKyAgICBpZiAobXlDb25uZWN0aW9uV29ya2VyICE9IG51bGwpIHsKKyAgICAgIG15V29ya2VyRnV0dXJlLmNhbmNlbCh0cnVlKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJvb2xlYW4gc2h1dGRvd25Db3JyZWN0bHkgPSBteUNvbm5lY3Rpb25Xb3JrZXIuc3RvcCh0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgICAgIGlmICghc2h1dGRvd25Db3JyZWN0bHkpIHsKKyAgICAgICAgICBzdWNjZXNzZnVsbHlDbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgICBsb2dnZXIud2FybigidW5hYmxlIHRvIHRlcm1pbmF0ZSB3b3JrZXIgaW4ge30ge30iLCB0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gZmFsc2U7CisgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIHRvIGF3YWl0IHRlcm1pbmF0aW9uIHdvcmtlciwgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgfQorICAgIH0KKyAgICB0cnkgeworICAgICAgdGhpcy5teVNlcnZlclNvY2tldENoYW5uZWwuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIHRvIGNsb3NlIHNlcnZlciBzb2NrZXQgY2hhbm5lbCIsIGUpOworICAgICAgc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IHRoaXMuc2VsZWN0b3Iua2V5cygpKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAoa2V5LmlzVmFsaWQoKSkgeworICAgICAgICAgIGtleS5jaGFubmVsKCkuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IGNoYW5uZWwge30iLCBrZXkuY2hhbm5lbCgpKTsKKyAgICAgICAgc3VjY2Vzc2Z1bGx5Q2xvc2VkID0gZmFsc2U7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHRyeSB7CisgICAgICB0aGlzLnNlbGVjdG9yLmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgIExvZ2dlclV0aWxzLmVycm9yQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuYWJsZSB0byBjbG9zZSBzZWxlY3RvciBjaGFubmVsIiwgZSk7CisgICAgICBzdWNjZXNzZnVsbHlDbG9zZWQgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN1Y2Nlc3NmdWxseUNsb3NlZCkgeworICAgICAgbG9nZ2VyLmRlYnVnKCJjb25uZWN0aW9uIG1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGNsb3NlZCIpOworICAgIH0gZWxzZSB7CisgICAgICBsb2dnZXIuZXJyb3IoImNvbm5lY3Rpb24gbWFuYWdlciB3YXNuJ3QgY2xvc2VkIHN1Y2Nlc3NmdWxseSIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIGNsb3NlKDEsIFRpbWVVbml0Lk1JTlVURVMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2xlYW51cFRpbWVvdXQobG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgQ29ubmVjdGlvbldvcmtlciB3b3JrZXJMb2NhbCA9IG15Q29ubmVjdGlvbldvcmtlcjsKKyAgICBjaGVja1RoYXRXb3JrZXJJc0luaXQod29ya2VyTG9jYWwpOworICAgIHdvcmtlckxvY2FsLnNldENsZWFudXBUaW1lb3V0KHRpbWVvdXRNaWxsaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U29ja2V0Q29ubmVjdGlvblRpbWVvdXQobG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgc29ja2V0VGltZW91dFN0b3JhZ2Uuc2V0VGltZW91dCh0aW1lb3V0TWlsbGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlQ2hhbm5lbChDaGFubmVsIGNoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY2hhbm5lbC5jbG9zZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1Y2JiNQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uTWFuYWdlckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTWFuYWdlckNvbnRleHQgZXh0ZW5kcyBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IHsKKworICBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3IoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25Xb3JrZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MzI3NQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVGltZVNlcnZpY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29ycy5DbGVhbnVwUHJvY2Vzc29yOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29ycy5LZXlQcm9jZXNzb3I7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbldvcmtlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbm5lY3Rpb25Xb3JrZXIuY2xhc3MpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfVEhSRUFEX05BTUUgPSAiVG9ycmVudCBjaGFubmVscyBtYW5hZ2VyIHRocmVhZCI7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7CisgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CisgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxDb25uZWN0VGFzaz4gbXlDb25uZWN0UXVldWU7CisgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxXcml0ZVRhc2s+IG15V3JpdGVRdWV1ZTsKKyAgcHJpdmF0ZSBmaW5hbCBTZW1hcGhvcmUgbXlTZW1hcGhvcmU7CisgIHByaXZhdGUgZmluYWwgTGlzdDxLZXlQcm9jZXNzb3I+IG15S2V5UHJvY2Vzc29yczsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lU2VydmljZSBteVRpbWVTZXJ2aWNlOworICBwcml2YXRlIGxvbmcgbGFzdENsZWFudXBUaW1lOworICBwcml2YXRlIHZvbGF0aWxlIGludCBteVNlbGVjdG9yVGltZW91dE1pbGxpczsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG15Q2xlYW51cFRpbWVvdXRNaWxsaXM7CisgIHByaXZhdGUgZmluYWwgQ2xlYW51cFByb2Nlc3NvciBteUNsZWFudXBQcm9jZXNzb3I7CisgIHByaXZhdGUgZmluYWwgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbXlOZXdDb25uZWN0aW9uQWxsb3dlcjsKKworICBDb25uZWN0aW9uV29ya2VyKFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgIExpc3Q8S2V5UHJvY2Vzc29yPiBrZXlQcm9jZXNzb3JzLAorICAgICAgICAgICAgICAgICAgIGludCBzZWxlY3RvclRpbWVvdXRNaWxsaXMsCisgICAgICAgICAgICAgICAgICAgaW50IGNsZWFudXBUaW1lb3V0TWlsbGlzLAorICAgICAgICAgICAgICAgICAgIFRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgIENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICBOZXdDb25uZWN0aW9uQWxsb3dlciBteU5ld0Nvbm5lY3Rpb25BbGxvd2VyKSB7CisgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgIHRoaXMubXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICAgIHRoaXMubGFzdENsZWFudXBUaW1lID0gdGltZVNlcnZpY2Uubm93KCk7CisgICAgdGhpcy5teVNlbGVjdG9yVGltZW91dE1pbGxpcyA9IHNlbGVjdG9yVGltZW91dE1pbGxpczsKKyAgICB0aGlzLm15Q2xlYW51cFRpbWVvdXRNaWxsaXMgPSBjbGVhbnVwVGltZW91dE1pbGxpczsKKyAgICB0aGlzLm15Q2xlYW51cFByb2Nlc3NvciA9IGNsZWFudXBQcm9jZXNzb3I7CisgICAgdGhpcy5teU5ld0Nvbm5lY3Rpb25BbGxvd2VyID0gbXlOZXdDb25uZWN0aW9uQWxsb3dlcjsKKyAgICB0aGlzLm15U2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxKTsKKyAgICB0aGlzLm15Q29ubmVjdFF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8Q29ubmVjdFRhc2s+KDEwMCk7CisgICAgdGhpcy5teUtleVByb2Nlc3NvcnMgPSBrZXlQcm9jZXNzb3JzOworICAgIHRoaXMubXlXcml0ZVF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPig1MDAwKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisKKyAgICB0cnkgeworICAgICAgbXlTZW1hcGhvcmUuYWNxdWlyZSgpOworICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgb2xkTmFtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworCisgICAgdHJ5IHsKKworICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXROYW1lKFNFTEVDVE9SX1RIUkVBRF9OQU1FKTsKKworICAgICAgd2hpbGUgKCFzdG9wICYmICghVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgc2VsZWN0IGtleXMgZnJvbSBzZWxlY3RvciIpOworICAgICAgICAgIGludCBzZWxlY3RlZDsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZWxlY3Rvci5zZWxlY3QobXlTZWxlY3RvclRpbWVvdXRNaWxsaXMpOworICAgICAgICAgIH0gY2F0Y2ggKENsb3NlZFNlbGVjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjb25uZWN0VG9QZWVyc0Zyb21RdWV1ZSgpOworICAgICAgICAgIHByb2Nlc3NXcml0ZVRhc2tzKCk7CisgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzZWxlY3Qga2V5cyBmcm9tIHNlbGVjdG9yLiBLZXlzIGNvdW50IGlzICIgKyBzZWxlY3RlZCk7CisgICAgICAgICAgaWYgKHNlbGVjdGVkICE9IDApIHsKKyAgICAgICAgICAgIHByb2Nlc3NTZWxlY3RlZEtleXMoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG5lZWRSdW5DbGVhbnVwKCkpIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgdG8gc2VsZWN0IGNoYW5uZWwga2V5cy4gRXJyb3IgbWVzc2FnZSB7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJleGNlcHRpb24gb24gY3ljbGUgaXRlcmF0aW9uIiwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0TmFtZShvbGROYW1lKTsKKyAgICAgIG15U2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKKyAgICBsYXN0Q2xlYW51cFRpbWUgPSBteVRpbWVTZXJ2aWNlLm5vdygpOworICAgIGZvciAoU2VsZWN0aW9uS2V5IGtleSA6IHNlbGVjdG9yLmtleXMoKSkgeworICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpKSBjb250aW51ZTsKKyAgICAgIG15Q2xlYW51cFByb2Nlc3Nvci5wcm9jZXNzQ2xlYW51cChrZXkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBuZWVkUnVuQ2xlYW51cCgpIHsKKyAgICByZXR1cm4gKG15VGltZVNlcnZpY2Uubm93KCkgLSBsYXN0Q2xlYW51cFRpbWUpID4gbXlDbGVhbnVwVGltZW91dE1pbGxpczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcm9jZXNzV3JpdGVUYXNrcygpIHsKKworICAgIGZpbmFsIEl0ZXJhdG9yPFdyaXRlVGFzaz4gaXRlcmF0b3IgPSBteVdyaXRlUXVldWUuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBXcml0ZVRhc2sgd3JpdGVUYXNrID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgaWYgKHN0b3AgfHwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgcmVnaXN0ZXIgY2hhbm5lbCBmb3Igd3JpdGUuIFdyaXRlIHRhc2sgaXMge30iLCB3cml0ZVRhc2spOworICAgICAgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gKFNvY2tldENoYW5uZWwpIHdyaXRlVGFzay5nZXRTb2NrZXRDaGFubmVsKCk7CisgICAgICBpZiAoIXNvY2tldENoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIHdyaXRlVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoZ2V0RGVmYXVsdFdyaXRlRXJyb3JNZXNzYWdlV2l0aFN1ZmZpeChzb2NrZXRDaGFubmVsLCAiQ2hhbm5lbCBpcyBub3Qgb3BlbiIpLCBuZXcgQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gc29ja2V0Q2hhbm5lbC5rZXlGb3Ioc2VsZWN0b3IpOworICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgIGxvZ2dlci53YXJuKCJ1bmFibGUgdG8gZmluZCBrZXkgZm9yIGNoYW5uZWwge30iLCBzb2NrZXRDaGFubmVsKTsKKyAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIHdyaXRlVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoZ2V0RGVmYXVsdFdyaXRlRXJyb3JNZXNzYWdlV2l0aFN1ZmZpeChzb2NrZXRDaGFubmVsLCAiQ2FuIG5vdCBmaW5kIGtleSBmb3IgdGhlIGNoYW5uZWwiKSwgbmV3IENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIFdyaXRlQXR0YWNobWVudCkpIHsKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJpbmNvcnJlY3QgYXR0YWNobWVudCB7fSBmb3IgY2hhbm5lbCB7fSIsIGF0dGFjaG1lbnQsIHNvY2tldENoYW5uZWwpOworICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgd3JpdGVUYXNrLmdldExpc3RlbmVyKCkub25Xcml0ZUZhaWxlZChnZXREZWZhdWx0V3JpdGVFcnJvck1lc3NhZ2VXaXRoU3VmZml4KHNvY2tldENoYW5uZWwsICJJbmNvcnJlY3QgYXR0YWNobWVudCBpbnN0YW5jZSBmb3IgdGhlIGtleSIpLCBuZXcgQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBXcml0ZUF0dGFjaG1lbnQga2V5QXR0YWNobWVudCA9IChXcml0ZUF0dGFjaG1lbnQpIGF0dGFjaG1lbnQ7CisgICAgICBpZiAoa2V5QXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkub2ZmZXIod3JpdGVUYXNrKSkgeworICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMoa2V5LmludGVyZXN0T3BzKCkgfCBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOworICAgICAgICB9IGNhdGNoIChDYW5jZWxsZWRLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgIHdyaXRlVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoZ2V0RGVmYXVsdFdyaXRlRXJyb3JNZXNzYWdlV2l0aFN1ZmZpeChzb2NrZXRDaGFubmVsLCAiS2V5IGlzIGNhbmNlbGxlZCIpLCBuZXcgQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbihlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0V3JpdGVFcnJvck1lc3NhZ2VXaXRoU3VmZml4KFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgU3RyaW5nIHN1ZmZpeCkgeworICAgIHJldHVybiAidW5hYmxlIHdyaXRlIGRhdGEgdG8gY2hhbm5lbCAiICsgc29ja2V0Q2hhbm5lbCArICIuICIgKyBzdWZmaXg7CisgIH0KKworICBwcml2YXRlIHZvaWQgY29ubmVjdFRvUGVlcnNGcm9tUXVldWUoKSB7CisgICAgQ29ubmVjdFRhc2sgY29ubmVjdFRhc2s7CisgICAgd2hpbGUgKChjb25uZWN0VGFzayA9IG15Q29ubmVjdFF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgaWYgKHN0b3AgfHwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbG9nZ2VyLmRlYnVnKCJ0cnkgY29ubmVjdCB0byBwZWVyLiBDb25uZWN0IHRhc2sgaXMge30iLCBjb25uZWN0VGFzayk7CisgICAgICB0cnkgeworICAgICAgICBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgc29ja2V0Q2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgICAgIHNvY2tldENoYW5uZWwucmVnaXN0ZXIoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9DT05ORUNULCBjb25uZWN0VGFzayk7CisgICAgICAgIHNvY2tldENoYW5uZWwuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoY29ubmVjdFRhc2suZ2V0SG9zdCgpLCBjb25uZWN0VGFzay5nZXRQb3J0KCkpKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgY29ubmVjdC4gQ29ubmVjdCB0YXNrIGlzIHt9IiwgY29ubmVjdFRhc2ssIGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIHN0b3AoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHN0b3AgPSB0cnVlOworICAgIGlmICh0aW1lb3V0IDw9IDApIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbXlTZW1hcGhvcmUudHJ5QWNxdWlyZSh0aW1lb3V0LCB0aW1lVW5pdCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlbGVjdGVkS2V5cygpIHsKKyAgICBTZXQ8U2VsZWN0aW9uS2V5PiBzZWxlY3Rpb25LZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCk7CisgICAgZm9yIChTZWxlY3Rpb25LZXkga2V5IDogc2VsZWN0aW9uS2V5cykgeworICAgICAgaWYgKHN0b3AgfHwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcHJvY2Vzc1NlbGVjdGVkS2V5KGtleSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dnZXIud2FybigiZXJyb3Ige30gaW4gcHJvY2Vzc2luZyBrZXkuIENsb3NlIGNoYW5uZWwge30iLCBlLmdldE1lc3NhZ2UoKSwga2V5LmNoYW5uZWwoKSk7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiIiwgZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAga2V5LmNoYW5uZWwoKS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgY2xvc2UgYmFkIGNoYW5uZWwiLCBpb2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHNlbGVjdGlvbktleXMuY2xlYXIoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2VsZWN0ZWRLZXkoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBsb2dnZXIudHJhY2UoInRyeSBwcm9jZXNzIGtleSBmb3IgY2hhbm5lbCB7fSIsIGtleS5jaGFubmVsKCkpOworICAgIG15Q2xlYW51cFByb2Nlc3Nvci5wcm9jZXNzU2VsZWN0ZWQoa2V5KTsKKyAgICBpZiAoIWtleS5jaGFubmVsKCkuaXNPcGVuKCkpIHsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChLZXlQcm9jZXNzb3Iga2V5UHJvY2Vzc29yIDogbXlLZXlQcm9jZXNzb3JzKSB7CisgICAgICBpZiAoa2V5UHJvY2Vzc29yLmFjY2VwdChrZXkpKSB7CisgICAgICAgIGtleVByb2Nlc3Nvci5wcm9jZXNzKGtleSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gb2ZmZXJDb25uZWN0KENvbm5lY3RUYXNrIGNvbm5lY3RUYXNrLCBpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBpZiAoIW15TmV3Q29ubmVjdGlvbkFsbG93ZXIuaXNOZXdDb25uZWN0aW9uQWxsb3dlZCgpKSB7CisgICAgICBsb2dnZXIuaW5mbygiY2FuIG5vdCBhZGQgY29ubmVjdCB0YXNrIHt9IHRvIHF1ZXVlLiBOZXcgY29ubmVjdGlvbiBpcyBub3QgYWxsb3dlZCIsIGNvbm5lY3RUYXNrKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGFkZFRhc2tUb1F1ZXVlKGNvbm5lY3RUYXNrLCB0aW1lb3V0LCB0aW1lVW5pdCwgbXlDb25uZWN0UXVldWUpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gb2ZmZXJXcml0ZShXcml0ZVRhc2sgd3JpdGVUYXNrLCBpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBib29sZWFuIGRvbmUgPSBhZGRUYXNrVG9RdWV1ZSh3cml0ZVRhc2ssIHRpbWVvdXQsIHRpbWVVbml0LCBteVdyaXRlUXVldWUpOworICAgIGlmICghZG9uZSkgeworICAgICAgd3JpdGVUYXNrLmdldExpc3RlbmVyKCkub25Xcml0ZUZhaWxlZCgidW5hYmxlIGFkZCB0YXNrICIgKyB3cml0ZVRhc2sgKyAiIHRvIHRoZSBxdWV1ZS4gTWF5YmUgcXVldWUgaXMgb3ZlcmxvYWQiLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIGRvbmU7CisgIH0KKworICBwcml2YXRlIDxUPiBib29sZWFuIGFkZFRhc2tUb1F1ZXVlKFQgdGFzaywgaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0LCBCbG9ja2luZ1F1ZXVlPFQ+IHF1ZXVlKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmIChxdWV1ZS5vZmZlcih0YXNrLCB0aW1lb3V0LCB0aW1lVW5pdCkpIHsKKyAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRlZCB0YXNrIHt9LiBXYWtlIHVwIHNlbGVjdG9yIiwgdGFzayk7CisgICAgICAgIHNlbGVjdG9yLndha2V1cCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuZGVidWcoIlRhc2sge30gaW50ZXJydXB0ZWQgYmVmb3JlIHdhcyBhZGRlZCB0byBxdWV1ZSIsIHRhc2spOworICAgIH0KKyAgICBsb2dnZXIuZGVidWcoIlRhc2sge30gd2FzIG5vdCBhZGRlZCIsIHRhc2spOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgc2V0Q2xlYW51cFRpbWVvdXQobG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgdGhpcy5teUNsZWFudXBUaW1lb3V0TWlsbGlzID0gdGltZW91dE1pbGxpczsKKyAgfQorCisgIHZvaWQgc2V0U2VsZWN0b3JTZWxlY3RUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgbXlTZWxlY3RvclRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0OworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9GaXJzdEF2YWlsYWJsZUNoYW5uZWwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9GaXJzdEF2YWlsYWJsZUNoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFhN2VmCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0ZpcnN0QXZhaWxhYmxlQ2hhbm5lbC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VydmVyU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIEZpcnN0QXZhaWxhYmxlQ2hhbm5lbCBpbXBsZW1lbnRzIFNlcnZlckNoYW5uZWxSZWdpc3RlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaXJzdEF2YWlsYWJsZUNoYW5uZWwuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgaW50IGZpcnN0VHJ5UG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbGFzdFRyeVBvcnQ7CisKKyAgcHVibGljIEZpcnN0QXZhaWxhYmxlQ2hhbm5lbChpbnQgZmlyc3RUcnlQb3J0LCBpbnQgbGFzdFRyeVBvcnQpIHsKKyAgICB0aGlzLmZpcnN0VHJ5UG9ydCA9IGZpcnN0VHJ5UG9ydDsKKyAgICB0aGlzLmxhc3RUcnlQb3J0ID0gbGFzdFRyeVBvcnQ7CisgIH0KKworICBATm90TnVsbAorICBAT3ZlcnJpZGUKKyAgcHVibGljIFNlcnZlclNvY2tldENoYW5uZWwgY2hhbm5lbEZvcihTZWxlY3RvciBzZWxlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIG15U2VydmVyU29ja2V0Q2hhbm5lbCA9IHNlbGVjdG9yLnByb3ZpZGVyKCkub3BlblNlcnZlclNvY2tldENoYW5uZWwoKTsKKyAgICBteVNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgIGludCBiaW5kUG9ydCA9IC0xOworICAgIGZvciAoaW50IHBvcnQgPSBmaXJzdFRyeVBvcnQ7IHBvcnQgPD0gbGFzdFRyeVBvcnQ7IHBvcnQrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgdHJ5QWRkcmVzcyA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KTsKKyAgICAgICAgbXlTZXJ2ZXJTb2NrZXRDaGFubmVsLnNvY2tldCgpLmJpbmQodHJ5QWRkcmVzcyk7CisgICAgICAgIGJpbmRQb3J0ID0gdHJ5QWRkcmVzcy5nZXRQb3J0KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAvL3RyeSBuZXh0IHBvcnQKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJDb3VsZCBub3QgYmluZCB0byBwb3J0IHt9LCB0cnlpbmcgbmV4dCBwb3J0Li4uIiwgcG9ydCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChiaW5kUG9ydCA9PSAtMSkgeworICAgICAgbG9nZ2VyLmVycm9yKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJObyBhdmFpbGFibGUgcG9ydHMgaW4gcmFuZ2UgWyVkLCAlZF0gZm9yIHRoZSBCaXRUb3JyZW50IGNsaWVudCEiLCBmaXJzdFRyeVBvcnQsIGxhc3RUcnlQb3J0CisgICAgICApKTsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gYXZhaWxhYmxlIHBvcnQgZm9yIHRoZSBCaXRUb3JyZW50IGNsaWVudCEiKTsKKyAgICB9CisgICAgcmV0dXJuIG15U2VydmVyU29ja2V0Q2hhbm5lbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL05ld0Nvbm5lY3Rpb25BbGxvd2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvTmV3Q29ubmVjdGlvbkFsbG93ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY4MzRmCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL05ld0Nvbm5lY3Rpb25BbGxvd2VyLmphdmEKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitwdWJsaWMgaW50ZXJmYWNlIE5ld0Nvbm5lY3Rpb25BbGxvd2VyIHsKKworICAvKioKKyAgICogQHJldHVybiB0cnVlIGlmIHdlIGNhbiBhY2NlcHQgbmV3IGNvbm5lY3Rpb24gb3IgY2FuIGNvbm5lY3QgdG8gb3RoZXIgcGVlcgorICAgKi8KKyAgYm9vbGVhbiBpc05ld0Nvbm5lY3Rpb25BbGxvd2VkKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9SZWFkQXR0YWNobWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1JlYWRBdHRhY2htZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3MmUzMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9SZWFkQXR0YWNobWVudC5qYXZhCkBAIC0wLDAgKzEsOSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitwdWJsaWMgaW50ZXJmYWNlIFJlYWRBdHRhY2htZW50IHsKKworICAvKioKKyAgICogQHJldHVybiBjb25uZWN0aW9uIGxpc3RlbmVyLCBhc3NvY2lhdGVkIHdpdGgga2V5IHdpdGggY3VycmVudCBhdHRhY2htZW50CisgICAqLworICBDb25uZWN0aW9uTGlzdGVuZXIgZ2V0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvUmVhZFdyaXRlQXR0YWNobWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1JlYWRXcml0ZUF0dGFjaG1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmIwNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1JlYWRXcml0ZUF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CisKK3B1YmxpYyBjbGFzcyBSZWFkV3JpdGVBdHRhY2htZW50IGltcGxlbWVudHMgUmVhZEF0dGFjaG1lbnQsIFdyaXRlQXR0YWNobWVudCwgVGltZW91dEF0dGFjaG1lbnQgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBXUklURV9UQVNLX1FVRVVFX1NJWkUgPSAxNTA7CisKKyAgcHJpdmF0ZSBsb25nIGxhc3RDb21tdW5pY2F0aW9uVGltZTsKKyAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOworICBwcml2YXRlIGZpbmFsIGxvbmcgbXlUaW1lb3V0TWlsbGlzOworICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPiB3cml0ZVRhc2tzOworCisgIHB1YmxpYyBSZWFkV3JpdGVBdHRhY2htZW50KENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXIsIGxvbmcgbGFzdENvbW11bmljYXRpb25UaW1lLCBsb25nIHRpbWVvdXRNaWxsaXMpIHsKKyAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IGNvbm5lY3Rpb25MaXN0ZW5lcjsKKyAgICB0aGlzLndyaXRlVGFza3MgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxXcml0ZVRhc2s+KFdSSVRFX1RBU0tfUVVFVUVfU0laRSk7CisgICAgdGhpcy5sYXN0Q29tbXVuaWNhdGlvblRpbWUgPSBsYXN0Q29tbXVuaWNhdGlvblRpbWU7CisgICAgdGhpcy5teVRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0TWlsbGlzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDb25uZWN0aW9uTGlzdGVuZXIgZ2V0Q29ubmVjdGlvbkxpc3RlbmVyKCkgeworICAgIHJldHVybiBjb25uZWN0aW9uTGlzdGVuZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEJsb2NraW5nUXVldWU8V3JpdGVUYXNrPiBnZXRXcml0ZVRhc2tzKCkgeworICAgIHJldHVybiB3cml0ZVRhc2tzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVGltZW91dEVsYXBzZWQobG9uZyBjdXJyZW50VGltZU1pbGxpcykgeworICAgIGxvbmcgbWluVGltZUZvcktlZXBBbGl2ZSA9IGN1cnJlbnRUaW1lTWlsbGlzIC0gbXlUaW1lb3V0TWlsbGlzOworICAgIHJldHVybiBtaW5UaW1lRm9yS2VlcEFsaXZlID4gbGFzdENvbW11bmljYXRpb25UaW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbW11bmljYXRlZE5vdyhsb25nIGN1cnJlbnRUaW1lTWlsbGlzKSB7CisgICAgbGFzdENvbW11bmljYXRpb25UaW1lID0gY3VycmVudFRpbWVNaWxsaXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25UaW1lb3V0RWxhcHNlZChTb2NrZXRDaGFubmVsIGNoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgY29ubmVjdGlvbkxpc3RlbmVyLm9uRXJyb3IoY2hhbm5lbCwgbmV3IFNvY2tldFRpbWVvdXRFeGNlcHRpb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9TZWxlY3RvckZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9TZWxlY3RvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2I5OWIyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1NlbGVjdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2VsZWN0b3JGYWN0b3J5IHsKKworICAvKioKKyAgICogQHJldHVybiBuZXcge0BsaW5rIFNlbGVjdG9yfSBpbnN0YW5jZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBpbyBlcnJvciBvY2N1cnMKKyAgICovCisgIFNlbGVjdG9yIG5ld1NlbGVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU2VydmVyQ2hhbm5lbFJlZ2lzdGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU2VydmVyQ2hhbm5lbFJlZ2lzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2OWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9TZXJ2ZXJDaGFubmVsUmVnaXN0ZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlcnZlclNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmVyQ2hhbm5lbFJlZ2lzdGVyIHsKKworICAvKioKKyAgICogQ3JlYXRlIG5ldyBjaGFubmVsIGFuZCBiaW5kIHRvIHNwZWNpZmllZCBzZWxlY3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VsZWN0b3Igc3BlY2lmaWVkIHNlbGVjdG9yCisgICAqIEByZXR1cm4gbmV3IGNyZWF0ZWQgc2VydmVyIGNoYW5uZWwKKyAgICovCisgIEBOb3ROdWxsCisgIFNlcnZlclNvY2tldENoYW5uZWwgY2hhbm5lbEZvcihTZWxlY3RvciBzZWxlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dEF0dGFjaG1lbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9UaW1lb3V0QXR0YWNobWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Nzg2NjYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dEF0dGFjaG1lbnQuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGltZW91dEF0dGFjaG1lbnQgeworCisgIC8qKgorICAgKiBAcGFyYW0gY3VycmVudFRpbWVNaWxsaXMgY3VycmVudCB0aW1lIGZvciB0aW1lb3V0IGNhbGN1bGF0aW9uCisgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYW5kIG9ubHkgaWYgdGltZW91dCB3YXMgZWxhcHNlZAorICAgKi8KKyAgYm9vbGVhbiBpc1RpbWVvdXRFbGFwc2VkKGxvbmcgY3VycmVudFRpbWVNaWxsaXMpOworCisgIC8qKgorICAgKiBzZXQgbGFzdCBjb21tdW5pY2F0aW9uIHRpbWUgdG8gY3VycmVudCB0aW1lCisgICAqCisgICAqIEBwYXJhbSBjdXJyZW50VGltZU1pbGxpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAqLworICB2b2lkIGNvbW11bmljYXRlZE5vdyhsb25nIGN1cnJlbnRUaW1lTWlsbGlzKTsKKworICAvKioKKyAgICogbXVzdCBiZSBpbnZva2VkIGlmIHRpbWVvdXQgd2FzIGVsYXBzZWQKKyAgICoKKyAgICogQHBhcmFtIGNoYW5uZWwgc3BlY2lmaWVkIGNoYW5uZWwgZm9yIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRhY2htZW50CisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgKi8KKyAgdm9pZCBvblRpbWVvdXRFbGFwc2VkKFNvY2tldENoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dFN0b3JhZ2UuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9UaW1lb3V0U3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMTRkOTIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dFN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGludGVyZmFjZSBUaW1lb3V0U3RvcmFnZSB7CisKKyAgdm9pZCBzZXRUaW1lb3V0KGxvbmcgbWlsbGlzKTsKKworICB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KTsKKworICBsb25nIGdldFRpbWVvdXRNaWxsaXMoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRTdG9yYWdlSW1wbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1RpbWVvdXRTdG9yYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWYwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvVGltZW91dFN0b3JhZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK3B1YmxpYyBjbGFzcyBUaW1lb3V0U3RvcmFnZUltcGwgaW1wbGVtZW50cyBUaW1lb3V0U3RvcmFnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIHRpbWVvdXRNaWxsaXMgPSBuZXcgQXRvbWljTG9uZygpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGxvbmcgbWlsbGlzKSB7CisgICAgdGltZW91dE1pbGxpcy5zZXQobWlsbGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgIHNldFRpbWVvdXQodGltZVVuaXQudG9NaWxsaXModGltZW91dCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIGdldFRpbWVvdXRNaWxsaXMoKSB7CisgICAgcmV0dXJuIHRpbWVvdXRNaWxsaXMuZ2V0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUF0dGFjaG1lbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUF0dGFjaG1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDk3Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dyaXRlQXR0YWNobWVudC5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CisKK3B1YmxpYyBpbnRlcmZhY2UgV3JpdGVBdHRhY2htZW50IHsKKworICAvKioKKyAgICogQHJldHVybiBxdWV1ZSBmb3Igb2ZmZXIvcGVlayB3cml0ZSB0YXNrcworICAgKi8KKyAgQmxvY2tpbmdRdWV1ZTxXcml0ZVRhc2s+IGdldFdyaXRlVGFza3MoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dyaXRlTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0M2U1MwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitwdWJsaWMgaW50ZXJmYWNlIFdyaXRlTGlzdGVuZXIgeworCisgIC8qKgorICAgKiBpbnZva2VkIGlmIHdyaXRlIGlzIGZhaWxlZCBieSBhbnkgcmVhc29uCisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIGVycm9yIGRlc2NyaXB0aW9uCisgICAqIEBwYXJhbSBlICAgICAgIGV4Y2VwdGlvbiBpZiBleGlzdC4gT3RoZXJ3aXNlIG51bGwKKyAgICovCisgIHZvaWQgb25Xcml0ZUZhaWxlZChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpOworCisgIC8qKgorICAgKiBpbnZva2VkIGlmIHdyaXRlIGRvbmUgY29ycmVjdGx5CisgICAqLworICB2b2lkIG9uV3JpdGVEb25lKCk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZVRhc2suamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Xcml0ZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg3NTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dyaXRlVGFzay5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBXcml0ZVRhc2sgeworCisgIHByaXZhdGUgZmluYWwgQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbDsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7CisgIHByaXZhdGUgZmluYWwgV3JpdGVMaXN0ZW5lciBsaXN0ZW5lcjsKKworICBwdWJsaWMgV3JpdGVUYXNrKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciwgV3JpdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHRoaXMuc29ja2V0Q2hhbm5lbCA9IHNvY2tldENoYW5uZWw7CisgICAgdGhpcy5ieXRlQnVmZmVyID0gYnl0ZUJ1ZmZlcjsKKyAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgIH0KKworICBwdWJsaWMgQnl0ZUNoYW5uZWwgZ2V0U29ja2V0Q2hhbm5lbCgpIHsKKyAgICByZXR1cm4gc29ja2V0Q2hhbm5lbDsKKyAgfQorCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgIH0KKworICBwdWJsaWMgV3JpdGVMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKKyAgICByZXR1cm4gbGlzdGVuZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIldyaXRlVGFza3siICsKKyAgICAgICAgICAgICJzb2NrZXRDaGFubmVsPSIgKyBzb2NrZXRDaGFubmVsICsKKyAgICAgICAgICAgICIsIGJ5dGVCdWZmZXI9IiArIGJ5dGVCdWZmZXIgKworICAgICAgICAgICAgIiwgbGlzdGVuZXI9IiArIGxpc3RlbmVyICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQWNjZXB0YWJsZUtleVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQWNjZXB0YWJsZUtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjA3YzIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9BY2NlcHRhYmxlS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVGltZVNlcnZpY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuKjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitwdWJsaWMgY2xhc3MgQWNjZXB0YWJsZUtleVByb2Nlc3NvciBpbXBsZW1lbnRzIEtleVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBY2NlcHRhYmxlS2V5UHJvY2Vzc29yLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIG15U2VsZWN0b3I7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15U2VydmVyU29ja2V0TG9jYWxBZGRyZXNzOworICBwcml2YXRlIGZpbmFsIFRpbWVTZXJ2aWNlIG15VGltZVNlcnZpY2U7CisgIHByaXZhdGUgZmluYWwgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbXlOZXdDb25uZWN0aW9uQWxsb3dlcjsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lb3V0U3RvcmFnZSBteVRpbWVvdXRTdG9yYWdlOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlTZW5kQnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15UmVjZWl2ZUJ1ZmZlclNpemU7CisKKyAgcHVibGljIEFjY2VwdGFibGVLZXlQcm9jZXNzb3IoU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdDb25uZWN0aW9uQWxsb3dlciBuZXdDb25uZWN0aW9uQWxsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dFN0b3JhZ2UgdGltZW91dFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgc2VuZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgcmVjZWl2ZUJ1ZmZlclNpemUpIHsKKyAgICB0aGlzLm15U2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICB0aGlzLm15U2VydmVyU29ja2V0TG9jYWxBZGRyZXNzID0gc2VydmVyU29ja2V0TG9jYWxBZGRyZXNzOworICAgIHRoaXMubXlUaW1lU2VydmljZSA9IHRpbWVTZXJ2aWNlOworICAgIHRoaXMubXlOZXdDb25uZWN0aW9uQWxsb3dlciA9IG5ld0Nvbm5lY3Rpb25BbGxvd2VyOworICAgIHRoaXMubXlUaW1lb3V0U3RvcmFnZSA9IHRpbWVvdXRTdG9yYWdlOworICAgIHRoaXMubXlTZW5kQnVmZmVyU2l6ZSA9IHNlbmRCdWZmZXJTaXplOworICAgIHRoaXMubXlSZWNlaXZlQnVmZmVyU2l6ZSA9IHJlY2VpdmVCdWZmZXJTaXplOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0ga2V5LmNoYW5uZWwoKTsKKyAgICBpZiAoIShjaGFubmVsIGluc3RhbmNlb2YgU2VydmVyU29ja2V0Q2hhbm5lbCkpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiaW5jb3JyZWN0IGluc3RhbmNlIG9mIHNlcnZlciBjaGFubmVsLiBDYW4gbm90IGFjY2VwdCBjb25uZWN0aW9ucyIpOworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIEFjY2VwdEF0dGFjaG1lbnQpKSB7CisgICAgICBsb2dnZXIuZXJyb3IoImluY29ycmVjdCBpbnN0YW5jZSBvZiBzZXJ2ZXIgY2hhbm5lbCBrZXkgYXR0YWNobWVudCIpOworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IGNoYW5uZWxMaXN0ZW5lckZhY3RvcnkgPSAoKEFjY2VwdEF0dGFjaG1lbnQpIGF0dGFjaG1lbnQpLmdldENoYW5uZWxMaXN0ZW5lckZhY3RvcnkoKTsKKworICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9ICgoU2VydmVyU29ja2V0Q2hhbm5lbCkga2V5LmNoYW5uZWwoKSkuYWNjZXB0KCk7CisgICAgbG9nZ2VyLnRyYWNlKCJzZXJ2ZXIge30gZ2V0IG5ldyBjb25uZWN0aW9uIGZyb20ge30iLCBuZXcgT2JqZWN0W117bXlTZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3MsIHNvY2tldENoYW5uZWwuc29ja2V0KCl9KTsKKworICAgIGlmICghbXlOZXdDb25uZWN0aW9uQWxsb3dlci5pc05ld0Nvbm5lY3Rpb25BbGxvd2VkKCkpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJuZXcgY29ubmVjdGlvbiBpcyBub3QgYWxsb3dlZC4gTmV3IGNvbm5lY3Rpb24gaXMgY2xvc2VkIik7CisgICAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ29ubmVjdGlvbkxpc3RlbmVyIHN0YXRlQ29ubmVjdGlvbkxpc3RlbmVyID0gY2hhbm5lbExpc3RlbmVyRmFjdG9yeS5uZXdDaGFubmVsTGlzdGVuZXIoKTsKKyAgICBzdGF0ZUNvbm5lY3Rpb25MaXN0ZW5lci5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChzb2NrZXRDaGFubmVsKTsKKyAgICBzb2NrZXRDaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICBLZXlQcm9jZXNzb3JVdGlsLnNldEJ1ZmZlcnNTaXplSWZOZWNlc3Nhcnkoc29ja2V0Q2hhbm5lbCwgbXlTZW5kQnVmZmVyU2l6ZS5nZXQoKSwgbXlSZWNlaXZlQnVmZmVyU2l6ZS5nZXQoKSk7CisgICAgUmVhZFdyaXRlQXR0YWNobWVudCBrZXlBdHRhY2htZW50ID0gbmV3IFJlYWRXcml0ZUF0dGFjaG1lbnQoc3RhdGVDb25uZWN0aW9uTGlzdGVuZXIsIG15VGltZVNlcnZpY2Uubm93KCksIG15VGltZW91dFN0b3JhZ2UuZ2V0VGltZW91dE1pbGxpcygpKTsKKyAgICBzb2NrZXRDaGFubmVsLnJlZ2lzdGVyKG15U2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFELCBrZXlBdHRhY2htZW50KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIHJldHVybiBrZXkuaXNWYWxpZCgpICYmIGtleS5pc0FjY2VwdGFibGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cEtleVByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cEtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTdmNzgKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlRpbWVvdXRBdHRhY2htZW50OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgY2xhc3MgQ2xlYW51cEtleVByb2Nlc3NvciBpbXBsZW1lbnRzIENsZWFudXBQcm9jZXNzb3IgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2xlYW51cEtleVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lU2VydmljZSBteVRpbWVTZXJ2aWNlOworCisgIHB1YmxpYyBDbGVhbnVwS2V5UHJvY2Vzc29yKFRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlKSB7CisgICAgdGhpcy5teVRpbWVTZXJ2aWNlID0gdGltZVNlcnZpY2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJvY2Vzc0NsZWFudXAoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIFRpbWVvdXRBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBLZXlQcm9jZXNzb3JVdGlsLmdldEF0dGFjaG1lbnRBc1RpbWVvdXRPck51bGwoa2V5KTsKKyAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChhdHRhY2htZW50LmlzVGltZW91dEVsYXBzZWQobXlUaW1lU2VydmljZS5ub3coKSkpIHsKKworICAgICAgU29ja2V0Q2hhbm5lbCBjaGFubmVsID0gS2V5UHJvY2Vzc29yVXRpbC5nZXRDYXN0ZWRDaGFubmVsT3JOdWxsKGtleSk7CisgICAgICBpZiAoY2hhbm5lbCA9PSBudWxsKSB7CisgICAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBsb2dnZXIuZGVidWcoImNoYW5uZWwge30gd2FzIGluYWN0aXZlIGluIHNwZWNpZmllZCB0aW1lb3V0LiBDbG9zZSBjaGFubmVsLi4uIiwgY2hhbm5lbCk7CisgICAgICB0cnkgeworICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgICAgYXR0YWNobWVudC5vblRpbWVvdXRFbGFwc2VkKGNoYW5uZWwpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgY2xvc2UgY2hhbm5lbCB7fSIsIGNoYW5uZWwsIGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwcm9jZXNzU2VsZWN0ZWQoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIFRpbWVvdXRBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBLZXlQcm9jZXNzb3JVdGlsLmdldEF0dGFjaG1lbnRBc1RpbWVvdXRPck51bGwoa2V5KTsKKyAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGF0dGFjaG1lbnQuY29tbXVuaWNhdGVkTm93KG15VGltZVNlcnZpY2Uubm93KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwUHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9DbGVhbnVwUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNTBjNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29yczsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKKworcHVibGljIGludGVyZmFjZSBDbGVhbnVwUHJvY2Vzc29yIHsKKworICAvKioKKyAgICogaW52b2tlZCB3aGVuIHRoZSBjbGVhbnVwIHByb2NlZHVyZSBpcyBydW5uaW5nLiBQcm9jZXNzb3IgY2FuIGNhbmNlbCBrZXkgYW5kL29yIGNsb3NlIGNoYW5uZWwgaWYgbmVjZXNzYXJ5CisgICAqCisgICAqIEBwYXJhbSBrZXkgc3BlY2lmaWVkIGtleQorICAgKi8KKyAgdm9pZCBwcm9jZXNzQ2xlYW51cChTZWxlY3Rpb25LZXkga2V5KTsKKworICAvKioKKyAgICogaW52b2tlZCB3aGVuIGdldCBhbnkgYWN0aXZpdHkgZm9yIGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5CisgICAqCisgICAqIEBwYXJhbSBrZXkgc3BlY2lmaWVkIGtleQorICAgKi8KKyAgdm9pZCBwcm9jZXNzU2VsZWN0ZWQoU2VsZWN0aW9uS2V5IGtleSk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0Nvbm5lY3RhYmxlS2V5UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Db25uZWN0YWJsZUtleVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Db25uZWN0YWJsZUtleVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3RUYXNrOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuUmVhZFdyaXRlQXR0YWNobWVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlRpbWVvdXRTdG9yYWdlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworcHVibGljIGNsYXNzIENvbm5lY3RhYmxlS2V5UHJvY2Vzc29yIGltcGxlbWVudHMgS2V5UHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbm5lY3RhYmxlS2V5UHJvY2Vzc29yLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIG15U2VsZWN0b3I7CisgIHByaXZhdGUgZmluYWwgVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lb3V0U3RvcmFnZSBteVRpbWVvdXRTdG9yYWdlOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlTZW5kQnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG15UmVjZWl2ZUJ1ZmZlclNpemU7CisKKyAgcHVibGljIENvbm5lY3RhYmxlS2V5UHJvY2Vzc29yKFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVNlcnZpY2UgdGltZVNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0U3RvcmFnZSB0aW1lb3V0U3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgc2VuZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIHJlY2VpdmVCdWZmZXJTaXplKSB7CisgICAgdGhpcy5teVNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgdGhpcy5teVRpbWVTZXJ2aWNlID0gdGltZVNlcnZpY2U7CisgICAgdGhpcy5teVRpbWVvdXRTdG9yYWdlID0gdGltZW91dFN0b3JhZ2U7CisgICAgdGhpcy5teVNlbmRCdWZmZXJTaXplID0gc2VuZEJ1ZmZlclNpemU7CisgICAgdGhpcy5teVJlY2VpdmVCdWZmZXJTaXplID0gcmVjZWl2ZUJ1ZmZlclNpemU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJvY2VzcyhTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgIGlmICghKGNoYW5uZWwgaW5zdGFuY2VvZiBTb2NrZXRDaGFubmVsKSkgeworICAgICAgbG9nZ2VyLndhcm4oImluY29ycmVjdCBpbnN0YW5jZSBvZiBjaGFubmVsLiBUaGUga2V5IGlzIGNhbmNlbGxlZCIpOworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDsKKyAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIENvbm5lY3RUYXNrKSkgeworICAgICAgbG9nZ2VyLndhcm4oImluY29ycmVjdCBpbnN0YW5jZSBvZiBhdHRhY2htZW50IGZvciBjaGFubmVsIHt9LiBUaGUga2V5IGZvciB0aGUgY2hhbm5lbCBpcyBjYW5jZWxsZWQiLCBzb2NrZXRDaGFubmVsKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmluYWwgQ29ubmVjdFRhc2sgY29ubmVjdFRhc2sgPSAoQ29ubmVjdFRhc2spIGF0dGFjaG1lbnQ7CisgICAgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lciA9IGNvbm5lY3RUYXNrLmdldENvbm5lY3Rpb25MaXN0ZW5lcigpOworICAgIGZpbmFsIGJvb2xlYW4gaXNDb25uZWN0RmluaXNoZWQ7CisgICAgdHJ5IHsKKyAgICAgIGlzQ29ubmVjdEZpbmlzaGVkID0gc29ja2V0Q2hhbm5lbC5maW5pc2hDb25uZWN0KCk7CisgICAgfSBjYXRjaCAoTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dnZXIuaW5mbygiQ291bGQgbm90IGNvbm5lY3QgdG8ge306e30sIHJlY2VpdmVkIE5vUm91dGVUb0hvc3RFeGNlcHRpb24iLCBjb25uZWN0VGFzay5nZXRIb3N0KCksIGNvbm5lY3RUYXNrLmdldFBvcnQoKSk7CisgICAgICBjb25uZWN0aW9uTGlzdGVuZXIub25FcnJvcihzb2NrZXRDaGFubmVsLCBlKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJDb3VsZCBub3QgY29ubmVjdCB0byB7fTp7fSwgcmVjZWl2ZWQgQ29ubmVjdEV4Y2VwdGlvbiIsIGNvbm5lY3RUYXNrLmdldEhvc3QoKSwgY29ubmVjdFRhc2suZ2V0UG9ydCgpKTsKKyAgICAgIGNvbm5lY3Rpb25MaXN0ZW5lci5vbkVycm9yKHNvY2tldENoYW5uZWwsIGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWlzQ29ubmVjdEZpbmlzaGVkKSB7CisgICAgICBsb2dnZXIuaW5mbygiQ291bGQgbm90IGNvbm5lY3QgdG8ge306e30iLCBjb25uZWN0VGFzay5nZXRIb3N0KCksIGNvbm5lY3RUYXNrLmdldFBvcnQoKSk7CisgICAgICBjb25uZWN0aW9uTGlzdGVuZXIub25FcnJvcihzb2NrZXRDaGFubmVsLCBudWxsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc29ja2V0Q2hhbm5lbC5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgS2V5UHJvY2Vzc29yVXRpbC5zZXRCdWZmZXJzU2l6ZUlmTmVjZXNzYXJ5KHNvY2tldENoYW5uZWwsIG15U2VuZEJ1ZmZlclNpemUuZ2V0KCksIG15UmVjZWl2ZUJ1ZmZlclNpemUuZ2V0KCkpOworICAgIFJlYWRXcml0ZUF0dGFjaG1lbnQga2V5QXR0YWNobWVudCA9IG5ldyBSZWFkV3JpdGVBdHRhY2htZW50KGNvbm5lY3Rpb25MaXN0ZW5lciwgbXlUaW1lU2VydmljZS5ub3coKSwgbXlUaW1lb3V0U3RvcmFnZS5nZXRUaW1lb3V0TWlsbGlzKCkpOworICAgIHNvY2tldENoYW5uZWwucmVnaXN0ZXIobXlTZWxlY3RvciwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQsIGtleUF0dGFjaG1lbnQpOworICAgIGxvZ2dlci5kZWJ1Zygic2V0dXAgbmV3IFRDUCBjb25uZWN0aW9uIHdpdGgge30iLCBzb2NrZXRDaGFubmVsKTsKKyAgICBjb25uZWN0aW9uTGlzdGVuZXIub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoc29ja2V0Q2hhbm5lbCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICByZXR1cm4ga2V5LmlzVmFsaWQoKSAmJiBrZXkuaXNDb25uZWN0YWJsZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9JbnZhbGlkS2V5UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9JbnZhbGlkS2V5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5ZjQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0ludmFsaWRLZXlQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29yczsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlJlYWRBdHRhY2htZW50OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNhbmNlbGxlZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIEludmFsaWRLZXlQcm9jZXNzb3IgaW1wbGVtZW50cyBLZXlQcm9jZXNzb3IgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW52YWxpZEtleVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisgICAgZmluYWwgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUmVhZEF0dGFjaG1lbnQpKSB7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghKGNoYW5uZWwgaW5zdGFuY2VvZiBTb2NrZXRDaGFubmVsKSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaW5hbCBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDsKKyAgICBmaW5hbCBSZWFkQXR0YWNobWVudCByZWFkQXR0YWNobWVudCA9IChSZWFkQXR0YWNobWVudCkgYXR0YWNobWVudDsKKworICAgIGxvZ2dlci50cmFjZSgiZHJvcCBpbnZhbGlkIGtleSB7fSIsIGNoYW5uZWwpOworICAgIHJlYWRBdHRhY2htZW50LmdldENvbm5lY3Rpb25MaXN0ZW5lcigpLm9uRXJyb3Ioc29ja2V0Q2hhbm5lbCwgbmV3IENhbmNlbGxlZEtleUV4Y2VwdGlvbigpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU2VsZWN0aW9uS2V5IGtleSkgeworICAgIHJldHVybiAha2V5LmlzVmFsaWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvS2V5UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9LZXlQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThmNTFlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKKworcHVibGljIGludGVyZmFjZSBLZXlQcm9jZXNzb3IgeworCisgIC8qKgorICAgKiBwcm9jZXNzZXMgdGhlIHBhc3NlZCBrZXkKKyAgICoKKyAgICogQHBhcmFtIGtleSBrZXkgZm9yIHByb2Nlc3NpbmcKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAqLworICB2b2lkIHByb2Nlc3MoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBAcGFyYW0ga2V5IHNwZWNpZmllZCBrZXkgZm9yIGNoZWNrIGFjY2VwdGFuY2UKKyAgICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHByb2Nlc3NvciBjYW4gcHJvY2VzcyB0aGlzIGtleS4KKyAgICovCisgIGJvb2xlYW4gYWNjZXB0KFNlbGVjdGlvbktleSBrZXkpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9LZXlQcm9jZXNzb3JVdGlsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9LZXlQcm9jZXNzb3JVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5Nzk0MgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0tleVByb2Nlc3NvclV0aWwuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsua2V5UHJvY2Vzc29yczsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlRpbWVvdXRBdHRhY2htZW50OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIEtleVByb2Nlc3NvclV0aWwgeworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2V5UHJvY2Vzc29yVXRpbC5jbGFzcyk7CisKKyAgcHVibGljIHN0YXRpYyBUaW1lb3V0QXR0YWNobWVudCBnZXRBdHRhY2htZW50QXNUaW1lb3V0T3JOdWxsKFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisgICAgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBUaW1lb3V0QXR0YWNobWVudCkgeworICAgICAgcmV0dXJuIChUaW1lb3V0QXR0YWNobWVudCkgYXR0YWNobWVudDsKKyAgICB9CisgICAgbG9nZ2VyLmVycm9yKCJ1bmFibGUgdG8gY2FzdCBhdHRhY2htZW50IHt9IHRvIHRpbWVvdXQgYXR0YWNobWVudCB0eXBlIiwgYXR0YWNobWVudCk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFNvY2tldENoYW5uZWwgZ2V0Q2FzdGVkQ2hhbm5lbE9yTnVsbChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgaWYgKGNoYW5uZWwgaW5zdGFuY2VvZiBTb2NrZXRDaGFubmVsKSB7CisgICAgICByZXR1cm4gKFNvY2tldENoYW5uZWwpIGNoYW5uZWw7CisgICAgfQorICAgIGxvZ2dlci5lcnJvcigidW5hYmxlIHRvIGNhc3QgY2hhbm5lbCB7fSB0byBzcGVjaWZpZWQgdHlwZSIpOworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJ1ZmZlcnNTaXplSWZOZWNlc3NhcnkoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBpbnQgc2VuZEJ1ZmZlclNpemUsIGludCByZWNlaXZlQnVmZmVyU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKKyAgICBpZiAoc2VuZEJ1ZmZlclNpemUgPiAwKSB7CisgICAgICBzb2NrZXQuc2V0U2VuZEJ1ZmZlclNpemUoc2VuZEJ1ZmZlclNpemUpOworICAgIH0KKyAgICBpZiAocmVjZWl2ZUJ1ZmZlclNpemUgPiAwKSB7CisgICAgICBzb2NrZXQuc2V0UmVjZWl2ZUJ1ZmZlclNpemUocmVjZWl2ZUJ1ZmZlclNpemUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvUmVhZGFibGVLZXlQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1JlYWRhYmxlS2V5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwOTkxOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1JlYWRhYmxlS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5SZWFkQXR0YWNobWVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIFJlYWRhYmxlS2V5UHJvY2Vzc29yIGltcGxlbWVudHMgS2V5UHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlYWRhYmxlS2V5UHJvY2Vzc29yLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteVNlcnZlclNvY2tldExvY2FsQWRkcmVzczsKKworICBwdWJsaWMgUmVhZGFibGVLZXlQcm9jZXNzb3IoU3RyaW5nIHNlcnZlclNvY2tldExvY2FsQWRkcmVzcykgeworICAgIHRoaXMubXlTZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3MgPSBzZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcHJvY2VzcyhTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgIGlmICghKGNoYW5uZWwgaW5zdGFuY2VvZiBTb2NrZXRDaGFubmVsKSkgeworICAgICAgbG9nZ2VyLndhcm4oImluY29ycmVjdCBpbnN0YW5jZSBvZiBjaGFubmVsLiBUaGUga2V5IGlzIGNhbmNlbGxlZCIpOworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKSBjaGFubmVsOworICAgIGxvZ2dlci50cmFjZSgic2VydmVyIHt9IGdldCBuZXcgZGF0YSBmcm9tIHt9IiwgbXlTZXJ2ZXJTb2NrZXRMb2NhbEFkZHJlc3MsIHNvY2tldENoYW5uZWwpOworCisgICAgT2JqZWN0IGF0dGFjaG1lbnQgPSBrZXkuYXR0YWNobWVudCgpOworICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWFkQXR0YWNobWVudCkpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJpbmNvcnJlY3QgaW5zdGFuY2Ugb2YgYXR0YWNobWVudCBmb3IgY2hhbm5lbCB7fSIsIG5ldyBPYmplY3RbXXtzb2NrZXRDaGFubmVsLnNvY2tldCgpfSk7CisgICAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXIgPSAoKFJlYWRBdHRhY2htZW50KSBhdHRhY2htZW50KS5nZXRDb25uZWN0aW9uTGlzdGVuZXIoKTsKKyAgICBjb25uZWN0aW9uTGlzdGVuZXIub25OZXdEYXRhQXZhaWxhYmxlKHNvY2tldENoYW5uZWwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgcmV0dXJuIGtleS5pc1ZhbGlkKCkgJiYga2V5LmlzUmVhZGFibGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvV3JpdGFibGVLZXlQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1dyaXRhYmxlS2V5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNWJlMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL1dyaXRhYmxlS2V5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVBdHRhY2htZW50OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVUYXNrOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgY2xhc3MgV3JpdGFibGVLZXlQcm9jZXNzb3IgaW1wbGVtZW50cyBLZXlQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV3JpdGFibGVLZXlQcm9jZXNzb3IuY2xhc3MpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNlbGVjdGlvbktleSBrZXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCA9IGtleS5jaGFubmVsKCk7CisgICAgaWYgKCEoY2hhbm5lbCBpbnN0YW5jZW9mIFNvY2tldENoYW5uZWwpKSB7CisgICAgICBsb2dnZXIud2FybigiaW5jb3JyZWN0IGluc3RhbmNlIG9mIGNoYW5uZWwuIFRoZSBrZXkgaXMgY2FuY2VsbGVkIik7CisgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsID0gKFNvY2tldENoYW5uZWwpIGNoYW5uZWw7CisKKyAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisgICAgaWYgKCEoYXR0YWNobWVudCBpbnN0YW5jZW9mIFdyaXRlQXR0YWNobWVudCkpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiaW5jb3JyZWN0IGluc3RhbmNlIG9mIGF0dGFjaG1lbnQgZm9yIGNoYW5uZWwge30iLCBjaGFubmVsKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXcml0ZUF0dGFjaG1lbnQga2V5QXR0YWNobWVudCA9IChXcml0ZUF0dGFjaG1lbnQpIGF0dGFjaG1lbnQ7CisKKyAgICBpZiAoa2V5QXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkuaXNFbXB0eSgpKSB7CisgICAgICBrZXkuaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFdyaXRlVGFzayBwcm9jZXNzZWRUYXNrID0ga2V5QXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkucGVlaygpOworCisgICAgdHJ5IHsKKyAgICAgIGludCB3cml0ZUNvdW50ID0gc29ja2V0Q2hhbm5lbC53cml0ZShwcm9jZXNzZWRUYXNrLmdldEJ5dGVCdWZmZXIoKSk7CisgICAgICBpZiAod3JpdGVDb3VudCA8IDApIHsKKyAgICAgICAgcHJvY2Vzc2VkVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSB3cml0aW5nIiwgbnVsbCk7CisgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSB3cml0aW5nIik7CisgICAgICB9CisKKyAgICAgIGlmICghcHJvY2Vzc2VkVGFzay5nZXRCeXRlQnVmZmVyKCkuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgcHJvY2Vzc2VkVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVEb25lKCk7CisgICAgICAgIGtleUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpLnJlbW92ZSgpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgcHJvY2Vzc2VkVGFzay5nZXRMaXN0ZW5lcigpLm9uV3JpdGVGYWlsZWQoIkkvTyBlcnJvciBvY2N1cnMgb24gd3JpdGUgdG8gY2hhbm5lbCAiICsgc29ja2V0Q2hhbm5lbCwgbmV3IENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24oZSkpOworICAgICAga2V5QXR0YWNobWVudC5nZXRXcml0ZVRhc2tzKCkuY2xlYXIoKTsKKyAgICAgIGtleS5jYW5jZWwoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlbGVjdGlvbktleSBrZXkpIHsKKyAgICByZXR1cm4ga2V5LmlzVmFsaWQoKSAmJiBrZXkuaXNXcml0YWJsZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvQ29ubmVjdGlvbk1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1ZmZlOAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuTW9ja1RpbWVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouKjsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uTWFuYWdlclRlc3QgeworCisgIHByaXZhdGUgQ29ubmVjdGlvbk1hbmFnZXIgbXlDb25uZWN0aW9uTWFuYWdlcjsKKyAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgbXlFeGVjdXRvclNlcnZpY2U7CisgIHByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKKyAgcHJpdmF0ZSBDb25uZWN0aW9uTWFuYWdlckNvbnRleHQgbXlDb250ZXh0OworCisgIHB1YmxpYyBDb25uZWN0aW9uTWFuYWdlclRlc3QoKSB7CisgICAgaWYgKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICByZXR1cm47CisgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIobmV3IFBhdHRlcm5MYXlvdXQoIlslZHtNTWRkIEhIOm1tOnNzLFNTU30gJXRdICU2cCAtICUyMC4yMGMgLSAlbSAlbiIpKSk7CisgICAgTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5zZXRMZXZlbChMZXZlbC5BTEwpOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisgICAgbXlDb250ZXh0ID0gbW9jayhDb25uZWN0aW9uTWFuYWdlckNvbnRleHQuY2xhc3MpOworICAgIG15RXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgd2hlbihteUNvbnRleHQuZ2V0RXhlY3V0b3IoKSkudGhlblJldHVybihteUV4ZWN1dG9yU2VydmljZSk7CisgICAgZmluYWwgU2VsZWN0b3JGYWN0b3J5IHNlbGVjdG9yRmFjdG9yeSA9IG1vY2soU2VsZWN0b3JGYWN0b3J5LmNsYXNzKTsKKyAgICB3aGVuKHNlbGVjdG9yRmFjdG9yeS5uZXdTZWxlY3RvcigpKS50aGVuUmV0dXJuKFNlbGVjdG9yLm9wZW4oKSk7CisgICAgTmV3Q29ubmVjdGlvbkFsbG93ZXIgbmV3Q29ubmVjdGlvbkFsbG93ZXIgPSBtb2NrKE5ld0Nvbm5lY3Rpb25BbGxvd2VyLmNsYXNzKTsKKyAgICB3aGVuKG5ld0Nvbm5lY3Rpb25BbGxvd2VyLmlzTmV3Q29ubmVjdGlvbkFsbG93ZWQoKSkudGhlblJldHVybih0cnVlKTsKKyAgICBteUNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25NYW5hZ2VyKAorICAgICAgICAgICAgbXlDb250ZXh0LAorICAgICAgICAgICAgbmV3IE1vY2tUaW1lU2VydmljZSgpLAorICAgICAgICAgICAgbmV3Q29ubmVjdGlvbkFsbG93ZXIsCisgICAgICAgICAgICBuZXdDb25uZWN0aW9uQWxsb3dlciwKKyAgICAgICAgICAgIHNlbGVjdG9yRmFjdG9yeSwKKyAgICAgICAgICAgIG5ldyBBdG9taWNJbnRlZ2VyKCksCisgICAgICAgICAgICBuZXcgQXRvbWljSW50ZWdlcigpKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFRoYXREb3VibGVJbml0VGhyb3dFeGNlcHRpb24oKSB7CisgICAgdHJ5IHsKKyAgICAgIG15Q29ubmVjdGlvbk1hbmFnZXIuaW5pdEFuZFJ1bldvcmtlcihuZXcgRmlyc3RBdmFpbGFibGVDaGFubmVsKDY4ODEsIDY4ODkpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBmYWlsKCJ1bmFibGUgdG8gaW5pdCBhbmQgcnVuIHdvcmtlciIsIGUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgbXlDb25uZWN0aW9uTWFuYWdlci5pbml0QW5kUnVuV29ya2VyKG5ldyBGaXJzdEF2YWlsYWJsZUNoYW5uZWwoNjg4MSwgNjg4OSkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZhaWwoInVuYWJsZSB0byBpbml0IGFuZCBydW4gd29ya2VyIiwgZSk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2FuQWNjZXB0QW5kUmVhZERhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGFjY2VwdENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHJlYWRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb25uZWN0Q291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbGFzdFJlYWRCeXRlc0NvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwKTsKKworICAgIGZpbmFsIFNlbWFwaG9yZSBzZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworCisgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbk5ld0RhdGFBdmFpbGFibGUoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWFkQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGxhc3RSZWFkQnl0ZXNDb3VudC5zZXQoc29ja2V0Q2hhbm5lbC5yZWFkKGJ5dGVCdWZmZXIpKTsKKyAgICAgICAgaWYgKGxhc3RSZWFkQnl0ZXNDb3VudC5nZXQoKSA9PSAtMSkgeworICAgICAgICAgIHNvY2tldENoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYWNjZXB0Q291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBleCkgeworCisgICAgICB9CisgICAgfTsKKworICAgIHdoZW4obXlDb250ZXh0Lm5ld0NoYW5uZWxMaXN0ZW5lcigpKS50aGVuUmV0dXJuKGNvbm5lY3Rpb25MaXN0ZW5lcik7CisKKyAgICBteUNvbm5lY3Rpb25NYW5hZ2VyLmluaXRBbmRSdW5Xb3JrZXIobmV3IEZpcnN0QXZhaWxhYmxlQ2hhbm5lbCg2ODgxLCA2ODg5KSk7CisKKyAgICBhc3NlcnRFcXVhbHMoYWNjZXB0Q291bnQuZ2V0KCksIDApOworICAgIGFzc2VydEVxdWFscyhyZWFkQ291bnQuZ2V0KCksIDApOworICAgIGludCBzZXJ2ZXJQb3J0ID0gbXlDb25uZWN0aW9uTWFuYWdlci5nZXRCaW5kUG9ydCgpOworCisgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoIjEyNy4wLjAuMSIsIHNlcnZlclBvcnQpOworCisgICAgdHJ5QWNxdWlyZU9yRmFpbChzZW1hcGhvcmUpOy8vd2FpdCB1bnRpbCBjb25uZWN0aW9uIGlzIGFjY2VwdGVkCisKKyAgICBhc3NlcnRUcnVlKHNvY2tldC5pc0Nvbm5lY3RlZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWNjZXB0Q291bnQuZ2V0KCksIDEpOworICAgIGFzc2VydEVxdWFscyhyZWFkQ291bnQuZ2V0KCksIDApOworCisgICAgU29ja2V0IHNvY2tldFNlY29uZCA9IG5ldyBTb2NrZXQoIjEyNy4wLjAuMSIsIHNlcnZlclBvcnQpOworCisgICAgdHJ5QWNxdWlyZU9yRmFpbChzZW1hcGhvcmUpOy8vd2FpdCB1bnRpbCBjb25uZWN0aW9uIGlzIGFjY2VwdGVkCisKKyAgICBhc3NlcnRUcnVlKHNvY2tldFNlY29uZC5pc0Nvbm5lY3RlZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWNjZXB0Q291bnQuZ2V0KCksIDIpOworICAgIGFzc2VydEVxdWFscyhyZWFkQ291bnQuZ2V0KCksIDApOworICAgIHNvY2tldFNlY29uZC5jbG9zZSgpOworICAgIHRyeUFjcXVpcmVPckZhaWwoc2VtYXBob3JlKTsvL3dhaXQgcmVhZCB0aGF0IGNvbm5lY3Rpb24gaXMgY2xvc2VkCisgICAgYXNzZXJ0RXF1YWxzKHJlYWRDb3VudC5nZXQoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKGFjY2VwdENvdW50LmdldCgpLCAyKTsKKyAgICBhc3NlcnRFcXVhbHMobGFzdFJlYWRCeXRlc0NvdW50LmdldCgpLCAtMSk7CisgICAgYnl0ZUJ1ZmZlci5yZXdpbmQoKTsKKyAgICBhc3NlcnRFcXVhbHMoYnl0ZUJ1ZmZlci5nZXQoKSwgMCk7CisgICAgYnl0ZUJ1ZmZlci5yZXdpbmQoKTsKKyAgICBTdHJpbmcgd3JpdGVTdHIgPSAiYWJjIjsKKyAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgIG91dHB1dFN0cmVhbS53cml0ZSh3cml0ZVN0ci5nZXRCeXRlcygpKTsKKyAgICB0cnlBY3F1aXJlT3JGYWlsKHNlbWFwaG9yZSk7Ly93YWl0IHVudGlsIHJlYWQgYnl0ZXMKKyAgICBhc3NlcnRFcXVhbHMocmVhZENvdW50LmdldCgpLCAyKTsKKyAgICBhc3NlcnRFcXVhbHMobGFzdFJlYWRCeXRlc0NvdW50LmdldCgpLCAzKTsKKyAgICBieXRlW10gZXhwZWN0ZWQgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLmNhcGFjaXR5KCldOworICAgIFN5c3RlbS5hcnJheWNvcHkod3JpdGVTdHIuZ2V0Qnl0ZXMoKSwgMCwgZXhwZWN0ZWQsIDAsIHdyaXRlU3RyLmxlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnl0ZUJ1ZmZlci5hcnJheSgpLCBleHBlY3RlZCk7CisgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgc29ja2V0LmNsb3NlKCk7CisgICAgdHJ5QWNxdWlyZU9yRmFpbChzZW1hcGhvcmUpOy8vd2FpdCByZWFkIHRoYXQgY29ubmVjdGlvbiBpcyBjbG9zZWQKKyAgICBhc3NlcnRFcXVhbHMocmVhZENvdW50LmdldCgpLCAzKTsKKworICAgIGludCBvdGhlclBlZXJQb3J0ID0gNzU3NTsKKyAgICBTZXJ2ZXJTb2NrZXQgc3MgPSBuZXcgU2VydmVyU29ja2V0KG90aGVyUGVlclBvcnQpOworICAgIGFzc2VydEVxdWFscyhjb25uZWN0Q291bnQuZ2V0KCksIDApOworICAgIG15Q29ubmVjdGlvbk1hbmFnZXIub2ZmZXJDb25uZWN0KG5ldyBDb25uZWN0VGFzaygiMTI3LjAuMC4xIiwgb3RoZXJQZWVyUG9ydCwgbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25OZXdEYXRhQXZhaWxhYmxlKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29ubmVjdENvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBUaHJvd2FibGUgZXgpIHsKKworICAgICAgfQorICAgIH0sIDAsIDEwMCksIDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIHNzLmFjY2VwdCgpOworICAgIHRyeUFjcXVpcmVPckZhaWwoc2VtYXBob3JlKTsKKyAgICBhc3NlcnRFcXVhbHMoY29ubmVjdENvdW50LmdldCgpLCAxKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMubXlDb25uZWN0aW9uTWFuYWdlci5jbG9zZSgpOworICAgIG15RXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgYXNzZXJ0VHJ1ZShteUV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKDEwLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdHJ5QWNxdWlyZU9yRmFpbChTZW1hcGhvcmUgc2VtYXBob3JlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIGlmICghc2VtYXBob3JlLnRyeUFjcXVpcmUoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICBmYWlsKCJkb24ndCBnZXQgc2lnbmFsIGZyb20gY29ubmVjdGlvbiByZWNlaXZlciB0aGF0IGNvbm5lY3Rpb24gc2VsZWN0ZWQiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL0Nvbm5lY3Rpb25Xb3JrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3ZDE2MwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9Db25uZWN0aW9uV29ya2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lk1vY2tUaW1lU2VydmljZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnMuQ2xlYW51cFByb2Nlc3NvcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnMuS2V5UHJvY2Vzc29yOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitAVGVzdAorcHVibGljIGNsYXNzIENvbm5lY3Rpb25Xb3JrZXJUZXN0IHsKKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW51cElzQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBTZWxlY3Rpb25LZXkgbW9ja0tleSA9IG1vY2soU2VsZWN0aW9uS2V5LmNsYXNzKTsKKyAgICBmaW5hbCBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgZmluYWwgS2V5UHJvY2Vzc29yIGFjY2VwdFByb2Nlc3NvciA9IG1vY2soS2V5UHJvY2Vzc29yLmNsYXNzKTsKKyAgICBmaW5hbCBLZXlQcm9jZXNzb3Igbm90QWNjZXB0UHJvY2Vzc29yID0gbW9jayhLZXlQcm9jZXNzb3IuY2xhc3MpOworCisgICAgU2VsZWN0b3IgbW9ja1NlbGVjdG9yID0gbW9jayhTZWxlY3Rvci5jbGFzcyk7CisgICAgd2hlbihtb2NrU2VsZWN0b3Iuc2VsZWN0KGFueUxvbmcoKSkpLnRoZW5SZXR1cm4oMSkudGhlblRocm93KG5ldyBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbigpKTsKKyAgICB3aGVuKG1vY2tTZWxlY3Rvci5zZWxlY3RlZEtleXMoKSkudGhlblJldHVybihuZXcgSGFzaFNldDxTZWxlY3Rpb25LZXk+KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtb2NrS2V5KSkpOworICAgIHdoZW4obW9ja0tleS5pc1ZhbGlkKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgd2hlbihtb2NrS2V5LmNoYW5uZWwoKSkudGhlblJldHVybihjaGFubmVsKTsKKyAgICB3aGVuKGFjY2VwdFByb2Nlc3Nvci5hY2NlcHQobW9ja0tleSkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgd2hlbihub3RBY2NlcHRQcm9jZXNzb3IuYWNjZXB0KG1vY2tLZXkpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICBDb25uZWN0aW9uV29ya2VyIGNvbm5lY3Rpb25Xb3JrZXIgPSBuZXcgQ29ubmVjdGlvbldvcmtlcigKKyAgICAgICAgICAgIG1vY2tTZWxlY3RvciwKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoYWNjZXB0UHJvY2Vzc29yLCBub3RBY2NlcHRQcm9jZXNzb3IpLAorICAgICAgICAgICAgMTAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgbmV3IE1vY2tUaW1lU2VydmljZSgpLAorICAgICAgICAgICAgbW9jayhDbGVhbnVwUHJvY2Vzc29yLmNsYXNzKSwKKyAgICAgICAgICAgIG1vY2soTmV3Q29ubmVjdGlvbkFsbG93ZXIuY2xhc3MpKTsKKyAgICBjb25uZWN0aW9uV29ya2VyLnJ1bigpOworICAgIHZlcmlmeShtb2NrU2VsZWN0b3IpLnNlbGVjdGVkS2V5cygpOworICAgIHZlcmlmeShhY2NlcHRQcm9jZXNzb3IpLmFjY2VwdChtb2NrS2V5KTsKKyAgICB2ZXJpZnkoYWNjZXB0UHJvY2Vzc29yKS5wcm9jZXNzKG1vY2tLZXkpOworICAgIHZlcmlmeShub3RBY2NlcHRQcm9jZXNzb3IpLmFjY2VwdChtb2NrS2V5KTsKKyAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobm90QWNjZXB0UHJvY2Vzc29yKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU3RhdGVDaGFubmVsTGlzdGVuZXJUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvU3RhdGVDaGFubmVsTGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzOGZhYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9TdGF0ZUNoYW5uZWxMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGNsYXNzIFN0YXRlQ2hhbm5lbExpc3RlbmVyVGVzdCB7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsvV29ya2luZ1JlY2VpdmVyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dvcmtpbmdSZWNlaXZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzRkMTdhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL1dvcmtpbmdSZWNlaXZlclRlc3QuamF2YQpAQCAtMCwwICsxLDQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yazsKKworcHVibGljIGNsYXNzIFdvcmtpbmdSZWNlaXZlclRlc3QgeworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvQ2xlYW51cEtleVByb2Nlc3NvclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBLZXlQcm9jZXNzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5N2QzMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9uZXR3b3JrL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvbmV0d29yay9rZXlQcm9jZXNzb3JzL0NsZWFudXBLZXlQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLmtleVByb2Nlc3NvcnM7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Nb2NrVGltZVNlcnZpY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Db25uZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5UaW1lb3V0QXR0YWNobWVudDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBDbGVhbnVwS2V5UHJvY2Vzc29yVGVzdCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgQ0xPU0VfVElNRU9VVCA9IDEwMDsKKworICBwcml2YXRlIE1vY2tUaW1lU2VydmljZSBteVRpbWVTZXJ2aWNlOworICBwcml2YXRlIFRpbWVvdXRBdHRhY2htZW50IG15VGltZW91dEF0dGFjaG1lbnQ7CisgIHByaXZhdGUgU2VsZWN0aW9uS2V5IG15S2V5OworICBwcml2YXRlIFNlbGVjdGFibGVDaGFubmVsIG15Q2hhbm5lbDsKKyAgcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgbXlDb25uZWN0aW9uTGlzdGVuZXI7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG15VGltZVNlcnZpY2UgPSBuZXcgTW9ja1RpbWVTZXJ2aWNlKCk7CisgICAgbXlDb25uZWN0aW9uTGlzdGVuZXIgPSBtb2NrKENvbm5lY3Rpb25MaXN0ZW5lci5jbGFzcyk7CisgICAgbXlUaW1lb3V0QXR0YWNobWVudCA9IG1vY2soVGltZW91dEF0dGFjaG1lbnQuY2xhc3MpOworICAgIG15S2V5ID0gbW9jayhTZWxlY3Rpb25LZXkuY2xhc3MpOworICAgIG15Q2hhbm5lbCA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgIHdoZW4obXlLZXkuY2hhbm5lbCgpKS50aGVuUmV0dXJuKG15Q2hhbm5lbCk7CisgICAgd2hlbihteUtleS5pbnRlcmVzdE9wcygpKS50aGVuUmV0dXJuKFNlbGVjdGlvbktleS5PUF9SRUFEKTsKKyAgICBteUtleS5hdHRhY2gobXlUaW1lb3V0QXR0YWNobWVudCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWQoKSB7CisKKyAgICBsb25nIG9sZFRpbWUgPSAxMDsKKyAgICBteVRpbWVTZXJ2aWNlLnNldFRpbWUob2xkVGltZSk7CisKKyAgICBDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cEtleVByb2Nlc3NvcihteVRpbWVTZXJ2aWNlKTsKKyAgICBjbGVhbnVwUHJvY2Vzc29yLnByb2Nlc3NTZWxlY3RlZChteUtleSk7CisKKyAgICB2ZXJpZnkobXlUaW1lb3V0QXR0YWNobWVudCkuY29tbXVuaWNhdGVkTm93KGVxKG9sZFRpbWUpKTsKKworICAgIGxvbmcgbmV3VGltZSA9IDEwMDsKKyAgICBteVRpbWVTZXJ2aWNlLnNldFRpbWUobmV3VGltZSk7CisKKyAgICBjbGVhbnVwUHJvY2Vzc29yLnByb2Nlc3NTZWxlY3RlZChteUtleSk7CisKKyAgICB2ZXJpZnkobXlUaW1lb3V0QXR0YWNobWVudCkuY29tbXVuaWNhdGVkTm93KGVxKG5ld1RpbWUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwV2lsbENsb3NlV2l0aFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIHdoZW4obXlUaW1lb3V0QXR0YWNobWVudC5pc1RpbWVvdXRFbGFwc2VkKGFueUxvbmcoKSkpLnRoZW5SZXR1cm4odHJ1ZSk7CisKKyAgICBDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cEtleVByb2Nlc3NvcihteVRpbWVTZXJ2aWNlKTsKKyAgICBjbGVhbnVwUHJvY2Vzc29yLnByb2Nlc3NDbGVhbnVwKG15S2V5KTsKKworICAgIHZlcmlmeShteUtleSkuY2FuY2VsKCk7CisgICAgdmVyaWZ5KG15S2V5KS5jaGFubmVsKCk7CisgICAgdmVyaWZ5KG15VGltZW91dEF0dGFjaG1lbnQpLm9uVGltZW91dEVsYXBzZWQoYW55KFNvY2tldENoYW5uZWwuY2xhc3MpKTsKKyAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobXlLZXkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFudXBXaXRob3V0Q2xvc2UoKSB7CisgICAgd2hlbihteVRpbWVvdXRBdHRhY2htZW50LmlzVGltZW91dEVsYXBzZWQoYW55TG9uZygpKSkudGhlblJldHVybihmYWxzZSk7CisKKyAgICBteVRpbWVTZXJ2aWNlLnNldFRpbWUoMjAwKTsKKworICAgIENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwS2V5UHJvY2Vzc29yKG15VGltZVNlcnZpY2UpOworICAgIGNsZWFudXBQcm9jZXNzb3IucHJvY2Vzc0NsZWFudXAobXlLZXkpOworCisgICAgdmVyaWZ5KG15VGltZW91dEF0dGFjaG1lbnQpLmlzVGltZW91dEVsYXBzZWQobXlUaW1lU2VydmljZS5ub3coKSk7CisgICAgdmVyaWZ5KG15S2V5LCBuZXZlcigpKS5jYW5jZWwoKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIG15Q2hhbm5lbC5jbG9zZSgpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvV3JpdGFibGVLZXlQcm9jZXNzb3JUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvbmV0d29yay9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L25ldHdvcmsva2V5UHJvY2Vzc29ycy9Xcml0YWJsZUtleVByb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg0OTUyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL25ldHdvcmsvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9uZXR3b3JrL2tleVByb2Nlc3NvcnMvV3JpdGFibGVLZXlQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5rZXlQcm9jZXNzb3JzOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Xcml0ZUF0dGFjaG1lbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5Xcml0ZUxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVUYXNrOworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitAVGVzdAorcHVibGljIGNsYXNzIFdyaXRhYmxlS2V5UHJvY2Vzc29yVGVzdCB7CisKKyAgcHJpdmF0ZSBTZWxlY3Rpb25LZXkgbXlLZXk7CisgIHByaXZhdGUgU29ja2V0Q2hhbm5lbCBteUNoYW5uZWw7CisgIHByaXZhdGUgV3JpdGFibGVLZXlQcm9jZXNzb3IgbXlXcml0YWJsZUtleVByb2Nlc3NvcjsKKyAgcHJpdmF0ZSBXcml0ZUF0dGFjaG1lbnQgbXlXcml0ZUF0dGFjaG1lbnQ7CisgIHByaXZhdGUgQmxvY2tpbmdRdWV1ZTxXcml0ZVRhc2s+IG15UXVldWU7CisKKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG15S2V5ID0gbW9jayhTZWxlY3Rpb25LZXkuY2xhc3MpOworICAgIG15Q2hhbm5lbCA9IG1vY2soU29ja2V0Q2hhbm5lbC5jbGFzcyk7CisgICAgbXlXcml0YWJsZUtleVByb2Nlc3NvciA9IG5ldyBXcml0YWJsZUtleVByb2Nlc3NvcigpOworICAgIHdoZW4obXlLZXkuY2hhbm5lbCgpKS50aGVuUmV0dXJuKG15Q2hhbm5lbCk7CisgICAgd2hlbihteUtleS5pbnRlcmVzdE9wcygpKS50aGVuUmV0dXJuKFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgbXlXcml0ZUF0dGFjaG1lbnQgPSBtb2NrKFdyaXRlQXR0YWNobWVudC5jbGFzcyk7CisgICAgbXlRdWV1ZSA9IG1vY2soQmxvY2tpbmdRdWV1ZS5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdE9uV3JpdGVEb25lSW52b2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTApOworCisgICAgLy9pbWl0YXRlIHdyaXRpbmcgYnl0ZSBidWZmZXIKKyAgICB3aGVuKG15Q2hhbm5lbC53cml0ZShlcShkYXRhKSkpLnRoZW4obmV3IEFuc3dlcjxJbnRlZ2VyPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEludGVnZXIgYW5zd2VyKEludm9jYXRpb25Pbk1vY2sgaW52b2NhdGlvbk9uTW9jaykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGRhdGEucG9zaXRpb24oZGF0YS5jYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGRhdGEuY2FwYWNpdHkoKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIFdyaXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBtb2NrKFdyaXRlTGlzdGVuZXIuY2xhc3MpOworCisgICAgd2hlbihteVF1ZXVlLnBlZWsoKSkudGhlblJldHVybihuZXcgV3JpdGVUYXNrKG15Q2hhbm5lbCwgZGF0YSwgbGlzdGVuZXIpKTsKKyAgICB3aGVuKG15V3JpdGVBdHRhY2htZW50LmdldFdyaXRlVGFza3MoKSkudGhlblJldHVybihteVF1ZXVlKTsKKworICAgIG15S2V5LmF0dGFjaChteVdyaXRlQXR0YWNobWVudCk7CisKKyAgICBteVdyaXRhYmxlS2V5UHJvY2Vzc29yLnByb2Nlc3MobXlLZXkpOworCisgICAgdmVyaWZ5KGxpc3RlbmVyKS5vbldyaXRlRG9uZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRoYXRPbldyaXRlRmFpbGVkSW52b2tlZElmQ2hhbm5lbFRocm93RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgd2hlbihteUNoYW5uZWwud3JpdGUoYW55KEJ5dGVCdWZmZXIuY2xhc3MpKSkudGhlblRocm93KG5ldyBJT0V4Y2VwdGlvbigpKTsKKworICAgIFdyaXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBtb2NrKFdyaXRlTGlzdGVuZXIuY2xhc3MpOworCisgICAgd2hlbihteVF1ZXVlLnBlZWsoKSkudGhlblJldHVybihuZXcgV3JpdGVUYXNrKG15Q2hhbm5lbCwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKSwgbGlzdGVuZXIpKTsKKyAgICB3aGVuKG15V3JpdGVBdHRhY2htZW50LmdldFdyaXRlVGFza3MoKSkudGhlblJldHVybihteVF1ZXVlKTsKKyAgICBteUtleS5hdHRhY2gobXlXcml0ZUF0dGFjaG1lbnQpOworCisgICAgbXlXcml0YWJsZUtleVByb2Nlc3Nvci5wcm9jZXNzKG15S2V5KTsKKworICAgIHZlcmlmeShsaXN0ZW5lcikub25Xcml0ZUZhaWxlZChhbnlTdHJpbmcoKSwgYW55KFRocm93YWJsZS5jbGFzcykpOworICB9CisKKyAgcHVibGljIHZvaWQgY2hlY2tUaGF0V3JpdGVUYXNrRG9lc250UmVtb3ZlZElmQnVmZmVySXNOb3RXcml0dGVuSW5PbmVTdGVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQnl0ZUJ1ZmZlciBkYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMCk7CisKKyAgICAvL2ltaXRhdGUgd3JpdGluZyBvbmx5IG9uZSBieXRlIG9mIGJ5dGUgYnVmZmVyCisgICAgd2hlbihteUNoYW5uZWwud3JpdGUoZXEoZGF0YSkpKS50aGVuKG5ldyBBbnN3ZXI8SW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJbnRlZ2VyIGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb25Pbk1vY2spIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBkYXRhLnBvc2l0aW9uKGRhdGEuY2FwYWNpdHkoKSAtIDEpOworICAgICAgICByZXR1cm4gZGF0YS5wb3NpdGlvbigpOworICAgICAgfQorICAgIH0pOworCisgICAgV3JpdGVMaXN0ZW5lciBsaXN0ZW5lciA9IG1vY2soV3JpdGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICB3aGVuKG15UXVldWUucGVlaygpKS50aGVuUmV0dXJuKG5ldyBXcml0ZVRhc2sobXlDaGFubmVsLCBkYXRhLCBsaXN0ZW5lcikpOworICAgIHdoZW4obXlXcml0ZUF0dGFjaG1lbnQuZ2V0V3JpdGVUYXNrcygpKS50aGVuUmV0dXJuKG15UXVldWUpOworCisgICAgbXlLZXkuYXR0YWNoKG15V3JpdGVBdHRhY2htZW50KTsKKworICAgIG15V3JpdGFibGVLZXlQcm9jZXNzb3IucHJvY2VzcyhteUtleSk7CisKKyAgICB2ZXJpZnkobGlzdGVuZXIsIG5ldmVyKCkpLm9uV3JpdGVEb25lKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwMWIzMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci9wb20ueG1sCkBAIC0wLDAgKzEsMjI3IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLm9zczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3NzLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NzwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxuYW1lPkphdmEgQml0VG9ycmVudCBsaWJyYXJ5PC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgdHRvcnJlbnQgaXMgYSBwdXJlLUphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wsCisgICAgICAgIGluY2x1ZGluZyBzdXBwb3J0IGZvciBzZXZlcmFsIEJFUHMuIEl0IGFsc28gcHJvdmlkZXMgYSBzdGFuZGFsb25lIGNsaWVudCwKKyAgICAgICAgYSB0cmFja2VyIGFuZCBhIHRvcnJlbnQgbWFuaXB1bGF0aW9uIHV0aWxpdHkuCis8IS0tICAgICAgICB0dG9ycmVudCDmmK8gQml0VG9ycmVudCDljY/orq7nmoTnuq8gSmF2YSDlrp7njrDjgIHljIXmi6zlr7nlpJrkuKogQkVQIOeahOaUr+aMgeOAguWug+i/mOaPkOS+m+S6huS4gOS4queLrOeri+WuouaIt+err+OAgei3n+i4quWZqOWSjCB0b3JyZW50IOaTjeS9nOW3peWFt+OAgi0tPgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5uZXR3b3JrPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+YmVuY29kaW5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+dHRvcnJlbnQtdHJhY2tlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnR0b3JyZW50LWNsaWVudDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNvbW1vbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnRlc3RzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+dGVzdC1hcGk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jbGk8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UdXJuLCBJbmMuPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cudHVybi5jb208L3VybD4KKyAgICA8L29yZ2FuaXphdGlvbj4KKworICAgIDxzY20+CisgICAgICAgIDxjb25uZWN0aW9uPnNjbTpnaXQ6Z2l0Oi8vZ2l0aHViLmNvbS90dXJuL3R0b3JyZW50LmdpdDwvY29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vZ2l0aHViLmNvbS90dXJuL3R0b3JyZW50PC91cmw+CisgICAgPC9zY20+CisKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgdmVyc2lvbiAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8aXNzdWVNYW5hZ2VtZW50PgorICAgICAgICA8c3lzdGVtPkdpdEh1Yjwvc3lzdGVtPgorICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS90dXJuL3R0b3JyZW50L2lzc3VlczwvdXJsPgorICAgIDwvaXNzdWVNYW5hZ2VtZW50PgorCisgICAgPGRldmVsb3BlcnM+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8aWQ+bXBldGF6em9uaTwvaWQ+CisgICAgICAgICAgICA8bmFtZT5NYXhpbWUgUGV0YXp6b25pPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPm1wZXRhenpvbmlAdHVybi5jb208L2VtYWlsPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmJ1bGl4Lm9yZzwvdXJsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5UdXJuLCBJbmM8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb25Vcmw+aHR0cDovL3d3dy50dXJuLmNvbTwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPm1haW50YWluZXI8L3JvbGU+CisgICAgICAgICAgICAgICAgPHJvbGU+YXJjaGl0ZWN0PC9yb2xlPgorICAgICAgICAgICAgICAgIDxyb2xlPmRldmVsb3Blcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgICAgICA8dGltZXpvbmU+LTg8L3RpbWV6b25lPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHBpY1VybD5odHRwczovL3NlY3VyZS5ncmF2YXRhci5jb20vYXZhdGFyLzZmNzA1ZTBjMjk5YmNhMjk0NDQ0ZGUzYTZhMzMwOGIzPC9waWNVcmw+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgIDwvZGV2ZWxvcGVycz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICAgICAgPGphdmEudmVyc2lvbj4xLjg8L2phdmEudmVyc2lvbj4KKyAgICAgICAgPG1hdmVuLmNvbXBpbGVyLnNvdXJjZT4ke2phdmEudmVyc2lvbn08L21hdmVuLmNvbXBpbGVyLnNvdXJjZT4KKyAgICAgICAgPG1hdmVuLmNvbXBpbGVyLnRhcmdldD4ke2phdmEudmVyc2lvbn08L21hdmVuLmNvbXBpbGVyLnRhcmdldD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8cmVwb3NpdG9yaWVzPgorICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgIDxpZD5qYm9zcy10aGlyZHBhcnR5LXJlbGVhc2VzPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkpCb3NzIFRoaXJkcGFydHkgUmVsZWFzZXM8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vcmVwb3NpdG9yeS5qYm9zcy5vcmcvbmV4dXMvY29udGVudC9yZXBvc2l0b3JpZXMvdGhpcmRwYXJ0eS1yZWxlYXNlcy88L3VybD4KKyAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgIDwvcmVwb3NpdG9yaWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4xMi4wPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjc8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xMTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNpbXBsZWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNpbXBsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMS4yMTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi40PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcudGVzdG5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Ni44Ljg8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm5ldC5zZjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphcmdzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamV0YnJhaW5zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5ub3RhdGlvbnMtamF2YTU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj5SRUxFQVNFPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGRlZmF1bHRHb2FsPnBhY2thZ2U8L2RlZmF1bHRHb2FsPgorICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vYnVpbGQ8L2RpcmVjdG9yeT4KKworICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICAgICAgPHBsdWdpbnM+Cis8IS0tICAgICAgICAgICAgPHBsdWdpbj4tLT4KKzwhLS0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPi0tPgorPCEtLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+LS0+Cis8IS0tICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMy4yPC92ZXJzaW9uPi0tPgorPCEtLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4tLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+LS0+Cis8IS0tICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0Pi0tPgorPCEtLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+LS0+Cis8IS0tICAgICAgICAgICAgPC9wbHVnaW4+LS0+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEyLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1YbXg3NjhNPC9hcmdMaW5lPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29tLnR1cm4udHRvcnJlbnQubG9nTGV2ZWw+JHt0ZXN0TG9nTGV2ZWx9PC9jb20udHVybi50dG9ycmVudC5sb2dMZXZlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcj4ke2phdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyfQorICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxidWlsZERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fTwvYnVpbGREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktZGVwZW5kZW5jaWVzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmVwYXJlLXBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHktZGVwZW5kZW5jaWVzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZVJlbGVhc2VzPmZhbHNlPC9vdmVyV3JpdGVSZWxlYXNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlU25hcHNob3RzPmZhbHNlPC9vdmVyV3JpdGVTbmFwc2hvdHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZUlmTmV3ZXI+dHJ1ZTwvb3ZlcldyaXRlSWZOZXdlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRDbGFzc3BhdGg+dHJ1ZTwvYWRkQ2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGNsYXNzcGF0aFByZWZpeD5saWI8L2NsYXNzcGF0aFByZWZpeD4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWFpbkNsYXNzPnRlc3Qub3JnLkNsaWVudGU8L21haW5DbGFzcz4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2xhc3MtUGF0aD5saWIvPC9DbGFzcy1QYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9wb20ueG1sIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwNzcyMgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9wb20ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxuYW1lPnR0b3JyZW50L3Rlc3QtYXBpPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL3R1cm4uZ2l0aHViLmNvbS90dG9ycmVudC88L3VybD4KKyAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC10ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvTW9ja1RpbWVTZXJ2aWNlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9Nb2NrVGltZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgwNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvTW9ja1RpbWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5UaW1lU2VydmljZTsKKworcHVibGljIGNsYXNzIE1vY2tUaW1lU2VydmljZSBpbXBsZW1lbnRzIFRpbWVTZXJ2aWNlIHsKKworICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgdGltZSA9IDA7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBsb25nIG5vdygpIHsKKyAgICByZXR1cm4gdGltZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7CisgICAgdGhpcy50aW1lID0gdGltZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvVGVtcEZpbGVzLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9UZW1wRmlsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJlZDkyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvVGVtcEZpbGVzLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsLlNoZXIKKyAqIERhdGU6IDA1LjAzLjIwMDgKKyAqLworcHVibGljIGNsYXNzIFRlbXBGaWxlcyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgb3VyQ3VycmVudFRlbXBEaXIgPSBGaWxlVXRpbHMuZ2V0VGVtcERpcmVjdG9yeSgpOworICBwcml2YXRlIGZpbmFsIEZpbGUgbXlDdXJyZW50VGVtcERpcjsKKworICBwcml2YXRlIHN0YXRpYyBSYW5kb20gb3VyUmFuZG9tOworCisgIHN0YXRpYyB7CisgICAgb3VyUmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgIG91clJhbmRvbS5zZXRTZWVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBteUZpbGVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisgIHByaXZhdGUgZmluYWwgVGhyZWFkIG15U2h1dGRvd25Ib29rOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbXlJbnNpZGVTaHV0ZG93bkhvb2s7CisKKyAgcHVibGljIFRlbXBGaWxlcygpIHsKKyAgICBteUN1cnJlbnRUZW1wRGlyID0gb3VyQ3VycmVudFRlbXBEaXI7CisgICAgaWYgKCFteUN1cnJlbnRUZW1wRGlyLmlzRGlyZWN0b3J5KCkpIHsKKworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcCBkaXJlY3RvcnkgaXMgbm90IGEgZGlyZWN0b3J5LCB3YXMgZGVsZXRlZCBieSBzb21lIHByb2Nlc3M6ICIgKyBteUN1cnJlbnRUZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsKKyAgICAgICAgICAgICAgIlxuamF2YS5pby50bXBkaXI6ICIgKyBGaWxlVXRpbHMuZ2V0VGVtcERpcmVjdG9yeSgpKTsKKyAgICB9CisKKyAgICBteVNodXRkb3duSG9vayA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBteUluc2lkZVNodXRkb3duSG9vayA9IHRydWU7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobXlTaHV0ZG93bkhvb2spOworICB9CisKKyAgcHJpdmF0ZSBGaWxlIGRvQ3JlYXRlVGVtcERpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXg7CisgICAgc3VmZml4ID0gc3VmZml4ID09IG51bGwgPyAiLnRtcCIgOiBzdWZmaXg7CisKKyAgICBkbyB7CisgICAgICBpbnQgY291bnQgPSBvdXJSYW5kb20ubmV4dEludCgpOworICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUobXlDdXJyZW50VGVtcERpciwgcHJlZml4ICsgY291bnQgKyBzdWZmaXgpOworICAgICAgaWYgKCFmLmV4aXN0cygpICYmIGYubWtkaXJzKCkpIHsKKyAgICAgICAgcmV0dXJuIGYuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgfQorICAgIH0gd2hpbGUgKHRydWUpOworCisgIH0KKworICBwcml2YXRlIEZpbGUgZG9DcmVhdGVUZW1wRmlsZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEZpbGUgZmlsZSA9IGRvQ3JlYXRlVGVtcERpcihwcmVmaXgsIHN1ZmZpeCk7CisgICAgZmlsZS5kZWxldGUoKTsKKyAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICByZXR1cm4gZmlsZTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBGaWxlIGNyZWF0ZVRlbXBGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRlbXBGaWxlID0gZG9DcmVhdGVUZW1wRmlsZSgidGVzdCIsIG51bGwpOworICAgIHJlZ2lzdGVyQXNUZW1wRmlsZSh0ZW1wRmlsZSk7CisgICAgcmV0dXJuIHRlbXBGaWxlOworICB9CisKKyAgcHVibGljIHZvaWQgcmVnaXN0ZXJBc1RlbXBGaWxlKGZpbmFsIEZpbGUgdGVtcEZpbGUpIHsKKyAgICBteUZpbGVzVG9EZWxldGUuYWRkKHRlbXBGaWxlKTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBGaWxlIGNyZWF0ZVRlbXBGaWxlKGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGUgdGVtcEZpbGUgPSBjcmVhdGVUZW1wRmlsZSgpOworICAgIGludCBidWZMZW4gPSBNYXRoLm1pbig4ICogMTAyNCwgc2l6ZSk7CisgICAgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICBpZiAoYnVmTGVuID09IDApIHJldHVybiB0ZW1wRmlsZTsKKyAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSk7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtidWZMZW5dOworCisgICAgICBpbnQgbnVtV3JpdHRlbiA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLyBidWYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhidWYpOworICAgICAgICBmb3Mud3JpdGUoYnVmKTsKKyAgICAgICAgbnVtV3JpdHRlbiArPSBidWYubGVuZ3RoOworICAgICAgfQorCisgICAgICBpZiAoc2l6ZSA+IG51bVdyaXR0ZW4pIHsKKyAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhidWYpOworICAgICAgICBmb3Mud3JpdGUoYnVmLCAwLCBzaXplIC0gbnVtV3JpdHRlbik7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZvcy5jbG9zZSgpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wRmlsZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgZm9yIGNyZWF0ZWQgdGVtcCBkaXJlY3RvcnkuCisgICAqIEFsc28gc3RvcmVzIHRoZSB2YWx1ZSBpbnRvIHRoaXMgb2JqZWN0IGFjY2Vzc2VkIHdpdGgge0BsaW5rICNnZXRDdXJyZW50VGVtcERpcigpfQorICAgKgorICAgKiBAcmV0dXJuIGEgRmlsZSBvYmplY3QgZm9yIGNyZWF0ZWQgdGVtcCBkaXJlY3RvcnkKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBkaXJlY3RvcnkgY3JlYXRpb24gZmFpbHMuCisgICAqLworICBwdWJsaWMgZmluYWwgRmlsZSBjcmVhdGVUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIGYgPSBkb0NyZWF0ZVRlbXBEaXIoInRlc3QiLCAiIik7CisgICAgcmVnaXN0ZXJBc1RlbXBGaWxlKGYpOworICAgIHJldHVybiBmOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIHRlc3Qgb3IgbnVsbCBpZiBubyB0ZXN0IGlzIHJ1bm5pbmcgb3Igbm8gZGlyZWN0b3J5IGlzIGNyZWF0ZWQgeWV0LgorICAgKgorICAgKiBAcmV0dXJuIHNlZSBhYm92ZQorICAgKi8KKyAgcHVibGljIEZpbGUgZ2V0Q3VycmVudFRlbXBEaXIoKSB7CisgICAgcmV0dXJuIG15Q3VycmVudFRlbXBEaXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgIHRyeSB7CisgICAgICBmb3IgKEZpbGUgZmlsZSA6IG15RmlsZXNUb0RlbGV0ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIEZpbGVVdGlscy5mb3JjZURlbGV0ZShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG15RmlsZXNUb0RlbGV0ZS5jbGVhcigpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoIW15SW5zaWRlU2h1dGRvd25Ib29rKSB7CisgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnJlbW92ZVNodXRkb3duSG9vayhteVNodXRkb3duSG9vayk7CisgICAgICB9CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvVXRpbHMuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjZTBmMQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L1V0aWxzLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTGV2ZWw7CisKK3B1YmxpYyBjbGFzcyBVdGlscyB7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19QUk9QRVJUWV9LRVkgPSAiY29tLnR1cm4udHRvcnJlbnQubG9nTGV2ZWwiOworCisgIHB1YmxpYyBzdGF0aWMgTGV2ZWwgZ2V0TG9nTGV2ZWwoKSB7CisgICAgZmluYWwgU3RyaW5nIGxldmVsU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KExPR19QUk9QRVJUWV9LRVkpOworICAgIHJldHVybiBMZXZlbC50b0xldmVsKGxldmVsU3RyLCBMZXZlbC5JTkZPKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvV2FpdEZvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3QtYXBpL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvV2FpdEZvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YjkzOWIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdC1hcGkvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9XYWl0Rm9yLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFdhaXRGb3IgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUE9MTF9JTlRFUlZBTCA9IDUwMDsKKworICBwcml2YXRlIGJvb2xlYW4gbXlSZXN1bHQgPSBmYWxzZTsKKworICBwcm90ZWN0ZWQgV2FpdEZvcigpIHsKKyAgICB0aGlzKDYwICogMTAwMCk7CisgIH0KKworICBwcm90ZWN0ZWQgV2FpdEZvcihsb25nIHRpbWVvdXQpIHsKKyAgICBsb25nIG1heFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7CisgICAgdHJ5IHsKKyAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IG1heFRpbWUgJiYgIWNvbmRpdGlvbigpKSB7CisgICAgICAgIFRocmVhZC5zbGVlcChQT0xMX0lOVEVSVkFMKTsKKyAgICAgIH0KKyAgICAgIGlmIChjb25kaXRpb24oKSkgeworICAgICAgICBteVJlc3VsdCA9IHRydWU7CisgICAgICB9CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzTXlSZXN1bHQoKSB7CisgICAgcmV0dXJuIG15UmVzdWx0OworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gY29uZGl0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvcG9tLnhtbCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmVjYWMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvcG9tLnhtbApAQCAtMCwwICsxLDQwIEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC9jb21tb248L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRlc3RzPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdHJhY2tlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRlc3QtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0NvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YmUyOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0NvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29tbXVuaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5IHsKKworICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1BPT0xfU0laRSA9IDEwOworCisgIHB1YmxpYyBDb21tdW5pY2F0aW9uTWFuYWdlciBnZXRDbGllbnQoU3RyaW5nIG5hbWUpIHsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigKKyAgICAgICAgICAgIERFRkFVTFRfUE9PTF9TSVpFLCBERUZBVUxUX1BPT0xfU0laRSwKKyAgICAgICAgICAgIDBMLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCisgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oNDAwMCkpOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigKKyAgICAgICAgICAgIERFRkFVTFRfUE9PTF9TSVpFLCBERUZBVUxUX1BPT0xfU0laRSwKKyAgICAgICAgICAgIDBMLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCisgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oNDAwKSk7CisgICAgcmV0dXJuIG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihleGVjdXRvclNlcnZpY2UsIHBpZWNlVmFsaWRhdG9yRXhlY3V0b3IpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIGludCB0aW1lb3V0ID0gNjA7CisgICAgICAgIFRpbWVVbml0IHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKworICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgcGllY2VWYWxpZGF0b3JFeGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBpZiAodGltZW91dCA+IDApIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFwaWVjZVZhbGlkYXRvckV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24odGltZW91dCwgdGltZVVuaXQpKSB7CisgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJ1bmFibGUgdG8gdGVybWluYXRlIGV4ZWN1dG9yIHNlcnZpY2UgaW4ge30ge30iLCB0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHNodXRkb3duQ29ycmVjdGx5ID0gZXhlY3V0b3JTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24odGltZW91dCwgdGltZVVuaXQpOworICAgICAgICAgICAgaWYgKCFzaHV0ZG93bkNvcnJlY3RseSkgeworICAgICAgICAgICAgICBsb2dnZXIud2FybigidW5hYmxlIHRvIHRlcm1pbmF0ZSBleGVjdXRvciBzZXJ2aWNlIGluIHt9IHt9IiwgdGltZW91dCwgdGltZVVuaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5hYmxlIHRvIGF3YWl0IHRlcm1pbmF0aW9uIGV4ZWN1dG9yIHNlcnZpY2UsIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQiLCBlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0R1bW15UGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L0R1bW15UGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGEwOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvRHVtbXlQZWVyQWN0aXZpdHlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuUGVlckFjdGl2aXR5TGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK3B1YmxpYyBjbGFzcyBEdW1teVBlZXJBY3Rpdml0eUxpc3RlbmVyIGltcGxlbWVudHMgUGVlckFjdGl2aXR5TGlzdGVuZXIgeworCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBlZXJDaG9rZWQoU2hhcmluZ1BlZXIgcGVlcikgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGVlclJlYWR5KFNoYXJpbmdQZWVyIHBlZXIpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVyUGVlclJlbW92ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VBdmFpbGFiaWxpdHkoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZUJpdGZpZWxkQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsIEJpdFNldCBhdmFpbGFibGVQaWVjZXMpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlU2VudChTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSkgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VDb21wbGV0ZWQoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQZWVyRGlzY29ubmVjdGVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZUlPRXhjZXB0aW9uKFNoYXJpbmdQZWVyIHBlZXIsIElPRXhjZXB0aW9uIGlvZSkgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlTmV3UGVlckNvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKSB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmMyNWIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ29tbXVuaWNhdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTA4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZpbGVTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5QaWVjZVN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlBlZXJNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuRmlyc3RBdmFpbGFibGVDaGFubmVsOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuU2VydmVyQ2hhbm5lbFJlZ2lzdGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlZFBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlci5UcmFja2VkVG9ycmVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dDsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07CisKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5LkRFRkFVTFRfUE9PTF9TSVpFOworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXIuQU5OT1VOQ0VfVVJMOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOworCisvKioKKyAqIEBhdXRob3IgU2VyZ2V5LlBhaworICogRGF0ZTogNy8yNi8xMworICogVGltZTogMjozMiBQTQorICovCitAVGVzdCh0aW1lT3V0ID0gNjAwMDAwKQorcHVibGljIGNsYXNzIENvbW11bmljYXRpb25NYW5hZ2VyVGVzdCB7CisKKyAgcHJpdmF0ZSBDb21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkgY29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5OworCisgIHByaXZhdGUgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVNPVVJDRVMgPSAic3JjL3Rlc3QvcmVzb3VyY2VzIjsKKyAgcHJpdmF0ZSBUcmFja2VyIHRyYWNrZXI7CisgIHByaXZhdGUgVGVtcEZpbGVzIHRlbXBGaWxlczsKKworICBwdWJsaWMgQ29tbXVuaWNhdGlvbk1hbmFnZXJUZXN0KCkgeworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeSA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkoKTsKKyAgICBpZiAoTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5nZXRBbGxBcHBlbmRlcnMoKS5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgIHJldHVybjsKKyAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcihuZXcgUGF0dGVybkxheW91dCgiWyVke01NZGQgSEg6bW06c3MsU1NTfSAldF0gJTZwIC0gJTIwLjIwYyAtICVtICVuIikpKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRlbXBGaWxlcyA9IG5ldyBUZW1wRmlsZXMoKTsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPigpOworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoVXRpbHMuZ2V0TG9nTGV2ZWwoKSk7CisgICAgc3RhcnRUcmFja2VyKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2F2ZVRvcnJlbnQoVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgIGZvcy53cml0ZShuZXcgVG9ycmVudFNlcmlhbGl6ZXIoKS5zZXJpYWxpemUodG9ycmVudCkpOworICAgIGZvcy5jbG9zZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRoYXRTZWVkZXJJc05vdFJlY2VpdmVkSGF2ZU1lc3NhZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHdvcmtlckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxMCk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIGlzU2VlZGVyUmVjZWl2ZWRIYXZlTWVzc2FnZSA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIod29ya2VyRVMsIHZhbGlkYXRvckVTKSB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFNoYXJpbmdQZWVyIGNyZWF0ZVNoYXJpbmdQZWVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgQnl0ZUJ1ZmZlciBwZWVySWQsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCwgQnl0ZUNoYW5uZWwgY2hhbm5lbCwgU3RyaW5nIGNsaWVudElkZW50aWZpZXIsIGludCBjbGllbnRWZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU2hhcmluZ1BlZXIoaG9zdCwgcG9ydCwgcGVlcklkLCB0b3JyZW50LCBnZXRDb25uZWN0aW9uTWFuYWdlcigpLCB0aGlzLCBjaGFubmVsLCAiVE8iLCAxMjM0KSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZU1lc3NhZ2UoUGVlck1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgUGVlck1lc3NhZ2UuSGF2ZU1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgaXNTZWVkZXJSZWNlaXZlZEhhdmVNZXNzYWdlLnNldCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICB3b3JrZXJFUy5zaHV0ZG93bigpOworICAgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bigpOworICAgICAgfQorICAgIH07CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChzZWVkZXIpOworCisgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDAgKiAxMDI1ICogMTAyNCk7CisgICAgVVJMIGFubm91bmNlID0gbmV3IFVSTCgiaHR0cDovLzEyNy4wLjAuMTo2OTY5L2Fubm91bmNlIik7CisgICAgVVJJIGFubm91bmNlVVJJID0gYW5ub3VuY2UudG9VUkkoKTsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCBhbm5vdW5jZVVSSSwgIlRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZW1wRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGUuZ2V0UGFyZW50KCkpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICB3YWl0Rm9yU2VlZGVySXNBbm5vdW5zZWRPblRyYWNrZXIodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDE1KTsKKyAgICBhc3NlcnRGYWxzZShpc1NlZWRlclJlY2VpdmVkSGF2ZU1lc3NhZ2UuZ2V0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdhaXREb3dubG9hZENvbXBsZXRlKFRvcnJlbnRNYW5hZ2VyIHRvcnJlbnRNYW5hZ2VyLCBpbnQgdGltZW91dFNlYykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICBUb3JyZW50TGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyID0gbmV3IFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfTsKKyAgICB0cnkgeworICAgICAgdG9ycmVudE1hbmFnZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgYm9vbGVhbiByZXMgPSBzZW1hcGhvcmUudHJ5QWNxdWlyZSh0aW1lb3V0U2VjLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGlmICghcmVzKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGRvd25sb2FkIGZpbGUgaW4gIiArIHRpbWVvdXRTZWMgKyAiIHNlY29uZHMiKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgdG9ycmVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3YWl0Rm9yU2VlZGVySXNBbm5vdW5zZWRPblRyYWNrZXIoZmluYWwgU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgZmluYWwgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQoaGV4SW5mb0hhc2gpICE9IG51bGw7CisgICAgICB9CisgICAgfTsKKyAgICBhc3NlcnRUcnVlKHdhaXRGb3IuaXNNeVJlc3VsdCgpKTsKKyAgfQorCisKKyAgLy8gIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDUwKQorICBwdWJsaWMgdm9pZCBkb3dubG9hZF9tdWx0aXBsZV9maWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgaW50IG51bUZpbGVzID0gNTA7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIEZpbGUgc3JjRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgic2VlZGVyIik7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IG51bGw7CisKKworICAgIHRyeSB7CisgICAgICBVUkwgYW5ub3VuY2UgPSBuZXcgVVJMKCJodHRwOi8vMTI3LjAuMC4xOjY5NjkvYW5ub3VuY2UiKTsKKyAgICAgIFVSSSBhbm5vdW5jZVVSSSA9IGFubm91bmNlLnRvVVJJKCk7CisgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgIExpc3Q8RmlsZT4gZmlsZXNUb1NoYXJlID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GaWxlczsgaSsrKSB7CisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCk7CisgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0ZW1wRmlsZS5yZW5hbWVUbyhzcmNGaWxlKSk7CisKKyAgICAgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoc3JjRmlsZSwgYW5ub3VuY2VVUkksICJUZXN0Iik7CisgICAgICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShzcmNGaWxlLmdldFBhcmVudEZpbGUoKSwgc3JjRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICAgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgICAgICBmaWxlc1RvU2hhcmUuYWRkKHNyY0ZpbGUpOworICAgICAgICBuYW1lcy5hZGQoc3JjRmlsZS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzVG9TaGFyZSkgeworICAgICAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoZi5nZXRQYXJlbnRGaWxlKCksIGYuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBmLmdldFBhcmVudCgpKTsKKyAgICAgIH0KKyAgICAgIGxlZWNoID0gY3JlYXRlQ2xpZW50KCJsZWVjaGVyIik7CisgICAgICBsZWVjaC5zdGFydChuZXcgSW5ldEFkZHJlc3NbXXtJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKX0sIDUsIG51bGwsIG5ldyBTZWxlY3RvckZhY3RvcnlJbXBsKCkpOworICAgICAgZm9yIChGaWxlIGYgOiBmaWxlc1RvU2hhcmUpIHsKKyAgICAgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50RmlsZSgpLCBmLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgICAgICBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICB9CisKKyAgICAgIG5ldyBXYWl0Rm9yKDYwICogMTAwMCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworCisgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc3RyaW5ncyA9IGxpc3RGaWxlTmFtZXMoZG93bmxvYWREaXIpOworICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcnRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJpbmdzKSB7CisgICAgICAgICAgICBpZiAocy5lbmRzV2l0aCgiLnBhcnQiKSkgeworICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICBwYXJ0SXRlbXMuYWRkKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY291bnQgPCA1KSB7CisKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJDb3VudDogJWQuIEl0ZW1zOiAlcyVuIiwgY291bnQsIEFycmF5cy50b1N0cmluZyhwYXJ0SXRlbXMudG9BcnJheSgpKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBzdHJpbmdzLmNvbnRhaW5zQWxsKG5hbWVzKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RGaWxlTmFtZXMoZG93bmxvYWREaXIpLCBuYW1lcyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGxlZWNoLnN0b3AoKTsKKyAgICAgIHNlZWRlci5zdG9wKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBsaXN0RmlsZU5hbWVzKEZpbGUgZG93bmxvYWREaXIpIHsKKyAgICBpZiAoZG93bmxvYWREaXIgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgRmlsZVtdIGZpbGVzID0gZG93bmxvYWREaXIubGlzdEZpbGVzKCk7CisgICAgaWYgKGZpbGVzID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIGZvciAoRmlsZSBmIDogZmlsZXMpIHsKKyAgICAgIG5hbWVzLmFkZChmLmdldE5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiBuYW1lczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIdW5nU2VlZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTAwICogMTAyNSAqIDEwMjQpOworICAgIFVSTCBhbm5vdW5jZSA9IG5ldyBVUkwoImh0dHA6Ly8xMjcuMC4wLjE6Njk2OS9hbm5vdW5jZSIpOworICAgIFVSSSBhbm5vdW5jZVVSSSA9IGFubm91bmNlLnRvVVJJKCk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgYW5ub3VuY2VVUkksICJUZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgZ29vZFNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGdvb2RTZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGUuZ2V0UGFyZW50KCksIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDEwKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGh1bmdTZWVkZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXMsIHZhbGlkYXRvckVTKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICAgICAgZXMuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd25Ob3coKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU2hhcmluZ1BlZXIgY3JlYXRlU2hhcmluZ1BlZXIoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBCeXRlQnVmZmVyIHBlZXJJZCwgU2hhcmVkVG9ycmVudCB0b3JyZW50LCBCeXRlQ2hhbm5lbCBjaGFubmVsLCBTdHJpbmcgY2xpZW50SWRlbnRpZmllciwgaW50IGNsaWVudFZlcnNpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaGFyaW5nUGVlcihob3N0LCBwb3J0LCBwZWVySWQsIHRvcnJlbnQsIGdldENvbm5lY3Rpb25NYW5hZ2VyKCksIHRoaXMsIGNoYW5uZWwsIGNsaWVudElkZW50aWZpZXIsIGNsaWVudFZlcnNpb24pIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKFBlZXJNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIFBlZXJNZXNzYWdlLlJlcXVlc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9CisgICAgfTsKKyAgICBodW5nU2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpLCBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworCisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKworICAgIHRyeSB7CisgICAgICBodW5nU2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGdvb2RTZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgICAgbGVlY2guc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICB3YWl0Rm9yRmlsZUluRGlyKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpOworICAgICAgYXNzZXJ0RmlsZXNFcXVhbCh0ZW1wRmlsZSwgbmV3IEZpbGUoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSkpOworICAgIH0gZmluYWxseSB7CisgICAgICBnb29kU2VlZGVyLnN0b3AoKTsKKyAgICAgIGxlZWNoLnN0b3AoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBsYXJnZV9maWxlX2Rvd25sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgyMDEgKiAxMDI1ICogMTAyNCk7CisgICAgVVJMIGFubm91bmNlID0gbmV3IFVSTCgiaHR0cDovLzEyNy4wLjAuMTo2OTY5L2Fubm91bmNlIik7CisgICAgVVJJIGFubm91bmNlVVJJID0gYW5ub3VuY2UudG9VUkkoKTsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCBhbm5vdW5jZVVSSSwgIlRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZW1wRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGUuZ2V0UGFyZW50KCksIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldEFic29sdXRlUGF0aCgpLCBFbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworCisgICAgdHJ5IHsKKyAgICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgICBsZWVjaC5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSk7CisgICAgICBhc3NlcnRGaWxlc0VxdWFsKHRlbXBGaWxlLCBuZXcgRmlsZShkb3dubG9hZERpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlZWRlci5zdG9wKCk7CisgICAgICBsZWVjaC5zdG9wKCk7CisgICAgfQorICB9CisKKyAgLy8gVE9ETzogMjQuMDkuMjAxOCBmbGFreSB0ZXN0LCBpdCdzIG5lZWRlZCB0byBkZWJ1ZyBhbmQgZml4CisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgdGVzdE1hbnlMZWVjaGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNDAwICogMTAyNSAqIDEwMjQpOworICAgIFVSTCBhbm5vdW5jZSA9IG5ldyBVUkwoImh0dHA6Ly8xMjcuMC4wLjE6Njk2OS9hbm5vdW5jZSIpOworICAgIFVSSSBhbm5vdW5jZVVSSSA9IGFubm91bmNlLnRvVVJJKCk7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgYW5ub3VuY2VVUkksICJUZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpLCBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworCisgICAgTGlzdDxNYXAuRW50cnk8Q29tbXVuaWNhdGlvbk1hbmFnZXIsIEZpbGU+PiBsZWVjaGVycyA9IG5ldyBBcnJheUxpc3Q8TWFwLkVudHJ5PENvbW11bmljYXRpb25NYW5hZ2VyLCBGaWxlPj4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNsaWVudCgpOworICAgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIEVtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSk7CisgICAgICBsZWVjaGVycy5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PENvbW11bmljYXRpb25NYW5hZ2VyLCBGaWxlPihsZWVjaCwgZG93bmxvYWREaXIpKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PENvbW11bmljYXRpb25NYW5hZ2VyLCBGaWxlPiBlbnRyeSA6IGxlZWNoZXJzKSB7CisgICAgICAgIGVudHJ5LmdldEtleSgpLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChNYXAuRW50cnk8Q29tbXVuaWNhdGlvbk1hbmFnZXIsIEZpbGU+IGxlZWNoZXIgOiBsZWVjaGVycykgeworICAgICAgICBGaWxlIGRvd25sb2FkRGlyID0gbGVlY2hlci5nZXRWYWx1ZSgpOworICAgICAgICB3YWl0Rm9yRmlsZUluRGlyKGRvd25sb2FkRGlyLCB0ZW1wRmlsZS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRGaWxlc0VxdWFsKHRlbXBGaWxlLCBuZXcgRmlsZShkb3dubG9hZERpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKSk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlZWRlci5zdG9wKCk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxDb21tdW5pY2F0aW9uTWFuYWdlciwgRmlsZT4gZSA6IGxlZWNoZXJzKSB7CisgICAgICAgIGUuZ2V0S2V5KCkuc3RvcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgcHVibGljIHZvaWQgZW5kZ2FtZU1vZGVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBmaW5hbCBpbnQgbnVtU2VlZGVycyA9IDI7CisgICAgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gc2VlZGVycyA9IG5ldyBBcnJheUxpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+KCk7CisgICAgZmluYWwgQXRvbWljSW50ZWdlciBza2lwUGllY2VzQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlZWRlcnM7IGkrKykgeworICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxMCk7CisgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGVzLCB2YWxpZGF0b3JFUykgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgICAgZXMuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTaGFyaW5nUGVlciBjcmVhdGVTaGFyaW5nUGVlcihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIEJ5dGVCdWZmZXIgcGVlcklkLCBTaGFyZWRUb3JyZW50IHRvcnJlbnQsIEJ5dGVDaGFubmVsIGNoYW5uZWwsIFN0cmluZyBjbGllbnRJZGVudGlmaWVyLCBpbnQgY2xpZW50VmVyc2lvbikgeworICAgICAgICAgIHJldHVybiBuZXcgU2hhcmluZ1BlZXIoaG9zdCwgcG9ydCwgcGVlcklkLCB0b3JyZW50LCBnZXRDb25uZWN0aW9uTWFuYWdlcigpLCB0aGlzLCBjaGFubmVsLCAiVE8iLCAxMjM0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmQoUGVlck1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUGVlck1lc3NhZ2UuUGllY2VNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBQaWVjZXNDb3VudC5nZXRBbmREZWNyZW1lbnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3VwZXIuc2VuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9CisgICAgICB9OworICAgICAgc2VlZGVycy5hZGQoc2VlZGVyKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoc2VlZGVyKTsKKyAgICB9CisgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDI0ICogMjAgKiAxMDI0KTsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHRlbXBGaWxlLCB0aGlzLnRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZW1wRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNlZWRlcnM7IGkrKykgeworICAgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgPSBzZWVkZXJzLmdldChpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICB9CisKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldFBhcmVudCgpKTsKKyAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgMjApOworCisgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgdGVtcEZpbGUuZ2V0TmFtZSgpKTsKKworICB9CisKKworICBwdWJsaWMgdm9pZCBtb3JlX3RoYW5fb25lX3NlZWRlcl9mb3Jfc2FtZV90b3JyZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSk7CisKKyAgICBmaW5hbCBpbnQgbnVtU2VlZGVycyA9IDU7CisgICAgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gc2VlZGVycyA9IG5ldyBBcnJheUxpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZWVkZXJzOyBpKyspIHsKKyAgICAgIHNlZWRlcnMuYWRkKGNyZWF0ZUNsaWVudCgpKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgRmlsZSB0ZW1wRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgxMDAgKiAxMDI0KTsKKworICAgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIHRoaXMudHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworICAgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdGVtcEZpbGUuZ2V0TmFtZSgpICsgIi50b3JyZW50Iik7CisgICAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VlZGVyczsgaSsrKSB7CisgICAgICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gc2VlZGVycy5nZXQoaSk7CisgICAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlLmdldFBhcmVudCgpKTsKKyAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgICAgfQorCisgICAgICBuZXcgV2FpdEZvcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgICBmb3IgKFRyYWNrZWRUb3JyZW50IHR0IDogdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKSkgeworICAgICAgICAgICAgaWYgKHR0LmdldFBlZXJzKCkuc2l6ZSgpID09IG51bVNlZWRlcnMpIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgQ29sbGVjdGlvbjxUcmFja2VkVG9ycmVudD4gdG9ycmVudHMgPSB0aGlzLnRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCk7CisgICAgICBhc3NlcnRFcXVhbHModG9ycmVudHMuc2l6ZSgpLCAxKTsKKyAgICAgIGFzc2VydEVxdWFscyhudW1TZWVkZXJzLCB0b3JyZW50cy5pdGVyYXRvcigpLm5leHQoKS5zZWVkZXJzKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyIDogc2VlZGVycykgeworICAgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhhdERvd25sb2FkU3RhdGlzdGljUHJvdmlkZWRUb1RyYWNrZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg4KTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRPZlRyYWNrZXJSZXNwb25zZXMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGV4ZWN1dG9yU2VydmljZSwgdmFsaWRhdG9yRVMpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgaGFuZGxlRGlzY292ZXJlZFBlZXJzKExpc3Q8UGVlcj4gcGVlcnMsIFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgICAgICBzdXBlci5oYW5kbGVEaXNjb3ZlcmVkUGVlcnMocGVlcnMsIGhleEluZm9IYXNoKTsKKyAgICAgICAgY291bnRPZlRyYWNrZXJSZXNwb25zZXMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd25Ob3coKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChsZWVjaGVyKTsKKworICAgIGZpbmFsIGludCBmaWxlU2l6ZSA9IDIgKiAxMDI1ICogMTAyNDsKKyAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKGZpbGVTaXplKTsKKyAgICBVUkwgYW5ub3VuY2UgPSBuZXcgVVJMKCJodHRwOi8vMTI3LjAuMC4xOjY5NjkvYW5ub3VuY2UiKTsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBhbm5vdW5jZS50b1VSSSgpOworCisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIGFubm91bmNlVVJJLCAiVGVzdCIpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlbXBGaWxlLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIFN0cmluZyBoYXNoID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpKS5nZXRIZXhJbmZvSGFzaCgpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGZpbmFsIExvYWRlZFRvcnJlbnQgYW5ub3VuY2VhYmxlVG9ycmVudCA9IGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuZ2V0TG9hZGVkVG9ycmVudChoYXNoKTsKKworICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgc2hhcmVkVG9ycmVudCA9IGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkucHV0SWZBYnNlbnRBY3RpdmVUb3JyZW50KGFubm91bmNlYWJsZVRvcnJlbnQuZ2V0VG9ycmVudEhhc2goKS5nZXRIZXhJbmZvSGFzaCgpLAorICAgICAgICAgICAgbGVlY2hlci5nZXRUb3JyZW50TG9hZGVyKCkubG9hZFRvcnJlbnQoYW5ub3VuY2VhYmxlVG9ycmVudCkpOworCisgICAgc2hhcmVkVG9ycmVudC5pbml0KCk7CisKKyAgICBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gY291bnRPZlRyYWNrZXJSZXNwb25zZXMuZ2V0KCkgPT0gMTsKKyAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgdHJhY2tlZFRvcnJlbnQgPSB0cmFja2VyLmdldFRyYWNrZWRUb3JyZW50KGFubm91bmNlYWJsZVRvcnJlbnQuZ2V0VG9ycmVudEhhc2goKS5nZXRIZXhJbmZvSGFzaCgpKTsKKworICAgIGFzc2VydEVxdWFscyh0cmFja2VkVG9ycmVudC5nZXRQZWVycygpLnNpemUoKSwgMSk7CisKKyAgICBmaW5hbCBUcmFja2VkUGVlciB0cmFja2VkUGVlciA9IHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0VXBsb2FkZWQoKSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldERvd25sb2FkZWQoKSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldExlZnQoKSwgZmlsZVNpemUpOworCisgICAgUGllY2UgcGllY2UgPSBzaGFyZWRUb3JyZW50LmdldFBpZWNlKDEpOworICAgIHNoYXJlZFRvcnJlbnQuaGFuZGxlUGllY2VDb21wbGV0ZWQobnVsbCwgcGllY2UpOworICAgIHNoYXJlZFRvcnJlbnQubWFya0NvbXBsZXRlZChwaWVjZSk7CisKKyAgICBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gY291bnRPZlRyYWNrZXJSZXNwb25zZXMuZ2V0KCkgPj0gMjsKKyAgICAgIH0KKyAgICB9OworICAgIGludCBkb3dubG9hZGVkID0gNTEyICogMTAyNDsvL29uZSBwaWVjZQorICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXRVcGxvYWRlZCgpLCAwKTsKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0RG93bmxvYWRlZCgpLCBkb3dubG9hZGVkKTsKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0TGVmdCgpLCBmaWxlU2l6ZSAtIGRvd25sb2FkZWQpOworICB9CisKKyAgcHVibGljIHZvaWQgbm9fZnVsbF9zZWVkZXJfdGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgZmluYWwgaW50IHBpZWNlU2l6ZSA9IDQ4ICogMTAyNDsgLy8gbG93ZXIgcGllY2Ugc2l6ZSB0byByZWR1Y2UgZGlzayB1c2FnZQorICAgIGZpbmFsIGludCBudW1TZWVkZXJzID0gNjsKKyAgICBmaW5hbCBpbnQgcGllY2VzQ291bnQgPSBudW1TZWVkZXJzICogMyArIDE1OworCisgICAgZmluYWwgTGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4gY2xpZW50c0xpc3Q7CisgICAgY2xpZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPihwaWVjZXNDb3VudCk7CisKKyAgICBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworCisgICAgdHJ5IHsKKyAgICAgIEZpbGUgdGVtcEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUocGllY2VzQ291bnQgKiBwaWVjZVNpemUpOworICAgICAgTGlzdDxGaWxlPiB0YXJnZXRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKworICAgICAgU3RyaW5nIGhhc2ggPSBjcmVhdGVNdWx0aXBsZVNlZWRlcnNXaXRoRGlmZmVyZW50UGllY2VzKHRlbXBGaWxlLCBwaWVjZXNDb3VudCwgcGllY2VTaXplLCBudW1TZWVkZXJzLCBjbGllbnRzTGlzdCwgdGFyZ2V0RmlsZXMpOworICAgICAgU3RyaW5nIGJhc2VNRDUgPSBnZXRGaWxlTUQ1KHRlbXBGaWxlLCBtZDUpOworICAgICAgYXNzZXJ0RXF1YWxzKG51bVNlZWRlcnMsIHRhcmdldEZpbGVzLnNpemUoKSk7CisKKyAgICAgIHZhbGlkYXRlTXVsdGlwbGVDbGllbnRzUmVzdWx0cyhjbGllbnRzTGlzdCwgbWQ1LCB0ZW1wRmlsZSwgYmFzZU1ENSwgaGFzaCwgdGFyZ2V0RmlsZXMpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZvciAoQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgOiBjbGllbnRzTGlzdCkgeworICAgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQorICBwdWJsaWMgdm9pZCBjb3JydXB0ZWRfc2VlZGVyX3JlcGFpcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgZmluYWwgaW50IHBpZWNlU2l6ZSA9IDQ4ICogMTAyNDsgLy8gbG93ZXIgcGllY2Ugc2l6ZSB0byByZWR1Y2UgZGlzayB1c2FnZQorICAgIGZpbmFsIGludCBudW1TZWVkZXJzID0gNjsKKyAgICBmaW5hbCBpbnQgcGllY2VzQ291bnQgPSBudW1TZWVkZXJzICsgNzsKKworICAgIGZpbmFsIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IGNsaWVudHNMaXN0OworICAgIGNsaWVudHNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb21tdW5pY2F0aW9uTWFuYWdlcj4ocGllY2VzQ291bnQpOworCisgICAgZmluYWwgTWVzc2FnZURpZ2VzdCBtZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKworICAgIHRyeSB7CisgICAgICBGaWxlIGJhc2VGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKHBpZWNlc0NvdW50ICogcGllY2VTaXplKTsKKyAgICAgIExpc3Q8RmlsZT4gdGFyZ2V0RmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisKKyAgICAgIFN0cmluZyBoYXNoID0gY3JlYXRlTXVsdGlwbGVTZWVkZXJzV2l0aERpZmZlcmVudFBpZWNlcyhiYXNlRmlsZSwgcGllY2VzQ291bnQsIHBpZWNlU2l6ZSwgbnVtU2VlZGVycywgY2xpZW50c0xpc3QsIHRhcmdldEZpbGVzKTsKKyAgICAgIGFzc2VydEVxdWFscyhudW1TZWVkZXJzLCB0YXJnZXRGaWxlcy5zaXplKCkpOworICAgICAgU3RyaW5nIGJhc2VNRDUgPSBnZXRGaWxlTUQ1KGJhc2VGaWxlLCBtZDUpOworICAgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgZmlyc3RDb21tdW5pY2F0aW9uTWFuYWdlciA9IGNsaWVudHNMaXN0LmdldCgwKTsKKworICAgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgcmV0dXJuIGZpcnN0Q29tbXVuaWNhdGlvbk1hbmFnZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkgPj0gMTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgZmluYWwgU2hhcmVkVG9ycmVudCB0b3JyZW50ID0gZmlyc3RDb21tdW5pY2F0aW9uTWFuYWdlci5nZXRUb3JyZW50cygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUodGFyZ2V0RmlsZXMuZ2V0KDApLmdldFBhcmVudEZpbGUoKSwgVG9ycmVudFV0aWxzLmdldFRvcnJlbnRGaWxlTmFtZXModG9ycmVudCkuZ2V0KDApKTsKKyAgICAgIGZpbmFsIGludCBvbGRCeXRlOworICAgICAgeworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJydyIpOworICAgICAgICByYWYuc2VlaygwKTsKKyAgICAgICAgb2xkQnl0ZSA9IHJhZi5yZWFkKCk7CisgICAgICAgIHJhZi5zZWVrKDApOworICAgICAgICAvLyByZXBsYWNpbmcgdGhlIGJ5dGUKKyAgICAgICAgaWYgKG9sZEJ5dGUgIT0gMzUpIHsKKyAgICAgICAgICByYWYud3JpdGUoMzUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJhZi53cml0ZSg0NSk7CisgICAgICAgIH0KKyAgICAgICAgcmFmLmNsb3NlKCk7CisgICAgICB9CisgICAgICBmaW5hbCBXYWl0Rm9yIHdhaXRGb3IgPSBuZXcgV2FpdEZvcig2MCAqIDEwMDApIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNsaWVudCA6IGNsaWVudHNMaXN0KSB7CisgICAgICAgICAgICBmaW5hbCBTaGFyZWRUb3JyZW50IG5leHQgPSBjbGllbnQuZ2V0VG9ycmVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChuZXh0LmdldENvbXBsZXRlZFBpZWNlcygpLmNhcmRpbmFsaXR5KCkgPCBuZXh0LmdldFBpZWNlQ291bnQoKSAtIDEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgaWYgKCF3YWl0Rm9yLmlzTXlSZXN1bHQoKSkgeworICAgICAgICBmYWlsKCJBbGwgc2VlZGVycyBkaWRuJ3QgZ2V0IHRoZWlyIGZpbGVzIik7CisgICAgICB9CisgICAgICBUaHJlYWQuc2xlZXAoMTAgKiAxMDAwKTsKKyAgICAgIHsKKyAgICAgICAgYnl0ZVtdIHBpZWNlID0gbmV3IGJ5dGVbcGllY2VTaXplXTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYmFzZUZpbGUpOworICAgICAgICBmaW4ucmVhZChwaWVjZSk7CisgICAgICAgIGZpbi5jbG9zZSgpOworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAicnciKTsKKyAgICAgICAgICByYWYuc2VlaygwKTsKKyAgICAgICAgICByYWYud3JpdGUob2xkQnl0ZSk7CisgICAgICAgICAgcmFmLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlTXVsdGlwbGVDbGllbnRzUmVzdWx0cyhjbGllbnRzTGlzdCwgbWQ1LCBiYXNlRmlsZSwgYmFzZU1ENSwgaGFzaCwgdGFyZ2V0RmlsZXMpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZvciAoQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgOiBjbGllbnRzTGlzdCkgeworICAgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRoYXRUb3JyZW50c0hhdmVMYXp5SW5pdEFuZFJlbW92aW5nQWZ0ZXJEb3dubG9hZCgpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBGaWxlIHRlbXBGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDEwMCAqIDEwMjUgKiAxMDI0KTsKKyAgICBVUkwgYW5ub3VuY2UgPSBuZXcgVVJMKCJodHRwOi8vMTI3LjAuMC4xOjY5NjkvYW5ub3VuY2UiKTsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBhbm5vdW5jZS50b1VSSSgpOworCisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUodGVtcEZpbGUsIGFubm91bmNlVVJJLCAiVGVzdCIpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS5nZXRQYXJlbnRGaWxlKCksIHRlbXBGaWxlLmdldE5hbWUoKSArICIudG9ycmVudCIpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRvd25sb2FkRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hbm5vdW5jZWFibGVUb3JyZW50cygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkpOworCisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICBXYWl0Rm9yIHdhaXRGb3IgPSBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkgPT0gMTsKKyAgICAgIH0KKyAgICB9OworCisgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSwgIlRvcnJlbnQgd2FzIG5vdCBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQiKTsKKworICAgIGFzc2VydEVxdWFscygxLCBzZWVkZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYWN0aXZlVG9ycmVudHMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygxLCBsZWVjaGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpKTsKKworICAgIHdhaXRGb3JGaWxlSW5EaXIoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RmlsZXNFcXVhbCh0ZW1wRmlsZSwgbmV3IEZpbGUoZG93bmxvYWREaXIsIHRlbXBGaWxlLmdldE5hbWUoKSkpOworCisgICAgd2FpdEZvciA9IG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgbGVlY2hlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSA9PSAwOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKHdhaXRGb3IuaXNNeVJlc3VsdCgpLCAiVG9ycmVudCB3YXMgbm90IHN1Y2Nlc3NmdWxseSByZW1vdmVkIik7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgc2VlZGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbGVlY2hlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hY3RpdmVUb3JyZW50cygpLnNpemUoKSk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNvcnJ1cHRlZF9zZWVkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBmaW5hbCBpbnQgcGllY2VTaXplID0gNDggKiAxMDI0OyAvLyBsb3dlciBwaWVjZSBzaXplIHRvIHJlZHVjZSBkaXNrIHVzYWdlCisgICAgZmluYWwgaW50IHBpZWNlc0NvdW50ID0gMzU7CisKKyAgICBmaW5hbCBMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPiBjbGllbnRzTGlzdDsKKyAgICBjbGllbnRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+KHBpZWNlc0NvdW50KTsKKworICAgIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisKKyAgICB0cnkgeworICAgICAgZmluYWwgRmlsZSBiYXNlRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZShwaWVjZXNDb3VudCAqIHBpZWNlU2l6ZSk7CisgICAgICBmaW5hbCBGaWxlIGJhZEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUocGllY2VzQ291bnQgKiBwaWVjZVNpemUpOworCisgICAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlcjIgPSBjcmVhdGVBbmRTdGFydENsaWVudCgpOworICAgICAgZmluYWwgRmlsZSBjbGllbnQyRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICAgIGZpbmFsIEZpbGUgY2xpZW50MkZpbGUgPSBuZXcgRmlsZShjbGllbnQyRGlyLCBiYXNlRmlsZS5nZXROYW1lKCkpOworICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGJhZEZpbGUsIGNsaWVudDJGaWxlKTsKKworICAgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoYmFzZUZpbGUsIG51bGwsIHRoaXMudHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCBudWxsLCAiVGVzdCIsIHBpZWNlU2l6ZSk7CisgICAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyMi5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBjbGllbnQyRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVBbmRTdGFydENsaWVudCgpOworICAgICAgZmluYWwgRmlsZSBsZWVjaERlc3REaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gdGhyb3duRXhjZXB0aW9uID0gbmV3IEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+KCk7CisgICAgICBmaW5hbCBUaHJlYWQgdGggPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBsZWVjaERlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDEwKTsKKyAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9uLnNldChlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICB0aC5zdGFydCgpOworICAgICAgZmluYWwgV2FpdEZvciB3YWl0Rm9yID0gbmV3IFdhaXRGb3IoMzAgKiAxMDAwKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgcmV0dXJuIHRoLmdldFN0YXRlKCkgPT0gVGhyZWFkLlN0YXRlLlRFUk1JTkFURUQ7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGZpbmFsIE1hcDxUaHJlYWQsIFN0YWNrVHJhY2VFbGVtZW50W10+IGFsbFN0YWNrVHJhY2VzID0gVGhyZWFkLmdldEFsbFN0YWNrVHJhY2VzKCk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxUaHJlYWQsIFN0YWNrVHJhY2VFbGVtZW50W10+IGVudHJ5IDogYWxsU3RhY2tUcmFjZXMuZW50cnlTZXQoKSkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJXM6JW4iLCBlbnRyeS5nZXRLZXkoKS5nZXROYW1lKCkpOworICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW0gOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGVsZW0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXNzZXJ0VHJ1ZSh3YWl0Rm9yLmlzTXlSZXN1bHQoKSk7CisgICAgICBhc3NlcnROb3ROdWxsKHRocm93bkV4Y2VwdGlvbi5nZXQoKSk7CisgICAgICBhc3NlcnRUcnVlKHRocm93bkV4Y2VwdGlvbi5nZXQoKS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlVuYWJsZSB0byBkb3dubG9hZCIpKTsKKworICAgIH0gZmluYWxseSB7CisgICAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyIDogY2xpZW50c0xpc3QpIHsKKyAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHVubG9ja19maWxlX3doZW5fbm9fbGVlY2hlcnMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDcpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIGRvd25sb2FkQW5kU3RvcCh0b3JyZW50LCAxNSAqIDEwMDAsIGNyZWF0ZUNsaWVudCgpKTsKKyAgICBUaHJlYWQuc2xlZXAoMiAqIDEwMDApOworICAgIGFzc2VydFRydWUoZHdubEZpbGUuZXhpc3RzKCkgJiYgZHdubEZpbGUuaXNGaWxlKCkpOworICAgIGZpbmFsIGJvb2xlYW4gZGVsZXRlID0gZHdubEZpbGUuZGVsZXRlKCk7CisgICAgYXNzZXJ0VHJ1ZShkZWxldGUgJiYgIWR3bmxGaWxlLmV4aXN0cygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkX21hbnlfdGltZXMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDcpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICBkb3dubG9hZEFuZFN0b3AodG9ycmVudCwgMjUwICogMTAwMCwgY3JlYXRlQ2xpZW50KCkpOworICAgICAgVGhyZWFkLnNsZWVwKDMgKiAxMDAwKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdFRvQWxsRGlzY292ZXJlZFBlZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg4KTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXhlY3V0b3JTZXJ2aWNlLCB2YWxpZGF0b3JFUykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bk5vdygpOworICAgICAgfQorICAgIH07CisgICAgbGVlY2hlci5zZXRNYXhJbkNvbm5lY3Rpb25zQ291bnQoMTApOworICAgIGxlZWNoZXIuc2V0TWF4T3V0Q29ubmVjdGlvbnNDb3VudCgxMCk7CisKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiAzNCk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgZmluYWwgU3RyaW5nIGhleEluZm9IYXNoID0gbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpKS5nZXRIZXhJbmZvSGFzaCgpOworICAgIGZpbmFsIExpc3Q8U2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXRzID0gbmV3IEFycmF5TGlzdDxTZXJ2ZXJTb2NrZXQ+KCk7CisKKyAgICBmaW5hbCBpbnQgc3RhcnRQb3J0ID0gNjg4NTsKKyAgICBpbnQgcG9ydCA9IHN0YXJ0UG9ydDsKKyAgICBQZWVyVUlEW10gcGVlclVpZHMgPSBuZXcgUGVlclVJRFtdeworICAgICAgICAgICAgbmV3IFBlZXJVSUQobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCBwb3J0KyspLCBoZXhJbmZvSGFzaCksCisgICAgICAgICAgICBuZXcgUGVlclVJRChuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIHBvcnQrKyksIGhleEluZm9IYXNoKSwKKyAgICAgICAgICAgIG5ldyBQZWVyVUlEKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgcG9ydCksIGhleEluZm9IYXNoKQorICAgIH07CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgdHJ5IHsKKyAgICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICBXYWl0Rm9yIHdhaXRGb3IgPSBuZXcgV2FpdEZvcig1MDAwKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgICAgcmV0dXJuIHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQoaGV4SW5mb0hhc2gpICE9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIGFzc2VydFRydWUod2FpdEZvci5pc015UmVzdWx0KCkpOworCisgICAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA9IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQoaGV4SW5mb0hhc2gpOworICAgICAgTWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPiB0cmFja2VkUGVlck1hcCA9IG5ldyBIYXNoTWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPigpOworCisgICAgICBwb3J0ID0gc3RhcnRQb3J0OworICAgICAgZm9yIChQZWVyVUlEIHVpZCA6IHBlZXJVaWRzKSB7CisgICAgICAgIHRyYWNrZWRQZWVyTWFwLnB1dCh1aWQsIG5ldyBUcmFja2VkUGVlcih0cmFja2VkVG9ycmVudCwgIjEyNy4wLjAuMSIsIHBvcnQsIEJ5dGVCdWZmZXIud3JhcCgiaWQiLmdldEJ5dGVzKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSkpKTsKKyAgICAgICAgc2VydmVyU29ja2V0cy5hZGQobmV3IFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgICAgIHBvcnQrKzsKKyAgICAgIH0KKworICAgICAgdHJhY2tlZFRvcnJlbnQuZ2V0UGVlcnMoKS5wdXRBbGwodHJhY2tlZFBlZXJNYXApOworCisgICAgICAvL3dhaXQgdW50aWwgYWxsIHNlcnZlciBzb2NrZXRzIGFjY2VwdCBjb25uZWN0aW9uIGZyb20gbGVlY2hlcgorICAgICAgZm9yIChmaW5hbCBTZXJ2ZXJTb2NrZXQgc3MgOiBzZXJ2ZXJTb2NrZXRzKSB7CisgICAgICAgIGZpbmFsIEZ1dHVyZTw/PiBmdXR1cmUgPSBlcy5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZpbmFsIFNvY2tldCBzb2NrZXQgPSBzcy5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4gbm90IGFjY2VwdCBjb25uZWN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmdXR1cmUuZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKCJnZXQgZXhlY3V0aW9uIGV4Y2VwdGlvbiBvbiBhY2NlcHQgY29ubmVjdGlvbiIsIGUpOworICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKCJub3QgcmVjZWl2ZWQgY29ubmVjdGlvbiBmcm9tIGxlZWNoZXIgaW4gc3BlY2lmaWVkIHRpbWVvdXQiLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGZvciAoU2VydmVyU29ja2V0IHNzIDogc2VydmVyU29ja2V0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgIHNzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKCJjYW4gbm90IGNsb3NlIHNlcnZlciBzb2NrZXQiLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZXMuc2h1dGRvd24oKTsKKyAgICAgIGxlZWNoZXIuc3RvcCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkX2lvX2Vycm9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiAzNCk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworCisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgZmluYWwgQXRvbWljSW50ZWdlciBpbnRlcnJ1cHRzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChERUZBVUxUX1BPT0xfU0laRSk7CisgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHZhbGlkYXRvckVTID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCg0KTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihlcywgdmFsaWRhdG9yRVMpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VDb21wbGV0ZWQoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmhhbmRsZVBpZWNlQ29tcGxldGVkKHBlZXIsIHBpZWNlKTsKKyAgICAgICAgaWYgKHBpZWNlLmdldEluZGV4KCkgJSA0ID09IDAgJiYgaW50ZXJydXB0cy5pbmNyZW1lbnRBbmRHZXQoKSA8PSAyKSB7CisgICAgICAgICAgcGVlci51bmJpbmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdG9wKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBzdXBlci5zdG9wKHRpbWVvdXQsIHRpbWVVbml0KTsKKyAgICAgICAgZXMuc2h1dGRvd24oKTsKKyAgICAgICAgdmFsaWRhdG9yRVMuc2h1dGRvd24oKTsKKyAgICAgIH0KKyAgICB9OworICAgIC8vbWFudWFsbHkgYWRkIGxlZWNoIGhlcmUgZm9yIGdyYWNlZnVsIHNodXRkb3duLgorICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQobGVlY2gpOworICAgIGRvd25sb2FkQW5kU3RvcCh0b3JyZW50LCA0NSAqIDEwMDAsIGxlZWNoKTsKKyAgICBUaHJlYWQuc2xlZXAoMiAqIDEwMDApOworICB9CisKKyAgcHVibGljIHZvaWQgZG93bmxvYWRfdW5pbnRlcnJ1cHRpYmx5X3Bvc2l0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCAxMCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkb3dubG9hZF91bmludGVycnVwdGlibHlfbmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGRvd25sb2FkZWRQaWVjZXNDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworCisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKERFRkFVTFRfUE9PTF9TSVpFKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoZXMsIHZhbGlkYXRvckVTKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHN0b3AoaW50IHRpbWVvdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIHN1cGVyLnN0b3AodGltZW91dCwgdGltZVVuaXQpOworICAgICAgICBlcy5zaHV0ZG93bigpOworICAgICAgICB2YWxpZGF0b3JFUy5zaHV0ZG93bigpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5oYW5kbGVQaWVjZUNvbXBsZXRlZChwZWVyLCBwaWVjZSk7CisgICAgICAgIGlmIChkb3dubG9hZGVkUGllY2VzQ291bnQuaW5jcmVtZW50QW5kR2V0KCkgPiAxMCkgeworICAgICAgICAgIHNlZWRlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQobGVlY2hlcik7CisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgZmluYWwgRmlsZSBkZXN0RGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdHJ5IHsKKyAgICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCA3KTsKKyAgICAgIGZhaWwoIk11c3QgZmFpbCwgYmVjYXVzZSBmaWxlIHdhc24ndCBkb3dubG9hZGVkIGNvbXBsZXRlbHkiKTsKKyAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisKKyAgICAgIExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCA9IGxlZWNoZXIuZ2V0VG9ycmVudHNTdG9yYWdlKCkuZ2V0TG9hZGVkVG9ycmVudCh0b3JyZW50TWFuYWdlci5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIGxvYWRlZFRvcnJlbnQuZ2V0UGllY2VTdG9yYWdlKCkuY2xvc2UoKTsKKworICAgICAgLy8gZGVsZXRlIC5wYXJ0IGZpbGUKKyAgICAgIEZpbGVbXSBkZXN0RGlyRmlsZXMgPSBkZXN0RGlyLmxpc3RGaWxlcygpOworICAgICAgYXNzZXJ0Tm90TnVsbChkZXN0RGlyRmlsZXMpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRlc3REaXJGaWxlcy5sZW5ndGgpOworICAgICAgRmlsZSB0YXJnZXRGaWxlID0gZGVzdERpckZpbGVzWzBdOworICAgICAgaWYgKCF0YXJnZXRGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgIGZhaWwoIlVuYWJsZSB0byByZW1vdmUgZmlsZSAiICsgdGFyZ2V0RmlsZSk7CisgICAgICB9CisgICAgICAvLyBlbnN1cmUgLnBhcnQgd2FzIGRlbGV0ZWQ6CisgICAgICBkZXN0RGlyRmlsZXMgPSBkZXN0RGlyLmxpc3RGaWxlcygpOworICAgICAgYXNzZXJ0Tm90TnVsbChkZXN0RGlyRmlsZXMpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlc3REaXJGaWxlcy5sZW5ndGgpOworICAgIH0KKworICB9CisKKyAgcHVibGljIHZvaWQgZG93bmxvYWRfdW5pbnRlcnJ1cHRpYmx5X3RpbWVvdXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiAyNCk7CisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoZHdubEZpbGUsIG51bGwsIHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgIlRlc3QiKTsKKworICAgIGZpbmFsIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZHdubEZpbGUuZ2V0UGFyZW50KCkpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgcGllY2VzRG93bmxvYWRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBlcyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woREVGQVVMVF9QT09MX1NJWkUpOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSB2YWxpZGF0b3JFUyA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woNCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IG5ldyBDb21tdW5pY2F0aW9uTWFuYWdlcihlcywgdmFsaWRhdG9yRVMpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VDb21wbGV0ZWQoU2hhcmluZ1BlZXIgcGVlciwgUGllY2UgcGllY2UpIHsKKyAgICAgICAgcGllY2VzRG93bmxvYWRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBUaHJlYWQuc2xlZXAocGllY2VzRG93bmxvYWRlZC5nZXQoKSAqIDUwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKKworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgc3VwZXIuc3RvcCh0aW1lb3V0LCB0aW1lVW5pdCk7CisgICAgICAgIGVzLnNodXRkb3duKCk7CisgICAgICAgIHZhbGlkYXRvckVTLnNodXRkb3duKCk7CisgICAgICB9CisgICAgfTsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuYWRkKGxlZWNoZXIpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHRyeSB7CisgICAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgNyk7CisgICAgICBmYWlsKCJNdXN0IGZhaWwsIGJlY2F1c2UgZmlsZSB3YXNuJ3QgZG93bmxvYWRlZCBjb21wbGV0ZWx5Iik7CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgY2FuU3RhcnRBbmRTdG9wQ2xpZW50VHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKERFRkFVTFRfUE9PTF9TSVpFKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgdmFsaWRhdG9yRVMgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDQpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gbmV3IENvbW11bmljYXRpb25NYW5hZ2VyKGVzLCB2YWxpZGF0b3JFUyk7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChjb21tdW5pY2F0aW9uTWFuYWdlcik7CisgICAgdHJ5IHsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0b3AoKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0b3AoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZXMuc2h1dGRvd24oKTsKKyAgICAgIHZhbGlkYXRvckVTLnNodXRkb3duKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgcGVlcl9kaWVzX2R1cmluZ19kb3dubG9hZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkMSA9IGNyZWF0ZUNsaWVudCgpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWQyID0gY3JlYXRlQ2xpZW50KCk7CisKKyAgICBmaW5hbCBGaWxlIGR3bmxGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDUxMyAqIDEwMjQgKiAyNDApOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisKKyAgICBmaW5hbCBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIHNlZWQxLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpKTsKKyAgICBzZWVkMS5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgc2VlZDEuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICBzZWVkMi5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgc2VlZDIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWQyLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2hlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgbGVlY2hlci5zZXRBbm5vdW5jZUludGVydmFsKDUpOworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBzZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKTsKKyAgICBmaW5hbCBGdXR1cmU8Pz4gZnV0dXJlID0gc2VydmljZS5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVGhyZWFkLnNsZWVwKDUgKiAxMDAwKTsKKyAgICAgICAgICBzZWVkMS5yZW1vdmVUb3JyZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICAgICAgVGhyZWFkLnNsZWVwKDMgKiAxMDAwKTsKKyAgICAgICAgICBzZWVkMS5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgc2VlZDIucmVtb3ZlVG9ycmVudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKyAgICB0cnkgeworICAgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDYwKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZnV0dXJlLmNhbmNlbCh0cnVlKTsKKyAgICAgIHNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0b3JyZW50TGlzdGVuZXJzUG9zaXRpdmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQgKyAxKTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgcGllY2VMb2FkZWRJbnZvY2F0aW9uQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY29ubmVjdGVkSW52b2NhdGlvbkNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBTZW1hcGhvcmUgZGlzY29ubmVjdGVkTG9jayA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIGZpbmFsIEF0b21pY0xvbmcgdG90YWxEb3dubG9hZGVkID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICB0b3JyZW50TWFuYWdlci5hZGRMaXN0ZW5lcihuZXcgVG9ycmVudExpc3RlbmVyV3JhcHBlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcGllY2VEb3dubG9hZGVkKFBpZWNlSW5mb3JtYXRpb24gcGllY2VJbmZvcm1hdGlvbiwgUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworICAgICAgICB0b3RhbERvd25sb2FkZWQuYWRkQW5kR2V0KHBpZWNlSW5mb3JtYXRpb24uZ2V0U2l6ZSgpKTsKKyAgICAgICAgcGllY2VMb2FkZWRJbnZvY2F0aW9uQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcGVlckNvbm5lY3RlZChQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIGNvbm5lY3RlZEludm9jYXRpb25Db3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwZWVyRGlzY29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgZGlzY29ubmVjdGVkTG9jay5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfSk7CisgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDUpOworICAgIGFzc2VydEVxdWFscyhwaWVjZUxvYWRlZEludm9jYXRpb25Db3VudC5nZXQoKSwgdG9ycmVudC5nZXRQaWVjZXNDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoY29ubmVjdGVkSW52b2NhdGlvbkNvdW50LmdldCgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHModG90YWxEb3dubG9hZGVkLmdldCgpLCBkd25sRmlsZS5sZW5ndGgoKSk7CisgICAgaWYgKCFkaXNjb25uZWN0ZWRMb2NrLnRyeUFjcXVpcmUoMTAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICBmYWlsKCJjb25uZWN0aW9uIHdpdGggc2VlZGVyIG11c3QgYmUgY2xvc2VkIGFmdGVyIGRvd25sb2FkIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsb3NpbmdQaWVjZVN0b3JhZ2VXaGVuRG93bmxvYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUFuZFN0YXJ0Q2xpZW50KCk7CisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQpOworICAgIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGR3bmxGaWxlLCBudWxsLCB0cmFja2VyLmdldEFubm91bmNlVVJJKCksICJUZXN0Iik7CisgICAgZmluYWwgUGllY2VTdG9yYWdlIHNlZWRlclN0b3JhZ2UgPSBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZSh0b3JyZW50LCBuZXcgRmlsZVN0b3JhZ2UoZHdubEZpbGUsIDAsIGR3bmxGaWxlLmxlbmd0aCgpKSk7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQobmV3IFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyKCkgeworICAgICAgQE5vdE51bGwKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBnZXRUb3JyZW50TWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiB0b3JyZW50OworICAgICAgfQorICAgIH0sIHNlZWRlclN0b3JhZ2UpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUFuZFN0YXJ0Q2xpZW50KCk7CisKKyAgICBmaW5hbCBQaWVjZVN0b3JhZ2UgbGVlY2hlclN0b3JhZ2UgPSBFbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZSh0b3JyZW50LCBuZXcgRmlsZVN0b3JhZ2UodGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCksIDAsIGR3bmxGaWxlLmxlbmd0aCgpKSk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQobmV3IFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyKCkgeworICAgICAgQE5vdE51bGwKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBnZXRUb3JyZW50TWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiB0b3JyZW50OworICAgICAgfQorICAgIH0sIGxlZWNoZXJTdG9yYWdlKTsKKworICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxUaHJvd2FibGU+IGV4Y2VwdGlvbkhvbGRlciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8VGhyb3dhYmxlPigpOworICAgIHRvcnJlbnRNYW5hZ2VyLmFkZExpc3RlbmVyKG5ldyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBwaWVjZURvd25sb2FkZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VlZGVyU3RvcmFnZS5jbG9zZSgpOworICAgICAgICAgIGxlZWNoZXJTdG9yYWdlLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBleGNlcHRpb25Ib2xkZXIuc2V0KGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgMTApOworICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBleGNlcHRpb25Ib2xkZXIuZ2V0KCk7CisgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICBmYWlsKCIiLCB0aHJvd2FibGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcnNXaXRoQmFkU2VlZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdHJhY2tlci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHModHJ1ZSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgZmluYWwgRmlsZSBkd25sRmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSg1MTMgKiAxMDI0ICogMjQwKTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZHdubEZpbGUsICJydyIpOworICAgIC8vY2hhbmdpbmcgb25lIGJ5dGUgaW4gZmlsZS4gU28gb25lIHBpZWNlCisgICAgdHJ5IHsKKyAgICAgIGxvbmcgcG9zID0gZHdubEZpbGUubGVuZ3RoKCkgLyAyOworICAgICAgcmFmLnNlZWsocG9zKTsKKyAgICAgIGludCBvbGRCeXRlID0gcmFmLnJlYWQoKTsKKyAgICAgIHJhZi5zZWVrKHBvcyk7CisgICAgICByYWYud3JpdGUob2xkQnl0ZSArIDEpOworICAgIH0gZmluYWxseSB7CisgICAgICByYWYuY2xvc2UoKTsKKyAgICB9CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGR3bmxGaWxlLmdldFBhcmVudCgpLCBGdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICBsZWVjaGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHBpZWNlTG9hZGVkSW52b2NhdGlvbkNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgdG9ycmVudE1hbmFnZXIuYWRkTGlzdGVuZXIobmV3IFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBpZWNlRG93bmxvYWRlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgcGllY2VMb2FkZWRJbnZvY2F0aW9uQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICB9CisgICAgfSk7CisgICAgdHJ5IHsKKyAgICAgIHdhaXREb3dubG9hZENvbXBsZXRlKHRvcnJlbnRNYW5hZ2VyLCAxNSk7CisgICAgICBmYWlsKCJEb3dubG9hZGluZyBtdXN0IGJlIGZhaWxlZCBiZWNhdXNlIHNlZWRlciBkb2Vzbid0IGhhdmUgdmFsaWQgcGllY2UiKTsKKyAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKHBpZWNlTG9hZGVkSW52b2NhdGlvbkNvdW50LmdldCgpLCB0b3JyZW50LmdldFBpZWNlc0NvdW50KCkgLSAxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGludGVycnVwdF9kb3dubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIHNlZWRlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGZpbmFsIEZpbGUgZHdubEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoNTEzICogMTAyNCAqIDYwKTsKKyAgICBmaW5hbCBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShkd25sRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgZmluYWwgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkd25sRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2hlciA9IGNyZWF0ZUNsaWVudCgpOworICAgIGxlZWNoZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gaW50ZXJydXB0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgIGZpbmFsIFRocmVhZCB0aCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBUb3JyZW50TWFuYWdlciB0b3JyZW50TWFuYWdlciA9IGxlZWNoZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgd2FpdERvd25sb2FkQ29tcGxldGUodG9ycmVudE1hbmFnZXIsIDMwKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24gZSkgeworICAgICAgICAgIGludGVycnVwdGVkLnNldCh0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpbnRlcnJ1cHRlZC5zZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIHRoLnN0YXJ0KCk7CisgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgdGguaW50ZXJydXB0KCk7CisgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICF0aC5pc0FsaXZlKCk7CisgICAgICB9CisgICAgfTsKKworICAgIGFzc2VydFRydWUoaW50ZXJydXB0ZWQuZ2V0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9jb25uZWN0X3RvX3Vua25vd25faG9zdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZpbmFsIEZpbGUgdG9ycmVudCA9IG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0dCA9IFRyYWNrZWRUb3JyZW50LmxvYWQodG9ycmVudCk7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQW5kU3RhcnRDbGllbnQoKTsKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQW5kU3RhcnRDbGllbnQoKTsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCBhbm5vdW5jZSA9IHRyYWNrZXIuYW5ub3VuY2UodHQpOworICAgIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgZmluYWwgRmlsZSBsZWVjaEZvbGRlciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyBpKyspIHsKKyAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMjBdOworICAgICAgcmFuZG9tLm5leHRCeXRlcyhkYXRhKTsKKyAgICAgIGFubm91bmNlLmFkZFBlZXIobmV3IFRyYWNrZWRQZWVyKHR0LCAibXlfdW5rbm93bl9hbmRfdW5yZWFjaGFibGVob3N0IiArIGksIDY4ODEsIEJ5dGVCdWZmZXIud3JhcChkYXRhKSkpOworICAgIH0KKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgbGVlY2hlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBsZWVjaEZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgd2FpdEZvckZpbGVJbkRpcihsZWVjaEZvbGRlciwgImZpbGUxLmphciIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9zZWVkaW5nX2RvZXNfbm90X2NoYW5nZV9maWxlX21vZGlmaWNhdGlvbl9kYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgRmlsZSBzcmNGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDEwMjQpOworICAgIGxvbmcgdGltZSA9IHNyY0ZpbGUubGFzdE1vZGlmaWVkKCk7CisKKyAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVBbmRTdGFydENsaWVudCgpOworCisgICAgZmluYWwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnQgPSBUb3JyZW50Q3JlYXRvci5jcmVhdGUoc3JjRmlsZSwgbnVsbCwgdHJhY2tlci5nZXRBbm5vdW5jZVVSSSgpLCAiVGVzdCIpOworCisgICAgRmlsZSB0b3JyZW50RmlsZSA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgpOworICAgIHNhdmVUb3JyZW50KHRvcnJlbnQsIHRvcnJlbnRGaWxlKTsKKyAgICBzZWVkZXIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgc3JjRmlsZS5nZXRQYXJlbnQoKSwgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKworICAgIGZpbmFsIEZpbGUgZG93bmxvYWREaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgbGVlY2guc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgc3JjRmlsZS5nZXROYW1lKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKHRpbWUsIHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkQW5kU3RvcChUb3JyZW50TWV0YWRhdGEgdG9ycmVudCwgbG9uZyB0aW1lb3V0LCBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlIHRlbXBEaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgbGVlY2guc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgd2FpdEZvckZpbGVJbkRpcih0ZW1wRGlyLCB0b3JyZW50LmdldEZpbGVzKCkuZ2V0KDApLmdldFJlbGF0aXZlUGF0aEFzU3RyaW5nKCkpOworCisgICAgbGVlY2guc3RvcCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTXVsdGlwbGVDbGllbnRzUmVzdWx0cyhmaW5hbCBMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPiBjbGllbnRzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlnZXN0IG1kNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGJhc2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTUQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RmlsZT4gdGFyZ2V0RmlsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBXYWl0Rm9yIHdhaXRGb3IgPSBuZXcgV2FpdEZvcig3NSAqIDEwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICBib29sZWFuIHJldHZhbCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpZW50c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBpZiAoIXJldHZhbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIEZpbGUgdGFyZ2V0ID0gdGFyZ2V0RmlsZXMuZ2V0KGkpOworICAgICAgICAgIHJldHZhbCA9IHRhcmdldC5pc0ZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKHdhaXRGb3IuaXNNeVJlc3VsdCgpLCAiQWxsIHNlZWRlcnMgZGlkbid0IGdldCB0aGVpciBmaWxlcyIpOworICAgIC8vIGNoZWNrIGZpbGUgY29udGVudHMgaGVyZToKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICBmaW5hbCBMb2FkZWRUb3JyZW50IHRvcnJlbnQgPSBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QuZ2V0KGkpLmdldFRvcnJlbnRzU3RvcmFnZSgpLmdldExvYWRlZFRvcnJlbnQoaGFzaCk7CisgICAgICBmaW5hbCBGaWxlIGZpbGUgPSB0YXJnZXRGaWxlcy5nZXQoaSk7CisgICAgICBhc3NlcnRFcXVhbHMoYmFzZU1ENSwgZ2V0RmlsZU1ENShmaWxlLCBtZDUpLCBTdHJpbmcuZm9ybWF0KCJNRDUgaGFzaCBpcyBpbnZhbGlkLiBDOiVzLCBPOiVzICIsCisgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGJhc2VGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1hbnlTZWVkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZSBhcnRpZmFjdCA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRmlsZSgyNTYgKiAxMDI0ICogMTAyNCk7CisgICAgaW50IHNlZWRlcnNDb3VudCA9IDE1OworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKGFydGlmYWN0LCB0aGlzLnRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKSwgInRlc3QiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgc2F2ZVRvcnJlbnQodG9ycmVudCwgdG9ycmVudEZpbGUpOworICAgIFNlcnZlckNoYW5uZWxSZWdpc3RlciBzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIgPSBuZXcgRmlyc3RBdmFpbGFibGVDaGFubmVsKDY4ODEsIDEwMDAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZWRlcnNDb3VudDsgaSsrKSB7CisgICAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDbGllbnQoKTsKKyAgICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBhcnRpZmFjdC5nZXRQYXJlbnQoKSwgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKyAgICAgIHNlZWRlci5zdGFydChuZXcgSW5ldEFkZHJlc3NbXXtJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKX0sCisgICAgICAgICAgICAgIENvbnN0YW50cy5ERUZBVUxUX0FOTk9VTkNFX0lOVEVSVkFMX1NFQywKKyAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgbmV3IFNlbGVjdG9yRmFjdG9yeUltcGwoKSwKKyAgICAgICAgICAgICAgc2VydmVyQ2hhbm5lbFJlZ2lzdGVyKTsKKyAgICB9CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaGVyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgbGVlY2hlci5zdGFydChuZXcgSW5ldEFkZHJlc3NbXXtJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKX0sCisgICAgICAgICAgICBDb25zdGFudHMuREVGQVVMVF9BTk5PVU5DRV9JTlRFUlZBTF9TRUMsCisgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgbmV3IFNlbGVjdG9yRmFjdG9yeUltcGwoKSwKKyAgICAgICAgICAgIHNlcnZlckNoYW5uZWxSZWdpc3Rlcik7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBsZWVjaGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5LklOU1RBTkNFKTsKKyAgICB3YWl0RG93bmxvYWRDb21wbGV0ZSh0b3JyZW50TWFuYWdlciwgNjApOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTXVsdGlwbGVTZWVkZXJzV2l0aERpZmZlcmVudFBpZWNlcyhGaWxlIGJhc2VGaWxlLCBpbnQgcGllY2VzQ291bnQsIGludCBwaWVjZVNpemUsIGludCBudW1TZWVkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29tbXVuaWNhdGlvbk1hbmFnZXI+IGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdCwgTGlzdDxGaWxlPiB0YXJnZXRGaWxlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKworICAgIExpc3Q8Ynl0ZVtdPiBwaWVjZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxieXRlW10+KHBpZWNlc0NvdW50KTsKKyAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShiYXNlRmlsZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWVjZXNDb3VudDsgaSsrKSB7CisgICAgICBieXRlW10gcGllY2UgPSBuZXcgYnl0ZVtwaWVjZVNpemVdOworICAgICAgZmluLnJlYWQocGllY2UpOworICAgICAgcGllY2VzTGlzdC5hZGQocGllY2UpOworICAgIH0KKyAgICBmaW4uY2xvc2UoKTsKKworICAgIGZpbmFsIGxvbmcgdG9ycmVudEZpbGVMZW5ndGggPSBiYXNlRmlsZS5sZW5ndGgoKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZShiYXNlRmlsZSwgbnVsbCwgdGhpcy50cmFja2VyLmdldEFubm91bmNlVVJJKCksIG51bGwsICJUZXN0IiwgcGllY2VTaXplKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoYmFzZUZpbGUuZ2V0UGFyZW50RmlsZSgpLCBiYXNlRmlsZS5nZXROYW1lKCkgKyAiLnRvcnJlbnQiKTsKKyAgICBzYXZlVG9ycmVudCh0b3JyZW50LCB0b3JyZW50RmlsZSk7CisKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2VlZGVyczsgaSsrKSB7CisgICAgICBmaW5hbCBGaWxlIGJhc2VEaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgICAgdGFyZ2V0RmlsZXMuYWRkKG5ldyBGaWxlKGJhc2VEaXIsIGJhc2VGaWxlLmdldE5hbWUoKSkpOworICAgICAgZmluYWwgRmlsZSBzZWVkZXJQaWVjZXNGaWxlID0gbmV3IEZpbGUoYmFzZURpciwgYmFzZUZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoc2VlZGVyUGllY2VzRmlsZSwgInJ3Iik7CisgICAgICByYWYuc2V0TGVuZ3RoKHRvcnJlbnRGaWxlTGVuZ3RoKTsKKyAgICAgIGZvciAoaW50IHBpZWNlSWR4ID0gaTsgcGllY2VJZHggPCBwaWVjZXNDb3VudDsgcGllY2VJZHggKz0gbnVtU2VlZGVycykgeworICAgICAgICByYWYuc2VlayhwaWVjZUlkeCAqIHBpZWNlU2l6ZSk7CisgICAgICAgIHJhZi53cml0ZShwaWVjZXNMaXN0LmdldChwaWVjZUlkeCkpOworICAgICAgfQorICAgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgPSBjcmVhdGVDbGllbnQoIiBjb21tdW5pY2F0aW9uTWFuYWdlciBpZHggIiArIGkpOworICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChjb21tdW5pY2F0aW9uTWFuYWdlcik7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldEZpbGVNRDUoRmlsZSBmaWxlLCBNZXNzYWdlRGlnZXN0IGRpZ2VzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBEaWdlc3RJbnB1dFN0cmVhbSBkSW4gPSBuZXcgRGlnZXN0SW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgZGlnZXN0KTsKKyAgICB3aGlsZSAoZEluLnJlYWQoKSA+PSAwKSA7CisgICAgcmV0dXJuIGRJbi5nZXRNZXNzYWdlRGlnZXN0KCkudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3YWl0Rm9yRmlsZUluRGlyKGZpbmFsIEZpbGUgZG93bmxvYWREaXIsIGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgeworICAgIG5ldyBXYWl0Rm9yKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkb3dubG9hZERpciwgZmlsZU5hbWUpLmlzRmlsZSgpOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGRvd25sb2FkRGlyLCBmaWxlTmFtZSkuaXNGaWxlKCkpOworICB9CisKKworICBAQWZ0ZXJNZXRob2QKKyAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyIDogY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0KSB7CisgICAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdG9wKCk7CisgICAgfQorICAgIHN0b3BUcmFja2VyKCk7CisgICAgdGVtcEZpbGVzLmNsZWFudXAoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFRyYWNrZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGludCBwb3J0ID0gNjk2OTsKKyAgICB0aGlzLnRyYWNrZXIgPSBuZXcgVHJhY2tlcihwb3J0LCAiaHR0cDovLyIgKyBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpICsgIjoiICsgcG9ydCArICIiICsgQU5OT1VOQ0VfVVJMKTsKKyAgICB0cmFja2VyLnNldEFubm91bmNlSW50ZXJ2YWwoNSk7CisgICAgdGhpcy50cmFja2VyLnN0YXJ0KHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBDb21tdW5pY2F0aW9uTWFuYWdlciBjcmVhdGVBbmRTdGFydENsaWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gY3JlYXRlQ2xpZW50KCk7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIHJldHVybiBjb21tdW5pY2F0aW9uTWFuYWdlcjsKKyAgfQorCisgIHByaXZhdGUgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY3JlYXRlQ2xpZW50KFN0cmluZyBuYW1lKSB7CisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgPSBjb21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkuZ2V0Q2xpZW50KG5hbWUpOworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdC5hZGQoY29tbXVuaWNhdGlvbk1hbmFnZXIpOworICAgIHJldHVybiBjb21tdW5pY2F0aW9uTWFuYWdlcjsKKyAgfQorCisgIHByaXZhdGUgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY3JlYXRlQ2xpZW50KCkgeworICAgIHJldHVybiBjcmVhdGVDbGllbnQoIiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN0b3BUcmFja2VyKCkgeworICAgIHRoaXMudHJhY2tlci5zdG9wKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RmlsZXNFcXVhbChGaWxlIGYxLCBGaWxlIGYyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhmMS5sZW5ndGgoKSwgZjIubGVuZ3RoKCksICJGaWxlcyBzaXplcyBkaWZmZXIiKTsKKyAgICBDaGVja3N1bSBjMSA9IEZpbGVVdGlscy5jaGVja3N1bShmMSwgbmV3IENSQzMyKCkpOworICAgIENoZWNrc3VtIGMyID0gRmlsZVV0aWxzLmNoZWNrc3VtKGYyLCBuZXcgQ1JDMzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGMxLmdldFZhbHVlKCksIGMyLmdldFZhbHVlKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudFRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9UcmFja2VyQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTViNTkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5VdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVyczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgVHJhY2tlckNsaWVudFRlc3QgeworCisgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworCisgIHB1YmxpYyBUcmFja2VyQ2xpZW50VGVzdCgpIHsKKyAgICBpZiAoTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5nZXRBbGxBcHBlbmRlcnMoKS5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgIHJldHVybjsKKyAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUobmV3IENvbnNvbGVBcHBlbmRlcihuZXcgUGF0dGVybkxheW91dCgiWyVke01NZGQgSEg6bW06c3MsU1NTfV0gJTZwIC0gJTIwLjIwYyAtICVtICVuIikpKTsKKyAgICBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnNldExldmVsKFV0aWxzLmdldExvZ0xldmVsKCkpOworICB9CisKKyAgQEJlZm9yZU1ldGhvZAorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHN0YXJ0VHJhY2tlcigpOworICB9CisKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBtdWx0aUFubm91bmNlVGVzdCgpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiB7CisgICAgTGlzdDxQZWVyPiBwZWVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFBlZXIobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCA2ODgxKSwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKSkpOworICAgIGZpbmFsIFVSSSB0cmFja2VyVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo2OTY5L2Fubm91bmNlIik7CisgICAgVHJhY2tlckNsaWVudCBjbGllbnQgPSBuZXcgSFRUUFRyYWNrZXJDbGllbnQocGVlcnMsIHRyYWNrZXJVUkkpOworCisgICAgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gZmlyc3RUb3JyZW50ID0gZ2V0TW9ja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDIsIDMsIDR9KTsKKyAgICBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBzZWNvbmRUb3JyZW50ID0gZ2V0TW9ja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDMsIDMsIDJ9KTsKKyAgICBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiB0b3JyZW50cyA9IEFycmF5cy5hc0xpc3QoZmlyc3RUb3JyZW50LCBzZWNvbmRUb3JyZW50KTsKKworICAgIGNsaWVudC5tdWx0aUFubm91bmNlKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50LlNUQVJURUQsIHRydWUsIHRvcnJlbnRzLCBwZWVycyk7CisKKyAgICBwZWVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFBlZXIobmV3IEluZXRTb2NrZXRBZGRyZXNzKCIxMjcuMC4wLjEiLCA2ODgyKSwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKSkpOworICAgIGNsaWVudC5tdWx0aUFubm91bmNlKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50LlNUQVJURUQsIHRydWUsIHRvcnJlbnRzLCBwZWVycyk7CisKKyAgICBMaXN0PFBlZXI+IGxlZWNoZXIgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBQZWVyKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgNjg4NSksIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSkpKTsKKyAgICBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBmaXJzdFRvcnJlbnRMZWVjaCA9IGdldE1vY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSk7CisgICAgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gc2Vjb25kVG9ycmVudExlZWNoID0gZ2V0TW9ja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDMsIDMsIDJ9KTsKKyAgICB3aGVuKGZpcnN0VG9ycmVudExlZWNoLmdldExlZnQoKSkudGhlblJldHVybigxMEwpOworICAgIHdoZW4oc2Vjb25kVG9ycmVudExlZWNoLmdldExlZnQoKSkudGhlblJldHVybigxMEwpOworCisgICAgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGxpc3RlbmVyID0gbW9jayhBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIuY2xhc3MpOworCisgICAgY2xpZW50LnJlZ2lzdGVyKGxpc3RlbmVyKTsKKyAgICBjbGllbnQubXVsdGlBbm5vdW5jZShBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5TVEFSVEVELCBmYWxzZSwKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3Qoc2Vjb25kVG9ycmVudExlZWNoLCBmaXJzdFRvcnJlbnRMZWVjaCksIGxlZWNoZXIpOworCisgICAgdmVyaWZ5KGxpc3RlbmVyLCB0aW1lcygyKSkuaGFuZGxlQW5ub3VuY2VSZXNwb25zZShhbnlJbnQoKSwgYW55SW50KCksIGFueUludCgpLCBhbnlTdHJpbmcoKSk7CisgICAgdmVyaWZ5KGxpc3RlbmVyLCB0aW1lcygyKSkuaGFuZGxlRGlzY292ZXJlZFBlZXJzKEFyZ3VtZW50TWF0Y2hlcnMuPFBlZXI+YW55TGlzdCgpLCBhbnlTdHJpbmcoKSk7CisKKyAgfQorCisgIHByaXZhdGUgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gZ2V0TW9ja2VkVG9ycmVudChieXRlW10gaGFzaCkgeworICAgIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHJlc3VsdCA9IG1vY2soQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24uY2xhc3MpOworICAgIHdoZW4ocmVzdWx0LmdldExlZnQoKSkudGhlblJldHVybigwTCk7CisgICAgd2hlbihyZXN1bHQuZ2V0RG93bmxvYWRlZCgpKS50aGVuUmV0dXJuKDBMKTsKKyAgICB3aGVuKHJlc3VsdC5nZXRVcGxvYWRlZCgpKS50aGVuUmV0dXJuKDBMKTsKKyAgICB3aGVuKHJlc3VsdC5nZXRJbmZvSGFzaCgpKS50aGVuUmV0dXJuKGhhc2gpOworICAgIHdoZW4ocmVzdWx0LmdldEhleEluZm9IYXNoKCkpLnRoZW5SZXR1cm4oVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKGhhc2gpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN0YXJ0VHJhY2tlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyID0gbmV3IFRyYWNrZXIoNjk2OSk7CisgICAgdHJhY2tlci5zZXRBbm5vdW5jZUludGVydmFsKDUpOworICAgIHRyYWNrZXIuc2V0UGVlckNvbGxlY3RvckV4cGlyZVRpbWVvdXQoMTApOworICAgIHRoaXMudHJhY2tlci5zdGFydCh0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdG9wVHJhY2tlcigpIHsKKyAgICB0aGlzLnRyYWNrZXIuc3RvcCgpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3RvcFRyYWNrZXIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jb21tb24vVG9ycmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzljNTJmCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY29tbW9uL1RvcnJlbnRUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jb21tb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkhleDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOworCitAVGVzdAorcHVibGljIGNsYXNzIFRvcnJlbnRUZXN0IHsKKworICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZV90b3JyZW50KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBVUkkgYW5ub3VuY2VVUkkgPSBuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UiKTsKKyAgICBTdHJpbmcgY3JlYXRlZEJ5ID0gIlRlc3QiOworICAgIFRvcnJlbnRNZXRhZGF0YSB0ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvZmlsZTEuamFyIiksIGFubm91bmNlVVJJLCBjcmVhdGVkQnkpOworICAgIGFzc2VydEVxdWFscyhjcmVhdGVkQnksIHQuZ2V0Q3JlYXRlZEJ5KCkuZ2V0KCkpOworICAgIGFzc2VydEVxdWFscyhhbm5vdW5jZVVSSS50b1N0cmluZygpLCB0LmdldEFubm91bmNlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgbG9hZF90b3JyZW50X2NyZWF0ZWRfYnlfdXRvcnJlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRvcnJlbnRNZXRhZGF0YSB0ID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvZmlsZTEuamFyLnRvcnJlbnQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjY5NjkvYW5ub3VuY2UiLCB0LmdldEFubm91bmNlKCkpOworICAgIGFzc2VydEVxdWFscygiQjkyRDM4MDQ2Qzc2RDczOTQ4RTE0QzQyREY5OTJDQUYyNTQ4OUQwOCIsIHQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ1VG9ycmVudC8zMTMwIiwgdC5nZXRDcmVhdGVkQnkoKS5nZXQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0b3JyZW50X2Zyb21fbXVsdGlwbGVfZmlsZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFVSSSBhbm5vdW5jZVVSSSA9IG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZSIpOworICAgIFN0cmluZyBjcmVhdGVkQnkgPSAiVGVzdDIiOworICAgIGZpbmFsIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIiKTsKKyAgICBmaW5hbCBsb25nIGNyZWF0aW9uVGltZVNlY3MgPSAxMzc2MDUxMDAwOworICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgeyJBY2N1UmV2Q29tbW9uLmphciIsCisgICAgICAgICAgICAgICAgICAgICJjb21tb25zLWlvLWNpbzIuNV8zLmphciIsCisgICAgICAgICAgICAgICAgICAgICJjb21tb25zLWlvLWNpbzIuNV8zLmphci5saW5rIiwKKyAgICAgICAgICAgICAgICAgICAgImluRGlyL2FwcGxpY2F0aW9uLndhZGwiLAorICAgICAgICAgICAgICAgICAgICAic3RvcmFnZS52ZXJzaW9uIn07CisgICAgZmluYWwgTGlzdDxGaWxlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKyAgICBmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgeworICAgICAgZmlsZXMuYWRkKG5ldyBGaWxlKHBhcmVudERpciwgZmlsZU5hbWUpKTsKKyAgICB9CisgICAgVG9ycmVudE1ldGFkYXRhIGNyZWF0ZWRUb3JyZW50ID0gVG9ycmVudENyZWF0b3IuY3JlYXRlKHBhcmVudERpciwgZmlsZXMsIGFubm91bmNlVVJJLCBudWxsLCBjcmVhdGVkQnksIGNyZWF0aW9uVGltZVNlY3MsIFRvcnJlbnRDcmVhdG9yLkRFRkFVTFRfUElFQ0VfTEVOR1RIKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlV2luID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIud2luLnRvcnJlbnQiKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlTGludXggPSBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL3BhcmVudERpci5saW51eC50b3JyZW50Iik7CisgICAgZmluYWwgYnl0ZVtdIGV4cGVjdGVkQnl0ZXNXaW4gPSBGaWxlVXRpbHMucmVhZEZpbGVUb0J5dGVBcnJheSh0b3JyZW50RmlsZVdpbik7CisgICAgZmluYWwgYnl0ZVtdIGV4cGVjdGVkQnl0ZXNMaW51eCA9IEZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5KHRvcnJlbnRGaWxlTGludXgpOworICAgIGZpbmFsIGJ5dGVbXSBhY3R1YWxCeXRlcyA9IG5ldyBUb3JyZW50U2VyaWFsaXplcigpLnNlcmlhbGl6ZShjcmVhdGVkVG9ycmVudCk7CisKKyAgICBhc3NlcnRUcnVlKEhleC5lbmNvZGVIZXhTdHJpbmcoZXhwZWN0ZWRCeXRlc1dpbikuZXF1YWxzKEhleC5lbmNvZGVIZXhTdHJpbmcoYWN0dWFsQnl0ZXMpKSB8fCBIZXguZW5jb2RlSGV4U3RyaW5nKGV4cGVjdGVkQnl0ZXNMaW51eCkuZXF1YWxzKEhleC5lbmNvZGVIZXhTdHJpbmcoYWN0dWFsQnl0ZXMpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmlsZW5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIud2luLnRvcnJlbnQiKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdDIgPSBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlRnJvbUZpbGUodG9ycmVudEZpbGUpOworICAgIGZpbmFsIExpc3Q8VG9ycmVudEZpbGU+IHRtcEZpbGVOYW1lcyA9IHQyLmdldEZpbGVzKCk7CisgICAgZmluYWwgTGlzdDxTdHJpbmc+IG5vcm1hbGl6ZWRGaWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odG1wRmlsZU5hbWVzLnNpemUoKSk7CisgICAgZm9yIChUb3JyZW50RmlsZSB0b3JyZW50RmlsZUluZm8gOiB0bXBGaWxlTmFtZXMpIHsKKyAgICAgIG5vcm1hbGl6ZWRGaWxlbmFtZXMuYWRkKHQyLmdldERpcmVjdG9yeU5hbWUoKSArICIvIiArIHRvcnJlbnRGaWxlSW5mby5nZXRSZWxhdGl2ZVBhdGhBc1N0cmluZygpLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpKTsKKyAgICB9CisgICAgU3RyaW5nW10gZXhwZWN0ZWRGaWxlbmFtZXMgPSBuZXcgU3RyaW5nW10KKyAgICAgICAgICAgIHsicGFyZW50RGlyL0FjY3VSZXZDb21tb24uamFyIiwKKyAgICAgICAgICAgICAgICAgICAgInBhcmVudERpci9jb21tb25zLWlvLWNpbzIuNV8zLmphciIsCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGluayIsCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnREaXIvaW5EaXIvYXBwbGljYXRpb24ud2FkbCIsCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnREaXIvc3RvcmFnZS52ZXJzaW9uIn07CisgICAgYXNzZXJ0RXF1YWxzTm9PcmRlcihub3JtYWxpemVkRmlsZW5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tub3JtYWxpemVkRmlsZW5hbWVzLnNpemUoKV0pLCBleHBlY3RlZEZpbGVuYW1lcyk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyQW5ub3VuY2VUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJBbm5vdW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFkOGMyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyQW5ub3VuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXIuVHJhY2tlclV0aWxzLmxvYWRUb3JyZW50OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgVHJhY2tlckFubm91bmNlVGVzdCB7CisKKyAgcHJpdmF0ZSBUcmFja2VyIHRyYWNrZXI7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlciA9IG5ldyBUcmFja2VyKDY5NjkpOworICAgIHRyYWNrZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICB0cmFja2VyLnNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KDEwKTsKKyAgICB0aGlzLnRyYWNrZXIuc3RhcnQoZmFsc2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdF9hbm5vdW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSk7CisKKyAgICB0aGlzLnRyYWNrZXIuYW5ub3VuY2UobG9hZFRvcnJlbnQoImZpbGUxLmphci50b3JyZW50IikpOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHRoaXMudHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKS5zaXplKCkpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnN0b3AoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDY4MDIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LkNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5UZW1wRmlsZXM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuV2FpdEZvcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29tbXVuaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNoYXJlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuRmFpclBpZWNlU3RvcmFnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuRmlsZUNvbGxlY3Rpb25TdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja3N1bTsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXIuQU5OT1VOQ0VfVVJMOworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC50cmFja2VyLlRyYWNrZXJVdGlscy5URVNUX1JFU09VUkNFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBUcmFja2VyVGVzdCB7CisKKyAgcHJpdmF0ZSBUcmFja2VyIHRyYWNrZXI7CisgIHByaXZhdGUgVGVtcEZpbGVzIHRlbXBGaWxlczsKKyAgLy8gIHByaXZhdGUgU3RyaW5nIG15TG9nZmlsZTsKKyAgcHJpdmF0ZSBMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPiBjb21tdW5pY2F0aW9uTWFuYWdlckxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbW11bmljYXRpb25NYW5hZ2VyPigpOworCisgIHByaXZhdGUgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5IGNvbW11bmljYXRpb25NYW5hZ2VyRmFjdG9yeTsKKworCisgIHB1YmxpYyBUcmFja2VyVGVzdCgpIHsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlckZhY3RvcnkgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5KCk7CisgICAgaWYgKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICByZXR1cm47CisgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIobmV3IFBhdHRlcm5MYXlvdXQoIlslZHtNTWRkIEhIOm1tOnNzLFNTU31dICU2cCAtICUyMC4yMGMgLSAlbSAlbiIpKSk7CisgICAgTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5zZXRMZXZlbChVdGlscy5nZXRMb2dMZXZlbCgpKTsKKyAgfQorCisgIEBCZWZvcmVNZXRob2QKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0ZW1wRmlsZXMgPSBuZXcgVGVtcEZpbGVzKCk7CisgICAgc3RhcnRUcmFja2VyKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X3RyYWNrZXJfYWxsX3BvcnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgcG9ydCA9IHRyYWNrZXIuZ2V0QW5ub3VuY2VVUkkoKS5nZXRQb3J0KCk7CisgICAgZmluYWwgRW51bWVyYXRpb248TmV0d29ya0ludGVyZmFjZT4gZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKKyAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgZmluYWwgTmV0d29ya0ludGVyZmFjZSBuaSA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgIGZpbmFsIEVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBhZGRyZXNzZXMgPSBuaS5nZXRJbmV0QWRkcmVzc2VzKCk7CisgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgIGZpbmFsIEluZXRBZGRyZXNzIGFkZHIgPSBhZGRyZXNzZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTb2NrZXQgcyA9IG5ldyBTb2NrZXQoYWRkciwgcG9ydCk7CisgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKS5zdGFydHNXaXRoKCIxLjcuIikgfHwgYWRkciBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykgeworICAgICAgICAgICAgZmFpbCgiVW5hYmxlIHRvIGNvbm5lY3QgdG8gIiArIGFkZHIsIGV4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQZWVyV2l0aE1hbnlJbnRlcmZhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxJbmV0QWRkcmVzcz4gc2VsZkFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3Q8SW5ldEFkZHJlc3M+KCk7CisgICAgZmluYWwgRW51bWVyYXRpb248TmV0d29ya0ludGVyZmFjZT4gbmV0d29ya0ludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisgICAgd2hpbGUgKG5ldHdvcmtJbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICBOZXR3b3JrSW50ZXJmYWNlIG5pID0gbmV0d29ya0ludGVyZmFjZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgIGZpbmFsIEVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBpbmV0QWRkcmVzc2VzID0gbmkuZ2V0SW5ldEFkZHJlc3NlcygpOworICAgICAgd2hpbGUgKGluZXRBZGRyZXNzZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBpbmV0QWRkcmVzc2VzLm5leHRFbGVtZW50KCk7CisgICAgICAgIGlmIChpbmV0QWRkcmVzcyBpbnN0YW5jZW9mIEluZXQ2QWRkcmVzcykgY29udGludWU7Ly8gaWdub3JlIElQdjYgYWRkcmVzc2VzCisKKyAgICAgICAgc2VsZkFkZHJlc3Nlcy5hZGQoaW5ldEFkZHJlc3MpOworICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIEluZXRBZGRyZXNzW10gaW5ldEFkZHJlc3NlcyA9IHNlbGZBZGRyZXNzZXMudG9BcnJheShuZXcgSW5ldEFkZHJlc3Nbc2VsZkFkZHJlc3Nlcy5zaXplKCldKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisgICAgZmluYWwgU3RyaW5nIGhleEluZm9IYXNoID0gc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHBhcmVudEZpbGVzLmdldEFic29sdXRlUGF0aCgpKS5nZXRIZXhJbmZvSGFzaCgpOworICAgIHNlZWRlci5zdGFydChpbmV0QWRkcmVzc2VzKTsKKyAgICBmaW5hbCBXYWl0Rm9yIHdhaXRGb3IgPSBuZXcgV2FpdEZvcigxMDAwMCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHRyYWNrZWRUb3JyZW50ID0gdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudChoZXhJbmZvSGFzaCk7CisgICAgICAgIHJldHVybiB0cmFja2VkVG9ycmVudCAhPSBudWxsICYmIHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCkuc2l6ZSgpID49IGluZXRBZGRyZXNzZXMubGVuZ3RoOworICAgICAgfQorICAgIH07CisKKyAgICBhc3NlcnRUcnVlKHdhaXRGb3IuaXNNeVJlc3VsdCgpKTsKKworICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHRyYWNrZWRUb3JyZW50ID0gdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudChoZXhJbmZvSGFzaCk7CisKKyAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZElwcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBmb3IgKEluZXRBZGRyZXNzIGluZXRBZGRyZXNzIDogaW5ldEFkZHJlc3NlcykgeworICAgICAgZXhwZWN0ZWRJcHMuYWRkKGluZXRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkpOworICAgIH0KKyAgICBTZXQ8U3RyaW5nPiBhY3R1YWxJcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgZm9yIChUcmFja2VkUGVlciBwZWVyIDogdHJhY2tlZFRvcnJlbnQuZ2V0UGVlcnMoKS52YWx1ZXMoKSkgeworICAgICAgYWN0dWFsSXBzLmFkZChwZWVyLmdldElwKCkpOworICAgIH0KKworICAgIGFzc2VydEVxdWFscyhhY3R1YWxJcHMsIGV4cGVjdGVkSXBzKTsKKyAgICBhc3NlcnRFcXVhbHMoaW5ldEFkZHJlc3Nlcy5sZW5ndGgsIGFjdHVhbElwcy5zaXplKCkpOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0X3NoYXJlX2FuZF9kb3dubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHR0ID0gdGhpcy50cmFja2VyLmFubm91bmNlKGxvYWRUb3JyZW50KCJmaWxlMS5qYXIudG9ycmVudCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdHQuZ2V0UGVlcnMoKS5zaXplKCkpOworCisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgc2VlZGVyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBGaWxlIHRvcnJlbnRGaWxlID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3RvcnJlbnRzIiwgImZpbGUxLmphci50b3JyZW50Iik7CisgICAgRmlsZSBwYXJlbnRGaWxlcyA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi9wYXJlbnRGaWxlcyIpOworICAgIHNlZWRlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBhc3NlcnRFcXVhbHModHQuZ2V0SGV4SW5mb0hhc2goKSwgc2VlZGVyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmFubm91bmNlYWJsZVRvcnJlbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICBmaW5hbCBGaWxlIGRvd25sb2FkRGlyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBsZWVjaCA9IGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCk7CisgICAgbGVlY2guYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZG93bmxvYWREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgdHJ5IHsKKyAgICAgIHNlZWRlci5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisKKyAgICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgImZpbGUxLmphciIpOworICAgICAgYXNzZXJ0RmlsZXNFcXVhbChuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvcGFyZW50RmlsZXMvZmlsZTEuamFyIiksIG5ldyBGaWxlKGRvd25sb2FkRGlyLCAiZmlsZTEuamFyIikpOworICAgIH0gZmluYWxseSB7CisgICAgICBsZWVjaC5zdG9wKCk7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRyYWNrZXJfYWNjZXB0c190b3JyZW50X2Zyb21fc2VlZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHBhcmVudEZpbGVzLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIHRyeSB7CisgICAgICBzZWVkZXIuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICB3YWl0Rm9yU2VlZGVyKHNlZWRlci5nZXRUb3JyZW50c1N0b3JhZ2UoKS5hbm5vdW5jZWFibGVUb3JyZW50cygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEluZm9IYXNoKCkpOworCisgICAgICBDb2xsZWN0aW9uPFRyYWNrZWRUb3JyZW50PiB0cmFja2VkVG9ycmVudHMgPSB0aGlzLnRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgdHJhY2tlZFRvcnJlbnRzLnNpemUoKSk7CisKKyAgICAgIFRyYWNrZWRUb3JyZW50IHRyYWNrZWRUb3JyZW50ID0gdHJhY2tlZFRvcnJlbnRzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgTWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPiBwZWVycyA9IHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgcGVlcnMuc2l6ZSgpKTsKKyAgICAgIGFzc2VydFRydWUocGVlcnMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuaXNDb21wbGV0ZWQoKSk7IC8vIHNlZWQKKyAgICAgIGFzc2VydEVxdWFscygxLCB0cmFja2VkVG9ycmVudC5zZWVkZXJzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRyYWNrZWRUb3JyZW50LmxlZWNoZXJzKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRyYWNrZXJfYWNjZXB0c190b3JyZW50X2Zyb21fbGVlY2goKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICB0aGlzLnRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworCisgICAgZmluYWwgRmlsZSBkb3dubG9hZERpciA9IHRlbXBGaWxlcy5jcmVhdGVUZW1wRGlyKCk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgbGVlY2ggPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB0cnkgeworICAgICAgbGVlY2guc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworCisgICAgICBuZXcgV2FpdEZvcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgICBmb3IgKFRyYWNrZWRUb3JyZW50IHR0IDogdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKSkgeworICAgICAgICAgICAgaWYgKHR0LmdldFBlZXJzKCkuc2l6ZSgpID09IDEpIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgQ29sbGVjdGlvbjxUcmFja2VkVG9ycmVudD4gdHJhY2tlZFRvcnJlbnRzID0gdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRyYWNrZWRUb3JyZW50cy5zaXplKCkpOworCisgICAgICBUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA9IHRyYWNrZWRUb3JyZW50cy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgIE1hcDxQZWVyVUlELCBUcmFja2VkUGVlcj4gcGVlcnMgPSB0cmFja2VkVG9ycmVudC5nZXRQZWVycygpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBlZXJzLnNpemUoKSk7CisgICAgICBhc3NlcnRGYWxzZShwZWVycy52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5pc0NvbXBsZXRlZCgpKTsgLy8gbGVlY2gKKyAgICAgIGFzc2VydEVxdWFscygwLCB0cmFja2VkVG9ycmVudC5zZWVkZXJzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRyYWNrZWRUb3JyZW50LmxlZWNoZXJzKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBsZWVjaC5zdG9wKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdHJhY2tlcl9yZW1vdmVzX3BlZXJfYWZ0ZXJfcGVlcl9zaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHRyYWNrZXIuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKHRydWUpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisKKyAgICBmaW5hbCBDb21tdW5pY2F0aW9uTWFuYWdlciBjMSA9IGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCk7CisgICAgYzEuc3RhcnQoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOworICAgIGMxLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHBhcmVudEZpbGVzLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGMyID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBjMi5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgYzIuYWRkVG9ycmVudCh0b3JyZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcGFyZW50RmlsZXMuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgbmV3IFdhaXRGb3IoMTAgKiAxMDAwKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkuc2l6ZSgpID09IDE7CisgICAgICB9CisgICAgfTsKKworICAgIGZpbmFsIFRyYWNrZWRUb3JyZW50IHR0ID0gdHJhY2tlci5nZXRUcmFja2VkVG9ycmVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworICAgIG5ldyBXYWl0Rm9yKDEwICogMTAwMCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0dC5nZXRQZWVycygpLnNpemUoKSA9PSAyOworICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBjMUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIGMxLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0QmluZFBvcnQoKSk7CisgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYzJBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBjMi5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldEJpbmRQb3J0KCkpOworICAgIGFzc2VydFRydWUodHQuZ2V0UGVlcnMoKS5jb250YWluc0tleShuZXcgUGVlclVJRChjMUFkZHJlc3MsIHR0LmdldEhleEluZm9IYXNoKCkpKSk7CisgICAgYXNzZXJ0VHJ1ZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMyQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKworICAgIGMyLnN0b3AoKTsKKyAgICBuZXcgV2FpdEZvcigzMCAqIDEwMDApIHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0dC5nZXRQZWVycygpLnNpemUoKSA9PSAxOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0VHJ1ZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMxQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKyAgICBhc3NlcnRGYWxzZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMyQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRyYWNrZXJfcmVtb3Zlc19wZWVyX2FmdGVyX3RpbWVvdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICB0cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICB0cmFja2VyLnN0b3AoKTsKKyAgICB0cmFja2VyLnN0YXJ0KHRydWUpOworICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCA9IGNvbXBsZXRlVG9ycmVudCgiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICB0cmFja2VyLnNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KDUpOworCisgICAgaW50IHBlZXJQb3J0ID0gNjg4NTsKKyAgICBTdHJpbmcgcGVlckhvc3QgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpOworICAgIGZpbmFsIFN0cmluZyBhbm5vdW5jZVVybEMxID0gImh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZT9pbmZvX2hhc2g9JUI5LTglMDRsdiVENzlIJUUxTEIlREYlOTklMkMlQUYlMjVIJTlEJTA4JnBlZXJfaWQ9LVRPMDA0Mi05N2VjMzA4Yzk2MzcmIiArCisgICAgICAgICAgICAicG9ydD0iICsgcGVlclBvcnQgKyAiJnVwbG9hZGVkPTAmZG93bmxvYWRlZD0wJmxlZnQ9MCZjb21wYWN0PTEmbm9fcGVlcl9pZD0wJmlwPSIgKyBwZWVySG9zdDsKKworICAgIHRyeSB7CisgICAgICBmaW5hbCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgVVJMKGFubm91bmNlVXJsQzEpLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZmFpbCgiIiwgZSk7CisgICAgfQorCisgICAgZmluYWwgQ29tbXVuaWNhdGlvbk1hbmFnZXIgYzIgPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIGMyLnNldEFubm91bmNlSW50ZXJ2YWwoMTIwKTsKKyAgICBjMi5zdGFydChJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSk7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi90b3JyZW50cyIsICJmaWxlMS5qYXIudG9ycmVudCIpOworICAgIEZpbGUgcGFyZW50RmlsZXMgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvcGFyZW50RmlsZXMiKTsKKyAgICBjMi5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwYXJlbnRGaWxlcy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0dCA9IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICBuZXcgV2FpdEZvcigxMCAqIDEwMDApIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0dC5nZXRQZWVycygpLnNpemUoKSA9PSAyOworICAgICAgfQorICAgIH07CisKKyAgICBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBjMUFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MocGVlckhvc3QsIHBlZXJQb3J0KTsKKyAgICBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBjMkFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIGMyLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0QmluZFBvcnQoKSk7CisgICAgYXNzZXJ0VHJ1ZSh0dC5nZXRQZWVycygpLmNvbnRhaW5zS2V5KG5ldyBQZWVyVUlEKGMxQWRkcmVzcywgdHQuZ2V0SGV4SW5mb0hhc2goKSkpKTsKKyAgICBhc3NlcnRUcnVlKHR0LmdldFBlZXJzKCkuY29udGFpbnNLZXkobmV3IFBlZXJVSUQoYzJBZGRyZXNzLCB0dC5nZXRIZXhJbmZvSGFzaCgpKSkpOworCisgICAgbmV3IFdhaXRGb3IoMzAgKiAxMDAwKSB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZGl0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGZpbmFsIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBVUkwoYW5ub3VuY2VVcmxDMSkub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0dC5nZXRQZWVycygpLnNpemUoKSA9PSAxOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0RXF1YWxzKHR0LmdldFBlZXJzKCkuc2l6ZSgpLCAxKTsKKyAgICBhc3NlcnRUcnVlKHR0LmdldFBlZXJzKCkuY29udGFpbnNLZXkobmV3IFBlZXJVSUQoYzFBZGRyZXNzLCB0dC5nZXRIZXhJbmZvSGFzaCgpKSkpOworICAgIGFzc2VydEZhbHNlKHR0LmdldFBlZXJzKCkuY29udGFpbnNLZXkobmV3IFBlZXJVSUQoYzJBZGRyZXNzLCB0dC5nZXRIZXhJbmZvSGFzaCgpKSkpOworICB9CisKKyAgLy8gIEBUZXN0KGludm9jYXRpb25Db3VudCA9IDUwKQorICBwdWJsaWMgdm9pZCB0cmFja2VyX2FjY2VwdHNfdG9ycmVudF9mcm9tX3NlZWRlcl9wbHVzX2xlZWNoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgdGhpcy50cmFja2VyLnNldEFjY2VwdEZvcmVpZ25Ub3JyZW50cyh0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdGhpcy50cmFja2VyLmdldFRyYWNrZWRUb3JyZW50cygpLnNpemUoKSk7CisKKyAgICBDb21tdW5pY2F0aW9uTWFuYWdlciBzZWVkZXIgPSBjcmVhdGVDb21tdW5pY2F0aW9uTWFuYWdlcigpOworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCAiZmlsZTEuamFyLnRvcnJlbnQiKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisgICAgc2VlZGVyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHBhcmVudEZpbGVzLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIGZpbmFsIEZpbGUgZG93bmxvYWREaXIgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcERpcigpOworICAgIENvbW11bmljYXRpb25NYW5hZ2VyIGxlZWNoID0gY3JlYXRlQ29tbXVuaWNhdGlvbk1hbmFnZXIoKTsKKyAgICBsZWVjaC5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkb3dubG9hZERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB0cnkgeworICAgICAgc2VlZGVyLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgIGxlZWNoLnN0YXJ0KEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKworICAgICAgd2FpdEZvckZpbGVJbkRpcihkb3dubG9hZERpciwgImZpbGUxLmphciIpOworICAgIH0gZmluYWxseSB7CisgICAgICBzZWVkZXIuc3RvcCgpOworICAgICAgbGVlY2guc3RvcCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgVHJhY2tlZFRvcnJlbnQgbG9hZFRvcnJlbnQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZShuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCBuYW1lKSk7CisgICAgcmV0dXJuIG5ldyBUcmFja2VkVG9ycmVudCh0b3JyZW50TWV0YWRhdGEuZ2V0SW5mb0hhc2goKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3RhcnRUcmFja2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgcG9ydCA9IDY5Njk7CisgICAgdGhpcy50cmFja2VyID0gbmV3IFRyYWNrZXIocG9ydCwgImh0dHA6Ly8iICsgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArIHBvcnQgKyAiIiArIEFOTk9VTkNFX1VSTCk7CisgICAgdHJhY2tlci5zZXRBbm5vdW5jZUludGVydmFsKDUpOworICAgIHRyYWNrZXIuc2V0UGVlckNvbGxlY3RvckV4cGlyZVRpbWVvdXQoMTApOworICAgIHRoaXMudHJhY2tlci5zdGFydCh0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdG9wVHJhY2tlcigpIHsKKyAgICB0aGlzLnRyYWNrZXIuc3RvcCgpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChDb21tdW5pY2F0aW9uTWFuYWdlciBjb21tdW5pY2F0aW9uTWFuYWdlciA6IGNvbW11bmljYXRpb25NYW5hZ2VyTGlzdCkgeworICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RvcCgpOworICAgIH0KKyAgICBzdG9wVHJhY2tlcigpOworICAgIHRlbXBGaWxlcy5jbGVhbnVwKCk7CisgIH0KKworICBwcml2YXRlIENvbW11bmljYXRpb25NYW5hZ2VyIGNyZWF0ZUNvbW11bmljYXRpb25NYW5hZ2VyKCkgeworICAgIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyID0gY29tbXVuaWNhdGlvbk1hbmFnZXJGYWN0b3J5LmdldENsaWVudCgiIik7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXJMaXN0LmFkZChjb21tdW5pY2F0aW9uTWFuYWdlcik7CisgICAgcmV0dXJuIGNvbW11bmljYXRpb25NYW5hZ2VyOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JGaWxlSW5EaXIoZmluYWwgRmlsZSBkb3dubG9hZERpciwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgbmV3IFdhaXRGb3IoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRvd25sb2FkRGlyLCBmaWxlTmFtZSkuaXNGaWxlKCk7CisgICAgICB9CisgICAgfTsKKworICAgIGFzc2VydFRydWUobmV3IEZpbGUoZG93bmxvYWREaXIsIGZpbGVOYW1lKS5pc0ZpbGUoKSk7CisgIH0KKworICBwcml2YXRlIFNoYXJlZFRvcnJlbnQgY29tcGxldGVUb3JyZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCBuYW1lKTsKKyAgICBGaWxlIHBhcmVudEZpbGVzID0gbmV3IEZpbGUoVEVTVF9SRVNPVVJDRVMgKyAiL3BhcmVudEZpbGVzIik7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG5ldyBUb3JyZW50UGFyc2VyKCkucGFyc2VGcm9tRmlsZSh0b3JyZW50RmlsZSk7CisgICAgcmV0dXJuIFNoYXJlZFRvcnJlbnQuZnJvbUZpbGUodG9ycmVudEZpbGUsCisgICAgICAgICAgICBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVTdG9yYWdlKHRvcnJlbnRNZXRhZGF0YSwgRmlsZUNvbGxlY3Rpb25TdG9yYWdlLmNyZWF0ZSh0b3JyZW50TWV0YWRhdGEsIHBhcmVudEZpbGVzKSksCisgICAgICAgICAgICBuZXcgVG9ycmVudFN0YXRpc3RpYygpKTsKKyAgfQorCisgIHByaXZhdGUgU2hhcmVkVG9ycmVudCBpbmNvbXBsZXRlVG9ycmVudChTdHJpbmcgbmFtZSwgRmlsZSBkZXN0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGUgdG9ycmVudEZpbGUgPSBuZXcgRmlsZShURVNUX1JFU09VUkNFUyArICIvdG9ycmVudHMiLCBuYW1lKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKHRvcnJlbnRGaWxlKTsKKyAgICByZXR1cm4gU2hhcmVkVG9ycmVudC5mcm9tRmlsZSh0b3JyZW50RmlsZSwKKyAgICAgICAgICAgICAgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZSh0b3JyZW50TWV0YWRhdGEsIEZpbGVDb2xsZWN0aW9uU3RvcmFnZS5jcmVhdGUodG9ycmVudE1ldGFkYXRhLCBkZXN0RGlyKSksCisgICAgICAgICAgICAgIG5ldyBUb3JyZW50U3RhdGlzdGljKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTZWVkZXIoZmluYWwgYnl0ZVtdIHRvcnJlbnRIYXNoKSB7CisgICAgbmV3IFdhaXRGb3IoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbmRpdGlvbigpIHsKKyAgICAgICAgZm9yIChUcmFja2VkVG9ycmVudCB0dCA6IHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkpIHsKKyAgICAgICAgICBpZiAodHQuc2VlZGVycygpID09IDEgJiYgdHQuZ2V0SGV4SW5mb0hhc2goKS5lcXVhbHMoVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHRvcnJlbnRIYXNoKSkpIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RmlsZXNFcXVhbChGaWxlIGYxLCBGaWxlIGYyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhmMS5sZW5ndGgoKSwgZjIubGVuZ3RoKCksICJGaWxlcyBzaXplcyBkaWZmZXIiKTsKKyAgICBDaGVja3N1bSBjMSA9IEZpbGVVdGlscy5jaGVja3N1bShmMSwgbmV3IENSQzMyKCkpOworICAgIENoZWNrc3VtIGMyID0gRmlsZVV0aWxzLmNoZWNrc3VtKGYyLCBuZXcgQ1JDMzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGMxLmdldFZhbHVlKCksIGMyLmdldFZhbHVlKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXJVdGlscy5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2E3ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyVXRpbHMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50UGFyc2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUcmFja2VyVXRpbHMgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0VTID0gInNyYy90ZXN0L3Jlc291cmNlcyI7CisKKyAgcHVibGljIHN0YXRpYyBUcmFja2VkVG9ycmVudCBsb2FkVG9ycmVudChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKG5ldyBGaWxlKFRFU1RfUkVTT1VSQ0VTICsgIi90b3JyZW50cyIsIG5hbWUpKTsKKyAgICByZXR1cm4gbmV3IFRyYWNrZWRUb3JyZW50KHRvcnJlbnRNZXRhZGF0YS5nZXRJbmZvSGFzaCgpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUxLmphciBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvZmlsZTEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDI1NzcKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUxLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUyLmphciBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvZmlsZTIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZDhlMjEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL2ZpbGUyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9BY2N1UmV2Q29tbW9uLmphciBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL0FjY3VSZXZDb21tb24uamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNWRiMjUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9BY2N1UmV2Q29tbW9uLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9jb21tb25zLWlvLWNpbzIuNV8zLmphciBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL2NvbW1vbnMtaW8tY2lvMi41XzMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTZlYzAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9jb21tb25zLWlvLWNpbzIuNV8zLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9jb21tb25zLWlvLWNpbzIuNV8zLmphci5saW5rIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGluawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY5MmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvY29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGluawpAQCAtMCwwICsxLDIgQEAKK0U6XERldkRhdGFcVGVhbWNpdHlCdWlsZHNcOC4xXFRlYW1DaXR5LTI5MTE3XERhdGFcc3lzdGVtXGFydGlmYWN0c1xDb21tb25zSW9cb25lXDdcY29tbW9ucy1pby1jaW8yLjVfMy5qYXIKK0U6XERldkRhdGFcVGVhbWNpdHlCdWlsZHNcOC4xXFRlYW1DaXR5LTI5MTE3XERhdGFcc3lzdGVtXGFydGlmYWN0c1xDb21tb25zSW9cb25lXDdcLnRlYW1jaXR5XHRvcnJlbnRzXGNvbW1vbnMtaW8tY2lvMi41XzMuamFyLnRvcnJlbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3BhcmVudEZpbGVzL3BhcmVudERpci9pbkRpci9hcHBsaWNhdGlvbi53YWRsIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvaW5EaXIvYXBwbGljYXRpb24ud2FkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY1NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvaW5EaXIvYXBwbGljYXRpb24ud2FkbApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz48bnMyOmFwcGxpY2F0aW9uIHhtbG5zOm5zMj0iaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiPjxuczI6ZG9jIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iIGplcnNleTpnZW5lcmF0ZWRCeT0iSmVyc2V5OiAxLjE2IDExLzI4LzIwMTIgMDI6MDkgUE0iLz48bnMyOmRvYyB0aXRsZT0iVGVhbUNpdHkgUkVTVCBBUEkiIHhtbDpsYW5nPSJlbiI+CisgICAgU2VlIGFsc28gaHR0cDovL2NvbmZsdWVuY2UuamV0YnJhaW5zLm5ldC9kaXNwbGF5L1RXL1JFU1QrQVBJK1BsdWdpbgorICA8L25zMjpkb2M+PG5zMjpncmFtbWFycz48bnMyOmluY2x1ZGUgaHJlZj0iYXBwbGljYXRpb24ud2FkbC94c2QxLnhzZCI+PG5zMjpkb2MgdGl0bGU9IkdlbmVyYXRlZCIgeG1sOmxhbmc9ImVuIi8+PC9uczI6aW5jbHVkZT48bnMyOmluY2x1ZGUgaHJlZj0iYXBwbGljYXRpb24ud2FkbC94c2QwLnhzZCI+PG5zMjpkb2MgdGl0bGU9IkdlbmVyYXRlZCIgeG1sOmxhbmc9ImVuIi8+PC9uczI6aW5jbHVkZT48L25zMjpncmFtbWFycz48bnMyOnJlc291cmNlcyBiYXNlPSJodHRwOi8vYnVpbGRzZXJ2ZXIubGFicy5pbnRlbGxpai5uZXQvIj48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC9wcm9qZWN0cyI+PG5zMjptZXRob2QgaWQ9InNlcnZlUHJvamVjdHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3RzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY3JlYXRlUHJvamVjdCIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3UHJvamVjdERlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3UHJvamVjdERlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJjcmVhdGVFbXB0eVByb2plY3QiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS90ZW1wbGF0ZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iY3JlYXRlQnVpbGRUeXBlVGVtcGxhdGUiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkNyZWF0ZXMgYSBuZXcgYnVpbGQgY29uZmlndXJhdGlvbiB0ZW1wbGF0ZSBieSBjb3B5aW5nIGV4aXN0aW5nIG9uZS48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3QnVpbGRUeXBlRGVzY3JpcHRpb24iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJuZXdCdWlsZFR5cGVEZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlVGVtcGxhdGVzSW5Qcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJjcmVhdGVFbXB0eUJ1aWxkVHlwZVRlbXBsYXRlIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L3BhcmFtZXRlcnMve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InB1dFBhcmFtZXRlciIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlUGFyYW1ldGVyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVBhcmFtZXRlciIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVByb2plY3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVByb2plY3QiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vcGFyZW50UHJvamVjdCI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRQYXJlbnRQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0LXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb2plY3QtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNldFBhcmVudFByb2plY3QiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdC1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0LXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvamVjdC1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9qZWN0LXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vYnVpbGRUeXBlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJjcmVhdGVCdWlsZFR5cGUiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkNyZWF0ZXMgYSBuZXcgYnVpbGQgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGV4aXN0aW5nIG9uZS48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3QnVpbGRUeXBlRGVzY3JpcHRpb24iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJuZXdCdWlsZFR5cGVEZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNyZWF0ZUVtcHR5QnVpbGRUeXBlIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVzSW5Qcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0vYnVpbGRUeXBlcy97YnRMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNldFByb2plY3RGaWxlZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlUHJvamVjdEZpZWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS90ZW1wbGF0ZXMve2J0TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZVRlbXBsYXRlcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9wYXJhbWV0ZXJzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlUGFyYW1ldGVycyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY2hhbmdlQWxsUGFyYW1ldGVycyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQWxsUGFyYW1ldGVycyIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9idWlsZFR5cGVzL3tidExvY2F0b3J9L2J1aWxkcy97YnVpbGRMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZEZpZWxkV2l0aFByb2plY3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L2J1aWxkVHlwZXMve2J0TG9jYXRvcn0vYnVpbGRzL3tidWlsZExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkV2l0aFByb2plY3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97cHJvamVjdExvY2F0b3J9L25ld1Byb2plY3REZXNjcmlwdGlvbiI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRFeGFtcGxlTmV3UHJvamVjdERlc2NyaXB0aW9uIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkuCisgVXNlIHRoaXMgdG8gZ2V0IGFuIGV4YW1wbGUgb2YgdGhlIGJlYW4gdG8gYmUgcG9zdGVkIHRvIHRoZSAvcHJvamVjdHMgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgcHJvamVjdDwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3UHJvamVjdERlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ibmV3UHJvamVjdERlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9idWlsZFR5cGVzL3tidExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVGaWVsZFdpdGhQcm9qZWN0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Byb2plY3RMb2NhdG9yfS9idWlsZFR5cGVzL3tidExvY2F0b3J9L2J1aWxkcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb2plY3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPlNlcnZlcyBidWlsZHMgbWF0Y2hpbmcgc3VwcGxpZWQgY29uZGl0aW9uLjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0YXR1cyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idHJpZ2dlcmVkQnlVc2VyIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpbmNsdWRlUGVyc29uYWwiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpbmNsdWRlQ2FuY2VsZWQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJvbmx5UGlubmVkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idGFnIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhZ2VudE5hbWUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InNpbmNlQnVpbGQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InNpbmNlRGF0ZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic3RhcnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6bG9uZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjb3VudCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czppbnQiLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibG9jYXRvciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC92Y3Mtcm9vdC1pbnN0YW5jZXMiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUluc3RhbmNlcyIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RJbnN0YW5jZUxvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdEluc3RhbmNlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVJbnN0YW5jZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2UiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290SW5zdGFuY2VMb2NhdG9yfS9wcm9wZXJ0aWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdEluc3RhbmNlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVSb290SW5zdGFuY2VQcm9wZXJ0aWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290SW5zdGFuY2VMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlSW5zdGFuY2VGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXRJbnN0YW5jZUZpZWxkIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC91c2VycyI+PG5zMjptZXRob2QgaWQ9ImNyZWF0ZVVzZXIiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InVzZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9IiovKiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2VydmVVc2VycyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlcnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t1c2VyTG9jYXRvcn0vcm9sZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ1c2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iYWRkUm9sZSIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VSb2xlcyIgbmFtZT0iUFVUIj48bnMyOmRvYz5SZXBsYWNlcyB1c2VyJ3Mgcm9sZXMgd2l0aCB0aGUgc3VibWl0dGVkIG9uZXM8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJsaXN0Um9sZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9L3JvbGVzL3tyb2xlSWR9L3tzY29wZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ1c2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2NvcGUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InJvbGVJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iYWRkUm9sZVNpbXBsZSIgbmFtZT0iUFVUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlUm9sZSIgbmFtZT0iREVMRVRFIi8+PG5zMjptZXRob2QgaWQ9Imxpc3RSb2xlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRSb2xlU2ltcGxlUG9zdCIgbmFtZT0iUE9TVCIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t1c2VyTG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ1c2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVVc2VyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJ1cGRhdGVVc2VyIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InVzZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ1c2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idXNlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t1c2VyTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ1c2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2V0VXNlckZpZWxkIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2VydmVVc2VyRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9L3Byb3BlcnRpZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ1c2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVVc2VyUHJvcGVydGllcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dXNlckxvY2F0b3J9L3Byb3BlcnRpZXMve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idXNlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlVXNlclByb3BlcnRpZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icHV0VXNlclByb3BlcnR5IiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icmVtb3ZlVXNlclByb3BlcnR5IiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdC9jaGFuZ2VzIj48bnMyOm1ldGhvZCBpZD0ic2VydmVDaGFuZ2VzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkxpc3RzIGNoYW5nZXMgYnkgdGhlIHNwZWNpZmllZCBsb2NhdG9yPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJvamVjdCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciPjxuczI6ZG9jPkNoYW5nZSBsb2NhdG9yPC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZFR5cGUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIj48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZDwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIj48bnMyOmRvYz5EZXByZWNhdGVkLCB1c2UgJnF1b3Q7bG9jYXRvciZxdW90OyBwYXJhbWV0ZXIgaW5zdGVhZDwvbnMyOmRvYz48L25zMjpwYXJhbT48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciPjxuczI6ZG9jPkRlcHJlY2F0ZWQsIHVzZSAmcXVvdDtsb2NhdG9yJnF1b3Q7IHBhcmFtZXRlciBpbnN0ZWFkPC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZUNoYW5nZSIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciPjxuczI6ZG9jPkRlcHJlY2F0ZWQsIHVzZSAmcXVvdDtsb2NhdG9yJnF1b3Q7IHBhcmFtZXRlciBpbnN0ZWFkLiBOb3RlIHRoYXQgY29ycmVzcG9uZGluZyBsb2NhdG9yIGRpbWVuc2lvbiBpcyAmcXVvdDt2Y3NSb290SW5zdGFuY2UmcXVvdDs8L25zMjpkb2M+PC9uczI6cGFyYW0+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0YXJ0IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmxvbmciPjxuczI6ZG9jPkRlcHJlY2F0ZWQsIHVzZSAmcXVvdDtsb2NhdG9yJnF1b3Q7IHBhcmFtZXRlciBpbnN0ZWFkPC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjb3VudCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czppbnQiPjxuczI6ZG9jPkRlcHJlY2F0ZWQsIHVzZSAmcXVvdDtsb2NhdG9yJnF1b3Q7IHBhcmFtZXRlciBpbnN0ZWFkPC9uczI6ZG9jPjwvbnMyOnBhcmFtPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJsb2NhdG9yIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyI+PG5zMjpkb2M+RGVwcmVjYXRlZCwgdXNlICZxdW90O2xvY2F0b3ImcXVvdDsgcGFyYW1ldGVyIGluc3RlYWQ8L25zMjpkb2M+PC9uczI6cGFyYW0+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iY2hhbmdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfS9wYXJlbnQtY2hhbmdlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImNoYW5nZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFBhcmVudENoYW5nZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L3BhcmVudC1yZXZpc2lvbnMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VQYXJlbnRSZXZpc2lvbnMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHN1cHBvcnQgb25seSE8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Iml0ZW1zIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaXRlbXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0vdmNzLXJvb3QiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VWQ1NSb290IiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkhPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZS1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZS1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0vYXR0cmlidXRlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImNoYW5nZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldENoYW5nZUF0dHJpYnV0ZXMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHN1cHBvcnQgb25seSE8L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L2R1cGxpY2F0ZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VEdXBsaWNhdGVzIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkhPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJjaGFuZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iY2hhbmdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tjaGFuZ2VMb2NhdG9yfS9pc3N1ZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VJc3N1ZSIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5ITwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaXNzdWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaXNzdWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9L2J1aWxkVHlwZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRSZWxhdGVkQnVpbGRUeXBlcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5ITwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Y2hhbmdlTG9jYXRvcn0vZmlyc3RCdWlsZHMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjaGFuZ2VMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRDaGFuZ2VGaXJzdEJ1aWxkcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5FeHBlcmltZW50YWwgc3VwcG9ydCBvbmx5ITwvbnMyOmRvYz48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2NoYW5nZUxvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY2hhbmdlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVDaGFuZ2UiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImNoYW5nZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L3NlcnZlciI+PG5zMjptZXRob2QgaWQ9InNlcnZlU2VydmVySW5mbyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic2VydmVyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic2VydmVyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYmFja3VwIj48bnMyOm1ldGhvZCBpZD0ic3RhcnRCYWNrdXAiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmlsZU5hbWUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFkZFRpbWVzdGFtcCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVDb25maWdzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZURhdGFiYXNlIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZUJ1aWxkTG9ncyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImluY2x1ZGVQZXJzb25hbENoYW5nZXMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZ2V0QmFja3VwU3RhdHVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvcGx1Z2lucyI+PG5zMjptZXRob2QgaWQ9InNlcnZlUGx1Z2lucyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icGx1Z2lucyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InBsdWdpbnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlU2VydmVyVmVyc2lvbiIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L2J1aWxkVHlwZXMiPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZXNYTUwiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vZmVhdHVyZXMve2ZlYXR1cmVJZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZlYXR1cmVJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RmVhdHVyZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlRmVhdHVyZSIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYXJ0aWZhY3QtZGVwZW5kZW5jaWVzL3thcnRpZmFjdERlcExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhcnRpZmFjdERlcExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0RGVwIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVBcnRpZmFjdERlcCIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYWdlbnQtcmVxdWlyZW1lbnRzL3thZ2VudFJlcXVpcmVtZW50TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFnZW50UmVxdWlyZW1lbnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBZ2VudFJlcXVpcmVtZW50IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZUFnZW50UmVxdWlyZW1lbnQiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3N0ZXBzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJhZGRTdGVwIiBuYW1lPSJQT1NUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icmVwbGFjZVN0ZXBzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZ2V0U3RlcHMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic3RlcHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9mZWF0dXJlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RmVhdHVyZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZlYXR1cmVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkRmVhdHVyZSIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZSIgbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmZWF0dXJlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlRmVhdHVyZXMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmZWF0dXJlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmVhdHVyZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmZWF0dXJlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2ludmVzdGlnYXRpb25zIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRJbnZlc3RpZ2F0aW9ucyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaW52ZXN0aWdhdGlvbnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJpbnZlc3RpZ2F0aW9ucyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3Zjcy1yb290LWVudHJpZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFZjc1Jvb3RFbnRyaWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cmllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlVmNzUm9vdEVudHJpZXMiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cmllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWVudHJpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZFZjc1Jvb3RFbnRyeSIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3Zjcy1yb290LWVudHJpZXMve2lkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImlkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFZjc1Jvb3RFbnRyeSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtZW50cnkiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1lbnRyeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVWY3NSb290RW50cnkiIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3NuYXBzaG90LWRlcGVuZGVuY2llcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0icmVwbGFjZVNuYXBzaG90RGVwcyIgbmFtZT0iUFVUIj48bnMyOmRvYz5SZXBsYWNlcyBzbmFwc2hvdCBkZXBlbmRlbmN5IHdpdGggdGhvc2Ugc2VudCBpbiByZXF1ZXN0LjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRTbmFwc2hvdERlcCIgbmFtZT0iUE9TVCI+PG5zMjpkb2M+Q3JlYXRlcyBuZXcgc25hcHNob3QgZGVwZW5kZW5jeS4gJ2lkJyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBpbiB0aGUgc3VibWl0dGVkIGRlc2NyaXB0b3IuCisgUmVwb3J0cyBlcnJvciBpZiBuZXcgZGVwZW5kZW5jeSBjYW5ub3QgYmUgY3JlYXRlZCAoZS5nLiBhbm90aGVyIGRlcGVuZGVuY3kgb24gdGhlIHNwZWNpZmllZCBidWlsZCBjb25maWd1cmF0aW9uIGFscmVhZHkgZXhpc3RzKS48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldFNuYXBzaG90RGVwcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0ic25hcHNob3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vc25hcHNob3QtZGVwZW5kZW5jaWVzL3tzbmFwc2hvdERlcExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzbmFwc2hvdERlcExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVNuYXBzaG90RGVwIiBuYW1lPSJERUxFVEUiLz48bnMyOm1ldGhvZCBpZD0iZ2V0U25hcHNob3REZXAiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InNuYXBzaG90LWRlcGVuZGVuY3kiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzbmFwc2hvdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vdHJpZ2dlcnMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VUcmlnZ2VycyIgbmFtZT0iUFVUIj48bnMyOmRvYz5SZXBsYWNlcyB0cmlnZ2VyIHdpdGggdGhvc2Ugc2VudCBpbnRoZSByZXF1ZXN0LjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXJzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VycyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXJzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZFRyaWdnZXIiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkNyZWF0ZXMgbmV3IHRyaWdnZXIuICdpZCcgYXR0cmlidXRlIGlzIGlnbm9yZWQgaW4gdGhlIHN1Ym1pdHRlZCBkZXNjcmlwdG9yLgorIFJlcG9ydHMgZXJyb3IgaWYgbmV3IHRyaWdnZXIgY2Fubm90IGJlIGNyZWF0ZWQgKGUuZy4gb25seSBzaW5nbGUgdHJpZ2dlciBvZiB0aGUgdHlwZSBpcyBhbGxvd2VkIGZvciBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24pLjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlciIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZ2V0VHJpZ2dlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXJzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idHJpZ2dlcnMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS90cmlnZ2Vycy97dHJpZ2dlckxvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ0cmlnZ2VyTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZGVsZXRlVHJpZ2dlciIgbmFtZT0iREVMRVRFIi8+PG5zMjptZXRob2QgaWQ9ImdldFRyaWdnZXIiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRyaWdnZXIiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0cmlnZ2VyIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vdHJpZ2dlcnMve3RyaWdnZXJMb2NhdG9yfS97ZmllbGROYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idHJpZ2dlckxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkTmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0VHJpZ2dlclNldHRpbmciIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY2hhbmdlVHJpZ2dlclNldHRpbmciIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2FnZW50LXJlcXVpcmVtZW50cyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0icmVwbGFjZUFnZW50UmVxdWlyZW1lbnRzIiBuYW1lPSJQVVQiPjxuczI6ZG9jPlJlcGxhY2VzIGFnZW50IHJlcXVpcmVtZW50cyB3aXRoIHRob3NlIHNlbnQgaW4gdGhlIHJlcXVlc3QuPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQtcmVxdWlyZW1lbnRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZEFnZW50UmVxdWlyZW1lbnQiIG5hbWU9IlBPU1QiPjxuczI6ZG9jPkNyZWF0ZXMgbmV3IGFnZW50IHJlcXVpcmVtZW50LiAnaWQnIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGluIHRoZSBzdWJtaXR0ZWQgZGVzY3JpcHRvci4KKyBSZXBvcnRzIGVycm9yIGlmIG5ldyByZXF1aXJlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCAoZS5nLiBhbm90aGVyIHJlcXVpcmVtZW50IGlzIHByZXNlbnQgZm9yIHRoZSBwYXJhbWV0ZXIpLjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50LXJlcXVpcmVtZW50IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldEFnZW50UmVxdWlyZW1lbnRzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudC1yZXF1aXJlbWVudHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS92Y3Mtcm9vdC1pbnN0YW5jZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEN1cnJlbnRWY3NJbnN0YW5jZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2J1aWxkcy97YnVpbGRMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkV2l0aFByb2plY3QiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9idWlsZHMve2J1aWxkTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZEZpZWxkIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYnJhbmNoZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnJhbmNoZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJyYW5jaGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnJhbmNoZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS92Y3MtbGFiZWxpbmciPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldFZDU0xhYmVsaW5nT3B0aW9ucyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLWxhYmVsaW5nIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLWxhYmVsaW5nIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNldFZDU0xhYmVsaW5nT3B0aW9ucyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3MtbGFiZWxpbmciIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3MtbGFiZWxpbmciIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1sYWJlbGluZyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1sYWJlbGluZyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L25ld0J1aWxkVHlwZURlc2NyaXB0aW9uIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRFeGFtcGxlTmV3UHJvamVjdERlc2NyaXB0aW9uIiBuYW1lPSJHRVQiPjxuczI6ZG9jPkV4cGVyaW1lbnRhbCBzdXBwb3J0IG9ubHkuCisgVXNlIHRoaXMgdG8gZ2V0IGFuIGV4YW1wbGUgb2YgdGhlIGJlYW4gdG8gYmUgcG9zdGVkIHRvIHRoZSAvYnVpbGRUeXBlcyByZXF1ZXN0IHRvIGNyZWF0ZSBhIG5ldyBidWlsZCB0eXBlPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJuZXdCdWlsZFR5cGVEZXNjcmlwdGlvbiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Im5ld0J1aWxkVHlwZURlc2NyaXB0aW9uIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYnVpbGRzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkcyIgbmFtZT0iR0VUIj48bnMyOmRvYz5TZXJ2ZXMgYnVpbGRzIG1hdGNoaW5nIHN1cHBsaWVkIGNvbmRpdGlvbi48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGF0dXMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRyaWdnZXJlZEJ5VXNlciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZVBlcnNvbmFsIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZUNhbmNlbGVkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ib25seVBpbm5lZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRhZyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYWdlbnROYW1lIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZUJ1aWxkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZURhdGUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0YXJ0IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmxvbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY291bnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6aW50Ii8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vc3RlcHMve3N0ZXBJZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0ZXBJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZGVsZXRlU3RlcCIgbmFtZT0iREVMRVRFIi8+PG5zMjptZXRob2QgaWQ9ImdldFN0ZXAiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InN0ZXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJzdGVwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlWE1MIiBuYW1lPSJHRVQiPjxuczI6ZG9jPlNlcnZlcyBidWlsZCBjb25maWd1cmF0aW9uIG9yIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGxvY2F0b3IuPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQnVpbGRUeXBlIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXRCdWlsZFR5cGVGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vYnVpbGRUYWdzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZUJ1aWxkc1RhZ3MiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vcGFyYW1ldGVycyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVQYXJhbWV0ZXJzIiBuYW1lPSJHRVQiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibG9jYXRvciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJjaGFuZ2VCdWlsZFR5cGVQYXJhbWV0ZXJzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVBbGxCdWlsZFR5cGVQYXJhbWV0ZXJzIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9wYXJhbWV0ZXJzL3tuYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVQYXJhbWV0ZXIiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icHV0QnVpbGRUeXBlUGFyYW1ldGVyIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQnVpbGRUeXBlUGFyYW1ldGVyIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zZXR0aW5ncy97bmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRUeXBlU2V0dGluZ3MiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icHV0QnVpbGRUeXBlU2V0dGluZyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zZXR0aW5ncyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFR5cGVTZXR0aW5ncyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0icmVwbGFjZUJ1aWxkVHlwZVNldHRpbmdzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3RlbXBsYXRlIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkVHlwZVRlbXBsYXRlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRUeXBlLXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJnZXRUZW1wbGF0ZUFzc29jaWF0aW9uIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkVHlwZS1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJidWlsZFR5cGUtcmVmIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVRlbXBsYXRlQXNzb2NpYXRpb24iIG5hbWU9IkRFTEVURSIvPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3N0ZXBzL3tzdGVwSWR9L3BhcmFtZXRlcnMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0ZXBJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0U3RlcFBhcmFtZXRlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VTdGVwUGFyYW1ldGVycyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9zdGVwcy97c3RlcElkfS9wYXJhbWV0ZXJzL3twYXJhbWV0ZXJOYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic3RlcElkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwYXJhbWV0ZXJOYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRTdGVwUGFyYW1ldGVyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZFN0ZXBQYXJhbWV0ZXIiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L3N0ZXBzL3tzdGVwSWR9L3tmaWVsZE5hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZE5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0ZXBJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0U3RlcFNldHRpbmciIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY2hhbmdlU3RlcFNldHRpbmciIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidExvY2F0b3J9L2ZlYXR1cmVzL3tmZWF0dXJlSWR9L3BhcmFtZXRlcnMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZlYXR1cmVJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0RmVhdHVyZVBhcmFtZXRlcnMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VGZWF0dXJlUGFyYW1ldGVycyIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9mZWF0dXJlcy97ZmVhdHVyZUlkfS9wYXJhbWV0ZXJzL3twYXJhbWV0ZXJOYW1lfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmVhdHVyZUlkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwYXJhbWV0ZXJOYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRGZWF0dXJlUGFyYW1ldGVyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZEZlYXR1cmVQYXJhbWV0ZXIiIG5hbWU9IlBVVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J0TG9jYXRvcn0vZmVhdHVyZXMve2ZlYXR1cmVJZH0ve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmZWF0dXJlSWQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEZlYXR1cmVTZXR0aW5nIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImNoYW5nZUZlYXR1cmVTZXR0aW5nIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnRMb2NhdG9yfS9hcnRpZmFjdC1kZXBlbmRlbmNpZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0RGVwcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jaWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VBcnRpZmFjdERlcHMiIG5hbWU9IlBVVCI+PG5zMjpkb2M+UmVwbGFjZXMgdGhlIGRlcGVuZGVuY2llcyB0byB0aG9zZSBzZW50IGluIHRoZSByZXF1ZXN0LjwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmNpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFydGlmYWN0LWRlcGVuZGVuY2llcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRBcnRpZmFjdERlcCIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSIqLyoiLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhcnRpZmFjdC1kZXBlbmRlbmN5IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYXJ0aWZhY3QtZGVwZW5kZW5jeSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L3VzZXJHcm91cHMiPjxuczI6bWV0aG9kIGlkPSJhZGRHcm91cCIgbmFtZT0iUE9TVCI+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJncm91cCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXAiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJncm91cCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUdyb3VwcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZ3JvdXBzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2dyb3VwTG9jYXRvcn0vcm9sZXMiPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJncm91cExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImFkZFJvbGUiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJsaXN0Um9sZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iYWRkUm9sZVB1dCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2dyb3VwTG9jYXRvcn0vcm9sZXMve3JvbGVJZH0ve3Njb3BlfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Imdyb3VwTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ic2NvcGUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InJvbGVJZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iYWRkUm9sZVNpbXBsZSIgbmFtZT0iUE9TVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJyb2xlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImRlbGV0ZVJvbGUiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJsaXN0Um9sZSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icm9sZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InJvbGUiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97Z3JvdXBMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Imdyb3VwTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZGVsZXRlR3JvdXAiIG5hbWU9IkRFTEVURSIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUdyb3VwIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJncm91cCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imdyb3VwIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvZGVidWciPjxuczI6ZG9jPlByb3ZpZGVzIHNvbWUgZGVidWcgYWJpbGl0aWVzIGZvciB0aGUgc2VydmVyLiBFeHBlcmltZW50YWwgb25seS4gU2hvdWxkIGJlIHVzZWQgd2l0aCBjYXV0aW9uIG9yIGJldHRlciBub3QgdXNlZCBpZiBub3QgYWR2aXNlZCBieSBKZXRCcmFpbnMKKyBUaGVzZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3Igbm9uLWRlYnVnIHB1cnBvc2VzIGFuZCB0aGUgQVBJIGhlcmUgY2FuIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGVhbUNpdHkgd2l0aG91dCBhbnkgbm90aWNlLjwvbnMyOmRvYz48bnMyOnJlc291cmNlIHBhdGg9Ii9kYXRhYmFzZS9xdWVyeS97cXVlcnl9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icXVlcnkiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImV4ZWN1dGVEQlF1ZXJ5IiBuYW1lPSJHRVQiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGREZWxpbWl0ZXIiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIsICIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjb3VudCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9IjEwMDAiLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvdmNzQ2hlY2tpbmdGb3JDaGFuZ2VzUXVldWUiPjxuczI6bWV0aG9kIGlkPSJzY2hlZHVsZUNoZWNraW5nRm9yQ2hhbmdlcyIgbmFtZT0iUE9TVCI+PG5zMjpkb2M+RXhwZXJpbWVudGFsIHVzZSBvbmx5ITwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QtaW5zdGFuY2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvZGF0YWJhc2UvdGFibGVzIj48bnMyOm1ldGhvZCBpZD0ibGlzdERCVGFibGVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvYnVpbGRzIj48bnMyOm1ldGhvZCBpZD0ic2VydmVBbGxCdWlsZHMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+U2VydmVzIGJ1aWxkcyBtYXRjaGluZyBzdXBwbGllZCBjb25kaXRpb24uPC9uczI6ZG9jPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRUeXBlIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzdGF0dXMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRyaWdnZXJlZEJ5VXNlciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZVBlcnNvbmFsIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZUNhbmNlbGVkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ib25seVBpbm5lZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InRhZyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYWdlbnROYW1lIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZUJ1aWxkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW5jZURhdGUiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InN0YXJ0IiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmxvbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY291bnQiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6aW50Ii8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGRzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vcmVzdWx0aW5nLXByb3BlcnRpZXMve3Byb3BlcnR5TmFtZX0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9wZXJ0eU5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0UGFyYW1ldGVyIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vYXJ0aWZhY3RzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJnZXRBcnRpZmFjdHMiIG5hbWU9IkdFVCI+PG5zMjpkb2M+TW9yZSB1c2VyLWZyaWVuZGx5IFVSTCBmb3IgJnF1b3Q7L3tidWlsZExvY2F0b3J9L2FydGlmYWN0cy9jaGlsZHJlbiZxdW90OyBvbmUuPC9uczI6ZG9jPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmaWxlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImZpbGVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vYXJ0aWZhY3RzL21ldGFkYXRhe3BhdGg6KC8uKik/fSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InBhdGgiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0QXJ0aWZhY3RNZXRhZGF0YSIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InJlc29sdmVQYXJhbWV0ZXJzIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibG9jYXRvciIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpzdHJpbmciLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmaWxlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmlsZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJkZWxldGVCdWlsZCIgbmFtZT0iREVMRVRFIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImJ1aWxkIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYnVpbGQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9waW4vIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJwaW5CdWlsZCIgbmFtZT0iUFVUIj48bnMyOmRvYz5QaW5zIGEgYnVpbGQ8L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVxdWVzdD48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImdldFBpbm5lZCIgbmFtZT0iR0VUIj48bnMyOmRvYz5GZXRjaGVzIGN1cnJlbnQgYnVpbGQgcGlubmVkIHN0YXR1cy48L25zMjpkb2M+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0idW5waW5CdWlsZCIgbmFtZT0iREVMRVRFIj48bnMyOmRvYz5VbnBpbnMgYSBidWlsZDwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS90YWdzLyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVUYWdzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJhZGRUYWdzIiBuYW1lPSJQT1NUIj48bnMyOmRvYz5BZGRzIGEgc2V0IG9mIHRhZ3MgdG8gYSBidWlsZDwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVxdWVzdD48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9ImFkZFRhZyIgbmFtZT0iUE9TVCI+PG5zMjpkb2M+QWRkcyBhIHNpbmdsZSB0YWcgdG8gYSBidWlsZDwvbnMyOmRvYz48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InJlcGxhY2VUYWdzIiBuYW1lPSJQVVQiPjxuczI6ZG9jPlJlcGxhY2VzIGJ1aWxkJ3MgdGFncy48L25zMjpkb2M+PG5zMjpyZXF1ZXN0PjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idGFncyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InRhZ3MiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ0YWdzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vcmVzdWx0aW5nLXByb3BlcnRpZXMvIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkQWN0dWFsUGFyYW1ldGVycyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9hcnRpZmFjdHMvY2hpbGRyZW57cGF0aDooLy4qKT99Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icGF0aCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0Q2hpbGRyZW4iIG5hbWU9IkdFVCI+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJyZXNvbHZlUGFyYW1ldGVycyIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iZmlsZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJmaWxlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L2FydGlmYWN0cy9jb250ZW50e3BhdGg6KC8uKik/fSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InBhdGgiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0iZ2V0QXJ0aWZhY3RDb250ZW50IiBuYW1lPSJHRVQiPjxuczI6cmVxdWVzdD48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icmVzb2x2ZVBhcmFtZXRlcnMiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L2FydGlmYWN0cy9maWxlc3twYXRoOigvLiopP30iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwYXRoIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9ImdldEFydGlmYWN0RmlsZXNDb250ZW50IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9zb3VyY2VzL2ZpbGVzL3tmaWxlTmFtZTouK30iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWxlTmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVNvdXJjZUZpbGUiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3JlbGF0ZWQtaXNzdWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkUmVsYXRlZElzc3Vlc09sZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaXNzdWVzVXNhZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iaXNzdWVzVXNhZ2VzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vcmVsYXRlZElzc3VlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFJlbGF0ZWRJc3N1ZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3Vlc1VzYWdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9Imlzc3Vlc1VzYWdlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkRmllbGRCeUJ1aWxkT25seSIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3N0YXRpc3RpY3MvIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkU3RhdGlzdGljVmFsdWVzIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3tidWlsZExvY2F0b3J9L3N0YXRpc3RpY3Mve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibmFtZSIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUJ1aWxkU3RhdGlzdGljVmFsdWUiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97YnVpbGRMb2NhdG9yfS9jb21tZW50Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnVpbGRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJyZXBsYWNlQ29tbWVudCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlQ29tbWVudCIgbmFtZT0iREVMRVRFIi8+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve2J1aWxkTG9jYXRvcn0vc3RhdHVzSWNvbiI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImJ1aWxkTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVCdWlsZFN0YXR1c0ljb24iIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L2NjdHJheSI+PG5zMjpyZXNvdXJjZSBwYXRoPSIvcHJvamVjdHMueG1sIj48bnMyOm1ldGhvZCBpZD0ic2VydmVQcm9qZWN0cyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iUHJvamVjdHMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJQcm9qZWN0cyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL2FwcC9yZXN0L3Zjcy1yb290cyI+PG5zMjptZXRob2QgaWQ9ImFkZFJvb3QiIG5hbWU9IlBPU1QiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290IiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2VydmVSb290cyIgbmFtZT0iR0VUIj48bnMyOnJlcXVlc3Q+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImxvY2F0b3IiIHN0eWxlPSJxdWVyeSIgdHlwZT0ieHM6c3RyaW5nIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3RzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3RzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS97ZmllbGR9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iZmllbGQiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXRGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlRmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdExvY2F0b3J9L3Byb3BlcnRpZXMve25hbWV9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InB1dFBhcmFtZXRlciIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PG5zMjptZXRob2QgaWQ9InNlcnZlUHJvcGVydHkiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iZGVsZXRlUGFyYW1ldGVyIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdExvY2F0b3J9Ij48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlUm9vdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0idmNzLXJvb3QiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVSb290IiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdExvY2F0b3J9L2luc3RhbmNlcy97dmNzUm9vdEluc3RhbmNlTG9jYXRvcn0vcHJvcGVydGllcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVJvb3RJbnN0YW5jZVByb3BlcnRpZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS9pbnN0YW5jZXMve3Zjc1Jvb3RJbnN0YW5jZUxvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdEluc3RhbmNlTG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlSW5zdGFuY2VGaWVsZCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJzZXRJbnN0YW5jZUZpZWxkIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlcXVlc3Q+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii97dmNzUm9vdExvY2F0b3J9L2luc3RhbmNlcyI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZVJvb3RJbnN0YW5jZXMiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3t2Y3NSb290TG9jYXRvcn0vaW5zdGFuY2VzL3t2Y3NSb290SW5zdGFuY2VMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RJbnN0YW5jZUxvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InZjc1Jvb3RMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyI+PG5zMjpkb2M+dGhpcyBpcyBlZmZlY3RpdmVseSBpZ25vcmVkIGFzIHZjc1Jvb3RJbnN0YW5jZUxvY2F0b3Igc2hvdWxkIHNwZWNpZnkgaW5zdGFuY2UgZnVsbHk8L25zMjpkb2M+PC9uczI6cGFyYW0+PG5zMjptZXRob2QgaWQ9InNlcnZlUm9vdEluc3RhbmNlIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJ2Y3Mtcm9vdC1pbnN0YW5jZSIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InZjcy1yb290LWluc3RhbmNlIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIve3Zjc1Jvb3RMb2NhdG9yfS9wcm9wZXJ0aWVzIj48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0idmNzUm9vdExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlUHJvcGVydGllcyIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0iY2hhbmdQcm9wZXJ0aWVzIiBuYW1lPSJQVVQiPjxuczI6cmVxdWVzdD48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9InByb3BlcnRpZXMiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL2pzb24iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwcm9wZXJ0aWVzIiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0icHJvcGVydGllcyIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6bWV0aG9kIGlkPSJkZWxldGVBbGxQcm9wZXJ0aWVzIiBuYW1lPSJERUxFVEUiLz48L25zMjpyZXNvdXJjZT48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9hcHAvcmVzdCI+PG5zMjptZXRob2QgaWQ9InNlcnZlUm9vdCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjxuczI6cmVzb3VyY2UgcGF0aD0iL3ZlcnNpb24iPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUFwaVZlcnNpb24iIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48L25zMjpyZXNvdXJjZT48bnMyOnJlc291cmNlIHBhdGg9Ii9pbmZvIj48bnMyOm1ldGhvZCBpZD0ic2VydmVQbHVnaW5JbmZvIiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJwbHVnaW4iIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3twcm9qZWN0TG9jYXRvcn0ve2J0TG9jYXRvcn0ve2J1aWxkTG9jYXRvcn0ve2ZpZWxkfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImZpZWxkIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm9qZWN0TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJidWlsZExvY2F0b3IiIHN0eWxlPSJ0ZW1wbGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+PG5zMjptZXRob2QgaWQ9InNlcnZlQnVpbGRGaWVsZFNob3J0IiBuYW1lPSJHRVQiPjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PG5zMjpyZXNvdXJjZSBwYXRoPSIvYXBwL3Jlc3QvYWdlbnRzIj48bnMyOm1ldGhvZCBpZD0ic2VydmVBZ2VudHMiIG5hbWU9IkdFVCI+PG5zMjpyZXF1ZXN0PjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJpbmNsdWRlRGlzY29ubmVjdGVkIiBzdHlsZT0icXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iaW5jbHVkZVVuYXV0aG9yaXplZCIgc3R5bGU9InF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIi8+PC9uczI6cmVxdWVzdD48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnRzLXJlZiIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz48bnMyOnJlcHJlc2VudGF0aW9uIGVsZW1lbnQ9ImFnZW50cy1yZWYiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vanNvbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOnJlc291cmNlIHBhdGg9Ii97YWdlbnRMb2NhdG9yfSI+PG5zMjpwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFnZW50TG9jYXRvciIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOm1ldGhvZCBpZD0ic2VydmVBZ2VudCIgbmFtZT0iR0VUIj48bnMyOnJlc3BvbnNlPjxuczI6cmVwcmVzZW50YXRpb24gZWxlbWVudD0iYWdlbnQiIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+PG5zMjpyZXByZXNlbnRhdGlvbiBlbGVtZW50PSJhZ2VudCIgbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi9qc29uIi8+PC9uczI6cmVzcG9uc2U+PC9uczI6bWV0aG9kPjwvbnMyOnJlc291cmNlPjxuczI6cmVzb3VyY2UgcGF0aD0iL3thZ2VudExvY2F0b3J9L3tmaWVsZH0iPjxuczI6cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJmaWVsZCIgc3R5bGU9InRlbXBsYXRlIiB0eXBlPSJ4czpzdHJpbmciLz48bnMyOnBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYWdlbnRMb2NhdG9yIiBzdHlsZT0idGVtcGxhdGUiIHR5cGU9InhzOnN0cmluZyIvPjxuczI6bWV0aG9kIGlkPSJzZXJ2ZUFnZW50RmllbGQiIG5hbWU9IkdFVCI+PG5zMjpyZXNwb25zZT48bnMyOnJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPjwvbnMyOnJlc3BvbnNlPjwvbnMyOm1ldGhvZD48bnMyOm1ldGhvZCBpZD0ic2V0QWdlbnRGaWVsZCIgbmFtZT0iUFVUIj48bnMyOnJlcXVlc3Q+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXF1ZXN0PjxuczI6cmVzcG9uc2U+PG5zMjpyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLz48L25zMjpyZXNwb25zZT48L25zMjptZXRob2Q+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2U+PC9uczI6cmVzb3VyY2VzPjwvbnMyOmFwcGxpY2F0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL3N0b3JhZ2UudmVyc2lvbiBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvcGFyZW50RmlsZXMvcGFyZW50RGlyL3N0b3JhZ2UudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODI2M2VlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy9wYXJlbnRGaWxlcy9wYXJlbnREaXIvc3RvcmFnZS52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL2ZpbGUxLmphci50b3JyZW50IGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMS5qYXIudG9ycmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY5NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMS5qYXIudG9ycmVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL2ZpbGUyLmphci50b3JyZW50IGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMi5qYXIudG9ycmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWQzYTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9maWxlMi5qYXIudG9ycmVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL3BhcmVudERpci5saW51eC50b3JyZW50IGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIubGludXgudG9ycmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTRjZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3Rlc3RzL3NyYy90ZXN0L3Jlc291cmNlcy90b3JyZW50cy9wYXJlbnREaXIubGludXgudG9ycmVudApAQCAtMCwwICsxIEBACitkODphbm5vdW5jZTMwOmh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZTEwOmNyZWF0ZWQgYnk1OlRlc3QyMTM6Y3JlYXRpb24gZGF0ZWkxMzc2MDUxMDAwZTQ6aW5mb2Q1OmZpbGVzbGQ2Omxlbmd0aGkyNTI3ODhlNDpwYXRobDE3OkFjY3VSZXZDb21tb24uamFyZWVkNjpsZW5ndGhpMTg4OTEwZTQ6cGF0aGwyMzpjb21tb25zLWlvLWNpbzIuNV8zLmphcmVlZDY6bGVuZ3RoaTI0MGU0OnBhdGhsMjg6Y29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGlua2VlZDY6bGVuZ3RoaTgyMjk3ZTQ6cGF0aGw1OmluRGlyMTY6YXBwbGljYXRpb24ud2FkbGVlZDY6bGVuZ3RoaTFlNDpwYXRobDE1OnN0b3JhZ2UudmVyc2lvbmVlZTQ6bmFtZTk6cGFyZW50RGlyMTI6cGllY2UgbGVuZ3RoaTUyNDI4OGU2OnBpZWNlczIwOp4GTtxKvk3YPfuh0V1/i3ZipqM2ZWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL3BhcmVudERpci53aW4udG9ycmVudCBiL3R0b3JyZW50LW1hc3Rlci90ZXN0cy9zcmMvdGVzdC9yZXNvdXJjZXMvdG9ycmVudHMvcGFyZW50RGlyLndpbi50b3JyZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDI5MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdGVzdHMvc3JjL3Rlc3QvcmVzb3VyY2VzL3RvcnJlbnRzL3BhcmVudERpci53aW4udG9ycmVudApAQCAtMCwwICsxIEBACitkODphbm5vdW5jZTMwOmh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZTEwOmNyZWF0ZWQgYnk1OlRlc3QyMTM6Y3JlYXRpb24gZGF0ZWkxMzc2MDUxMDAwZTQ6aW5mb2Q1OmZpbGVzbGQ2Omxlbmd0aGkyNTI3ODhlNDpwYXRobDE3OkFjY3VSZXZDb21tb24uamFyZWVkNjpsZW5ndGhpMTg4OTEwZTQ6cGF0aGwyMzpjb21tb25zLWlvLWNpbzIuNV8zLmphcmVlZDY6bGVuZ3RoaTI0MWU0OnBhdGhsMjg6Y29tbW9ucy1pby1jaW8yLjVfMy5qYXIubGlua2VlZDY6bGVuZ3RoaTgyMzA1ZTQ6cGF0aGw1OmluRGlyMTY6YXBwbGljYXRpb24ud2FkbGVlZDY6bGVuZ3RoaTFlNDpwYXRobDE1OnN0b3JhZ2UudmVyc2lvbmVlZTQ6bmFtZTk6cGFyZW50RGlyMTI6cGllY2UgbGVuZ3RoaTUyNDI4OGU2OnBpZWNlczIwOlR2aGTpXvnNdpecpH3v2ksSF0axZWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3BvbS54bWwgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NTUxNQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvcG9tLnhtbApAQCAtMCwwICsxLDQ2IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLnR1cm48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8bmFtZT50dG9ycmVudC9jbGllbnQ8L25hbWU+CisgICAgPHVybD5odHRwOi8vdHVybi5naXRodWIuY29tL3R0b3JyZW50LzwvdXJsPgorICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWJlbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LW5ldHdvcms8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdGVzdC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbkltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQW5ub3VuY2VhYmxlSW5mb3JtYXRpb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmMGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQW5ub3VuY2VhYmxlSW5mb3JtYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIEFubm91bmNlYWJsZUluZm9ybWF0aW9uSW1wbCBpbXBsZW1lbnRzIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHsKKworICBwcml2YXRlIGZpbmFsIGxvbmcgdXBsb2FkZWQ7CisgIHByaXZhdGUgZmluYWwgbG9uZyBkb3dubG9hZGVkOworICBwcml2YXRlIGZpbmFsIGxvbmcgbGVmdDsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50SGFzaCB0b3JyZW50SGFzaDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VVcmxzOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbm5vdW5jZTsKKworICBwdWJsaWMgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb25JbXBsKGxvbmcgdXBsb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3dubG9hZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SGFzaCB0b3JyZW50SGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VVcmxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbm5vdW5jZSkgeworICAgIHRoaXMudXBsb2FkZWQgPSB1cGxvYWRlZDsKKyAgICB0aGlzLmRvd25sb2FkZWQgPSBkb3dubG9hZGVkOworICAgIHRoaXMubGVmdCA9IGxlZnQ7CisgICAgdGhpcy50b3JyZW50SGFzaCA9IHRvcnJlbnRIYXNoOworICAgIHRoaXMuYW5ub3VuY2VVcmxzID0gYW5ub3VuY2VVcmxzOworICAgIHRoaXMuYW5ub3VuY2UgPSBhbm5vdW5jZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRVcGxvYWRlZCgpIHsKKyAgICByZXR1cm4gdXBsb2FkZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGxvbmcgZ2V0RG93bmxvYWRlZCgpIHsKKyAgICByZXR1cm4gZG93bmxvYWRlZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRMZWZ0KCkgeworICAgIHJldHVybiBsZWZ0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0QW5ub3VuY2VMaXN0KCkgeworICAgIHJldHVybiBhbm5vdW5jZVVybHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRBbm5vdW5jZSgpIHsKKyAgICByZXR1cm4gYW5ub3VuY2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gdG9ycmVudEhhc2guZ2V0SW5mb0hhc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleEluZm9IYXNoKCkgeworICAgIHJldHVybiB0b3JyZW50SGFzaC5nZXRIZXhJbmZvSGFzaCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJhbm5vdW5jZWFibGUgdG9ycmVudCAiICsgdG9ycmVudEhhc2guZ2V0SGV4SW5mb0hhc2goKSArICIgZm9yIHRyYWNrZXJzICIgKyBhbm5vdW5jZVVybHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ2xpZW50U3RhdGUuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ2xpZW50U3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjYxMDZlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9DbGllbnRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitwdWJsaWMgZW51bSBDbGllbnRTdGF0ZSB7CisgIFdBSVRJTkcsCisgIFZBTElEQVRJTkcsCisgIFNIQVJJTkcsCisgIFNFRURJTkcsCisgIEVSUk9SLAorICBET05FCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbW11bmljYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlN2VkMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ29tbXVuaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDg2NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKiA8cD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlLio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcmsuQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrLk91dGdvaW5nQ29ubmVjdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrLlN0YXRlQ2hhbm5lbExpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlBlZXJBY3Rpdml0eUxpc3RlbmVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLkZpbGVDb2xsZWN0aW9uU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5QaWVjZVN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uKjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuUGVlck1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay4qOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IHN0YXRpYyBjb20udHVybi50dG9ycmVudC5Db25zdGFudHMuREVGQVVMVF9TT0NLRVRfQ09OTkVDVElPTl9USU1FT1VUX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50Lio7CisKKy8qKgorICogQSBwdXJlLWphdmEgQml0VG9ycmVudCBjbGllbnQuCisgKiA8cC8+CisgKiA8cD4KKyAqIEEgQml0VG9ycmVudCBjbGllbnQgaW4gaXRzIGJhcmUgZXNzZW5jZSBzaGFyZXMgYSBnaXZlbiB0b3JyZW50LiBJZiB0aGUKKyAqIHRvcnJlbnQgaXMgbm90IGNvbXBsZXRlIGxvY2FsbHksIGl0IHdpbGwgY29udGludWUgdG8gZG93bmxvYWQgaXQuIElmIG9yCisgKiBhZnRlciB0aGUgdG9ycmVudCBpcyBjb21wbGV0ZSwgdGhlIGNsaWVudCBtYXkgZXZlbnR1YWxseSBjb250aW51ZSB0byBzZWVkIGl0CisgKiBmb3Igb3RoZXIgY2xpZW50cy4KKyAqIDwvcD4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhpcyBCaXRUb3JyZW50IGNsaWVudCBpbXBsZW1lbnRhdGlvbiBpcyBtYWRlIHRvIGJlIHNpbXBsZSB0byBlbWJlZCBhbmQKKyAqIHNpbXBsZSB0byB1c2UuIEZpcnN0LCBpbml0aWFsaXplIGEgU2hhcmVUb3JyZW50IG9iamVjdCBmcm9tIGEgdG9ycmVudAorICogbWV0YS1pbmZvIHNvdXJjZSAoZWl0aGVyIGEgZmlsZSBvciBhIGJ5dGUgYXJyYXksIHNlZQorICogY29tLnR1cm4udHRvcnJlbnQuU2hhcmVkVG9ycmVudCBmb3IgaG93IHRvIGNyZWF0ZSBhIFNoYXJlZFRvcnJlbnQgb2JqZWN0KS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqCisgKiDlrp7njrDku450b3JyZW505YWD5L+h5oGv5rqQ77yI5paH5Lu25oiW5a2X6IqC5pWw57uE5Z2H5Y+v77yJ5Yid5aeL5YyW5LiA5LiqIFNoYXJlVG9ycmVudCDlr7nosaHjgIIKKyAqLworcHVibGljIGNsYXNzIENvbW11bmljYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyLCBQZWVyQWN0aXZpdHlMaXN0ZW5lciwgQ29udGV4dCwgQ29ubmVjdGlvbk1hbmFnZXJDb250ZXh0IHsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tbXVuaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJVFRPUlJFTlRfSURfUFJFRklYID0gIi1UTzAwNDItIjsKKworICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gc3RvcCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICBwcml2YXRlIEFubm91bmNlIGFubm91bmNlOworCisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBteVN0YXJ0ZWQgPSBmYWxzZTsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50TG9hZGVyIG15VG9ycmVudExvYWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50c1N0b3JhZ2UgdG9ycmVudHNTdG9yYWdlOworICBwcml2YXRlIGZpbmFsIENvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlciBteUluQ29ubmVjdGlvbkFsbG93ZXI7CisgIHByaXZhdGUgZmluYWwgQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyIG15T3V0Q29ubmVjdGlvbkFsbG93ZXI7CisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBteVNlbmRCdWZmZXJTaXplOworICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbXlSZWNlaXZlQnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBmaW5hbCBQZWVyc1N0b3JhZ2UgcGVlcnNTdG9yYWdlOworICBwcml2YXRlIHZvbGF0aWxlIENvbm5lY3Rpb25NYW5hZ2VyIG15Q29ubmVjdGlvbk1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIG15RXhlY3V0b3JTZXJ2aWNlOworICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBteVBpZWNlVmFsaWRhdG9yRXhlY3V0b3I7CisKKyAgLyoqCisgICAqIEBwYXJhbSB3b3JraW5nRXhlY3V0b3IgICAgICAgIGV4ZWN1dG9yIHNlcnZpY2UgZm9yIHJ1biBjb25uZWN0aW9uIHdvcmtlciBhbmQgcHJvY2VzcyBpbmNvbWluZyBkYXRhLiBNdXN0IGhhdmUgYSBwb29sIHNpemUgYXQgbGVhc3QgMgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlpITnkIbov57mjqXnm7jlhbMg5bu656uL5p2l5Yed57uT77yM5o6l5pS25aSE55CG5pWw5o2uCisgICAqIEBwYXJhbSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yIGV4ZWN1dG9yIHNlcnZpY2UgZm9yIGNhbGN1bGF0aW9uIHNoYTEgaGFzaGVzIG9mIGRvd25sb2FkZWQgcGllY2VzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOiuoeeul+S4i+i9veeJh+auteeahOWTiOW4jOWAvAorICAgKi8KKyAgcHVibGljIENvbW11bmljYXRpb25NYW5hZ2VyKEV4ZWN1dG9yU2VydmljZSB3b3JraW5nRXhlY3V0b3IsIEV4ZWN1dG9yU2VydmljZSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yKSB7CisgICAgdGhpcyh3b3JraW5nRXhlY3V0b3IsIHBpZWNlVmFsaWRhdG9yRXhlY3V0b3IsIG5ldyBUcmFja2VyQ2xpZW50RmFjdG9yeUltcGwoKSk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHdvcmtpbmdFeGVjdXRvciAgICAgICAgZXhlY3V0b3Igc2VydmljZSBmb3IgcnVuIGNvbm5lY3Rpb24gd29ya2VyIGFuZCBwcm9jZXNzIGluY29taW5nIGRhdGEuIE11c3QgaGF2ZSBhIHBvb2wgc2l6ZSBhdCBsZWFzdCAyCisgICAqIEBwYXJhbSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yIGV4ZWN1dG9yIHNlcnZpY2UgZm9yIGNhbGN1bGF0aW9uIHNoYTEgaGFzaGVzIG9mIGRvd25sb2FkZWQgcGllY2VzCisgICAqIEBwYXJhbSB0cmFja2VyQ2xpZW50RmFjdG9yeSAgIGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBpbnN0YW5jZXMgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0cmFja2VyCisgICAqLworICBwdWJsaWMgQ29tbXVuaWNhdGlvbk1hbmFnZXIoRXhlY3V0b3JTZXJ2aWNlIHdvcmtpbmdFeGVjdXRvciwgRXhlY3V0b3JTZXJ2aWNlIHBpZWNlVmFsaWRhdG9yRXhlY3V0b3IsIFRyYWNrZXJDbGllbnRGYWN0b3J5IHRyYWNrZXJDbGllbnRGYWN0b3J5KSB7CisgICAgdGhpcy5hbm5vdW5jZSA9IG5ldyBBbm5vdW5jZSh0aGlzLCB0cmFja2VyQ2xpZW50RmFjdG9yeSk7Ly8g6LSf6LSj5LqOdHJhY2tlcui/m+ihjOmAmuS/oeeahAorICAgIHRoaXMudG9ycmVudHNTdG9yYWdlID0gbmV3IFRvcnJlbnRzU3RvcmFnZSgpOy8vIHRvcnJlbnTmlofku7blrZjlgqgKKyAgICB0aGlzLnBlZXJzU3RvcmFnZSA9IG5ldyBQZWVyc1N0b3JhZ2UoKTsvLyDnu5PngrnlrZjlgqgKKyAgICB0aGlzLm15U2VuZEJ1ZmZlclNpemUgPSBuZXcgQXRvbWljSW50ZWdlcigpOy8vIOaVtOaVsCDlj5HpgIHlrZfoioLlpKflsI8KKyAgICB0aGlzLm15VG9ycmVudExvYWRlciA9IG5ldyBUb3JyZW50TG9hZGVySW1wbCh0aGlzLnRvcnJlbnRzU3RvcmFnZSk7Ly/lsIbliqDovb3nmoTnp43lrZDovazljJbkuLrliIbkuqvnmoTnp43lrZAKKyAgICB0aGlzLm15UmVjZWl2ZUJ1ZmZlclNpemUgPSBuZXcgQXRvbWljSW50ZWdlcigpOy8vIOaVtOaVsCDmjqXmlLblrZfoioLlpKflsI8KKyAgICB0aGlzLm15SW5Db25uZWN0aW9uQWxsb3dlciA9IG5ldyBDb3VudExpbWl0Q29ubmVjdGlvbkFsbG93ZXIocGVlcnNTdG9yYWdlKTsKKyAgICB0aGlzLm15T3V0Q29ubmVjdGlvbkFsbG93ZXIgPSBuZXcgQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyKHBlZXJzU3RvcmFnZSk7CisgICAgdGhpcy5teUV4ZWN1dG9yU2VydmljZSA9IHdvcmtpbmdFeGVjdXRvcjsKKyAgICBteVBpZWNlVmFsaWRhdG9yRXhlY3V0b3IgPSBwaWVjZVZhbGlkYXRvckV4ZWN1dG9yOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgdG9ycmVudCB0byBzdG9yYWdlLCB2YWxpZGF0ZSBkb3dubG9hZGVkIGZpbGVzIGFuZCBzdGFydCBzZWVkaW5nIGFuZCBsZWVjaGluZyB0aGUgdG9ycmVudAorICAgKgorICAgKiBAcGFyYW0gZG90VG9ycmVudEZpbGVQYXRoIHBhdGggdG8gdG9ycmVudCBtZXRhZGF0YSBmaWxlCisgICAqIEBwYXJhbSBkb3dubG9hZERpclBhdGggICAgcGF0aCB0byBkaXJlY3Rvcnkgd2hlcmUgZG93bmxvYWRlZCBmaWxlcyBhcmUgcGxhY2VkCisgICAqIEByZXR1cm4ge0BsaW5rIFRvcnJlbnRNYW5hZ2VyfSBpbnN0YW5jZSBmb3IgbW9uaXRvcmluZyB0b3JyZW50IHN0YXRlCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSU8gZXJyb3Igb2NjdXJzIGluIHJlYWRpbmcgbWV0YWRhdGEgZmlsZQorICAgKi8KKyAgLy/pgJrov4fnlKjmiLfmj5DkvpvnmoTnp43lrZDmlofku7bot6/lvoTvvIhkb3RUb3JyZW50RmlsZVBhdGjvvInmnaXmt7vliqDnp43lrZDliLDlrZjlgqjkuK0KKyAgLy/lubblsIbkuIvovb3nmoTmlofku7bkv53lrZjliLDmjIflrprnmoTmnKzlnLDnm67lvZXvvIhkb3dubG9hZERpclBhdGjvvInjgIIKKyAgcHVibGljIFRvcnJlbnRNYW5hZ2VyIGFkZFRvcnJlbnQoU3RyaW5nIGRvdFRvcnJlbnRGaWxlUGF0aCwgU3RyaW5nIGRvd25sb2FkRGlyUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYWRkVG9ycmVudChkb3RUb3JyZW50RmlsZVBhdGgsIGRvd25sb2FkRGlyUGF0aCwgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgdG9ycmVudCB0byBzdG9yYWdlIHdpdGggc3BlY2lmaWVkIGxpc3RlbmVycywgdmFsaWRhdGUgZG93bmxvYWRlZCBmaWxlcyBhbmQgc3RhcnQgc2VlZGluZyBhbmQgbGVlY2hpbmcgdGhlIHRvcnJlbnQKKyAgICoKKyAgICogQHBhcmFtIGRvdFRvcnJlbnRGaWxlUGF0aCBwYXRoIHRvIHRvcnJlbnQgbWV0YWRhdGEgZmlsZQorICAgKiBAcGFyYW0gZG93bmxvYWREaXJQYXRoICAgIHBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIGRvd25sb2FkZWQgZmlsZXMgYXJlIHBsYWNlZAorICAgKiBAcGFyYW0gbGlzdGVuZXJzICAgICAgICAgIHNwZWNpZmllZCBsaXN0ZW5lcnMKKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1hbmFnZXJ9IGluc3RhbmNlIGZvciBtb25pdG9yaW5nIHRvcnJlbnQgc3RhdGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBJTyBlcnJvciBvY2N1cnMgaW4gcmVhZGluZyBtZXRhZGF0YSBmaWxlCisgICAqLworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgYWRkVG9ycmVudChTdHJpbmcgZG90VG9ycmVudEZpbGVQYXRoLCBTdHJpbmcgZG93bmxvYWREaXJQYXRoLCBMaXN0PFRvcnJlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBhZGRUb3JyZW50KGRvdFRvcnJlbnRGaWxlUGF0aCwgZG93bmxvYWREaXJQYXRoLCBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRSwgbGlzdGVuZXJzKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRvcnJlbnQgdG8gc3RvcmFnZSB3aXRoIHNwZWNpZmllZCB7QGxpbmsgUGllY2VTdG9yYWdlRmFjdG9yeX0uCisgICAqIEl0IGNhbiBiZSB1c2VkIGZvciBza2lwcGluZyBpbml0aWFsIHZhbGlkYXRpb24gb2YgZGF0YQorICAgKgorICAgKiBAcGFyYW0gZG90VG9ycmVudEZpbGVQYXRoIHBhdGggdG8gdG9ycmVudCBtZXRhZGF0YSBmaWxlCisgICAqIEBwYXJhbSBkb3dubG9hZERpclBhdGggICAgcGF0aCB0byBkaXJlY3Rvcnkgd2hlcmUgZG93bmxvYWRlZCBmaWxlcyBhcmUgcGxhY2VkCisgICAqIEBwYXJhbSBwaWVjZVN0b3JhZ2VGYWN0b3J5IGZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBQaWVjZVN0b3JhZ2V9LgorICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50TWFuYWdlcn0gaW5zdGFuY2UgZm9yIG1vbml0b3JpbmcgdG9ycmVudCBzdGF0ZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIGVycm9yIG9jY3VycyBpbiByZWFkaW5nIG1ldGFkYXRhIGZpbGUKKyAgICovCisgIHB1YmxpYyBUb3JyZW50TWFuYWdlciBhZGRUb3JyZW50KFN0cmluZyBkb3RUb3JyZW50RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb3dubG9hZERpclBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpZWNlU3RvcmFnZUZhY3RvcnkgcGllY2VTdG9yYWdlRmFjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYWRkVG9ycmVudChkb3RUb3JyZW50RmlsZVBhdGgsIGRvd25sb2FkRGlyUGF0aCwgcGllY2VTdG9yYWdlRmFjdG9yeSwgQ29sbGVjdGlvbnMuPFRvcnJlbnRMaXN0ZW5lcj5lbXB0eUxpc3QoKSk7CisgIH0KKworICAvKioKKyAgICogQWRkcyB0b3JyZW50IHRvIHN0b3JhZ2Ugd2l0aCBzcGVjaWZpZWQge0BsaW5rIFBpZWNlU3RvcmFnZUZhY3Rvcnl9LgorICAgKiBJdCBjYW4gYmUgdXNlZCBmb3Igc2tpcHBpbmcgaW5pdGlhbCB2YWxpZGF0aW9uIG9mIGRhdGEKKyAgICoKKyAgICogQHBhcmFtIGRvdFRvcnJlbnRGaWxlUGF0aCBwYXRoIHRvIHRvcnJlbnQgbWV0YWRhdGEgZmlsZQorICAgKiBAcGFyYW0gZG93bmxvYWREaXJQYXRoICAgIHBhdGggdG8gZGlyZWN0b3J5IHdoZXJlIGRvd25sb2FkZWQgZmlsZXMgYXJlIHBsYWNlZAorICAgKiBAcGFyYW0gcGllY2VTdG9yYWdlRmFjdG9yeSBmYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgUGllY2VTdG9yYWdlfS4KKyAgICogQHJldHVybiB7QGxpbmsgVG9ycmVudE1hbmFnZXJ9IGluc3RhbmNlIGZvciBtb25pdG9yaW5nIHRvcnJlbnQgc3RhdGUKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBJTyBlcnJvciBvY2N1cnMgaW4gcmVhZGluZyBtZXRhZGF0YSBmaWxlCisgICAqLworICBwdWJsaWMgVG9ycmVudE1hbmFnZXIgYWRkVG9ycmVudChTdHJpbmcgZG90VG9ycmVudEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG93bmxvYWREaXJQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZVN0b3JhZ2VGYWN0b3J5IHBpZWNlU3RvcmFnZUZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VG9ycmVudExpc3RlbmVyPiBsaXN0ZW5lcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgRmlsZU1ldGFkYXRhUHJvdmlkZXIgbWV0YWRhdGFQcm92aWRlciA9IG5ldyBGaWxlTWV0YWRhdGFQcm92aWRlcihkb3RUb3JyZW50RmlsZVBhdGgpOworICAgIFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSA9IG1ldGFkYXRhUHJvdmlkZXIuZ2V0VG9ycmVudE1ldGFkYXRhKCk7CisgICAgRmlsZUNvbGxlY3Rpb25TdG9yYWdlIGZpbGVDb2xsZWN0aW9uU3RvcmFnZSA9IEZpbGVDb2xsZWN0aW9uU3RvcmFnZS5jcmVhdGUobWV0YWRhdGEsIG5ldyBGaWxlKGRvd25sb2FkRGlyUGF0aCkpOworICAgIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UgPSBwaWVjZVN0b3JhZ2VGYWN0b3J5LmNyZWF0ZVN0b3JhZ2UobWV0YWRhdGEsIGZpbGVDb2xsZWN0aW9uU3RvcmFnZSk7CisgICAgcmV0dXJuIGFkZFRvcnJlbnQobWV0YWRhdGFQcm92aWRlciwgcGllY2VTdG9yYWdlLCBsaXN0ZW5lcnMpOworICB9CisKKyAgLyoqCisgICAqIEFkZHMgdG9ycmVudCB0byBzdG9yYWdlIHdpdGggYW55IHN0b3JhZ2UgYW5kIG1ldGFkYXRhIHNvdXJjZQorICAgKgorICAgKiBAcGFyYW0gbWV0YWRhdGFQcm92aWRlciBzcGVjaWZpZWQgbWV0YWRhdGEgc291cmNlCisgICAqIEBwYXJhbSBwaWVjZVN0b3JhZ2UgICAgIHNwZWNpZmllZCBzdG9yYWdlIG9mIHBpZWNlcworICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50TWFuYWdlcn0gaW5zdGFuY2UgZm9yIG1vbml0b3JpbmcgdG9ycmVudCBzdGF0ZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIGVycm9yIG9jY3VycyBpbiByZWFkaW5nIG1ldGFkYXRhIGZpbGUKKyAgICovCisgIHB1YmxpYyBUb3JyZW50TWFuYWdlciBhZGRUb3JyZW50KFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXIsIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFkZFRvcnJlbnQobWV0YWRhdGFQcm92aWRlciwgcGllY2VTdG9yYWdlLCBDb2xsZWN0aW9ucy48VG9ycmVudExpc3RlbmVyPmVtcHR5TGlzdCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBBZGRzIHRvcnJlbnQgdG8gc3RvcmFnZSB3aXRoIGFueSBzdG9yYWdlLCBtZXRhZGF0YSBzb3VyY2UgYW5kIHNwZWNpZmllZCBsaXN0ZW5lcnMKKyAgICoKKyAgICogQHBhcmFtIG1ldGFkYXRhUHJvdmlkZXIgc3BlY2lmaWVkIG1ldGFkYXRhIHNvdXJjZQorICAgKiBAcGFyYW0gcGllY2VTdG9yYWdlICAgICBzcGVjaWZpZWQgc3RvcmFnZSBvZiBwaWVjZXMKKyAgICogQHBhcmFtIGxpc3RlbmVycyAgICAgICAgc3BlY2lmaWVkIGxpc3RlbmVycworICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50TWFuYWdlcn0gaW5zdGFuY2UgZm9yIG1vbml0b3JpbmcgdG9ycmVudCBzdGF0ZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIGVycm9yIG9jY3VycyBpbiByZWFkaW5nIG1ldGFkYXRhIGZpbGUKKyAgICovCisgIHB1YmxpYyBUb3JyZW50TWFuYWdlciBhZGRUb3JyZW50KFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8VG9ycmVudExpc3RlbmVyPiBsaXN0ZW5lcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSA9IG1ldGFkYXRhUHJvdmlkZXIuZ2V0VG9ycmVudE1ldGFkYXRhKCk7CisgICAgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKyAgICBmb3IgKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgZXZlbnREaXNwYXRjaGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisgICAgZmluYWwgTG9hZGVkVG9ycmVudEltcGwgbG9hZGVkVG9ycmVudCA9IG5ldyBMb2FkZWRUb3JyZW50SW1wbCgKKyAgICAgICAgICAgIG5ldyBUb3JyZW50U3RhdGlzdGljKCksCisgICAgICAgICAgICBtZXRhZGF0YVByb3ZpZGVyLAorICAgICAgICAgICAgdG9ycmVudE1ldGFkYXRhLAorICAgICAgICAgICAgcGllY2VTdG9yYWdlLAorICAgICAgICAgICAgZXZlbnREaXNwYXRjaGVyKTsKKworICAgIGlmIChwaWVjZVN0b3JhZ2UuaXNGaW5pc2hlZCgpKSB7CisgICAgICBsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRTdGF0aXN0aWMoKS5zZXRMZWZ0KDApOworICAgIH0gZWxzZSB7CisgICAgICBsb25nIGxlZnQgPSBjYWxjdWxhdGVMZWZ0KHBpZWNlU3RvcmFnZSwgdG9ycmVudE1ldGFkYXRhKTsKKyAgICAgIGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudFN0YXRpc3RpYygpLnNldExlZnQobGVmdCk7CisgICAgfQorICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnZhbGlkYXRpb25Db21wbGV0ZShwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwgdG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkpOworCisgICAgdGhpcy50b3JyZW50c1N0b3JhZ2UuYWRkVG9ycmVudChsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRIYXNoKCkuZ2V0SGV4SW5mb0hhc2goKSwgbG9hZGVkVG9ycmVudCk7CisgICAgZm9yY2VBbm5vdW5jZUFuZExvZ0Vycm9yKGxvYWRlZFRvcnJlbnQsIHBpZWNlU3RvcmFnZS5pc0ZpbmlzaGVkKCkgPyBDT01QTEVURUQgOiBTVEFSVEVEKTsKKyAgICBsb2dnZXIuZGVidWcoU3RyaW5nLmZvcm1hdCgiQWRkZWQgdG9ycmVudCAlcyAoJXMpIiwgbG9hZGVkVG9ycmVudCwgbG9hZGVkVG9ycmVudC5nZXRUb3JyZW50SGFzaCgpLmdldEhleEluZm9IYXNoKCkpKTsKKyAgICByZXR1cm4gbmV3IFRvcnJlbnRNYW5hZ2VySW1wbChldmVudERpc3BhdGNoZXIsIGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudEhhc2goKSk7CisgICAgLy9hZGR0b3JyZW505pyA57uI6L+U5Zue55qE5pWw5o2uCisgIH0KKworICAvLyDorqHnrpfliankvZnlpKflsI/vvIzkuI3nlKjnrqEKKyAgcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUxlZnQoUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZSwgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSkgeworCisgICAgbG9uZyBzaXplID0gMDsKKyAgICBmb3IgKFRvcnJlbnRGaWxlIHRvcnJlbnRGaWxlIDogdG9ycmVudE1ldGFkYXRhLmdldEZpbGVzKCkpIHsKKyAgICAgIHNpemUgKz0gdG9ycmVudEZpbGUuc2l6ZTsKKyAgICB9CisKKyAgICBpbnQgcGllY2VMZW5ndGggPSB0b3JyZW50TWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKTsKKyAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpOyBpKyspIHsKKyAgICAgIGlmIChhdmFpbGFibGVQaWVjZXMuZ2V0KGkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IE1hdGgubWluKHBpZWNlTGVuZ3RoLCBzaXplIC0gaSAqIHBpZWNlTGVuZ3RoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBmb3JjZUFubm91bmNlQW5kTG9nRXJyb3IoTG9hZGVkVG9ycmVudCB0b3JyZW50LCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCkgeworICAgIHRyeSB7CisgICAgICB0aGlzLmFubm91bmNlLmZvcmNlQW5ub3VuY2UodG9ycmVudC5jcmVhdGVBbm5vdW5jZWFibGVJbmZvcm1hdGlvbigpLCB0aGlzLCBldmVudCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLndhcm4oInVuYWJsZSB0byBmb3JjZSBhbm5vdW5jZSB0b3JyZW50IHt9IiwgdG9ycmVudCk7CisgICAgICBsb2dnZXIuZGVidWcoIiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIHNwZWNpZmllZCB0b3JyZW50IGZyb20gc3RvcmFnZS4KKyAgICoKKyAgICogQHBhcmFtIHRvcnJlbnRIYXNoIHNwZWNpZmllZCB0b3JyZW50IGhhc2gKKyAgICovCisKKyAgLy/np7vpmaTku7vliqEKKyAgcHVibGljIHZvaWQgcmVtb3ZlVG9ycmVudChTdHJpbmcgdG9ycmVudEhhc2gpIHsKKyAgICBsb2dnZXIuZGVidWcoIlN0b3BwaW5nIHNlZWRpbmcgIiArIHRvcnJlbnRIYXNoKTsKKyAgICBmaW5hbCBQYWlyPFNoYXJlZFRvcnJlbnQsIExvYWRlZFRvcnJlbnQ+IHRvcnJlbnRzID0gdG9ycmVudHNTdG9yYWdlLnJlbW92ZSh0b3JyZW50SGFzaCk7CisKKyAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQgPSB0b3JyZW50cy5maXJzdCgpOworICAgIGlmICh0b3JyZW50ICE9IG51bGwpIHsKKyAgICAgIHRvcnJlbnQuc2V0Q2xpZW50U3RhdGUoQ2xpZW50U3RhdGUuRE9ORSk7CisgICAgICB0b3JyZW50LmNsb3NlRnVsbHkoKTsKKyAgICB9CisgICAgTGlzdDxTaGFyaW5nUGVlcj4gcGVlcnMgPSBnZXRQZWVyc0ZvclRvcnJlbnQodG9ycmVudEhhc2gpOworICAgIGZvciAoU2hhcmluZ1BlZXIgcGVlciA6IHBlZXJzKSB7CisgICAgICBwZWVyLnVuYmluZCh0cnVlKTsKKyAgICB9CisgICAgc2VuZFN0b3BFdmVudCh0b3JyZW50cy5zZWNvbmQoKSwgdG9ycmVudEhhc2gpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRTdG9wRXZlbnQoTG9hZGVkVG9ycmVudCBsb2FkZWRUb3JyZW50LCBTdHJpbmcgdG9ycmVudEhhc2gpIHsKKyAgICBpZiAobG9hZGVkVG9ycmVudCA9PSBudWxsKSB7CisgICAgICBsb2dnZXIuaW5mbygiQW5ub3VuY2VhYmxlIHRvcnJlbnQge30gbm90IGZvdW5kIGluIHN0b3JhZ2UgYWZ0ZXIgdW5zdWNjZXNzZnVsIGRvd25sb2FkIGF0dGVtcHQiLCB0b3JyZW50SGFzaCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvcmNlQW5ub3VuY2VBbmRMb2dFcnJvcihsb2FkZWRUb3JyZW50LCBTVE9QUEVEKTsKKyAgfQorCisgIC8qKgorICAgKiBzZXQgc3BlY2lmaWVkIGFubm91bmNlIGludGVydmFsIGJldHdlZW4gcmVxdWVzdHMgdG8gdGhlIHRyYWNrZXIKKyAgICoKKyAgICogQHBhcmFtIGFubm91bmNlSW50ZXJ2YWwgYW5ub3VuY2UgaW50ZXJ2YWwgaW4gc2Vjb25kcworICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QW5ub3VuY2VJbnRlcnZhbChmaW5hbCBpbnQgYW5ub3VuY2VJbnRlcnZhbCkgeworICAgIGFubm91bmNlLnNldEFubm91bmNlSW50ZXJ2YWwoYW5ub3VuY2VJbnRlcnZhbCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSB0b3JyZW50IHRoaXMgY2xpZW50IGlzIGV4Y2hhbmdpbmcgb24uCisgICAqLworICBwdWJsaWMgQ29sbGVjdGlvbjxTaGFyZWRUb3JyZW50PiBnZXRUb3JyZW50cygpIHsKKyAgICByZXR1cm4gdGhpcy50b3JyZW50c1N0b3JhZ2UuYWN0aXZlVG9ycmVudHMoKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwdWJsaWMgVVJJIGdldERlZmF1bHRUcmFja2VyVVJJKCkgeworICAgIHJldHVybiBhbm5vdW5jZS5nZXREZWZhdWx0VHJhY2tlclVSSSgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHNldCBvZiBrbm93biBwZWVycy4KKyAgICovCisgIHB1YmxpYyBTZXQ8U2hhcmluZ1BlZXI+IGdldFBlZXJzKCkgeworICAgIHJldHVybiBuZXcgSGFzaFNldDxTaGFyaW5nUGVlcj4odGhpcy5wZWVyc1N0b3JhZ2UuZ2V0U2hhcmluZ1BlZXJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TWF4SW5Db25uZWN0aW9uc0NvdW50KGludCBtYXhDb25uZWN0aW9uc0NvdW50KSB7CisgICAgdGhpcy5teUluQ29ubmVjdGlvbkFsbG93ZXIuc2V0TXlNYXhDb25uZWN0aW9uQ291bnQobWF4Q29ubmVjdGlvbnNDb3VudCk7CisgIH0KKworICAvKioKKyAgICogc2V0IHVwcyBuZXcgcmVjZWl2ZSBidWZmZXIgc2l6ZSwgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIG5ldyBjb25uZWN0aW9ucy4KKyAgICogSWYgdmFsdWUgaXMgZXF1YWwgb3IgbGVzcywgdGhhbiB6ZXJvLCB0aGVuIG1ldGhvZCBkb2Vzbid0IGhhdmUgZWZmZWN0CisgICAqCisgICAqIEBwYXJhbSBuZXdTaXplIG5ldyBzaXplCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlQnVmZmVyU2l6ZShpbnQgbmV3U2l6ZSkgeworICAgIG15UmVjZWl2ZUJ1ZmZlclNpemUuc2V0KG5ld1NpemUpOworICB9CisKKyAgLyoqCisgICAqIHNldCB1cHMgbmV3IHNlbmQgYnVmZmVyIHNpemUsIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBuZXcgY29ubmVjdGlvbnMuCisgICAqIElmIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MsIHRoYW4gemVybywgdGhlbiBtZXRob2QgZG9lc24ndCBoYXZlIGVmZmVjdAorICAgKgorICAgKiBAcGFyYW0gbmV3U2l6ZSBuZXcgc2l6ZQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0U2VuZEJ1ZmZlclNpemUoaW50IG5ld1NpemUpIHsKKyAgICBteVNlbmRCdWZmZXJTaXplLnNldChuZXdTaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE1heE91dENvbm5lY3Rpb25zQ291bnQoaW50IG1heENvbm5lY3Rpb25zQ291bnQpIHsKKyAgICB0aGlzLm15T3V0Q29ubmVjdGlvbkFsbG93ZXIuc2V0TXlNYXhDb25uZWN0aW9uQ291bnQobWF4Q29ubmVjdGlvbnNDb3VudCk7CisgIH0KKworICAvKioKKyAgICogUnVucyBjbGllbnQgaW5zdGFuY2UgYW5kIHN0YXJ0cyBhbm5vdW5jaW5nLCBzZWVkaW5nIGFuZCBkb3dubG9hZGluZyBvZiBhbGwgdG9ycmVudHMgZnJvbSBzdG9yYWdlCisgICAqCisgICAqIEBwYXJhbSBiaW5kQWRkcmVzc2VzIGxpc3Qgb2YgYWRkcmVzc2VzIHdoaWNoIGFyZSB1c2VkIGZvciBzZW5kaW5nIHRvIHRoZSB0cmFja2VyLiBDdXJyZW50IGNsaWVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGF2YWlsYWJsZSBmb3Igb3RoZXIgcGVlcnMgb24gdGhlIGFkZHJlc3NlcworICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBpbyBlcnJvciBvY2N1cnMKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEluZXRBZGRyZXNzLi4uIGJpbmRBZGRyZXNzZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnQoYmluZEFkZHJlc3NlcywgQ29uc3RhbnRzLkRFRkFVTFRfQU5OT1VOQ0VfSU5URVJWQUxfU0VDLCBudWxsLCBuZXcgU2VsZWN0b3JGYWN0b3J5SW1wbCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBSdW5zIGNsaWVudCBpbnN0YW5jZSBhbmQgc3RhcnRzIGFubm91bmNpbmcsIHNlZWRpbmcgYW5kIGRvd25sb2FkaW5nIG9mIGFsbCB0b3JyZW50cyBmcm9tIHN0b3JhZ2UKKyAgICoKKyAgICogQHBhcmFtIGJpbmRBZGRyZXNzZXMgICAgIGxpc3Qgb2YgYWRkcmVzc2VzIHdoaWNoIGFyZSB1c2VkIGZvciBzZW5kaW5nIHRvIHRoZSB0cmFja2VyLiBDdXJyZW50IGNsaWVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhdmFpbGFibGUgZm9yIG90aGVyIHBlZXJzIG9uIHRoZSBhZGRyZXNzZXMKKyAgICogQHBhcmFtIGRlZmF1bHRUcmFja2VyVVJJIGRlZmF1bHQgdHJhY2tlciBhZGRyZXNzLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHRvcnJlbnRzIHdpbGwgYmUgYW5ub3VuY2VkIG5vdCBvbmx5IG9uIHRoZSB0cmFja2VycyBmcm9tIG1ldGFkYXRhIGZpbGUgYnV0IGFsc28gdG8gdGhpcyB0cmFja2VyCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55IGlvIGVycm9yIG9jY3VycworICAgKi8KKyAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgSW5ldEFkZHJlc3NbXSBiaW5kQWRkcmVzc2VzLCBmaW5hbCBVUkkgZGVmYXVsdFRyYWNrZXJVUkkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnQoYmluZEFkZHJlc3NlcywgQ29uc3RhbnRzLkRFRkFVTFRfQU5OT1VOQ0VfSU5URVJWQUxfU0VDLCBkZWZhdWx0VHJhY2tlclVSSSwgbmV3IFNlbGVjdG9yRmFjdG9yeUltcGwoKSk7CisgIH0KKworICBwdWJsaWMgUGVlcltdIGdldFNlbGZQZWVycyhmaW5hbCBJbmV0QWRkcmVzc1tdIGJpbmRBZGRyZXNzZXMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBQZWVyIHNlbGYgPSBwZWVyc1N0b3JhZ2UuZ2V0U2VsZigpOworCisgICAgaWYgKHNlbGYgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG5ldyBQZWVyWzBdOworICAgIH0KKworICAgIFBlZXJbXSByZXN1bHQgPSBuZXcgUGVlcltiaW5kQWRkcmVzc2VzLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kQWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmaW5hbCBJbmV0QWRkcmVzcyBiaW5kQWRkcmVzcyA9IGJpbmRBZGRyZXNzZXNbaV07CisgICAgICBmaW5hbCBQZWVyIHBlZXIgPSBuZXcgUGVlcihuZXcgSW5ldFNvY2tldEFkZHJlc3MoYmluZEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSwgc2VsZi5nZXRQb3J0KCkpKTsKKyAgICAgIHBlZXIuc2V0VG9ycmVudEhhc2goc2VsZi5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIC8vaWYgd2UgaGF2ZSBtb3JlLCB0aGF0IG9uZSBiaW5kIGFkZHJlc3MsIHRoZW4gb25seSBmb3IgZmlyc3Qgc2V0IHNlbGYgcGVlciBpZC4gRm9yIG90aGVyIGdlbmVyYXRlIGl0CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIHBlZXIuc2V0UGVlcklkKHNlbGYuZ2V0UGVlcklkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gQ29tbXVuaWNhdGlvbk1hbmFnZXIuQklUVE9SUkVOVF9JRF9QUkVGSVggKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLnNwbGl0KCItIilbNF07CisgICAgICAgIGJ5dGVbXSBpZEJ5dGVzID0gaWQuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworICAgICAgICBwZWVyLnNldFBlZXJJZChCeXRlQnVmZmVyLndyYXAoaWRCeXRlcykpOworICAgICAgfQorICAgICAgcmVzdWx0W2ldID0gcGVlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSdW5zIGNsaWVudCBpbnN0YW5jZSBhbmQgc3RhcnRzIGFubm91bmNpbmcsIHNlZWRpbmcgYW5kIGRvd25sb2FkaW5nIG9mIGFsbCB0b3JyZW50cyBmcm9tIHN0b3JhZ2UKKyAgICoKKyAgICogQHBhcmFtIGJpbmRBZGRyZXNzZXMgICAgICAgbGlzdCBvZiBhZGRyZXNzZXMgd2hpY2ggYXJlIHVzZWQgZm9yIHNlbmRpbmcgdG8gdGhlIHRyYWNrZXIuIEN1cnJlbnQgY2xpZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYXZhaWxhYmxlIGZvciBvdGhlciBwZWVycyBvbiB0aGUgYWRkcmVzc2VzCisgICAqIEBwYXJhbSBhbm5vdW5jZUludGVydmFsU2VjIGRlZmF1bHQgYW5ub3VuY2UgaW50ZXJ2YWwuIFRoaXMgaW50ZXJ2YWwgY2FuIGJlIG92ZXJyaWRlIGJ5IHRyYWNrZXIKKyAgICogQHBhcmFtIGRlZmF1bHRUcmFja2VyVVJJICAgZGVmYXVsdCB0cmFja2VyIGFkZHJlc3MuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCB0b3JyZW50cyB3aWxsIGJlIGFubm91bmNlZCBub3Qgb25seSBvbiB0aGUgdHJhY2tlcnMgZnJvbSBtZXRhZGF0YSBmaWxlIGJ1dCBhbHNvIHRvIHRoaXMgdHJhY2tlcgorICAgKiBAcGFyYW0gc2VsZWN0b3JGYWN0b3J5ICAgICBmYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3J9IGluc3RhbmNlLgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBpbyBlcnJvciBvY2N1cnMKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEluZXRBZGRyZXNzW10gYmluZEFkZHJlc3NlcywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFubm91bmNlSW50ZXJ2YWxTZWMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSBkZWZhdWx0VHJhY2tlclVSSSwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VsZWN0b3JGYWN0b3J5IHNlbGVjdG9yRmFjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzdGFydChiaW5kQWRkcmVzc2VzLCBhbm5vdW5jZUludGVydmFsU2VjLCBkZWZhdWx0VHJhY2tlclVSSSwgc2VsZWN0b3JGYWN0b3J5LAorICAgICAgICAgICAgbmV3IEZpcnN0QXZhaWxhYmxlQ2hhbm5lbCg2ODgxLCA2ODg5KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBJbmV0QWRkcmVzc1tdIGJpbmRBZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhbm5vdW5jZUludGVydmFsU2VjLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgZGVmYXVsdFRyYWNrZXJVUkksCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdG9yRmFjdG9yeSBzZWxlY3RvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZlckNoYW5uZWxSZWdpc3RlciBzZXJ2ZXJDaGFubmVsUmVnaXN0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teUNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25NYW5hZ2VyKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIG5ldyBTeXN0ZW1UaW1lU2VydmljZSgpLAorICAgICAgICAgICAgbXlJbkNvbm5lY3Rpb25BbGxvd2VyLAorICAgICAgICAgICAgbXlPdXRDb25uZWN0aW9uQWxsb3dlciwKKyAgICAgICAgICAgIHNlbGVjdG9yRmFjdG9yeSwKKyAgICAgICAgICAgIG15U2VuZEJ1ZmZlclNpemUsCisgICAgICAgICAgICBteVJlY2VpdmVCdWZmZXJTaXplKTsKKyAgICB0aGlzLnNldFNvY2tldENvbm5lY3Rpb25UaW1lb3V0KERFRkFVTFRfU09DS0VUX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMubXlDb25uZWN0aW9uTWFuYWdlci5pbml0QW5kUnVuV29ya2VyKHNlcnZlckNoYW5uZWxSZWdpc3Rlcik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMuZXJyb3JBbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiZXJyb3IgaW4gaW5pdGlhbGl6YXRpb24gc2VydmVyIGNoYW5uZWwiLCBlKTsKKyAgICAgIHRoaXMuc3RvcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaW5hbCBTdHJpbmcgaWQgPSBDb21tdW5pY2F0aW9uTWFuYWdlci5CSVRUT1JSRU5UX0lEX1BSRUZJWCArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkuc3BsaXQoIi0iKVs0XTsKKyAgICBieXRlW10gaWRCeXRlcyA9IGlkLmdldEJ5dGVzKENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKTsKKyAgICBQZWVyIHNlbGYgPSBuZXcgUGVlcihuZXcgSW5ldFNvY2tldEFkZHJlc3MobXlDb25uZWN0aW9uTWFuYWdlci5nZXRCaW5kUG9ydCgpKSwgQnl0ZUJ1ZmZlci53cmFwKGlkQnl0ZXMpKTsKKyAgICBwZWVyc1N0b3JhZ2Uuc2V0U2VsZihzZWxmKTsKKyAgICBsb2dnZXIuaW5mbygiQml0VG9ycmVudCBjbGllbnQgW3t9XSBzdGFydGVkIGFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgImxpc3RlbmluZyBhdCB7fTp7fS4uLiIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0U2hvcnRIZXhQZWVySWQoKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRJcCgpLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFBvcnQoKQorICAgICAgICAgICAgfSk7CisKKyAgICBhbm5vdW5jZS5zdGFydChkZWZhdWx0VHJhY2tlclVSSSwgdGhpcywgZ2V0U2VsZlBlZXJzKGJpbmRBZGRyZXNzZXMpLCBhbm5vdW5jZUludGVydmFsU2VjKTsKKyAgICB0aGlzLnN0b3Auc2V0KGZhbHNlKTsKKworICAgIG15U3RhcnRlZCA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogSW1tZWRpYXRlbHkgYnV0IGdyYWNlZnVsbHkgc3RvcCB0aGlzIGNsaWVudC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgdGhpcy5zdG9wKDYwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgfQorCisgIHZvaWQgc3RvcChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICBib29sZWFuIHdhc1N0b3BwZWQgPSB0aGlzLnN0b3AuZ2V0QW5kU2V0KHRydWUpOworICAgIGlmICh3YXNTdG9wcGVkKSByZXR1cm47CisKKyAgICBpZiAoIW15U3RhcnRlZCkKKyAgICAgIHJldHVybjsKKworICAgIHRoaXMubXlDb25uZWN0aW9uTWFuYWdlci5jbG9zZSgpOworCisgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgc3RvcCBhbm5vdW5jZSB0aHJlYWQuLi4iKTsKKworICAgIHRoaXMuYW5ub3VuY2Uuc3RvcCgpOworCisgICAgbG9nZ2VyLnRyYWNlKCJhbm5vdW5jZSB0aHJlYWQgaXMgc3RvcHBlZCIpOworCisgICAgZm9yIChTaGFyZWRUb3JyZW50IHRvcnJlbnQgOiB0aGlzLnRvcnJlbnRzU3RvcmFnZS5hY3RpdmVUb3JyZW50cygpKSB7CisgICAgICBsb2dnZXIudHJhY2UoInRyeSBjbG9zZSB0b3JyZW50IHt9IiwgdG9ycmVudCk7CisgICAgICB0b3JyZW50LmNsb3NlRnVsbHkoKTsKKyAgICAgIGlmICh0b3JyZW50LmlzRmluaXNoZWQoKSkgeworICAgICAgICB0b3JyZW50LnNldENsaWVudFN0YXRlKENsaWVudFN0YXRlLkRPTkUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG9ycmVudC5zZXRDbGllbnRTdGF0ZShDbGllbnRTdGF0ZS5FUlJPUik7CisgICAgICB9CisgICAgfQorCisgICAgbG9nZ2VyLmRlYnVnKCJDbG9zaW5nIGFsbCByZW1haW5pbmcgcGVlciBjb25uZWN0aW9ucy4uLiIpOworICAgIGZvciAoU2hhcmluZ1BlZXIgcGVlciA6IHRoaXMucGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpKSB7CisgICAgICBwZWVyLnVuYmluZCh0cnVlKTsKKyAgICB9CisKKyAgICB0b3JyZW50c1N0b3JhZ2UuY2xlYXIoKTsKKyAgICBsb2dnZXIuaW5mbygiQml0VG9ycmVudCBjbGllbnQgc2lnbmluZyBvZmYuIik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDbGVhbnVwVGltZW91dChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgIENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gdGhpcy5teUNvbm5lY3Rpb25NYW5hZ2VyOworICAgIGlmIChjb25uZWN0aW9uTWFuYWdlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0aW9uIG1hbmFnZXIgaXMgbnVsbCIpOworICAgIH0KKyAgICBjb25uZWN0aW9uTWFuYWdlci5zZXRDbGVhbnVwVGltZW91dCh0aW1lVW5pdC50b01pbGxpcyh0aW1lb3V0KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTb2NrZXRDb25uZWN0aW9uVGltZW91dChpbnQgdGltZW91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgIENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gdGhpcy5teUNvbm5lY3Rpb25NYW5hZ2VyOworICAgIGlmIChjb25uZWN0aW9uTWFuYWdlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0aW9uIG1hbmFnZXIgaXMgbnVsbCIpOworICAgIH0KKyAgICBjb25uZWN0aW9uTWFuYWdlci5zZXRTb2NrZXRDb25uZWN0aW9uVGltZW91dCh0aW1lVW5pdC50b01pbGxpcyh0aW1lb3V0KSk7CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB3ZSBhcmUgYSBzZWVkIGZvciB0aGUgdG9ycmVudCB3ZSdyZSBzaGFyaW5nLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZWVkKFN0cmluZyBoZXhJbmZvSGFzaCkgeworICAgIFNoYXJlZFRvcnJlbnQgdCA9IHRoaXMudG9ycmVudHNTdG9yYWdlLmdldFRvcnJlbnQoaGV4SW5mb0hhc2gpOworICAgIHJldHVybiB0ICE9IG51bGwgJiYgdC5pc0NvbXBsZXRlKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTaGFyaW5nUGVlcj4gZ2V0UGVlcnNGb3JUb3JyZW50KFN0cmluZyB0b3JyZW50SGFzaCkgeworICAgIGlmICh0b3JyZW50SGFzaCA9PSBudWxsKSByZXR1cm4gbmV3IEFycmF5TGlzdDxTaGFyaW5nUGVlcj4oKTsKKworICAgIExpc3Q8U2hhcmluZ1BlZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KCk7CisgICAgZm9yIChTaGFyaW5nUGVlciBzaGFyaW5nUGVlciA6IHBlZXJzU3RvcmFnZS5nZXRTaGFyaW5nUGVlcnMoKSkgeworICAgICAgaWYgKHRvcnJlbnRIYXNoLmVxdWFscyhzaGFyaW5nUGVlci5nZXRIZXhJbmZvSGFzaCgpKSkgeworICAgICAgICByZXN1bHQuYWRkKHNoYXJpbmdQZWVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICByZXR1cm4gbXlTdGFydGVkOworICB9CisKKyAgcHJpdmF0ZSBDb2xsZWN0aW9uPFNoYXJpbmdQZWVyPiBnZXRDb25uZWN0ZWRQZWVycygpIHsKKyAgICBTZXQ8U2hhcmluZ1BlZXI+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFNoYXJpbmdQZWVyPigpOworICAgIGZvciAoU2hhcmluZ1BlZXIgcGVlciA6IHRoaXMucGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpKSB7CisgICAgICBpZiAocGVlci5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgIHJlc3VsdC5hZGQocGVlcik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGhhc2ggc3BlY2lmaWVkIHRvcnJlbnQgaGFzaAorICAgKiBAcmV0dXJuIHRydWUgaWYgc3RvcmFnZSBjb250YWlucyBzcGVjaWZpZWQgdG9ycmVudC4gRmFsc2Ugb3RoZXJ3aXNlCisgICAqIEBzZWUgVG9ycmVudHNTdG9yYWdlI2hhc1RvcnJlbnQKKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1RvcnJlbnRXaXRoSGFzaChTdHJpbmcgaGFzaCkgeworICAgIHJldHVybiB0b3JyZW50c1N0b3JhZ2UuaGFzVG9ycmVudChoYXNoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGVlcnNTdG9yYWdlIGdldFBlZXJzU3RvcmFnZSgpIHsKKyAgICByZXR1cm4gcGVlcnNTdG9yYWdlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUb3JyZW50c1N0b3JhZ2UgZ2V0VG9ycmVudHNTdG9yYWdlKCkgeworICAgIHJldHVybiB0b3JyZW50c1N0b3JhZ2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvcigpIHsKKyAgICByZXR1cm4gbXlFeGVjdXRvclNlcnZpY2U7CisgIH0KKworICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldFBpZWNlVmFsaWRhdG9yRXhlY3V0b3IoKSB7CisgICAgcmV0dXJuIG15UGllY2VWYWxpZGF0b3JFeGVjdXRvcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ29ubmVjdGlvbkxpc3RlbmVyIG5ld0NoYW5uZWxMaXN0ZW5lcigpIHsKKyAgICByZXR1cm4gbmV3IFN0YXRlQ2hhbm5lbExpc3RlbmVyKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTaGFyaW5nUGVlciBjcmVhdGVTaGFyaW5nUGVlcihTdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgeworICAgIHJldHVybiBuZXcgU2hhcmluZ1BlZXIoaG9zdCwgcG9ydCwgcGVlcklkLCB0b3JyZW50LCBnZXRDb25uZWN0aW9uTWFuYWdlcigpLCB0aGlzLCBjaGFubmVsLCBjbGllbnRJZGVudGlmaWVyLCBjbGllbnRWZXJzaW9uKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVG9ycmVudExvYWRlciBnZXRUb3JyZW50TG9hZGVyKCkgeworICAgIHJldHVybiBteVRvcnJlbnRMb2FkZXI7CisgIH0KKworCisgIC8qKiBBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIgaGFuZGxlcihzKS4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioKKyAgICogSGFuZGxlIGFuIGFubm91bmNlIHJlc3BvbnNlIGV2ZW50LgorICAgKgorICAgKiBAcGFyYW0gaW50ZXJ2YWwgICBUaGUgYW5ub3VuY2UgaW50ZXJ2YWwgcmVxdWVzdGVkIGJ5IHRoZSB0cmFja2VyLgorICAgKiBAcGFyYW0gY29tcGxldGUgICBUaGUgbnVtYmVyIG9mIHNlZWRlcnMgb24gdGhpcyB0b3JyZW50LgorICAgKiBAcGFyYW0gaW5jb21wbGV0ZSBUaGUgbnVtYmVyIG9mIGxlZWNoZXJzIG9uIHRoaXMgdG9ycmVudC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVBbm5vdW5jZVJlc3BvbnNlKGludCBpbnRlcnZhbCwgaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgZmluYWwgU2hhcmVkVG9ycmVudCBzaGFyZWRUb3JyZW50ID0gdGhpcy50b3JyZW50c1N0b3JhZ2UuZ2V0VG9ycmVudChoZXhJbmZvSGFzaCk7CisgICAgaWYgKHNoYXJlZFRvcnJlbnQgIT0gbnVsbCkgeworICAgICAgc2hhcmVkVG9ycmVudC5zZXRTZWVkZXJzQ291bnQoY29tcGxldGUpOworICAgICAgc2hhcmVkVG9ycmVudC5zZXRMYXN0QW5ub3VuY2VUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisgICAgc2V0QW5ub3VuY2VJbnRlcnZhbChpbnRlcnZhbCk7CisgIH0KKworICAvKioKKyAgICogSGFuZGxlIHRoZSBkaXNjb3Zlcnkgb2YgbmV3IHBlZXJzLgorICAgKgorICAgKiBAcGFyYW0gcGVlcnMgVGhlIGxpc3Qgb2YgcGVlcnMgZGlzY292ZXJlZCAoZnJvbSB0aGUgYW5ub3VuY2UgcmVzcG9uc2Ugb3IKKyAgICogICAgICAgICAgICAgIGFueSBvdGhlciBtZWFucyBsaWtlIERIVC9QRVgsIGV0Yy4pLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZURpc2NvdmVyZWRQZWVycyhMaXN0PFBlZXI+IHBlZXJzLCBTdHJpbmcgaGV4SW5mb0hhc2gpIHsKKworICAgIGlmIChwZWVycy5zaXplKCkgPT0gMCkgcmV0dXJuOworCisgICAgU2hhcmVkVG9ycmVudCB0b3JyZW50ID0gdG9ycmVudHNTdG9yYWdlLmdldFRvcnJlbnQoaGV4SW5mb0hhc2gpOworCisgICAgaWYgKHRvcnJlbnQgIT0gbnVsbCAmJiB0b3JyZW50LmlzRmluaXNoZWQoKSkgcmV0dXJuOworCisgICAgZmluYWwgTG9hZGVkVG9ycmVudCBhbm5vdW5jZWFibGVUb3JyZW50ID0gdG9ycmVudHNTdG9yYWdlLmdldExvYWRlZFRvcnJlbnQoaGV4SW5mb0hhc2gpOworICAgIGlmIChhbm5vdW5jZWFibGVUb3JyZW50ID09IG51bGwpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJhbm5vdW5jZWFibGUgdG9ycmVudCB7fSBpcyBub3QgZm91bmQgaW4gc3RvcmFnZS4gTWF5YmUgaXQgd2FzIHJlbW92ZWQiLCBoZXhJbmZvSGFzaCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGFubm91bmNlYWJsZVRvcnJlbnQuZ2V0UGllY2VTdG9yYWdlKCkuaXNGaW5pc2hlZCgpKSByZXR1cm47CisKKyAgICBsb2dnZXIuZGVidWcoIkdvdCB7fSBwZWVyKHMpICh7fSkgZm9yIHt9IGluIHRyYWNrZXIgcmVzcG9uc2UiLCBuZXcgT2JqZWN0W117cGVlcnMuc2l6ZSgpLAorICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHBlZXJzLnRvQXJyYXkoKSksIGhleEluZm9IYXNofSk7CisKKyAgICBNYXA8UGVlclVJRCwgUGVlcj4gdW5pcXVlUGVlcnMgPSBuZXcgSGFzaE1hcDxQZWVyVUlELCBQZWVyPigpOworICAgIGZvciAoUGVlciBwZWVyIDogcGVlcnMpIHsKKyAgICAgIGZpbmFsIFBlZXJVSUQgcGVlclVJRCA9IG5ldyBQZWVyVUlEKHBlZXIuZ2V0QWRkcmVzcygpLCBoZXhJbmZvSGFzaCk7CisgICAgICBpZiAodW5pcXVlUGVlcnMuY29udGFpbnNLZXkocGVlclVJRCkpIGNvbnRpbnVlOworICAgICAgdW5pcXVlUGVlcnMucHV0KHBlZXJVSUQsIHBlZXIpOworICAgIH0KKworICAgIGZvciAoTWFwLkVudHJ5PFBlZXJVSUQsIFBlZXI+IGUgOiB1bmlxdWVQZWVycy5lbnRyeVNldCgpKSB7CisKKyAgICAgIFBlZXJVSUQgcGVlclVJRCA9IGUuZ2V0S2V5KCk7CisgICAgICBQZWVyIHBlZXIgPSBlLmdldFZhbHVlKCk7CisgICAgICBib29sZWFuIGFscmVhZHlDb25uZWN0ZWRUb1RoaXNQZWVyID0gcGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVyKHBlZXJVSUQpICE9IG51bGw7CisKKyAgICAgIGlmIChhbHJlYWR5Q29ubmVjdGVkVG9UaGlzUGVlcikgeworICAgICAgICBsb2dnZXIuZGVidWcoInNraXBwaW5nIHBlZXIge30sIGJlY2F1c2Ugd2UgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhpcyBwZWVyIiwgcGVlcik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IE91dGdvaW5nQ29ubmVjdGlvbkxpc3RlbmVyKAorICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICBhbm5vdW5jZWFibGVUb3JyZW50LmdldFRvcnJlbnRIYXNoKCksCisgICAgICAgICAgICAgIHBlZXIuZ2V0SXAoKSwKKyAgICAgICAgICAgICAgcGVlci5nZXRQb3J0KCkpOworCisgICAgICBsb2dnZXIuZGVidWcoInRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBwZWVyIHt9IiwgcGVlcik7CisKKyAgICAgIGJvb2xlYW4gY29ubmVjdFRhc2tBZGRlZCA9IHRoaXMubXlDb25uZWN0aW9uTWFuYWdlci5vZmZlckNvbm5lY3QoCisgICAgICAgICAgICAgIG5ldyBDb25uZWN0VGFzayhwZWVyLmdldElwKCksCisgICAgICAgICAgICAgICAgICAgICAgcGVlci5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeXN0ZW1UaW1lU2VydmljZSgpLm5vdygpLAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5ERUZBVUxUX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGlmICghY29ubmVjdFRhc2tBZGRlZCkgeworICAgICAgICBsb2dnZXIuaW5mbygiY2FuIG5vdCBjb25uZWN0IHRvIHBlZXIge30uIFVuYWJsZSB0byBhZGQgY29ubmVjdCB0YXNrIHRvIGNvbm5lY3Rpb24gbWFuYWdlciIsIHBlZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQZWVyQWN0aXZpdHlMaXN0ZW5lciBoYW5kbGVyKHMpLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqLworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQZWVyQ2hva2VkKFNoYXJpbmdQZWVyIHBlZXIpIHsgLyogRG8gbm90aGluZyAqLyB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBlZXJSZWFkeShTaGFyaW5nUGVlciBwZWVyKSB7IC8qIERvIG5vdGhpbmcgKi8gfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZUF2YWlsYWJpbGl0eShTaGFyaW5nUGVlciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZSBwaWVjZSkgeyAvKiBEbyBub3RoaW5nICovIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlQml0ZmllbGRBdmFpbGFiaWxpdHkoU2hhcmluZ1BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcykgeyAvKiBEbyBub3RoaW5nICovIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VTZW50KFNoYXJpbmdQZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZSBwaWVjZSkgeyAvKiBEbyBub3RoaW5nICovIH0KKworICAvKioKKyAgICogUGllY2UgZG93bmxvYWQgY29tcGxldGlvbiBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBXaGVuIGEgcGllY2UgaXMgY29tcGxldGVkLCBhbmQgdmFsaWQsIHdlIGFubm91bmNlIHRvIGFsbCBjb25uZWN0ZWQgcGVlcnMKKyAgICogdGhhdCB3ZSBub3cgaGF2ZSB0aGlzIHBpZWNlLgorICAgKiA8L3A+CisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFdlIHVzZSB0aGlzIGhhbmRsZXIgdG8gaWRlbnRpZnkgd2hlbiBhbGwgb2YgdGhlIHBpZWNlcyBoYXZlIGJlZW4KKyAgICogZG93bmxvYWRlZC4gV2hlbiB0aGF0J3MgdGhlIGNhc2UsIHdlIGNhbiBzdGFydCB0aGUgc2VlZGluZyBwZXJpb2QsIGlmCisgICAqIGFueS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgVGhlIHBlZXIgd2UgZ290IHRoZSBwaWVjZSBmcm9tLgorICAgKiBAcGFyYW0gcGllY2UgVGhlIHBpZWNlIGluIHF1ZXN0aW9uLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKGZpbmFsIFNoYXJpbmdQZWVyIHBlZXIsIGZpbmFsIFBpZWNlIHBpZWNlKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU2hhcmVkVG9ycmVudCB0b3JyZW50ID0gcGVlci5nZXRUb3JyZW50KCk7CisgICAgZmluYWwgU3RyaW5nIHRvcnJlbnRIYXNoID0gdG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpOworICAgIHRyeSB7CisgICAgICBmaW5hbCBGdXR1cmU8Pz4gdmFsaWRhdGlvbkZ1dHVyZSA9IG15UGllY2VWYWxpZGF0b3JFeGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIHZhbGlkYXRlUGllY2VBc3luYyh0b3JyZW50LCBwaWVjZSwgdG9ycmVudEhhc2gsIHBlZXIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHRvcnJlbnQubWFya0NvbXBsZXRlZEFuZEFkZFZhbGlkYXRpb25GdXR1cmUocGllY2UsIHZhbGlkYXRpb25GdXR1cmUpOworICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRvcnJlbnQubWFya1VuY29tcGxldGVkKHBpZWNlKTsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5XaXRoTWVzc2FnZUFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJVbmFibGUgdG8gc3VibWl0IHZhbGlkYXRpb24gdGFzayBmb3IgdG9ycmVudCB7fSIsIHRvcnJlbnRIYXNoLCBlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQaWVjZUFzeW5jKGZpbmFsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCwgZmluYWwgUGllY2UgcGllY2UsIFN0cmluZyB0b3JyZW50SGFzaCwgU2hhcmluZ1BlZXIgcGVlcikgeworICAgIHRyeSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHBpZWNlKSB7CisKKyAgICAgICAgaWYgKHBpZWNlLmlzVmFsaWQoKSkgcmV0dXJuOworCisgICAgICAgIHBpZWNlLnZhbGlkYXRlKHRvcnJlbnQsIHBpZWNlKTsKKyAgICAgICAgaWYgKHBpZWNlLmlzVmFsaWQoKSkgeworICAgICAgICAgIHRvcnJlbnQubm90aWZ5UGllY2VEb3dubG9hZGVkKHBpZWNlLCBwZWVyKTsKKyAgICAgICAgICBwaWVjZS5maW5pc2goKTsKKyAgICAgICAgICAvLyBTZW5kIGEgSEFWRSBtZXNzYWdlIHRvIGFsbCBjb25uZWN0ZWQgcGVlcnMsIHdoaWNoIGRvbid0IGhhdmUgdGhlIHBpZWNlCisgICAgICAgICAgUGVlck1lc3NhZ2UgaGF2ZSA9IFBlZXJNZXNzYWdlLkhhdmVNZXNzYWdlLmNyYWZ0KHBpZWNlLmdldEluZGV4KCkpOworICAgICAgICAgIGZvciAoU2hhcmluZ1BlZXIgcmVtb3RlIDogZ2V0Q29ubmVjdGVkUGVlcnMoKSkgeworICAgICAgICAgICAgaWYgKHJlbW90ZS5nZXRUb3JyZW50KCkuZ2V0SGV4SW5mb0hhc2goKS5lcXVhbHModG9ycmVudEhhc2gpICYmCisgICAgICAgICAgICAgICAgICAgICFyZW1vdGUuZ2V0QXZhaWxhYmxlUGllY2VzKCkuZ2V0KHBpZWNlLmdldEluZGV4KCkpKQorICAgICAgICAgICAgICByZW1vdGUuc2VuZChoYXZlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGVlci5waWVjZURvd25sb2FkZWQoKTsKKworICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUb3JyZW50Q29tcGxldGU7CisgICAgICAgICAgc3luY2hyb25pemVkICh0b3JyZW50KSB7CisgICAgICAgICAgICB0b3JyZW50LnJlbW92ZVZhbGlkYXRpb25GdXR1cmUocGllY2UpOworCisgICAgICAgICAgICBib29sZWFuIGlzQ3VycmVudFBlZXJTZWVkZXIgPSBwZWVyLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCkgPT0gdG9ycmVudC5nZXRQaWVjZUNvdW50KCk7CisgICAgICAgICAgICAvL2lmIGl0J3Mgc2VlZGVyIHdlIHdpbGwgc2VuZCBub3QgaW50ZXJlc3RlZCBtZXNzYWdlIHdoZW4gd2UgZG93bmxvYWQgZnVsbCBmaWxlCisgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFBlZXJTZWVkZXIpIHsKKyAgICAgICAgICAgICAgaWYgKHRvcnJlbnQuaXNBbGxQaWVjZXNPZlBlZXJDb21wbGV0ZWRBbmRWYWxpZGF0ZWQocGVlcikpIHsKKyAgICAgICAgICAgICAgICBwZWVyLm5vdEludGVyZXN0aW5nKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXNUb3JyZW50Q29tcGxldGUgPSB0b3JyZW50LmlzQ29tcGxldGUoKTsKKworICAgICAgICAgICAgaWYgKGlzVG9ycmVudENvbXBsZXRlKSB7CisgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZCBvZiB7fSBjb21wbGV0ZS4iLCB0b3JyZW50LmdldERpcmVjdG9yeU5hbWUoKSk7CisKKyAgICAgICAgICAgICAgdG9ycmVudC5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoaXNUb3JyZW50Q29tcGxldGUpIHsKKworICAgICAgICAgICAgTG9hZGVkVG9ycmVudCBhbm5vdW5jZWFibGVUb3JyZW50ID0gdG9ycmVudHNTdG9yYWdlLmdldExvYWRlZFRvcnJlbnQodG9ycmVudEhhc2gpOworCisgICAgICAgICAgICBpZiAoYW5ub3VuY2VhYmxlVG9ycmVudCA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGFubm91bmNlYWJsZUluZm9ybWF0aW9uID0gYW5ub3VuY2VhYmxlVG9ycmVudC5jcmVhdGVBbm5vdW5jZWFibGVJbmZvcm1hdGlvbigpOworCisgICAgICAgICAgICBpZiAoIVRvcnJlbnRVdGlscy5pc1RyYWNrZXJMZXNzSW5mbyhhbm5vdW5jZWFibGVJbmZvcm1hdGlvbikpIHsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhbm5vdW5jZS5nZXRDdXJyZW50VHJhY2tlckNsaWVudChhbm5vdW5jZWFibGVJbmZvcm1hdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbm5vdW5jZUFsbEludGVyZmFjZXMoQ09NUExFVEVELCB0cnVlLCBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbik7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKEFubm91bmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoInVuYWJsZSB0byBhbm5vdW5jZSB0b3JyZW50IHt9IG9uIHRyYWNrZXIge30iLCB0b3JyZW50LCB0b3JyZW50LmdldEFubm91bmNlKCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU2hhcmluZ1BlZXIgcmVtb3RlIDogZ2V0UGVlcnNGb3JUb3JyZW50KHRvcnJlbnRIYXNoKSkgeworICAgICAgICAgICAgICByZW1vdGUubm90SW50ZXJlc3RpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0b3JyZW50Lm1hcmtVbmNvbXBsZXRlZChwaWVjZSk7CisgICAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkZWQgcGllY2UgI3t9IGZyb20ge30gd2FzIG5vdCB2YWxpZCA7LSguIFRyeWluZyBhbm90aGVyIHBlZXIiLCBwaWVjZS5nZXRJbmRleCgpLCBwZWVyKTsKKyAgICAgICAgICBwZWVyLmdldFBvb3JseUF2YWlsYWJsZVBpZWNlcygpLnNldChwaWVjZS5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICB0b3JyZW50Lm1hcmtVbmNvbXBsZXRlZChwaWVjZSk7CisgICAgICBsb2dnZXIud2FybigidW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBwaWVjZSB7fSB2YWxpZGF0aW9uIHRhc2siLCBlKTsKKyAgICB9CisgICAgdG9ycmVudC5oYW5kbGVQZWVyUmVhZHkocGVlcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGVlckRpc2Nvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgUGVlciBwID0gbmV3IFBlZXIocGVlci5nZXRJcCgpLCBwZWVyLmdldFBvcnQoKSk7CisgICAgcC5zZXRQZWVySWQocGVlci5nZXRQZWVySWQoKSk7CisgICAgcC5zZXRUb3JyZW50SGFzaChwZWVyLmdldEhleEluZm9IYXNoKCkpOworICAgIGxvZ2dlci50cmFjZSgiUGVlciB7fSBkaXNjb25uZWN0ZWQsIFt7fS97fV0uIiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGVkUGVlcnMoKS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMucGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKQorICAgICAgICAgICAgfSk7CisgICAgUGVlclVJRCBwZWVyVUlEID0gbmV3IFBlZXJVSUQocGVlci5nZXRBZGRyZXNzKCksIHBlZXIuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgcGVlcnNTdG9yYWdlLnJlbW92ZVNoYXJpbmdQZWVyKHBlZXJVSUQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVyUGVlclJlbW92ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGxvZ2dlci50cmFjZSgiZGlzY29ubmVjdGVkIHBlZXIgIiArIHBlZXIpOworICAgIHRvcnJlbnRzU3RvcmFnZS5wZWVyRGlzY29ubmVjdGVkKHBlZXIuZ2V0SGV4SW5mb0hhc2goKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlSU9FeGNlcHRpb24oU2hhcmluZ1BlZXIgcGVlciwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgbG9nZ2VyLmRlYnVnKCJJL08gcHJvYmxlbSBvY2N1cmVkIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIHBpZWNlIGRhdGEgZm9yIHBlZXIge306IHt9LiIsIHBlZXIsIGlvZS5nZXRNZXNzYWdlKCkpOworCisgICAgcGVlci51bmJpbmQodHJ1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlTmV3UGVlckNvbm5lY3RlZChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgLy9kbyBub3RoaW5nCisgIH0KKworICBwdWJsaWMgQ29ubmVjdGlvbk1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICBDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IHRoaXMubXlDb25uZWN0aW9uTWFuYWdlcjsKKyAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBtYW5hZ2VyIGlzIG51bGwiKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbm5lY3Rpb25NYW5hZ2VyOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzU3RvcCgpeworICAgIHJldHVybiBzdG9wLmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbnRleHQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTcwZTUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ2hhbm5lbExpc3RlbmVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworcHVibGljIGludGVyZmFjZSBDb250ZXh0IGV4dGVuZHMgU2hhcmluZ1BlZXJGYWN0b3J5LCBDaGFubmVsTGlzdGVuZXJGYWN0b3J5IHsKKworICAvKioKKyAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgcGVlcnMgc3RvcmFnZQorICAgKi8KKyAgUGVlcnNTdG9yYWdlIGdldFBlZXJzU3RvcmFnZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHNpbmdsZSBpbnN0YW5jZSBvZiB0b3JyZW50cyBzdG9yYWdlCisgICAqLworICBUb3JyZW50c1N0b3JhZ2UgZ2V0VG9ycmVudHNTdG9yYWdlKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gZXhlY3V0b3IgZm9yIGhhbmRsaW5nIGluY29taW5nIG1lc3NhZ2VzCisgICAqLworICBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3IoKTsKKworICAvKioKKyAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2UgZm9yIGxvYWQgdG9ycmVudHMKKyAgICovCisgIFRvcnJlbnRMb2FkZXIgZ2V0VG9ycmVudExvYWRlcigpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0V2ZW50RGlzcGF0Y2hlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9FdmVudERpc3BhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDMxMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9FdmVudERpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgRXZlbnREaXNwYXRjaGVyIHsKKworICBwcml2YXRlIGZpbmFsIExpc3Q8VG9ycmVudExpc3RlbmVyPiBsaXN0ZW5lcnM7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudExpc3RlbmVyIG5vdGlmeWVyOworCisgIHB1YmxpYyBFdmVudERpc3BhdGNoZXIoKSB7CisgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8VG9ycmVudExpc3RlbmVyPigpOworICAgIHRoaXMubm90aWZ5ZXIgPSBjcmVhdGVOb3RpZnllcigpOworICB9CisKKyAgcHJpdmF0ZSBUb3JyZW50TGlzdGVuZXIgY3JlYXRlTm90aWZ5ZXIoKSB7CisgICAgcmV0dXJuIG5ldyBUb3JyZW50TGlzdGVuZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBlZXJDb25uZWN0ZWQoUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworICAgICAgICBmb3IgKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgIGxpc3RlbmVyLnBlZXJDb25uZWN0ZWQocGVlckluZm9ybWF0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBlZXJEaXNjb25uZWN0ZWQoUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworICAgICAgICBmb3IgKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgIGxpc3RlbmVyLnBlZXJEaXNjb25uZWN0ZWQocGVlckluZm9ybWF0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHBpZWNlRG93bmxvYWRlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5waWVjZURvd25sb2FkZWQocGllY2VJbmZvcm1hdGlvbiwgcGVlckluZm9ybWF0aW9uKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisgICAgICAgIGZvciAoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIuZG93bmxvYWRDb21wbGV0ZSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcGllY2VSZWNlaXZlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5waWVjZVJlY2VpdmVkKHBpZWNlSW5mb3JtYXRpb24sIHBlZXJJbmZvcm1hdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBkb3dubG9hZEZhaWxlZChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5kb3dubG9hZEZhaWxlZChjYXVzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0aW9uQ29tcGxldGUoaW50IHZhbGlkcGllY2VzLCBpbnQgdG90YWxwaWVjZXMpIHsKKyAgICAgICAgZm9yIChUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci52YWxpZGF0aW9uQ29tcGxldGUodmFsaWRwaWVjZXMsIHRvdGFscGllY2VzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIH0KKworICBUb3JyZW50TGlzdGVuZXIgbXVsdGljYXN0ZXIoKSB7CisgICAgcmV0dXJuIG5vdGlmeWVyOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTGlzdGVuZXIoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgcmV0dXJuIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoVG9ycmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRmlsZU1ldGFkYXRhUHJvdmlkZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRmlsZU1ldGFkYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGIyNGRkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9GaWxlTWV0YWRhdGFQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFBhcnNlcjsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEZpbGVNZXRhZGF0YVByb3ZpZGVyIGltcGxlbWVudHMgVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIgeworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVQYXRoOworCisgIHB1YmxpYyBGaWxlTWV0YWRhdGFQcm92aWRlcihTdHJpbmcgZmlsZVBhdGgpIHsKKyAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7CisgIH0KKworICBATm90TnVsbAorICBAT3ZlcnJpZGUKKyAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBnZXRUb3JyZW50TWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKyAgICByZXR1cm4gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZUZyb21GaWxlKGZpbGUpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0hhbmRzaGFrZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9IYW5kc2hha2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk2ODFjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9IYW5kc2hha2UuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBQZWVyIGhhbmRzaGFrZSBoYW5kbGVyLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICogQGNvbW1lbnRzIHJwaWx5dXNoaW4KKyAqCisgKi8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgQml0VG9ycmVudCBoYW5kc2hha2UgbWVzc2FnZS4KKyAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBzdHJ1Y3R1cmUgYW5kIHBhcnNpbmcgbG9naWMgZm9yIHRoZSBoYW5kc2hha2UKKyAqIHRoYXQgaXMgZXhjaGFuZ2VkIGJldHdlZW4gcGVlcnMgd2hlbiBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIGluIHRoZQorICogQml0VG9ycmVudCBwcm90b2NvbC4KKyAqLworCitwdWJsaWMgY2xhc3MgSGFuZHNoYWtlIGltcGxlbWVudHMgVG9ycmVudEhhc2ggeworCisgIC8vIEJpdFRvcnJlbnQgcHJvdG9jb2wgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgYnkgdGhlIEJpdFRvcnJlbnQgc3BlY2lmaWNhdGlvbi4KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklUVE9SUkVOVF9QUk9UT0NPTF9JREVOVElGSUVSID0gIkJpdFRvcnJlbnQgcHJvdG9jb2wiOworICAvLyBCYXNlIGxlbmd0aCBmb3IgYSBoYW5kc2hha2UgbWVzc2FnZSB3aXRob3V0IHRoZSBwcm90b2NvbCBpZGVudGlmaWVyLgorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVNFX0hBTkRTSEFLRV9MRU5HVEggPSA0OTsKKworICAvLyBCeXRlQnVmZmVyIHRvIHN0b3JlIHRoZSBmdWxsIGhhbmRzaGFrZSBkYXRhLgorICBwcml2YXRlIEJ5dGVCdWZmZXIgZGF0YTsKKyAgLy8gQnl0ZUJ1ZmZlciB0byBzdG9yZSB0aGUgdG9ycmVudCBpbmZvIGhhc2guCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciBpbmZvSGFzaDsKKyAgLy8gQnl0ZUJ1ZmZlciB0byBzdG9yZSB0aGUgcGVlciBJRC4KKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHBlZXJJZDsKKworICAvLyBTdHJpbmcgdG8gc3RvcmUgYW4gaWRlbnRpZmllciBmb3IgdGhlIHRvcnJlbnQsIG5vdCB1c2VkIGluIHRoZSBhY3R1YWwgaGFuZHNoYWtlIG1lc3NhZ2UuCisgIHByaXZhdGUgU3RyaW5nIHRvcnJlbnRJZGVudGlmaWVyOworCisgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHByb3RvY29sIGlkZW50aWZpZXIgc3RyaW5nIGluIHRoaXMgaGFuZHNoYWtlLgorICBwcml2YXRlIGludCBteVBzdHJsZW47CisKKyAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgaW50ZXJuYWwgdXNlIHRvIHNldCB1cCB0aGUgaGFuZHNoYWtlIG9iamVjdC4KKyAgcHJpdmF0ZSBIYW5kc2hha2UoQnl0ZUJ1ZmZlciBkYXRhLCBCeXRlQnVmZmVyIGluZm9IYXNoLAorICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHBlZXJJZCkgeworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgdGhpcy5kYXRhLnJld2luZCgpOyAvLyBSZXdpbmQgdGhlIGJ1ZmZlciB0byB0aGUgc3RhcnQgZm9yIHJlYWRpbmcuCisKKyAgICB0aGlzLmluZm9IYXNoID0gaW5mb0hhc2g7CisgICAgdGhpcy5wZWVySWQgPSBwZWVySWQ7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSByYXcgaGFuZHNoYWtlIGRhdGEgYXMgYSBCeXRlQnVmZmVyLgorICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXREYXRhKCkgeworICAgIHJldHVybiB0aGlzLmRhdGE7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpbmZvIGhhc2ggYXMgYSBieXRlIGFycmF5LgorICBwdWJsaWMgYnl0ZVtdIGdldEluZm9IYXNoKCkgeworICAgIHJldHVybiB0aGlzLmluZm9IYXNoLmFycmF5KCk7CisgIH0KKworICAvLyBSZXR1cm5zIGEgaGV4YWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmZvIGhhc2guCisgIHB1YmxpYyBTdHJpbmcgZ2V0SGV4SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIFRvcnJlbnRVdGlscy5ieXRlQXJyYXlUb0hleFN0cmluZyhnZXRJbmZvSGFzaCgpKTsKKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHBlZXIgSUQgYXMgYSBieXRlIGFycmF5LgorICBwdWJsaWMgYnl0ZVtdIGdldFBlZXJJZCgpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVySWQuYXJyYXkoKTsKKyAgfQorCisgIC8vIFBhcnNlcyBhIEJ5dGVCdWZmZXIgaW50byBhIEhhbmRzaGFrZSBvYmplY3QsIHZhbGlkYXRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaGFuZHNoYWtlLgorICBwdWJsaWMgc3RhdGljIEhhbmRzaGFrZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlcikKKyAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIC8vIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyIGZyb20gdGhlIGZpcnN0IGJ5dGUuCisgICAgaW50IHBzdHJsZW4gPSBCeXRlLnZhbHVlT2YoYnVmZmVyLmdldCgpKS5pbnRWYWx1ZSgpOworICAgIC8vIENoZWNrIHRoYXQgdGhlIGxlbmd0aCBpcyBjb3JyZWN0IGdpdmVuIHRoZSByZW1haW5pbmcgZGF0YS4KKyAgICBpZiAocHN0cmxlbiA8IDAgfHwKKyAgICAgICAgICAgIGJ1ZmZlci5yZW1haW5pbmcoKSAhPSBCQVNFX0hBTkRTSEFLRV9MRU5HVEggKyBwc3RybGVuIC0gMSkgeworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJJbmNvcnJlY3QgaGFuZHNoYWtlIG1lc3NhZ2UgbGVuZ3RoICIgKworICAgICAgICAgICAgICAiKHBzdHJsZW49IiArIHBzdHJsZW4gKyAiKSAhIiwgMCk7CisgICAgfQorCisgICAgLy8gUGFyc2UgdGhlIHByb3RvY29sIGlkZW50aWZpZXIgYW5kIHZhbGlkYXRlIGl0LgorICAgIGJ5dGVbXSBwc3RyID0gbmV3IGJ5dGVbcHN0cmxlbl07CisgICAgYnVmZmVyLmdldChwc3RyKTsKKworICAgIGlmICghSGFuZHNoYWtlLkJJVFRPUlJFTlRfUFJPVE9DT0xfSURFTlRJRklFUi5lcXVhbHMoCisgICAgICAgICAgICBuZXcgU3RyaW5nKHBzdHIsIENvbnN0YW50cy5CWVRFX0VOQ09ESU5HKSkpIHsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBwcm90b2NvbCBpZGVudGlmaWVyISIsIDEpOworICAgIH0KKworICAgIC8vIFNraXAgb3ZlciB0aGUgcmVzZXJ2ZWQgYnl0ZXMsIHdoaWNoIGFyZSBub3QgY3VycmVudGx5IHVzZWQuCisgICAgYnl0ZVtdIHJlc2VydmVkID0gbmV3IGJ5dGVbOF07CisgICAgYnVmZmVyLmdldChyZXNlcnZlZCk7CisKKyAgICAvLyBQYXJzZSB0aGUgaW5mbyBoYXNoIGFuZCBwZWVyIElEIGZyb20gdGhlIGJ1ZmZlci4KKyAgICBieXRlW10gaW5mb0hhc2ggPSBuZXcgYnl0ZVsyMF07CisgICAgYnVmZmVyLmdldChpbmZvSGFzaCk7CisgICAgYnl0ZVtdIHBlZXJJZCA9IG5ldyBieXRlWzIwXTsKKyAgICBidWZmZXIuZ2V0KHBlZXJJZCk7CisgICAgLy8gUmV0dXJuIGEgbmV3IGhhbmRzaGFrZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkIGRhdGEuCisgICAgcmV0dXJuIG5ldyBIYW5kc2hha2UoYnVmZmVyLCBCeXRlQnVmZmVyLndyYXAoaW5mb0hhc2gpLAorICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHBlZXJJZCkpOworICB9CisKKyAgLy8gQWRkaXRpb25hbCBvdmVybG9hZGVkIHBhcnNlIG1ldGhvZCB3aGljaCBhbHNvIHNldHMgdGhlIHRvcnJlbnQgaWRlbnRpZmllci4KKyAgcHVibGljIHN0YXRpYyBIYW5kc2hha2UgcGFyc2UoQnl0ZUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0b3JyZW50SWRlbnRpZmllcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBIYW5kc2hha2UgaHMgPSBIYW5kc2hha2UucGFyc2UoYnVmZmVyKTsKKyAgICBocy5zZXRUb3JyZW50SWRlbnRpZmllcih0b3JyZW50SWRlbnRpZmllcik7CisgICAgcmV0dXJuIGhzOworICB9CisKKyAgLy8gQWRkaXRpb25hbCBvdmVybG9hZGVkIHBhcnNlIG1ldGhvZCB3aGljaCBhbHNvIHNldHMgdGhlIHByb3RvY29sIGlkZW50aWZpZXIgbGVuZ3RoLgorICBwdWJsaWMgc3RhdGljIEhhbmRzaGFrZSBwYXJzZShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IHBzdHJsZW4pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgSGFuZHNoYWtlIGhzID0gSGFuZHNoYWtlLnBhcnNlKGJ1ZmZlcik7CisgICAgaHMubXlQc3RybGVuID0gcHN0cmxlbjsKKyAgICByZXR1cm4gaHM7CisgIH0KKworICAvLyBNZXRob2QgdG8gY3JhZnQgYSBuZXcgaGFuZHNoYWtlIG1lc3NhZ2UgZ2l2ZW4gYSB0b3JyZW50IGluZm8gaGFzaCBhbmQgcGVlciBJRC4KKyAgcHVibGljIHN0YXRpYyBIYW5kc2hha2UgY3JhZnQoYnl0ZVtdIHRvcnJlbnRJbmZvSGFzaCwgYnl0ZVtdIGNsaWVudFBlZXJJZCkgeworICAgIHRyeSB7CisgICAgICAvLyBBbGxvY2F0ZSBhIEJ5dGVCdWZmZXIgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuCisgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoCisgICAgICAgICAgICAgIEhhbmRzaGFrZS5CQVNFX0hBTkRTSEFLRV9MRU5HVEggKworICAgICAgICAgICAgICAgICAgICAgIEhhbmRzaGFrZS5CSVRUT1JSRU5UX1BST1RPQ09MX0lERU5USUZJRVIubGVuZ3RoKCkpOworCisgICAgICBieXRlW10gcmVzZXJ2ZWQgPSBuZXcgYnl0ZVs4XTsgLy8gUmVzZXJ2ZWQgYnl0ZXMsIG5vdCB1c2VkLgorICAgICAgQnl0ZUJ1ZmZlciBpbmZvSGFzaCA9IEJ5dGVCdWZmZXIud3JhcCh0b3JyZW50SW5mb0hhc2gpOworICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQgPSBCeXRlQnVmZmVyLndyYXAoY2xpZW50UGVlcklkKTsKKworICAgICAgLy8gQ29uc3RydWN0IHRoZSBoYW5kc2hha2UgbWVzc2FnZSBpbiB0aGUgYnVmZmVyLgorICAgICAgYnVmZmVyLnB1dCgoYnl0ZSkgSGFuZHNoYWtlCisgICAgICAgICAgICAgIC5CSVRUT1JSRU5UX1BST1RPQ09MX0lERU5USUZJRVIubGVuZ3RoKCkpOworICAgICAgYnVmZmVyLnB1dChIYW5kc2hha2UKKyAgICAgICAgICAgICAgLkJJVFRPUlJFTlRfUFJPVE9DT0xfSURFTlRJRklFUi5nZXRCeXRlcyhDb25zdGFudHMuQllURV9FTkNPRElORykpOworICAgICAgYnVmZmVyLnB1dChyZXNlcnZlZCk7CisgICAgICBidWZmZXIucHV0KGluZm9IYXNoKTsKKyAgICAgIGJ1ZmZlci5wdXQocGVlcklkKTsKKworICAgICAgLy8gUmV0dXJuIGEgbmV3IGhhbmRzaGFrZSBvYmplY3Qgd2l0aCB0aGUgY29uc3RydWN0ZWQgbWVzc2FnZS4KKyAgICAgIHJldHVybiBuZXcgSGFuZHNoYWtlKGJ1ZmZlciwgaW5mb0hhc2gsIHBlZXJJZCk7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgIHJldHVybiBudWxsOyAvLyBJbiBjYXNlIHRoZSBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm4gbnVsbC4KKyAgICB9CisgIH0KKworICAvLyBBZGRpdGlvbmFsIG1ldGhvZCB0byBjcmFmdCBhIGhhbmRzaGFrZSBtZXNzYWdlIHdpdGggdGhlIHRvcnJlbnQgaWRlbnRpZmllciBzZXQuCisgIHB1YmxpYyBzdGF0aWMgSGFuZHNoYWtlIHBhcnNlKGJ5dGVbXSB0b3JyZW50SW5mb0hhc2gsIGJ5dGVbXSBjbGllbnRQZWVySWQsIFN0cmluZyB0b3JyZW50SWRlbnRpZmllcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBIYW5kc2hha2UgaHMgPSBIYW5kc2hha2UuY3JhZnQodG9ycmVudEluZm9IYXNoLCBjbGllbnRQZWVySWQpOworICAgIGhzLnNldFRvcnJlbnRJZGVudGlmaWVyKHRvcnJlbnRJZGVudGlmaWVyKTsKKyAgICByZXR1cm4gaHM7CisgIH0KKworICAvLyBTZXRzIHRoZSB0b3JyZW50IGlkZW50aWZpZXIgZm9yIHRoaXMgaGFuZHNoYWtlLgorICBwdWJsaWMgdm9pZCBzZXRUb3JyZW50SWRlbnRpZmllcihTdHJpbmcgdG9ycmVudElkZW50aWZpZXIpIHsKKyAgICB0aGlzLnRvcnJlbnRJZGVudGlmaWVyID0gdG9ycmVudElkZW50aWZpZXI7CisgIH0KKworICAvLyBHZXRzIHRoZSBwcm90b2NvbCBpZGVudGlmaWVyIGxlbmd0aCBmb3IgdGhpcyBoYW5kc2hha2UuCisgIHB1YmxpYyBpbnQgZ2V0UHN0cmxlbigpIHsKKyAgICByZXR1cm4gbXlQc3RybGVuOworICB9CisKKyAgLy8gR2V0cyB0aGUgdG9ycmVudCBpZGVudGlmaWVyLgorICBwdWJsaWMgU3RyaW5nIGdldFRvcnJlbnRJZGVudGlmaWVyKCkgeworICAgIHJldHVybiB0b3JyZW50SWRlbnRpZmllcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0xvYWRlZFRvcnJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50LmphdmEKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5QaWVjZVN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50U3RhdGlzdGljOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKKworcHVibGljIGludGVyZmFjZSBMb2FkZWRUb3JyZW50IHsKKworICAvKioKKyAgICogQHJldHVybiB7QGxpbmsgUGllY2VTdG9yYWdlfSB3aGVyZSBzdG9yZWQgYXZhaWxhYmxlIHBpZWNlcworICAgKi8KKyAgUGllY2VTdG9yYWdlIGdldFBpZWNlU3RvcmFnZSgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHtAbGluayBUb3JyZW50TWV0YWRhdGF9IGluc3RhbmNlCisgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBmZXRjaCBtZXRhZGF0YSBmcm9tIHNvdXJjZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBzb3VyY2UgaXMgLnRvcnJlbnQgZmlsZSBhbmQgaXQgd2FzIGRlbGV0ZWQgbWFudWFsbHkpCisgICAqLworICBUb3JyZW50TWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb259IGZvciBhbm5vdW5jZSB0aGlzIHRvcnJlbnQgdG8gdGhlIHRyYWNrZXIKKyAgICovCisgIEBOb3ROdWxsCisgIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGNyZWF0ZUFubm91bmNlYWJsZUluZm9ybWF0aW9uKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4ge0BsaW5rIFRvcnJlbnRTdGF0aXN0aWN9IGluc3RhbmNlIHJlbGF0ZWQgd2l0aCB0aGlzIHRvcnJlbnQKKyAgICovCisgIFRvcnJlbnRTdGF0aXN0aWMgZ2V0VG9ycmVudFN0YXRpc3RpYygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGhhc2ggb2YgdGhpcyB0b3JyZW50CisgICAqLworICBUb3JyZW50SGFzaCBnZXRUb3JyZW50SGFzaCgpOworCisgIC8qKgorICAgKiBAcmV0dXJuIHJlbGF0ZWQge0BsaW5rIEV2ZW50RGlzcGF0Y2hlcn0KKyAgICovCisgIEV2ZW50RGlzcGF0Y2hlciBnZXRFdmVudERpc3BhdGNoZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50SW1wbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Mb2FkZWRUb3JyZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTZhN2EKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0xvYWRlZFRvcnJlbnRJbXBsLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5QaWVjZVN0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLio7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBMb2FkZWRUb3JyZW50SW1wbCBpbXBsZW1lbnRzIExvYWRlZFRvcnJlbnQgeworCisgIHByaXZhdGUgZmluYWwgVG9ycmVudFN0YXRpc3RpYyB0b3JyZW50U3RhdGlzdGljOworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRIYXNoIHRvcnJlbnRIYXNoOworICBwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBhbm5vdW5jZVVybHM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFubm91bmNlOworICBwcml2YXRlIGZpbmFsIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2U7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIgbWV0YWRhdGFQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBFdmVudERpc3BhdGNoZXIgZXZlbnREaXNwYXRjaGVyOworCisgIExvYWRlZFRvcnJlbnRJbXBsKFRvcnJlbnRTdGF0aXN0aWMgdG9ycmVudFN0YXRpc3RpYywKKyAgICAgICAgICAgICAgICAgICAgVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIgbWV0YWRhdGFQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcikgeworICAgIHRoaXMudG9ycmVudFN0YXRpc3RpYyA9IHRvcnJlbnRTdGF0aXN0aWM7CisgICAgdGhpcy5tZXRhZGF0YVByb3ZpZGVyID0gbWV0YWRhdGFQcm92aWRlcjsKKyAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IGV2ZW50RGlzcGF0Y2hlcjsKKyAgICB0b3JyZW50SGFzaCA9IG5ldyBJbW11dGFibGVUb3JyZW50SGFzaCh0b3JyZW50TWV0YWRhdGEuZ2V0SW5mb0hhc2goKSk7CisgICAgaWYgKHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZUxpc3QoKSAhPSBudWxsKSB7CisgICAgICB0aGlzLmFubm91bmNlVXJscyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodG9ycmVudE1ldGFkYXRhLmdldEFubm91bmNlTGlzdCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5hbm5vdW5jZVVybHMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodG9ycmVudE1ldGFkYXRhLmdldEFubm91bmNlKCkpKTsKKyAgICB9CisgICAgdGhpcy5hbm5vdW5jZSA9IHRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZSgpOworICAgIHRoaXMucGllY2VTdG9yYWdlID0gcGllY2VTdG9yYWdlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQaWVjZVN0b3JhZ2UgZ2V0UGllY2VTdG9yYWdlKCkgeworICAgIHJldHVybiBwaWVjZVN0b3JhZ2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRvcnJlbnRNZXRhZGF0YSBnZXRNZXRhZGF0YSgpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG1ldGFkYXRhUHJvdmlkZXIuZ2V0VG9ycmVudE1ldGFkYXRhKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZldGNoIHRvcnJlbnQgbWV0YWRhdGEgZnJvbSBtZXRhZGF0YSBwcm92aWRlcjogIiArIG1ldGFkYXRhUHJvdmlkZXIsIGUpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVG9ycmVudFN0YXRpc3RpYyBnZXRUb3JyZW50U3RhdGlzdGljKCkgeworICAgIHJldHVybiB0b3JyZW50U3RhdGlzdGljOworICB9CisKKyAgQE92ZXJyaWRlCisgIEBOb3ROdWxsCisgIHB1YmxpYyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiBjcmVhdGVBbm5vdW5jZWFibGVJbmZvcm1hdGlvbigpIHsKKyAgICByZXR1cm4gbmV3IEFubm91bmNlYWJsZUluZm9ybWF0aW9uSW1wbCgKKyAgICAgICAgICAgIHRvcnJlbnRTdGF0aXN0aWMuZ2V0VXBsb2FkZWRCeXRlcygpLAorICAgICAgICAgICAgdG9ycmVudFN0YXRpc3RpYy5nZXREb3dubG9hZGVkQnl0ZXMoKSwKKyAgICAgICAgICAgIHRvcnJlbnRTdGF0aXN0aWMuZ2V0TGVmdEJ5dGVzKCksCisgICAgICAgICAgICB0b3JyZW50SGFzaCwKKyAgICAgICAgICAgIGFubm91bmNlVXJscywKKyAgICAgICAgICAgIGFubm91bmNlCisgICAgKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVG9ycmVudEhhc2ggZ2V0VG9ycmVudEhhc2goKSB7CisgICAgcmV0dXJuIHRvcnJlbnRIYXNoOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFdmVudERpc3BhdGNoZXIgZ2V0RXZlbnREaXNwYXRjaGVyKCkgeworICAgIHJldHVybiBldmVudERpc3BhdGNoZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gIkxvYWRlZFRvcnJlbnRJbXBseyIgKworICAgICAgICAgICAgInBpZWNlIHN0b3JhZ2U9JyIgKyBwaWVjZVN0b3JhZ2UgKyAnXCcnICsKKyAgICAgICAgICAgICIsIG1ldGFkYXRhIHByb3ZpZGVyPSciICsgbWV0YWRhdGFQcm92aWRlciArICdcJycgKworICAgICAgICAgICAgJ30nOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BlZXJJbmZvcm1hdGlvbi5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVySW5mb3JtYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjAyYzhkCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVySW5mb3JtYXRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCitwdWJsaWMgaW50ZXJmYWNlIFBlZXJJbmZvcm1hdGlvbiB7CisKKyAgLyoqCisgICAqIEByZXR1cm4ge0BsaW5rIEluZXRTb2NrZXRBZGRyZXNzfSBvZiByZW1vdGUgcGVlcgorICAgKi8KKyAgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpOworCisgIC8qKgorICAgKiBAcmV0dXJuIGlkIG9mIGN1cnJlbnQgcGVlciB3aGljaCB0aGUgcGVlcnMgc2VudCBpbiB0aGUgaGFuZHNoYWtlCisgICAqLworICBieXRlW10gZ2V0SWQoKTsKKworICAvKioKKyAgICogQHJldHVybiBjbGllbnQgaWRlbnRpZmllciBvZiBjdXJyZW50IHBlZXIKKyAgICovCisgIFN0cmluZyBnZXRDbGllbnRJZGVudGlmaWVyKCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gY2xpZW50IHZlcnNpb24gb2YgY3VycmVudCBwZWVyCisgICAqLworICBpbnQgZ2V0Q2xpZW50VmVyc2lvbigpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BlZXJzU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzYyMzlhCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyVUlEOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKK3B1YmxpYyBjbGFzcyBQZWVyc1N0b3JhZ2UgeworCisgIHByaXZhdGUgdm9sYXRpbGUgUGVlciBzZWxmID0gbnVsbDsKKyAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxQZWVyVUlELCBTaGFyaW5nUGVlcj4gY29ubmVjdGVkU2hhcmluZ1BlZXJzOworCisgIHB1YmxpYyBQZWVyc1N0b3JhZ2UoKSB7CisgICAgdGhpcy5jb25uZWN0ZWRTaGFyaW5nUGVlcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8UGVlclVJRCwgU2hhcmluZ1BlZXI+KCk7CisgIH0KKworICBwdWJsaWMgUGVlciBnZXRTZWxmKCkgeworICAgIHJldHVybiBzZWxmOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2VsZihQZWVyIHNlbGYpIHsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICB9CisKKyAgcHVibGljIFNoYXJpbmdQZWVyIHB1dElmQWJzZW50KFBlZXJVSUQgcGVlcklkLCBTaGFyaW5nUGVlciBzaGFyaW5nUGVlcikgeworICAgIHJldHVybiBjb25uZWN0ZWRTaGFyaW5nUGVlcnMucHV0SWZBYnNlbnQocGVlcklkLCBzaGFyaW5nUGVlcik7CisgIH0KKworICBwdWJsaWMgU2hhcmluZ1BlZXIgcmVtb3ZlU2hhcmluZ1BlZXIoUGVlclVJRCBwZWVySWQpIHsKKyAgICByZXR1cm4gY29ubmVjdGVkU2hhcmluZ1BlZXJzLnJlbW92ZShwZWVySWQpOworICB9CisKKyAgcHVibGljIFNoYXJpbmdQZWVyIGdldFNoYXJpbmdQZWVyKFBlZXJVSUQgcGVlcklkKSB7CisgICAgcmV0dXJuIGNvbm5lY3RlZFNoYXJpbmdQZWVycy5nZXQocGVlcklkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbW92ZVNoYXJpbmdQZWVyKFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBjb25uZWN0ZWRTaGFyaW5nUGVlcnMudmFsdWVzKCkucmVtb3ZlKHBlZXIpOworICB9CisKKyAgcHVibGljIENvbGxlY3Rpb248U2hhcmluZ1BlZXI+IGdldFNoYXJpbmdQZWVycygpIHsKKyAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTaGFyaW5nUGVlcj4oY29ubmVjdGVkU2hhcmluZ1BlZXJzLnZhbHVlcygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QaWVjZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QaWVjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjY4MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BpZWNlLmphdmEKQEAgLTAsMCArMSwyOTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworCisvKioKKyAqIEEgdG9ycmVudCBwaWVjZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRvcnJlbnQgcGllY2UuIFRvcnJlbnRzIGFyZSBtYWRlIG9mIHBpZWNlcywgd2hpY2gKKyAqIGFyZSBpbiB0dXJuIG1hZGUgb2YgYmxvY2tzIHRoYXQgYXJlIGV4Y2hhbmdlZCB1c2luZyB0aGUgcGVlciBwcm90b2NvbC4KKyAqIFRoZSBwaWVjZSBsZW5ndGggaXMgZGVmaW5lZCBhdCB0aGUgdG9ycmVudCBsZXZlbCwgYnV0IHRoZSBsYXN0IHBpZWNlIHRoYXQKKyAqIG1ha2VzIHRoZSB0b3JyZW50IG1pZ2h0IGJlIHNtYWxsZXIuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBJZiB0aGUgdG9ycmVudCBoYXMgbXVsdGlwbGUgZmlsZXMsIHBpZWNlcyBjYW4gc3ByZWFkIGFjcm9zcyBmaWxlIGJvdW5kYXJpZXMuCisgKiBUaGUgVG9ycmVudEJ5dGVTdG9yYWdlIGFic3RyYWN0cyB0aGlzIHByb2JsZW0gdG8gZ2l2ZSBQaWVjZSBvYmplY3RzIHRoZQorICogaW1wcmVzc2lvbiBvZiBhIGNvbnRpZ3VvdXMsIGxpbmVhciBieXRlIHN0b3JhZ2UuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBjbGFzcyBQaWVjZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8UGllY2U+LCBQaWVjZUluZm9ybWF0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGllY2UuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZTsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgIHByaXZhdGUgZmluYWwgbG9uZyBsZW5ndGg7CisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGhhc2g7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHZhbGlkOworICBwcml2YXRlIGludCBzZWVuOworICBwcml2YXRlIEJ5dGVCdWZmZXIgZGF0YTsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZSBhIG5ldyBwaWVjZSBpbiB0aGUgYnl0ZSBidWNrZXQuCisgICAqCisgICAqIEBwYXJhbSBwaWVjZVN0b3JhZ2UgIFRoZSB1bmRlcmx5aW5nIHBpZWNlIHN0b3JhZ2UgYnVja2V0LgorICAgKiBAcGFyYW0gaW5kZXggICBUaGlzIHBpZWNlIGluZGV4IGluIHRoZSB0b3JyZW50LgorICAgKiBAcGFyYW0gbGVuZ3RoICBUaGlzIHBpZWNlIGxlbmd0aCwgaW4gYnl0ZXMuCisgICAqIEBwYXJhbSBoYXNoICAgIFRoaXMgcGllY2UgMjAtYnl0ZSBTSEExIGhhc2ggc3VtLgorICAgKi8KKyAgcHVibGljIFBpZWNlKFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsIGludCBpbmRleCwgbG9uZyBsZW5ndGgsIGJ5dGVbXSBoYXNoKSB7CisgICAgdGhpcy5waWVjZVN0b3JhZ2UgPSBwaWVjZVN0b3JhZ2U7CisgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgIHRoaXMuaGFzaCA9IGhhc2g7CisKKyAgICAvLyBQaWVjZSBpcyBjb25zaWRlcmVkIGludmFsaWQgdW50aWwgZmlyc3QgY2hlY2suCisgICAgdGhpcy52YWxpZCA9IGZhbHNlOworCisgICAgLy8gUGllY2Ugc3RhcnQgdW5zZWVuCisgICAgdGhpcy5zZWVuID0gMDsKKworICAgIHRoaXMuZGF0YSA9IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgIHJldHVybiAoaW50KWxlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGllY2UncyBkYXRhIGlzIHZhbGlkIG9yIG5vdC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgcmV0dXJuIHRoaXMudmFsaWQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwaWVjZSBpbiB0aGUgdG9ycmVudC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXg7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoaXMgcGllY2UuCisgICAqCisgICAqIDxwPgorICAgKiBBbGwgcGllY2VzLCBleGNlcHQgdGhlIGxhc3Qgb25lLCBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaXplLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgbG9uZyBzaXplKCkgeworICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgcGllY2UgaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBwZWVyIHN3YXJtLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gYXZhaWxhYmxlKCkgeworICAgIHJldHVybiB0aGlzLnNlZW4gPiAwOworICB9CisKKyAgLyoqCisgICAqIE1hcmsgdGhpcyBwaWVjZSBhcyBiZWluZyBzZWVuIGF0IHRoZSBnaXZlbiBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgc2hhcmluZyBwZWVyIHRoaXMgcGllY2UgaGFzIGJlZW4gc2VlbiBhdmFpbGFibGUgYXQuCisgICAqLworICBwdWJsaWMgdm9pZCBzZWVuQXQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIHRoaXMuc2VlbisrOworICB9CisKKyAgLyoqCisgICAqIE1hcmsgdGhpcyBwaWVjZSBhcyBubyBsb25nZXIgYmVpbmcgYXZhaWxhYmxlIGF0IHRoZSBnaXZlbiBwZWVyLgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgc2hhcmluZyBwZWVyIGZyb20gd2hpY2ggdGhlIHBpZWNlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisgICAqLworICBwdWJsaWMgdm9pZCBub0xvbmdlckF0KFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICB0aGlzLnNlZW4tLTsKKyAgfQorCisgIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiB2YWxpZCkgeworICAgIHRoaXMudmFsaWQgPSB2YWxpZDsKKyAgfQorCisgIC8qKgorICAgKiBWYWxpZGF0ZXMgdGhpcyBwaWVjZS4KKyAgICoKKyAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwaWVjZSwgYXMgc3RvcmVkIGluIHRoZSB1bmRlcmx5aW5nIGJ5dGUKKyAgICogc3RvcmFnZSwgaXMgdmFsaWQsIGkuZS4gaXRzIFNIQTEgc3VtIG1hdGNoZXMgdGhlIG9uZSBmcm9tIHRoZSB0b3JyZW50CisgICAqIG1ldGEtaW5mby4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFNoYXJlZFRvcnJlbnQgdG9ycmVudCwgUGllY2UgcGllY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBsb2dnZXIudHJhY2UoIlZhbGlkYXRpbmcge30uLi4iLCB0aGlzKTsKKworICAgIC8vIFRPRE86IHJlbW92ZSBjYXN0IHRvIGludCB3aGVuIGxhcmdlIEJ5dGVCdWZmZXIgc3VwcG9ydCBpcworICAgIC8vIGltcGxlbWVudGVkIGluIEphdmEuCisgICAgYnl0ZVtdIHBpZWNlQnl0ZXMgPSBkYXRhLmFycmF5KCk7CisgICAgZmluYWwgYnl0ZVtdIGNhbGN1bGF0ZWRIYXNoID0gVG9ycmVudFV0aWxzLmNhbGN1bGF0ZVNoYTFIYXNoKHBpZWNlQnl0ZXMpOworICAgIHRoaXMudmFsaWQgPSBBcnJheXMuZXF1YWxzKGNhbGN1bGF0ZWRIYXNoLCB0aGlzLmhhc2gpOworICAgIGxvZ2dlci50cmFjZSgidmFsaWRhdGluZyByZXN1bHQgb2YgcGllY2Uge30gaXMge30iLCB0aGlzLmluZGV4LCB0aGlzLnZhbGlkKTsKKworICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnRlcm5hbCBwaWVjZSBkYXRhIHJlYWQgZnVuY3Rpb24uCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgcGllY2UgZGF0YSB3aXRob3V0IGNoZWNraW5nIGlmIHRoZSBwaWVjZSBoYXMKKyAgICogYmVlbiB2YWxpZGF0ZWQuIEl0IGlzIHNpbXBseSBtZWFudCBhdCBmYWN0b3JpbmctaW4gdGhlIGNvbW1vbiByZWFkIGNvZGUKKyAgICogZnJvbSB0aGUgdmFsaWRhdGUgYW5kIHJlYWQgZnVuY3Rpb25zLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGluc2lkZSB0aGlzIHBpZWNlIHdoZXJlIHRvIHN0YXJ0IHJlYWRpbmcuCisgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgcGllY2UuCisgICAqIEByZXR1cm4gQSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaWVjZSBkYXRhLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiA8ZW0+b2Zmc2V0ICsgbGVuZ3RoPC9lbT4gZ29lcyBvdmVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwaWVjZSBib3VuZGFyeS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgSWYgdGhlIHJlYWQgY2FuJ3QgYmUgY29tcGxldGVkIChJL08gZXJyb3IsIG9yIEVPRgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVkLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBwaWVjZSBpcyBub3QgY29tcGxldGUpLgorICAgKi8KKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIF9yZWFkKGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCwgQnl0ZUJ1ZmZlciBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQaWVjZSMiICsgdGhpcy5pbmRleCArCisgICAgICAgICAgICAgICIgb3ZlcnJ1biAoIiArIG9mZnNldCArICIgKyAiICsgbGVuZ3RoICsgIiA+ICIgKworICAgICAgICAgICAgICB0aGlzLmxlbmd0aCArICIpICEiKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgY2FzdCB0byBpbnQgd2hlbiBsYXJnZSBCeXRlQnVmZmVyIHN1cHBvcnQgaXMKKyAgICAvLyBpbXBsZW1lbnRlZCBpbiBKYXZhLgorICAgIGludCBwb3NpdGlvbiA9IGJ1ZmZlci5wb3NpdGlvbigpOworICAgIGJ5dGVbXSBieXRlcyA9IHRoaXMucGllY2VTdG9yYWdlLnJlYWRQaWVjZVBhcnQodGhpcy5pbmRleCwgKGludClvZmZzZXQsIChpbnQpbGVuZ3RoKTsKKyAgICBidWZmZXIucHV0KGJ5dGVzKTsKKyAgICBidWZmZXIucmV3aW5kKCk7CisgICAgYnVmZmVyLmxpbWl0KGJ5dGVzLmxlbmd0aCArIHBvc2l0aW9uKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBwaWVjZSBibG9jayBmcm9tIHRoZSB1bmRlcmx5aW5nIGJ5dGUgc3RvcmFnZS4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaXMgdGhlIHB1YmxpYyBtZXRob2QgZm9yIHJlYWRpbmcgdGhpcyBwaWVjZSdzIGRhdGEsIGFuZCBpdCB3aWxsCisgICAqIG9ubHkgc3VjY2VlZCBpZiB0aGUgcGllY2UgaXMgY29tcGxldGUgYW5kIHZhbGlkIG9uIGRpc2ssIHRodXMgZW5zdXJpbmcKKyAgICogYW55IGRhdGEgdGhhdCBjb21lcyBvdXQgb2YgdGhpcyBmdW5jdGlvbiBpcyB2YWxpZCBwaWVjZSBkYXRhIHdlIGNhbiBzZW5kCisgICAqIHRvIG90aGVyIHBlZXJzLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGluc2lkZSB0aGlzIHBpZWNlIHdoZXJlIHRvIHN0YXJ0IHJlYWRpbmcuCisgICAqIEBwYXJhbSBsZW5ndGggTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgcGllY2UuCisgICAqIEByZXR1cm4gQSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaWVjZSBkYXRhLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiA8ZW0+b2Zmc2V0ICsgbGVuZ3RoPC9lbT4gZ29lcyBvdmVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwaWVjZSBib3VuZGFyeS4KKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgSWYgdGhlIHBpZWNlIGlzIG5vdCB2YWxpZCB3aGVuIGF0dGVtcHRpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVhZCBpdC4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgSWYgdGhlIHJlYWQgY2FuJ3QgYmUgY29tcGxldGVkIChJL08gZXJyb3IsIG9yIEVPRgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVkLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBwaWVjZSBpcyBub3QgY29tcGxldGUpLgorICAgKi8KKyAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZChsb25nIG9mZnNldCwgaW50IGxlbmd0aCwgQnl0ZUJ1ZmZlciBibG9jaykKKyAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIXRoaXMudmFsaWQpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gcmVhZCBhbiAiICsKKyAgICAgICAgICAgICAgImtub3duLXRvLWJlIGludmFsaWQgcGllY2UhIik7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMuX3JlYWQob2Zmc2V0LCBsZW5ndGgsIGJsb2NrKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmQgdGhlIGdpdmVuIGJsb2NrIGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4gdGhpcyBwaWVjZS4KKyAgICoKKyAgICogQHBhcmFtIGJsb2NrICBUaGUgQnl0ZUJ1ZmZlciBjb250YWluaW5nIHRoZSBibG9jayBkYXRhLgorICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBibG9jayBvZmZzZXQgaW4gdGhpcyBwaWVjZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJlY29yZChCeXRlQnVmZmVyIGJsb2NrLCBpbnQgb2Zmc2V0KSB7CisgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKSB7CisgICAgICAvLyBUT0RPOiByZW1vdmUgY2FzdCB0byBpbnQgd2hlbiBsYXJnZSBCeXRlQnVmZmVyIHN1cHBvcnQgaXMKKyAgICAgIC8vIGltcGxlbWVudGVkIGluIEphdmEuCisgICAgICB0aGlzLmRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKChpbnQpIHRoaXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBpbnQgcG9zID0gYmxvY2sucG9zaXRpb24oKTsKKyAgICB0aGlzLmRhdGEucG9zaXRpb24ob2Zmc2V0KTsKKyAgICB0aGlzLmRhdGEucHV0KGJsb2NrKTsKKyAgICBibG9jay5wb3NpdGlvbihwb3MpOworICB9CisKKyAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLmRhdGEucmV3aW5kKCk7CisgICAgbG9nZ2VyLnRyYWNlKCJSZWNvcmRpbmcge30uLi4iLCB0aGlzKTsKKyAgICB0cnkgeworICAgICAgcGllY2VTdG9yYWdlLnNhdmVQaWVjZShpbmRleCwgdGhpcy5kYXRhLmFycmF5KCkpOworICAgIH0gZmluYWxseSB7CisgICAgICB0aGlzLmRhdGEgPSBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBpZWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgicGllY2UjJTRkJXMiLAorICAgICAgICAgICAgdGhpcy5pbmRleCwKKyAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpID8gIisiIDogIi0iKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmIChvYmogaW5zdGFuY2VvZiBQaWVjZSkgeworICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT0gKChQaWVjZSkgb2JqKS5pbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQaWVjZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBvcmRlcmluZyBwaWVjZXMgYmFzZWQgb24gdGhlaXIKKyAgICogYXZhaWxhYmlsaXR5LgorICAgKgorICAgKiBAcGFyYW0gb3RoZXIgVGhlIHBpZWNlIHRvIGNvbXBhcmUgd2l0aCwgc2hvdWxkIG5vdCBiZSA8ZW0+bnVsbDwvZW0+LgorICAgKi8KKyAgcHVibGljIGludCBjb21wYXJlVG8oUGllY2Ugb3RoZXIpIHsKKyAgICAvLyByZXR1cm4gdHJ1ZSBmb3IgdGhlIHNhbWUgcGllY2VzLCBvdGhlcndpc2Ugc29ydCBieSB0aW1lIHNlZW4sIHRoZW4gYnkgaW5kZXg7CisgICAgaWYgKHRoaXMuZXF1YWxzKG90aGVyKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICh0aGlzLnNlZW4gPT0gb3RoZXIuc2VlbikgeworICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuaW5kZXgpLmNvbXBhcmVUbyhvdGhlci5pbmRleCk7CisgICAgfSBlbHNlIGlmICh0aGlzLnNlZW4gPCBvdGhlci5zZWVuKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BpZWNlSW5mb3JtYXRpb24uamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvUGllY2VJbmZvcm1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWRhYTMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BpZWNlSW5mb3JtYXRpb24uamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworcHVibGljIGludGVyZmFjZSBQaWVjZUluZm9ybWF0aW9uIHsKKworICAvKioKKyAgICogQHJldHVybiBwaWVjZSBpbmRleC4gSW5kZXhpbmcgc3RhcnRzIGZyb20gemVybworICAgKi8KKyAgaW50IGdldEluZGV4KCk7CisKKyAgLyoqCisgICAqIEByZXR1cm4gcGllY2Ugc2l6ZS4gVGhpcyB2YWx1ZSBtdXN0IGJlIGVxdWFscyBwaWVjZSBzaXplIHNwZWNpZmllZCBieSBtZXRhZGF0YSBleGNsdWRpbmcgbGFzdCBwaWVjZQorICAgKi8KKyAgaW50IGdldFNpemUoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TZWxlY3RvckZhY3RvcnlJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NlbGVjdG9yRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTcxMzNlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TZWxlY3RvckZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLlNlbGVjdG9yRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBTZWxlY3RvckZhY3RvcnlJbXBsIGltcGxlbWVudHMgU2VsZWN0b3JGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNlbGVjdG9yIG5ld1NlbGVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gU2VsZWN0b3Iub3BlbigpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NoYXJlZFRvcnJlbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2hhcmVkVG9ycmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NoYXJlZFRvcnJlbnQuamF2YQpAQCAtMCwwICsxLDg1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5Db25zdGFudHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuUGVlckFjdGl2aXR5TGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuUGllY2VTdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlLlRvcnJlbnRCeXRlU3RvcmFnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3kuKjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uT3B0aW9uYWw7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKKworLyoqCisgKiBBIHRvcnJlbnQgc2hhcmVkIGJ5IHRoZSBCaXRUb3JyZW50IGNsaWVudC4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhlIHtAbGluayBTaGFyZWRUb3JyZW50fSBjbGFzcyBleHRlbmRzIHRoZSBUb3JyZW50IGNsYXNzIHdpdGggYWxsIHRoZSBkYXRhCisgKiBhbmQgbG9naWMgcmVxdWlyZWQgYnkgdGhlIEJpdFRvcnJlbnQgY2xpZW50IGltcGxlbWVudGF0aW9uLgorICogPC9wPgorICogPHAvPgorICogPHA+CisgKiA8ZW0+Tm90ZTo8L2VtPiB0aGlzIGltcGxlbWVudGF0aW9uIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHNpbmdsZS1maWxlCisgKiB0b3JyZW50cy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworCisvLyDliJvlu7p0b3JyZW505a+56LGhCisvLyDmjqXlj6Pnu6fmib/nmoTku6PnoIHkuI3nlKjmgI7kuYjnnIvvvIzlj43mraPlrp7njrDmmK/lnKjmlofku7bph4znmoQKK3B1YmxpYyBjbGFzcyBTaGFyZWRUb3JyZW50IGltcGxlbWVudHMgUGVlckFjdGl2aXR5TGlzdGVuZXIsIFRvcnJlbnRNZXRhZGF0YSwgVG9ycmVudEluZm8geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaGFyZWRUb3JyZW50LmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXF1ZXN0U3RyYXRlZ3kgREVGQVVMVF9SRVFVRVNUX1NUUkFURUdZID0gbmV3IFJlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZygpOworCisgIC8qKgorICAgKiBFbmQtZ2FtZSB0cmlnZ2VyIHJhdGlvLgorICAgKgorICAgKiA8cD4KKyAgICogRW5nLWdhbWUgYmVoYXZpb3IgKHJlcXVlc3RpbmcgYWxyZWFkeSByZXF1ZXN0ZWQgcGllY2VzIGZyb20gYXZhaWxhYmxlCisgICAqIGFuZCByZWFkeSBwZWVycyB0byB0cnkgdG8gc3BlZWQtdXAgdGhlIGVuZCBvZiB0aGUgdHJhbnNmZXIpIHdpbGwgb25seSBiZQorICAgKiBlbmFibGVkIHdoZW4gdGhlIHJhdGlvIG9mIGNvbXBsZXRlZCBwaWVjZXMgb3ZlciB0b3RhbCBwaWVjZXMgaW4gdGhlCisgICAqIHRvcnJlbnQgaXMgb3ZlciB0aGlzIHZhbHVlLgorICAgKiA8L3A+CisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFTkdfR0FNRV9DT01QTEVUSU9OX1JBVElPID0gMC45NWY7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfR0FNRV9TVEFUSUNfUElFQ0VTX0NPVU5UID0gMjA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5EX0dBTUVfSU5WT0NBVElPTl9QRVJJT0RfTVMgPSAyMDAwOworCisgIHByaXZhdGUgZmluYWwgVG9ycmVudFN0YXRpc3RpYyBteVRvcnJlbnRTdGF0aXN0aWM7CisKKyAgcHJpdmF0ZSBsb25nIG15TGFzdEFubm91bmNlVGltZSA9IC0xOworICBwcml2YXRlIGludCBteVNlZWRlcnNDb3VudCA9IDA7CisKKyAgcHJpdmF0ZSBmaW5hbCBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlOworICBwcml2YXRlIGJvb2xlYW4gaXNGaWxlQ2hhbm5lbE9wZW4gPSBmYWxzZTsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgRnV0dXJlPD8+PiBteVZhbGlkYXRpb25GdXR1cmVzOworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRNZXRhZGF0YSBteVRvcnJlbnRNZXRhZGF0YTsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIG15VG9ycmVudFRvdGFsU2l6ZTsKKworICBwcml2YXRlIGZpbmFsIGludCBwaWVjZUxlbmd0aDsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIHBpZWNlc0hhc2hlczsKKworICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7CisgIHByaXZhdGUgUGllY2VbXSBwaWVjZXM7CisgIHByaXZhdGUgZmluYWwgQml0U2V0IGNvbXBsZXRlZFBpZWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBCaXRTZXQgcmVxdWVzdGVkUGllY2VzOworICBwcml2YXRlIGZpbmFsIFJlcXVlc3RTdHJhdGVneSBteVJlcXVlc3RTdHJhdGVneTsKKyAgcHJpdmF0ZSBmaW5hbCBFdmVudERpc3BhdGNoZXIgZXZlbnREaXNwYXRjaGVyOworCisgIHByaXZhdGUgZmluYWwgTGlzdDxTaGFyaW5nUGVlcj4gbXlEb3dubG9hZGVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxTaGFyaW5nUGVlcj4oKTsKKyAgcHJpdmF0ZSBmaW5hbCBFbmRHYW1lU3RyYXRlZ3kgZW5kR2FtZVN0cmF0ZWd5ID0gbmV3IEVuZEdhbWVTdHJhdGVneUltcGwoMik7CisgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBlbmRHYW1lRW5hYmxlZE9uID0gLTE7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBDbGllbnRTdGF0ZSBjbGllbnRTdGF0ZSA9IENsaWVudFN0YXRlLldBSVRJTkc7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkFMSURBVElPTl9UQVNLX0NPVU5UID0gMjAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFUVVFU1RFRF9QSUVDRVNfUEVSX1RPUlJFTlQgPSAxMDA7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBzaGFyZWQgdG9ycmVudCBmcm9tIG1ldGEtaW5mbworICAgKgorICAgKiBAcGFyYW0gdG9ycmVudE1ldGFkYXRhIFRoZSBtZXRhLWluZm8KKyAgICogQHBhcmFtIGV2ZW50RGlzcGF0Y2hlcgorICAgKi8KKyAgcHVibGljIFNoYXJlZFRvcnJlbnQoVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YSwgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZSwgUmVxdWVzdFN0cmF0ZWd5IHJlcXVlc3RTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgVG9ycmVudFN0YXRpc3RpYyB0b3JyZW50U3RhdGlzdGljLCBFdmVudERpc3BhdGNoZXIgZXZlbnREaXNwYXRjaGVyKSB7CisgICAgbXlUb3JyZW50TWV0YWRhdGEgPSB0b3JyZW50TWV0YWRhdGE7CisgICAgdGhpcy5waWVjZVN0b3JhZ2UgPSBwaWVjZVN0b3JhZ2U7CisgICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBldmVudERpc3BhdGNoZXI7CisgICAgbXlUb3JyZW50U3RhdGlzdGljID0gdG9ycmVudFN0YXRpc3RpYzsKKyAgICBteVZhbGlkYXRpb25GdXR1cmVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgRnV0dXJlPD8+PigpOworICAgIGxvbmcgdG90YWxTaXplID0gMDsKKyAgICBmb3IgKFRvcnJlbnRGaWxlIHRvcnJlbnRGaWxlIDogbXlUb3JyZW50TWV0YWRhdGEuZ2V0RmlsZXMoKSkgeworICAgICAgdG90YWxTaXplICs9IHRvcnJlbnRGaWxlLnNpemU7CisgICAgfQorICAgIG15VG9ycmVudFRvdGFsU2l6ZSA9IHRvdGFsU2l6ZTsKKyAgICB0aGlzLm15UmVxdWVzdFN0cmF0ZWd5ID0gcmVxdWVzdFN0cmF0ZWd5OworCisgICAgdGhpcy5waWVjZUxlbmd0aCA9IG15VG9ycmVudE1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCk7CisgICAgdGhpcy5waWVjZXNIYXNoZXMgPSBCeXRlQnVmZmVyLndyYXAobXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzSGFzaGVzKCkpOworCisgICAgaWYgKHRoaXMucGllY2VzSGFzaGVzLmNhcGFjaXR5KCkgLyBDb25zdGFudHMuUElFQ0VfSEFTSF9TSVpFICoKKyAgICAgICAgICAgIChsb25nKSB0aGlzLnBpZWNlTGVuZ3RoIDwgbXlUb3JyZW50VG90YWxTaXplKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb3JyZW50IHNpemUgZG9lcyBub3QgIiArCisgICAgICAgICAgICAgICJtYXRjaCB0aGUgbnVtYmVyIG9mIHBpZWNlcyBhbmQgdGhlIHBpZWNlIHNpemUhIik7CisgICAgfQorCisgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOworICAgIHRoaXMucGllY2VzID0gbmV3IFBpZWNlWzBdOworICAgIHRoaXMuY29tcGxldGVkUGllY2VzID0gbmV3IEJpdFNldCh0b3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSk7CisgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMgPSBuZXcgQml0U2V0KCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFNoYXJlZFRvcnJlbnQgZnJvbUZpbGUoRmlsZSBzb3VyY2UsIFBpZWNlU3RvcmFnZSBwaWVjZVN0b3JhZ2UsIFRvcnJlbnRTdGF0aXN0aWMgdG9ycmVudFN0YXRpc3RpYykKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBkYXRhID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkoc291cmNlKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudE1ldGFkYXRhID0gbmV3IFRvcnJlbnRQYXJzZXIoKS5wYXJzZShkYXRhKTsKKyAgICByZXR1cm4gbmV3IFNoYXJlZFRvcnJlbnQodG9ycmVudE1ldGFkYXRhLCBwaWVjZVN0b3JhZ2UsIERFRkFVTFRfUkVRVUVTVF9TVFJBVEVHWSwgdG9ycmVudFN0YXRpc3RpYywgbmV3IEV2ZW50RGlzcGF0Y2hlcigpKTsKKyAgfQorCisgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xvc2VGaWxlQ2hhbm5lbElmTmVjZXNzYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoaXNGaWxlQ2hhbm5lbE9wZW4gJiYgbXlEb3dubG9hZGVycy5zaXplKCkgPT0gMCkgeworICAgICAgbG9nZ2VyLmRlYnVnKCJDbG9zaW5nIGZpbGUgIGNoYW5uZWwgZm9yIHt9IGlmIG5lY2Vzc2FyeS4gRG93bmxvYWRlcnM6IHt9IiwgZ2V0SGV4SW5mb0hhc2goKSwgbXlEb3dubG9hZGVycy5zaXplKCkpOworICAgICAgdGhpcy5waWVjZVN0b3JhZ2UuY2xvc2UoKTsKKyAgICAgIGlzRmlsZUNoYW5uZWxPcGVuID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVwbG9hZGVkIGZvciB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRVcGxvYWRlZCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50U3RhdGlzdGljLmdldFVwbG9hZGVkQnl0ZXMoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBkb3dubG9hZGVkIGZvciB0aGlzIHRvcnJlbnQuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIDxiPk5vdGU6PC9iPiB0aGlzIGNvdWxkIGJlIG1vcmUgdGhhbiB0aGUgdG9ycmVudCdzIGxlbmd0aCwgYW5kIHNob3VsZAorICAgKiBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgYSBjb21wbGV0aW9uIHBlcmNlbnRhZ2UuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBsb25nIGdldERvd25sb2FkZWQoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudFN0YXRpc3RpYy5nZXREb3dubG9hZGVkQnl0ZXMoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGRvd25sb2FkIGZvciB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRMZWZ0KCkgeworICAgIHJldHVybiBteVRvcnJlbnRTdGF0aXN0aWMuZ2V0TGVmdEJ5dGVzKCk7CisgIH0KKworICBwdWJsaWMgaW50IGdldFNlZWRlcnNDb3VudCgpIHsKKyAgICByZXR1cm4gbXlTZWVkZXJzQ291bnQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTZWVkZXJzQ291bnQoaW50IHNlZWRlcnNDb3VudCkgeworICAgIG15U2VlZGVyc0NvdW50ID0gc2VlZGVyc0NvdW50OworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0TGFzdEFubm91bmNlVGltZSgpIHsKKyAgICByZXR1cm4gbXlMYXN0QW5ub3VuY2VUaW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TGFzdEFubm91bmNlVGltZShsb25nIGxhc3RBbm5vdW5jZVRpbWUpIHsKKyAgICBteUxhc3RBbm5vdW5jZVRpbWUgPSBsYXN0QW5ub3VuY2VUaW1lOworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyB0b3JyZW50IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIHlldC4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZWQ7CisgIH0KKworICAvKioKKyAgICogU3RvcCB0aGUgdG9ycmVudCBpbml0aWFsaXphdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgKi8KKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZCB0aGlzIHRvcnJlbnQncyBwaWVjZXMgYXJyYXkuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIEhhc2ggYW5kIHZlcmlmeSBhbnkgcG90ZW50aWFsbHkgcHJlc2VudCBsb2NhbCBkYXRhIGFuZCBjcmVhdGUgdGhpcworICAgKiB0b3JyZW50J3MgcGllY2VzIGFycmF5IGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBoYXNoIHByb3ZpZGVkIGluIHRoZQorICAgKiB0b3JyZW50IG1ldGEtaW5mby4KKyAgICogPC9wPgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgc29vbiBhZnRlciB0aGUgY29uc3RydWN0b3IgdG8gaW5pdGlhbGl6ZQorICAgKiB0aGUgcGllY2VzIGFycmF5LgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHNldENsaWVudFN0YXRlKENsaWVudFN0YXRlLlZBTElEQVRJTkcpOworCisgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUb3JyZW50IHdhcyBhbHJlYWR5IGluaXRpYWxpemVkISIpOworICAgIH0KKworICAgIGhhc2hTaW5nbGVUaHJlYWQoKTsKKworICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRQaWVjZXMoKSB7CisgICAgaW50IG5QaWVjZXMgPSAoaW50KSAoTWF0aC5jZWlsKAorICAgICAgICAgICAgKGRvdWJsZSkgbXlUb3JyZW50VG90YWxTaXplIC8gdGhpcy5waWVjZUxlbmd0aCkpOworICAgIHRoaXMucGllY2VzID0gbmV3IFBpZWNlW25QaWVjZXNdOworICAgIHRoaXMucGllY2VzSGFzaGVzLmNsZWFyKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaGFzaFNpbmdsZVRocmVhZCgpIHsKKyAgICBpbml0UGllY2VzKCk7CisKKyAgICBsb2dnZXIuZGVidWcoIkFuYWx5emluZyBsb2NhbCBkYXRhIGZvciB7fSB3aXRoIHt9IHRocmVhZHMuLi4iLAorICAgICAgICAgICAgbXlUb3JyZW50TWV0YWRhdGEuZ2V0RGlyZWN0b3J5TmFtZSgpLCBUb3JyZW50Q3JlYXRvci5IQVNISU5HX1RIUkVBRFNfQ09VTlQpOworICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHRoaXMucGllY2VzLmxlbmd0aDsgaWR4KyspIHsKKyAgICAgIGJ5dGVbXSBoYXNoID0gbmV3IGJ5dGVbQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRV07CisgICAgICB0aGlzLnBpZWNlc0hhc2hlcy5nZXQoaGFzaCk7CisKKyAgICAgIC8vIFRoZSBsYXN0IHBpZWNlIG1heSBiZSBzaG9ydGVyIHRoYW4gdGhlIHRvcnJlbnQncyBnbG9iYWwgcGllY2UKKyAgICAgIC8vIGxlbmd0aC4gTGV0J3MgbWFrZSBzdXJlIHdlIGdldCB0aGUgcmlnaHQgcGllY2UgbGVuZ3RoIGluIGFueQorICAgICAgLy8gc2l0dWF0aW9uLgorICAgICAgbG9uZyBvZmYgPSAoKGxvbmcpIGlkeCkgKiB0aGlzLnBpZWNlTGVuZ3RoOworICAgICAgbG9uZyBsZW4gPSBNYXRoLm1pbigKKyAgICAgICAgICAgICAgbXlUb3JyZW50VG90YWxTaXplIC0gb2ZmLAorICAgICAgICAgICAgICB0aGlzLnBpZWNlTGVuZ3RoKTsKKworICAgICAgUGllY2UgcGllY2UgPSBuZXcgUGllY2UodGhpcy5waWVjZVN0b3JhZ2UsIGlkeCwgbGVuLCBoYXNoCisgICAgICApOworICAgICAgdGhpcy5waWVjZXNbaWR4XSA9IHBpZWNlOworICAgICAgcGllY2Uuc2V0VmFsaWQocGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmdldChpZHgpKTsKKworICAgICAgaWYgKHBpZWNlLmlzVmFsaWQoKSkgeworICAgICAgICB0aGlzLmNvbXBsZXRlZFBpZWNlcy5zZXQocGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgIGxvZ2dlci50cmFjZSgiQ2xvc2luZyB0b3JyZW50IiwgbXlUb3JyZW50TWV0YWRhdGEuZ2V0RGlyZWN0b3J5TmFtZSgpKTsKKyAgICB0cnkgeworICAgICAgdGhpcy5waWVjZVN0b3JhZ2UuY2xvc2UoKTsKKyAgICAgIGlzRmlsZUNoYW5uZWxPcGVuID0gZmFsc2U7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkVycm9yIGNsb3NpbmcgdG9ycmVudCBieXRlIHN0b3JhZ2U6IHt9IiwKKyAgICAgICAgICAgICAgaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlRnVsbHkoKSB7CisgICAgbG9nZ2VyLnRyYWNlKCJDbG9zaW5nIHRvcnJlbnQiLCBteVRvcnJlbnRNZXRhZGF0YS5nZXREaXJlY3RvcnlOYW1lKCkpOworICAgIHRyeSB7CisgICAgICB0aGlzLnBpZWNlU3RvcmFnZS5jbG9zZUZ1bGx5KCk7CisgICAgICBpc0ZpbGVDaGFubmVsT3BlbiA9IGZhbHNlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJFcnJvciBjbG9zaW5nIHRvcnJlbnQgYnl0ZSBzdG9yYWdlOiB7fSIsCisgICAgICAgICAgICAgIGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXRyaWV2ZSBhIHBpZWNlIG9iamVjdCBieSBpbmRleC4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcGllY2UgaW4gdGhpcyB0b3JyZW50LgorICAgKi8KKyAgcHVibGljIFBpZWNlIGdldFBpZWNlKGludCBpbmRleCkgeworICAgIGlmICh0aGlzLnBpZWNlcyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUb3JyZW50IG5vdCBpbml0aWFsaXplZCB5ZXQuIik7CisgICAgfQorCisgICAgaWYgKGluZGV4ID49IHRoaXMucGllY2VzLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwaWVjZSBpbmRleCEiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5waWVjZXNbaW5kZXhdOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGJpdCBmaWVsZCBvZiBhdmFpbGFibGUgcGllY2VzIGZvciB0aGlzIHRvcnJlbnQuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIEF2YWlsYWJsZSBwaWVjZXMgYXJlIHBpZWNlcyBhdmFpbGFibGUgaW4gdGhlIHN3YXJtLCBhbmQgaXQgZG9lcyBub3QKKyAgICogaW5jbHVkZSBvdXIgb3duIHBpZWNlcy4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIEJpdFNldCBnZXRBdmFpbGFibGVQaWVjZXMoKSB7CisgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBub3QgeWV0IGluaXRpYWxpemVkISIpOworICAgIH0KKworICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSBuZXcgQml0U2V0KHRoaXMucGllY2VzLmxlbmd0aCk7CisKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMucGllY2VzKSB7CisgICAgICBmb3IgKFBpZWNlIHBpZWNlIDogdGhpcy5waWVjZXMpIHsKKyAgICAgICAgaWYgKHBpZWNlLmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgYXZhaWxhYmxlUGllY2VzLnNldChwaWVjZS5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhdmFpbGFibGVQaWVjZXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgY29tcGxldGVkIHBpZWNlcyBiaXRzZXQuCisgICAqLworICBwdWJsaWMgQml0U2V0IGdldENvbXBsZXRlZFBpZWNlcygpIHsKKyAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUb3JyZW50IG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIik7CisgICAgfQorCisgICAgcmV0dXJuIHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKTsKKyAgfQorCisgIC8qKgorICAgKiBUZWxscyB3aGV0aGVyIHRoaXMgdG9ycmVudCBoYXMgYmVlbiBmdWxseSBkb3dubG9hZGVkLCBvciBpcyBmdWxseQorICAgKiBhdmFpbGFibGUgbG9jYWxseS4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgIHJldHVybiB0aGlzLnBpZWNlcy5sZW5ndGggPiAwCisgICAgICAgICAgICAmJiBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSA9PSBteVRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpOworICB9CisKKyAgLyoqCisgICAqIEZpbmFsaXplIHRoZSBkb3dubG9hZCBvZiB0aGlzIHRvcnJlbnQuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoaXMgcmVhbGl6ZXMgdGhlIGZpbmFsLCBwcmUtc2VlZGluZyBwaGFzZSBhY3Rpb25zIG9uIHRoaXMgdG9ycmVudCwKKyAgICogd2hpY2ggdXN1YWxseSBjb25zaXN0cyBpbiBwdXR0aW5nIHRoZSB0b3JyZW50IGRhdGEgaW4gdGhlaXIgZmluYWwgZm9ybQorICAgKiBhbmQgYXQgdGhlaXIgdGFyZ2V0IGxvY2F0aW9uLgorICAgKiA8L3A+CisgICAqCisgICAqIEBzZWUgVG9ycmVudEJ5dGVTdG9yYWdlI2ZpbmlzaAorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGZpbmlzaCgpIHsKKyAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUb3JyZW50IG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIik7CisgICAgfQorCisgICAgaWYgKCF0aGlzLmlzQ29tcGxldGUoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVG9ycmVudCBkb3dubG9hZCBpcyBub3QgY29tcGxldGUhIik7CisgICAgfQorCisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkuZG93bmxvYWRDb21wbGV0ZSgpOworICAgIHNldENsaWVudFN0YXRlKENsaWVudFN0YXRlLlNFRURJTkcpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICByZXR1cm4gcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCkgPT0gbXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKTsKKyAgfQorCisgIHB1YmxpYyBDbGllbnRTdGF0ZSBnZXRDbGllbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gdGhpcy5jbGllbnRTdGF0ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENsaWVudFN0YXRlKENsaWVudFN0YXRlIGNsaWVudFN0YXRlKSB7CisgICAgdGhpcy5jbGllbnRTdGF0ZSA9IGNsaWVudFN0YXRlOworICB9CisKKyAgLyoqCisgICAqIE1hcmsgYSBwaWVjZSBhcyBjb21wbGV0ZWQsIGRlY3JlbWVudGluZyB0aGUgcGllY2Ugc2l6ZSBpbiBieXRlcyBmcm9tIG91cgorICAgKiBsZWZ0IGJ5dGVzIHRvIGRvd25sb2FkIGNvdW50ZXIuCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFya0NvbXBsZXRlZChQaWVjZSBwaWVjZSkgeworICAgIGlmICh0aGlzLmNvbXBsZXRlZFBpZWNlcy5nZXQocGllY2UuZ2V0SW5kZXgoKSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBIGNvbXBsZXRlZCBwaWVjZSBtZWFucyB0aGF0J3MgdGhhdCBtdWNoIGRhdGEgbGVmdCB0byBkb3dubG9hZCBmb3IKKyAgICAvLyB0aGlzIHRvcnJlbnQuCisgICAgbXlUb3JyZW50U3RhdGlzdGljLmFkZExlZnQoLXBpZWNlLnNpemUoKSk7CisgICAgdGhpcy5jb21wbGV0ZWRQaWVjZXMuc2V0KHBpZWNlLmdldEluZGV4KCkpOworICAgIGlmIChjb21wbGV0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSA9PSBnZXRQaWVjZXNDb3VudCgpKSB7CisgICAgICBsb2dnZXIuaW5mbygiYWxsIHBpZWNlcyBhcmUgcmVjZWl2ZWQgZm9yIHRvcnJlbnQge30uIFZhbGlkYXRpbmcuLi4iLCB0aGlzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFya1VuY29tcGxldGVkKFBpZWNlIHBpZWNlKSB7CisgICAgaWYgKCF0aGlzLmNvbXBsZXRlZFBpZWNlcy5nZXQocGllY2UuZ2V0SW5kZXgoKSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZW1vdmVWYWxpZGF0aW9uRnV0dXJlKHBpZWNlKTsKKyAgICBteVRvcnJlbnRTdGF0aXN0aWMuYWRkTGVmdChwaWVjZS5zaXplKCkpOworICAgIHRoaXMuY29tcGxldGVkUGllY2VzLmNsZWFyKHBpZWNlLmdldEluZGV4KCkpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVZhbGlkYXRpb25GdXR1cmUoUGllY2UgcGllY2UpIHsKKyAgICBteVZhbGlkYXRpb25GdXR1cmVzLnJlbW92ZShwaWVjZS5nZXRJbmRleCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIG5vdGlmeVBpZWNlRG93bmxvYWRlZChQaWVjZSBwaWVjZSwgU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBpZWNlRG93bmxvYWRlZChwaWVjZSwgcGVlcik7CisgIH0KKworICAvKiogUGVlckFjdGl2aXR5TGlzdGVuZXIgaGFuZGxlcihzKS4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioKKyAgICogUGVlciBjaG9rZWQgaGFuZGxlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2hlbiBhIHBlZXIgY2hva2VzLCB0aGUgcmVxdWVzdHMgbWFkZSB0byBpdCBhcmUgY2FuY2VsZWQgYW5kIHdlIG5lZWQgdG8KKyAgICogbWFyayB0aGUgZXZlbnR1YWxseSBwaWVjZSB3ZSByZXF1ZXN0ZWQgZnJvbSBpdCBhcyBhdmFpbGFibGUgYWdhaW4gZm9yCisgICAqIGRvd25sb2FkIHRlbnRhdGl2ZSBmcm9tIGFub3RoZXIgcGVlci4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciB0aGF0IGNob2tlZC4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlUGVlckNob2tlZChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgU2V0PFBpZWNlPiBwaWVjZXMgPSBwZWVyLmdldFJlcXVlc3RlZFBpZWNlcygpOworCisgICAgaWYgKHBpZWNlcy5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKFBpZWNlIHBpZWNlIDogcGllY2VzKSB7CisgICAgICAgIHRoaXMucmVxdWVzdGVkUGllY2VzLnNldChwaWVjZS5nZXRJbmRleCgpLCBmYWxzZSk7CisgICAgICB9CisgICAgfQorCisgICAgbG9nZ2VyLnRyYWNlKCJQZWVyIHt9IGNob2tlZCwgd2Ugbm93IGhhdmUge30gb3V0c3RhbmRpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0KHMpOiB7fS4iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICBwZWVyLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcworICAgICAgICAgICAgfSk7CisgIH0KKworICAvKioKKyAgICogUGVlciByZWFkeSBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBXaGVuIGEgcGVlciBiZWNvbWVzIHJlYWR5IHRvIGFjY2VwdCBwaWVjZSBibG9jayByZXF1ZXN0cywgc2VsZWN0IGEgcGllY2UKKyAgICogdG8gZG93bmxvYWQgYW5kIGdvIGZvciBpdC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciB0aGF0IGJlY2FtZSByZWFkeS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQZWVyUmVhZHkoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGluaXRJZk5lY2Vzc2FyeShwZWVyKTsKKworICAgIFJlcXVlc3RzQ29sbGVjdGlvbiByZXF1ZXN0c0NvbGxlY3Rpb24gPSBnZXRSZXF1ZXN0c0NvbGxlY3Rpb24ocGVlcik7CisgICAgcmVxdWVzdHNDb2xsZWN0aW9uLnNlbmRBbGxSZXF1ZXN0cygpOworICB9CisKKyAgQE5vdE51bGwKKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgUmVxdWVzdHNDb2xsZWN0aW9uIGdldFJlcXVlc3RzQ29sbGVjdGlvbihmaW5hbCBTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgaWYgKG15VmFsaWRhdGlvbkZ1dHVyZXMuc2l6ZSgpID4gTUFYX1ZBTElEQVRJT05fVEFTS19DT1VOVCkgcmV0dXJuIFJlcXVlc3RzQ29sbGVjdGlvbi5FbXB0eS5JTlNUQU5DRTsKKworICAgIGlmICh0aGlzLnJlcXVlc3RlZFBpZWNlcy5jYXJkaW5hbGl0eSgpID4gTUFYX1JFUVVFU1RFRF9QSUVDRVNfUEVSX1RPUlJFTlQpIHJldHVybiBSZXF1ZXN0c0NvbGxlY3Rpb24uRW1wdHkuSU5TVEFOQ0U7CisKKyAgICBpbnQgY29tcGxldGVkQW5kVmFsaWRhdGVkID0gcGllY2VTdG9yYWdlLmdldEF2YWlsYWJsZVBpZWNlcygpLmNhcmRpbmFsaXR5KCk7CisKKyAgICBib29sZWFuIHR1cm5PbkVuZEdhbWUgPSBjb21wbGV0ZWRBbmRWYWxpZGF0ZWQgPiBnZXRQaWVjZXNDb3VudCgpICogRU5HX0dBTUVfQ09NUExFVElPTl9SQVRJTyB8fAorICAgICAgICAgICAgY29tcGxldGVkQW5kVmFsaWRhdGVkID4gZ2V0UGllY2VzQ291bnQoKSAtIEVORF9HQU1FX1NUQVRJQ19QSUVDRVNfQ09VTlQ7CisgICAgaWYgKHR1cm5PbkVuZEdhbWUpIHsKKyAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICBpZiAobm93IC0gRU5EX0dBTUVfSU5WT0NBVElPTl9QRVJJT0RfTVMgPiBlbmRHYW1lRW5hYmxlZE9uKSB7CisgICAgICAgIGVuZEdhbWVFbmFibGVkT24gPSBub3c7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSdW5uaW5nIGVuZC1nYW1lIG1vZGUsIGN1cnJlbnRseSBhdmFpbGFibGUge30ve30gcGllY2VzIiwKKyAgICAgICAgICAgICAgICBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICBnZXRQaWVjZUNvdW50KCkpOworICAgICAgICByZXR1cm4gZW5kR2FtZVN0cmF0ZWd5LmNvbGxlY3RSZXF1ZXN0cyhwaWVjZXMsIG15RG93bmxvYWRlcnMpOworICAgICAgfQorICAgICAgcmV0dXJuIFJlcXVlc3RzQ29sbGVjdGlvbi5FbXB0eS5JTlNUQU5DRTsKKyAgICB9CisKKyAgICBmaW5hbCBCaXRTZXQgaW50ZXJlc3RpbmcgPSBwZWVyLmdldEF2YWlsYWJsZVBpZWNlcygpOworICAgIGludGVyZXN0aW5nLmFuZE5vdCh0aGlzLmNvbXBsZXRlZFBpZWNlcyk7CisgICAgaW50ZXJlc3RpbmcuYW5kTm90KHRoaXMucmVxdWVzdGVkUGllY2VzKTsKKworICAgIGludCBtYXhSZXF1ZXN0aW5nUGllY2VzID0gTWF0aC5taW4oMTAsIGludGVyZXN0aW5nLmNhcmRpbmFsaXR5KCkpOworICAgIGludCBjdXJyZW50bHlEb3dubG9hZGluZyA9IHBlZXIuZ2V0RG93bmxvYWRpbmdQaWVjZXNDb3VudCgpOworICAgIE1hcDxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+IHRvUmVxdWVzdCA9IG5ldyBIYXNoTWFwPFBpZWNlLCBMaXN0PFNoYXJpbmdQZWVyPj4oKTsKKyAgICB3aGlsZSAoY3VycmVudGx5RG93bmxvYWRpbmcgPCBtYXhSZXF1ZXN0aW5nUGllY2VzKSB7CisgICAgICBpZiAoIXBlZXIuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKGludGVyZXN0aW5nLmNhcmRpbmFsaXR5KCkgPT0gMCkgeworICAgICAgICByZXR1cm4gUmVxdWVzdHNDb2xsZWN0aW9uLkVtcHR5LklOU1RBTkNFOworICAgICAgfQorCisgICAgICBQaWVjZSBjaG9zZW4gPSBteVJlcXVlc3RTdHJhdGVneS5jaG9vc2VQaWVjZShpbnRlcmVzdGluZywgcGllY2VzKTsKKyAgICAgIGlmIChjaG9zZW4gPT0gbnVsbCkgeworICAgICAgICBsb2dnZXIuaW5mbygiY2hvc2VuIHBpZWNlIGlzIG51bGwiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcy5zZXQoY2hvc2VuLmdldEluZGV4KCkpOworICAgICAgY3VycmVudGx5RG93bmxvYWRpbmcrKzsKKyAgICAgIHRvUmVxdWVzdC5wdXQoY2hvc2VuLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBlZXIpKTsKKyAgICAgIGludGVyZXN0aW5nLmNsZWFyKGNob3Nlbi5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFJlcXVlc3RzQ29sbGVjdGlvbkltcGwodG9SZXF1ZXN0KTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0SWZOZWNlc3NhcnkoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7CisgICAgICB0cnkgeworICAgICAgICBpbml0KCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJJbnRlcnJ1cHRlZCBpbml0IiwgZSk7CisgICAgICAgIHBlZXIudW5iaW5kKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJJT0UgZHVyaW5nIGluaXQiLCBlKTsKKyAgICAgICAgcGVlci51bmJpbmQodHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGllY2UgYXZhaWxhYmlsaXR5IGhhbmRsZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIEhhbmRsZSB1cGRhdGVzIGluIHBpZWNlIGF2YWlsYWJpbGl0eSBmcm9tIGEgcGVlcidzIEhBVkUgbWVzc2FnZS4gV2hlbgorICAgKiB0aGlzIGhhcHBlbnMsIHdlIG5lZWQgdG8gbWFyayB0aGF0IHBpZWNlIGFzIGF2YWlsYWJsZSBmcm9tIHRoZSBwZWVyLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyICBUaGUgcGVlciB3ZSBnb3QgdGhlIHVwZGF0ZSBmcm9tLgorICAgKiBAcGFyYW0gcGllY2UgVGhlIHBpZWNlIHRoYXQgYmVjYW1lIGF2YWlsYWJsZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZUF2YWlsYWJpbGl0eShTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSkgeworICAgIGJvb2xlYW4gaXNQZWVySW50ZXJlc3RpbmcgPSAhdGhpcy5jb21wbGV0ZWRQaWVjZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpICYmCisgICAgICAgICAgICAhdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpOworICAgIGlmIChpc1BlZXJJbnRlcmVzdGluZykgeworICAgICAgcGVlci5pbnRlcmVzdGluZygpOworICAgIH0KKworICAgIHBpZWNlLnNlZW5BdChwZWVyKTsKKworICAgIGxvZ2dlci50cmFjZSgiUGVlciB7fSBjb250cmlidXRlcyB7fSBwaWVjZShzKSBbe30ve30ve31dLiIsCisgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgIHBlZXIsCisgICAgICAgICAgICAgICAgICAgIHBlZXIuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBdmFpbGFibGVQaWVjZXMoKS5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnBpZWNlcy5sZW5ndGgKKyAgICAgICAgICAgIH0pOworCisgICAgaWYgKCFwZWVyLmlzQ2hva2VkKCkgJiYKKyAgICAgICAgICAgIHBlZXIuaXNJbnRlcmVzdGluZygpICYmCisgICAgICAgICAgICAhcGVlci5pc0Rvd25sb2FkaW5nKCkpIHsKKyAgICAgIHRoaXMuaGFuZGxlUGVlclJlYWR5KHBlZXIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBCaXQgZmllbGQgYXZhaWxhYmlsaXR5IGhhbmRsZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIEhhbmRsZSB1cGRhdGVzIGluIHBpZWNlIGF2YWlsYWJpbGl0eSBmcm9tIGEgcGVlcidzIEJJVEZJRUxEIG1lc3NhZ2UuCisgICAqIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBuZWVkIHRvIG1hcmsgaW4gYWxsIHRoZSBwaWVjZXMgdGhlIHBlZXIgaGFzIHRoYXQKKyAgICogdGhleSBjYW4gYmUgcmVhY2hlZCB0aHJvdWdoIHRoaXMgcGVlciwgdGh1cyBhdWdtZW50aW5nIHRoZSBnbG9iYWwKKyAgICogYXZhaWxhYmlsaXR5IG9mIHBpZWNlcy4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgICAgICAgICAgIFRoZSBwZWVyIHdlIGdvdCB0aGUgdXBkYXRlIGZyb20uCisgICAqIEBwYXJhbSBhdmFpbGFibGVQaWVjZXMgVGhlIHBpZWNlcyBhdmFpbGFiaWxpdHkgYml0IGZpZWxkIG9mIHRoZSBwZWVyLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZUJpdGZpZWxkQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMpIHsKKyAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHBlZXIgaXMgaW50ZXJlc3RpbmcgZm9yIHVzIG9yIG5vdCwgYW5kIG5vdGlmeSBpdC4KKyAgICBCaXRTZXQgaW50ZXJlc3RpbmcgPSAoQml0U2V0KSBhdmFpbGFibGVQaWVjZXMuY2xvbmUoKTsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgIGludGVyZXN0aW5nLmFuZE5vdCh0aGlzLmNvbXBsZXRlZFBpZWNlcyk7CisgICAgICBpbnRlcmVzdGluZy5hbmROb3QodGhpcy5yZXF1ZXN0ZWRQaWVjZXMpOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhlIHBlZXIgaGFzIGFsbCB0aGUgcGllY2VzIGl0IHRvbGQgdXMgaXQgaGFkLgorICAgIGZvciAoaW50IGkgPSBhdmFpbGFibGVQaWVjZXMubmV4dFNldEJpdCgwKTsgaSA+PSAwOworICAgICAgICAgaSA9IGF2YWlsYWJsZVBpZWNlcy5uZXh0U2V0Qml0KGkgKyAxKSkgeworICAgICAgdGhpcy5waWVjZXNbaV0uc2VlbkF0KHBlZXIpOworICAgIH0KKworICAgIGlmIChpbnRlcmVzdGluZy5jYXJkaW5hbGl0eSgpID09IDApIHsKKyAgICAgIHBlZXIubm90SW50ZXJlc3RpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGVlci5pbnRlcmVzdGluZygpOworICAgIH0KKworICAgIGxvZ2dlci5kZWJ1ZygiUGVlciB7fSBjb250cmlidXRlcyB7fSBwaWVjZShzKSwgdG90YWwgcGllY2VzIGNvdW50OiB7fS4iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICBwZWVyLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgbXlUb3JyZW50TWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKQorICAgICAgICAgICAgfSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldERvd25sb2FkZXJzQ291bnQoKSB7CisgICAgcmV0dXJuIG15RG93bmxvYWRlcnMuc2l6ZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFmdGVyUGVlclJlbW92ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworCisgIH0KKworICAvKioKKyAgICogUGllY2UgdXBsb2FkIGNvbXBsZXRpb24gaGFuZGxlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2hlbiBhIHBpZWNlIGhhcyBiZWVuIHNlbnQgdG8gYSBwZWVyLCB3ZSBqdXN0IHJlY29yZCB0aGF0IHdlIHNlbnQgdGhhdAorICAgKiBtYW55IGJ5dGVzLiBJZiB0aGUgcGllY2UgaXMgdmFsaWQgb24gdGhlIHBlZXIncyBzaWRlLCBpdCB3aWxsIHNlbmQgdXMgYQorICAgKiBIQVZFIG1lc3NhZ2UgYW5kIHdlJ2xsIHJlY29yZCB0aGF0IHRoZSBwaWVjZSBpcyBhdmFpbGFibGUgb24gdGhlIHBlZXIgYXQKKyAgICogdGhhdCBtb21lbnQgKHNlZSA8Y29kZT5oYW5kbGVQaWVjZUF2YWlsYWJpbGl0eSgpPC9jb2RlPikuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgIFRoZSBwZWVyIHdlIGdvdCB0aGlzIHBpZWNlIGZyb20uCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgaW4gcXVlc3Rpb24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaGFuZGxlUGllY2VTZW50KFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKSB7CisgICAgbG9nZ2VyLnRyYWNlKCJDb21wbGV0ZWQgdXBsb2FkIG9mIHt9IHRvIHt9LiIsIHBpZWNlLCBwZWVyKTsKKyAgICBteVRvcnJlbnRTdGF0aXN0aWMuYWRkVXBsb2FkZWQocGllY2Uuc2l6ZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBQaWVjZSBkb3dubG9hZCBjb21wbGV0aW9uIGhhbmRsZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIElmIHRoZSBjb21wbGV0ZSBwaWVjZSBkb3dubG9hZGVkIGlzIHZhbGlkLCB3ZSBjYW4gcmVjb3JkIGluIHRoZSB0b3JyZW50CisgICAqIGNvbXBsZXRlZFBpZWNlcyBiaXQgZmllbGQgdGhhdCB3ZSBrbm93IGhhdmUgdGhpcyBwaWVjZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgVGhlIHBlZXIgd2UgZ290IHRoaXMgcGllY2UgZnJvbS4KKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSBpbiBxdWVzdGlvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVQaWVjZUNvbXBsZXRlZChTaGFyaW5nUGVlciBwZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWVjZSBwaWVjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBSZWdhcmRsZXNzIG9mIHZhbGlkaXR5LCByZWNvcmQgdGhlIG51bWJlciBvZiBieXRlcyBkb3dubG9hZGVkIGFuZAorICAgIC8vIG1hcmsgdGhlIHBpZWNlIGFzIG5vdCByZXF1ZXN0ZWQgYW55bW9yZQorICAgIG15VG9ycmVudFN0YXRpc3RpYy5hZGREb3dubG9hZGVkKHBpZWNlLnNpemUoKSk7CisgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuc2V0KHBpZWNlLmdldEluZGV4KCksIGZhbHNlKTsKKworICAgIGxvZ2dlci50cmFjZSgiV2Ugbm93IGhhdmUge30gcGllY2UocykgYW5kIHt9IG91dHN0YW5kaW5nIHJlcXVlc3Qocyk6IHt9IiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMuY2FyZGluYWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRQaWVjZXMKKyAgICAgICAgICAgIH0pOworICB9CisKKyAgLyoqCisgICAqIFBlZXIgZGlzY29ubmVjdGlvbiBoYW5kbGVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBXaGVuIGEgcGVlciBkaXNjb25uZWN0cywgd2UgbmVlZCB0byBtYXJrIGluIGFsbCBvZiB0aGUgcGllY2VzIGl0IGhhZAorICAgKiBhdmFpbGFibGUgdGhhdCB0aGV5IGNhbid0IGJlIHJlYWNoZWQgdGhyb3VnaCB0aGlzIHBlZXIgYW55bW9yZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgcGVlciB3ZSBnb3QgdGhpcyBwaWVjZSBmcm9tLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVQZWVyRGlzY29ubmVjdGVkKFNoYXJpbmdQZWVyIHBlZXIpIHsKKyAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gcGVlci5nZXRBdmFpbGFibGVQaWVjZXMoKTsKKworICAgIGZvciAoaW50IGkgPSBhdmFpbGFibGVQaWVjZXMubmV4dFNldEJpdCgwKTsgaSA+PSAwOworICAgICAgICAgaSA9IGF2YWlsYWJsZVBpZWNlcy5uZXh0U2V0Qml0KGkgKyAxKSkgeworICAgICAgdGhpcy5waWVjZXNbaV0ubm9Mb25nZXJBdChwZWVyKTsKKyAgICB9CisKKyAgICBTZXQ8UGllY2U+IHJlcXVlc3RlZCA9IHBlZXIuZ2V0UmVxdWVzdGVkUGllY2VzKCk7CisgICAgaWYgKHJlcXVlc3RlZCAhPSBudWxsKSB7CisgICAgICBmb3IgKFBpZWNlIHBpZWNlIDogcmVxdWVzdGVkKSB7CisgICAgICAgIHRoaXMucmVxdWVzdGVkUGllY2VzLnNldChwaWVjZS5nZXRJbmRleCgpLCBmYWxzZSk7CisgICAgICB9CisgICAgfQorCisgICAgbXlEb3dubG9hZGVycy5yZW1vdmUocGVlcik7CisKKyAgICB0cnkgeworICAgICAgY2xvc2VGaWxlQ2hhbm5lbElmTmVjZXNzYXJ5KCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmluZm8oIkkvTyBlcnJvciBvbiBhdHRlbXB0IHRvIGNsb3NlIGZpbGUgc3RvcmFnZTogIiArIGUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgbG9nZ2VyLmRlYnVnKCJQZWVyIHt9IHdlbnQgYXdheSB3aXRoIHt9IHBpZWNlKHMpIFt7fS97fV0uIiwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVkUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMucGllY2VzLmxlbmd0aAorICAgICAgICAgICAgfSk7CisgICAgbG9nZ2VyLnRyYWNlKCJXZSBub3cgaGF2ZSB7fSBwaWVjZShzKSBhbmQge30gb3V0c3RhbmRpbmcgcmVxdWVzdChzKToge30iLAorICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlZFBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcy5jYXJkaW5hbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZFBpZWNlcworICAgICAgICAgICAgfSk7CisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkucGVlckRpc2Nvbm5lY3RlZChwZWVyKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSU9FeGNlcHRpb24oU2hhcmluZ1BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSkgeworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLmRvd25sb2FkRmFpbGVkKGlvZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZU5ld1BlZXJDb25uZWN0ZWQoU2hhcmluZ1BlZXIgcGVlcikgeworICAgIGluaXRJZk5lY2Vzc2FyeShwZWVyKTsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5wZWVyQ29ubmVjdGVkKHBlZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJTaGFyZWRUb3JyZW50eyIgKworICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKFRvcnJlbnRVdGlscy5nZXRUb3JyZW50RmlsZU5hbWVzKG15VG9ycmVudE1ldGFkYXRhKS50b0FycmF5KCkpICsKKyAgICAgICAgICAgICJ9IjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeU5hbWUoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmdldERpcmVjdG9yeU5hbWUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxUb3JyZW50RmlsZT4gZ2V0RmlsZXMoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmdldEZpbGVzKCk7CisgIH0KKworICBATnVsbGFibGUKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZ2V0QW5ub3VuY2VMaXN0KCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRBbm5vdW5jZUxpc3QoKTsKKyAgfQorCisgIEBOdWxsYWJsZQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRBbm5vdW5jZSgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0QW5ub3VuY2UoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3B0aW9uYWw8TG9uZz4gZ2V0Q3JlYXRpb25EYXRlKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRDcmVhdGlvbkRhdGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRDb21tZW50KCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRDb21tZW50KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0Q3JlYXRlZEJ5KCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRDcmVhdGVkQnkoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldFBpZWNlTGVuZ3RoKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0UGllY2VzSGFzaGVzKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRQaWVjZXNIYXNoZXMoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGUoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmlzUHJpdmF0ZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UGllY2VzQ291bnQoKSB7CisgICAgcmV0dXJuIG15VG9ycmVudE1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gbXlUb3JyZW50TWV0YWRhdGEuZ2V0SW5mb0hhc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleEluZm9IYXNoKCkgeworICAgIHJldHVybiBteVRvcnJlbnRNZXRhZGF0YS5nZXRIZXhJbmZvSGFzaCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgZ2V0UGllY2VDb3VudCgpIHsKKyAgICByZXR1cm4gZ2V0UGllY2VzQ291bnQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgbG9uZyBnZXRQaWVjZVNpemUoaW50IHBpZWNlSWR4KSB7CisgICAgcmV0dXJuIGdldFBpZWNlTGVuZ3RoKCk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZVBpZWNlQW5kVmFsaWRhdGUoUGllY2UgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKy8vICAgIHAuZmluaXNoKCk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFya0NvbXBsZXRlZEFuZEFkZFZhbGlkYXRpb25GdXR1cmUoUGllY2UgcGllY2UsIEZ1dHVyZTw/PiB2YWxpZGF0aW9uRnV0dXJlKSB7CisgICAgdGhpcy5tYXJrQ29tcGxldGVkKHBpZWNlKTsKKyAgICBteVZhbGlkYXRpb25GdXR1cmVzLnB1dChwaWVjZS5nZXRJbmRleCgpLCB2YWxpZGF0aW9uRnV0dXJlKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FsbFBpZWNlc09mUGVlckNvbXBsZXRlZEFuZFZhbGlkYXRlZChTaGFyaW5nUGVlciBwZWVyKSB7CisgICAgZmluYWwgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IHBlZXIuZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisgICAgZm9yIChQaWVjZSBwaWVjZSA6IHBpZWNlcykgeworICAgICAgZmluYWwgYm9vbGVhbiBwZWVySGF2ZUN1cnJlbnRQaWVjZSA9IGF2YWlsYWJsZVBpZWNlcy5nZXQocGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICBpZiAoIXBlZXJIYXZlQ3VycmVudFBpZWNlKSBjb250aW51ZTsKKyAgICAgIGlmICghY29tcGxldGVkUGllY2VzLmdldChwaWVjZS5nZXRJbmRleCgpKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKG15VmFsaWRhdGlvbkZ1dHVyZXMuZ2V0KHBpZWNlLmdldEluZGV4KCkpICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0ZWRQZWVyKFNoYXJpbmdQZWVyIHNoYXJpbmdQZWVyKSB7CisgICAgbXlEb3dubG9hZGVycy5hZGQoc2hhcmluZ1BlZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1NoYXJpbmdQZWVyRmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaGFyaW5nUGVlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI2M2UxCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaGFyaW5nUGVlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKKworcHVibGljIGludGVyZmFjZSBTaGFyaW5nUGVlckZhY3RvcnkgeworCisgIFNoYXJpbmdQZWVyIGNyZWF0ZVNoYXJpbmdQZWVyKFN0cmluZyBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZFRvcnJlbnQgdG9ycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNoYW5uZWwgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsaWVudElkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRWZXJzaW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9TaW1wbGVDbGllbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2ltcGxlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0M2NjZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvU2ltcGxlQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFN0YXRpc3RpYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKKy8vIOWuouaIt+errworcHVibGljIGNsYXNzIFNpbXBsZUNsaWVudCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfRVhFQ1VUT1JfU0laRSA9IDEwOworICBwcml2YXRlIGZpbmFsIENvbW11bmljYXRpb25NYW5hZ2VyIGNvbW11bmljYXRpb25NYW5hZ2VyOworCisgIHB1YmxpYyBTaW1wbGVDbGllbnQoKSB7CisgICAgdGhpcyhERUZBVUxUX0VYRUNVVE9SX1NJWkUsIERFRkFVTFRfRVhFQ1VUT1JfU0laRSk7Ly8g5p6E6YCg5Ye95pWw6YeN6L2977yM6L295YWl5LiL6Z2i55qE5Lyg5YWl5Lik5Liq5Ye95pWw55qE5Ye95pWwCisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2xpZW50KGludCB3b3JraW5nRXhlY3V0b3JTaXplLCBpbnQgdmFsaWRhdG9yRXhlY3V0b3JTaXplKSB7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIgPSBuZXcgQ29tbXVuaWNhdGlvbk1hbmFnZXIoRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCh3b3JraW5nRXhlY3V0b3JTaXplKSwgRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCh2YWxpZGF0b3JFeGVjdXRvclNpemUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgc3RvcCg2MCwgVGltZVVuaXQuU0VDT05EUyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzdG9wKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLnN0b3AodGltZW91dCwgdGltZVVuaXQpOworICAgIEV4Y2VwdGlvbiBpbnRlcnJ1cHRlZEV4Y2VwdGlvbiA9IG51bGw7CisgICAgYm9vbGVhbiBhbnlGYWlsZWRCeVRpbWVvdXQgPSBmYWxzZTsKKyAgICBmb3IgKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgOiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuZ2V0RXhlY3V0b3IoKSwKKyAgICAgICAgICAgIGNvbW11bmljYXRpb25NYW5hZ2VyLmdldFBpZWNlVmFsaWRhdG9yRXhlY3V0b3IoKSkpIHsKKyAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworCisgICAgICAvL2lmIHRoZSB0aHJlYWQgaXMgYWxyZWFkeSBpbnRlcnJ1cHRlZCBkb24ndCB0cnkgdG8gYXdhaXQgdGVybWluYXRpb24KKyAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgY29udGludWU7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICghZXhlY3V0b3JTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24odGltZW91dCwgdGltZVVuaXQpKSB7CisgICAgICAgICAgYW55RmFpbGVkQnlUaW1lb3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBpbnRlcnJ1cHRlZEV4Y2VwdGlvbiA9IGU7CisgICAgICB9CisgICAgfQorICAgIGlmIChpbnRlcnJ1cHRlZEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCwgIiArCisgICAgICAgICAgICAgICJzaHV0ZG93biBtZXRob2RzIGFyZSBpbnZva2VkIGJ1dCBtYXliZSB0YXNrcyBhcmUgbm90IGZpbmlzaGVkIHlldCIsIGludGVycnVwdGVkRXhjZXB0aW9uKTsKKyAgICB9CisgICAgaWYgKGFueUZhaWxlZEJ5VGltZW91dCkKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgZXhlY3V0b3Igd2FzIG5vdCBmdWxseSBzaHV0ZG93biBiZWNhdXNlIHRpbWVvdXQgd2FzIGVsYXBzZWQiKTsKKworICB9CisKKyAgLy90b3JyZW50RmlsZSDmmK/np43lrZDot6/lvoQKKyAgcHVibGljIHZvaWQgZG93bmxvYWRUb3JyZW50KFN0cmluZyB0b3JyZW50RmlsZSwgU3RyaW5nIGRvd25sb2FkRGlyLCBJbmV0QWRkcmVzcyBpUHY0QWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgY29tbXVuaWNhdGlvbk1hbmFnZXIuc3RhcnQoaVB2NEFkZHJlc3MpOworICAgIGZpbmFsIFNlbWFwaG9yZSBzZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworICAgIExpc3Q8VG9ycmVudExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucy48VG9ycmVudExpc3RlbmVyPnNpbmdsZXRvbkxpc3QoCisgICAgICAgICAgICBuZXcgVG9ycmVudExpc3RlbmVyV3JhcHBlcigpIHsKKworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGlvbkNvbXBsZXRlKGludCB2YWxpZHBpZWNlcywgaW50IHRvdGFscGllY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkcGllY2VzID09IHRvdGFscGllY2VzKSBzZW1hcGhvcmUucmVsZWFzZSgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisgICAgICAgICAgICAgICAgc2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICk7CisgICAgVG9ycmVudE1hbmFnZXIgdG9ycmVudE1hbmFnZXIgPSBjb21tdW5pY2F0aW9uTWFuYWdlci5hZGRUb3JyZW50KHRvcnJlbnRGaWxlLCBkb3dubG9hZERpciwgbGlzdGVuZXJzKTsKKyAgICBzZW1hcGhvcmUuYWNxdWlyZSgpOworICB9CisKKyAgcHJpdmF0ZSBUb3JyZW50TWFuYWdlciBzdGFydERvd25sb2FkaW5nKFN0cmluZyB0b3JyZW50RmlsZSwgU3RyaW5nIGRvd25sb2FkRGlyLCBJbmV0QWRkcmVzcyBpUHY0QWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjb21tdW5pY2F0aW9uTWFuYWdlci5zdGFydChpUHY0QWRkcmVzcyk7CisgICAgcmV0dXJuIGNvbW11bmljYXRpb25NYW5hZ2VyLmFkZFRvcnJlbnQodG9ycmVudEZpbGUsIGRvd25sb2FkRGlyKTsKKyAgfQorCisgIHB1YmxpYyBUb3JyZW50TWFuYWdlciBkb3dubG9hZFRvcnJlbnRBc3luYyhTdHJpbmcgdG9ycmVudEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG93bmxvYWREaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpUHY0QWRkcmVzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc3RhcnREb3dubG9hZGluZyh0b3JyZW50RmlsZSwgZG93bmxvYWREaXIsIGlQdjRBZGRyZXNzKTsKKyAgfQorCisKKyAgLyoqCisgICAqIEdldCBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIHRvcnJlbnQgZmlsZQorICAgKiBAcGFyYW0gZG90VG9ycmVudEZpbGVQYXRoCisgICAqIEByZXR1cm4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB1bmFibGUgdG8gZ2V0IHRvcnJlbnQgbWV0YWRhdGEKKyAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhlIHRvcnJlbnQgaGFzIG5vdCBiZWVuIGxvYWRlZAorICAgKi8KKyAgcHVibGljIFRvcnJlbnRTdGF0aXN0aWMgZ2V0U3RhdGlzdGljcyhTdHJpbmcgZG90VG9ycmVudEZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGVNZXRhZGF0YVByb3ZpZGVyIG1ldGFkYXRhUHJvdmlkZXIgPSBuZXcgRmlsZU1ldGFkYXRhUHJvdmlkZXIoZG90VG9ycmVudEZpbGVQYXRoKTsKKyAgICBUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEgPSBtZXRhZGF0YVByb3ZpZGVyLmdldFRvcnJlbnRNZXRhZGF0YSgpOworICAgIExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCA9IGNvbW11bmljYXRpb25NYW5hZ2VyLmdldFRvcnJlbnRzU3RvcmFnZSgpLmdldExvYWRlZFRvcnJlbnQobWV0YWRhdGEuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgaWYgKGxvYWRlZFRvcnJlbnQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIG5ldyBUb3JyZW50U3RhdGlzdGljKGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudFN0YXRpc3RpYygpKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUb3JyZW50IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0Iik7CisKKyAgfQorCisKKyAgcHVibGljIGJvb2xlYW4gaGFzU3RvcCgpIHsKKyAgICByZXR1cm4gY29tbXVuaWNhdGlvbk1hbmFnZXIuaGFzU3RvcCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudENvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzQ2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50SGFzaDsKKworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CisKKy8qKgorICogQGF1dGhvciBTZXJnZXkuUGFrCisgKiBEYXRlOiA5LzkvMTMKKyAqIFRpbWU6IDc6NDYgUE0KKyAqLworcHVibGljIGludGVyZmFjZSBUb3JyZW50Q29ubmVjdGlvbkxpc3RlbmVyIHsKKworICBib29sZWFuIGhhc1RvcnJlbnQoVG9ycmVudEhhc2ggdG9ycmVudEhhc2gpOworCisgIHZvaWQgaGFuZGxlTmV3UGVlckNvbm5lY3Rpb24oU29ja2V0Q2hhbm5lbCBzLCBieXRlW10gcGVlcklkLCBTdHJpbmcgaGV4SW5mb0hhc2gpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhYjZkYwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgVG9ycmVudExpc3RlbmVyIHsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIGNvbm5lY3Rpb24gd2l0aCBwZWVyIGlzIGVzdGFibGlzaGVkCisgICAqCisgICAqIEBwYXJhbSBwZWVySW5mb3JtYXRpb24gc3BlY2lmaWVkIGluZm9ybWF0aW9uIGFib3V0IHBlZXIKKyAgICovCisgIHZvaWQgcGVlckNvbm5lY3RlZChQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKTsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIGNvbm5lY3Rpb24gd2l0aCBwZWVyIGlzIGNsb3NlZC4KKyAgICoKKyAgICogQHBhcmFtIHBlZXJJbmZvcm1hdGlvbiBzcGVjaWZpZWQgaW5mb3JtYXRpb24gYWJvdXQgcGVlcgorICAgKi8KKyAgdm9pZCBwZWVyRGlzY29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pOworCisgIC8qKgorICAgKiBJbnZva2VkIHdoZW4gcGllY2UgaXMgZG93bmxvYWRlZCBhbmQgdmFsaWRhdGVkCisgICAqCisgICAqIEBwYXJhbSBwaWVjZUluZm9ybWF0aW9uIHNwZWNpZmllZCBpbmZvcm1hdGlvbiBhYm91dCBwaWVjZQorICAgKiBAcGFyYW0gcGVlckluZm9ybWF0aW9uICBzcGVjaWZpZWQgaW5mb3JtYXRpb24gYWJvdXQgcGVlcgorICAgKi8KKyAgdm9pZCBwaWVjZURvd25sb2FkZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKTsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIGRvd25sb2FkaW5nIGlzIGZ1bGx5IGRvd25sb2FkZWQgKGxhc3QgcGllY2UgaXMgcmVjZWl2ZWQgYW5kIHZhbGlkYXRlZCkKKyAgICovCisgIHZvaWQgZG93bmxvYWRDb21wbGV0ZSgpOworCisgIC8qKgorICAgKiBpbnZva2VkIHdoZW4gcGllY2UgaXMgZG93bmxvYWRlZCBidXQgbm90IHZhbGlkYXRlZCB5ZXQKKyAgICoKKyAgICogQHBhcmFtIHBpZWNlSW5mb3JtYXRpb24gc3BlY2lmaWVkIGluZm9ybWF0aW9uIGFib3V0IHBpZWNlCisgICAqIEBwYXJhbSBwZWVySW5mb3JtYXRpb24gIHNwZWNpZmllZCBpbmZvcm1hdGlvbiBhYm91dCBwZWVyCisgICAqLworICB2b2lkIHBpZWNlUmVjZWl2ZWQoUGllY2VJbmZvcm1hdGlvbiBwaWVjZUluZm9ybWF0aW9uLCBQZWVySW5mb3JtYXRpb24gcGVlckluZm9ybWF0aW9uKTsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIGRvd25sb2FkIHdhcyBmYWlsZWQgd2l0aCBhbnkgZXhjZXB0aW9uIChlLmcuIHNvbWUgcnVudGltZSBleGNlcHRpb24gb3IgaS9vIGV4Y2VwdGlvbiBpbiBmaWxlIG9wZXJhdGlvbikuCisgICAqCisgICAqIEBwYXJhbSBjYXVzZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAqLworICB2b2lkIGRvd25sb2FkRmFpbGVkKFRocm93YWJsZSBjYXVzZSk7CisKKyAgLyoqCisgICAqIEludm9rZWQgd2hlbiB2YWxpZGF0aW9uIG9mIHRvcnJlbnQgaXMgZG9uZS4KKyAgICogSWYgdG90YWwgcGllY2VzIGNvdW50IGFuZCB2YWxpZCBwaWVjZXMgY291bnQgYXJlIGVxdWFscyBpdCBtZWFucyB0aGF0IHRvcnJlbnQgaXMgZnVsbHkgZG93bmxvYWRlZC4KKyAgICoge0BsaW5rICNkb3dubG9hZENvbXBsZXRlKCl9IGxpc3RlbmVyIHdpbGwgbm90IGJlIGludm9rZWQgaW4gdGhpcyBjYXNlCisgICAqCisgICAqIEBwYXJhbSB2YWxpZHBpZWNlcyBjb3VudCBvZiB2YWxpZCBwaWVjZXMuIE11c3QgYmUgbm90IGdyZWF0ZXIgYXMgI3RvdGFscGllY2VzCisgICAqIEBwYXJhbSB0b3RhbHBpZWNlcyB0b3RhbCBwaWVjZXMgY291bnQgaW4gdG9ycmVudAorICAgKi8KKyAgdm9pZCB2YWxpZGF0aW9uQ29tcGxldGUoaW50IHZhbGlkcGllY2VzLCBpbnQgdG90YWxwaWVjZXMpOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMaXN0ZW5lcldyYXBwZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExpc3RlbmVyV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzU2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMaXN0ZW5lcldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworcHVibGljIGNsYXNzIFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIgaW1wbGVtZW50cyBUb3JyZW50TGlzdGVuZXIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBwZWVyQ29ubmVjdGVkKFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHBlZXJEaXNjb25uZWN0ZWQoUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcGllY2VEb3dubG9hZGVkKFBpZWNlSW5mb3JtYXRpb24gcGllY2VJbmZvcm1hdGlvbiwgUGVlckluZm9ybWF0aW9uIHBlZXJJbmZvcm1hdGlvbikgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZG93bmxvYWRDb21wbGV0ZSgpIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkRmFpbGVkKFRocm93YWJsZSBjYXVzZSkgeworCisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcGllY2VSZWNlaXZlZChQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mb3JtYXRpb24sIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mb3JtYXRpb24pIHsKKworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25Db21wbGV0ZShpbnQgdmFsaWRwaWVjZXMsIGludCB0b3RhbHBpZWNlcykgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExvYWRlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxNWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUb3JyZW50TG9hZGVyIHsKKworICAvKioKKyAgICogQ3JlYXRlcyBvciBmaW5kcyBzaGFyZWQgdG9ycmVudCBpbnN0YW5jZSBmb3Igc3BlY2lmaWVkIGFubm91bmNlYWJsZSB0b3JyZW50IGFuZCByZXR1cm4gaXQKKyAgICoKKyAgICogQHBhcmFtIGxvYWRlZFRvcnJlbnQgc3BlY2lmaWVkIHRvcnJlbnQKKyAgICogQHJldHVybiBzaGFyZWQgdG9ycmVudCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBhbm5vdW5jZWFibGUgdG9ycmVudAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICBpZiBhbnkgaW8gZXJyb3Igb2NjdXJzCisgICAqLworICBATm90TnVsbAorICBTaGFyZWRUb3JyZW50IGxvYWRUb3JyZW50KEBOb3ROdWxsIExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMb2FkZXJJbXBsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRMb2FkZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViZmJlMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudExvYWRlckltcGwuamF2YQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneS5SZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3Rpbmc7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvL+WunueOsOWKoOi9vVNoYXJlZFRvcnJlbnTmoLnmja7nu5nlrprnmoQgTG9hZGVkVG9ycmVudCDlr7nosaHvvIzliqDovb3kuIDkuKogU2hhcmVkVG9ycmVudCDlr7nosaEKK3B1YmxpYyBjbGFzcyBUb3JyZW50TG9hZGVySW1wbCBpbXBsZW1lbnRzIFRvcnJlbnRMb2FkZXIgeworCisgIEBOb3ROdWxsCisgIHByaXZhdGUgZmluYWwgVG9ycmVudHNTdG9yYWdlIG15VG9ycmVudHNTdG9yYWdlOworCisgIHB1YmxpYyBUb3JyZW50TG9hZGVySW1wbChATm90TnVsbCBUb3JyZW50c1N0b3JhZ2UgdG9ycmVudHNTdG9yYWdlKSB7CisgICAgbXlUb3JyZW50c1N0b3JhZ2UgPSB0b3JyZW50c1N0b3JhZ2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgQE5vdE51bGwKKyAgcHVibGljIFNoYXJlZFRvcnJlbnQgbG9hZFRvcnJlbnQoQE5vdE51bGwgTG9hZGVkVG9ycmVudCBsb2FkZWRUb3JyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgZmluYWwgU3RyaW5nIGhleEluZm9IYXNoID0gbG9hZGVkVG9ycmVudC5nZXRUb3JyZW50SGFzaCgpLmdldEhleEluZm9IYXNoKCk7CisgICAgU2hhcmVkVG9ycmVudCBvbGQgPSBteVRvcnJlbnRzU3RvcmFnZS5nZXRUb3JyZW50KGhleEluZm9IYXNoKTsKKyAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBvbGQ7CisgICAgfQorCisgICAgVG9ycmVudE1ldGFkYXRhIHRvcnJlbnRNZXRhZGF0YTsKKyAgICB0cnkgeworICAgICAgdG9ycmVudE1ldGFkYXRhID0gbG9hZGVkVG9ycmVudC5nZXRNZXRhZGF0YSgpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICBteVRvcnJlbnRzU3RvcmFnZS5yZW1vdmUoaGV4SW5mb0hhc2gpOworICAgICAgdGhyb3cgZTsKKyAgICB9CisKKyAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHNoYXJlZFRvcnJlbnQgPSBuZXcgU2hhcmVkVG9ycmVudCh0b3JyZW50TWV0YWRhdGEsIGxvYWRlZFRvcnJlbnQuZ2V0UGllY2VTdG9yYWdlKCksCisgICAgICAgICAgICBuZXcgUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nKCksCisgICAgICAgICAgICBsb2FkZWRUb3JyZW50LmdldFRvcnJlbnRTdGF0aXN0aWMoKSwgbG9hZGVkVG9ycmVudC5nZXRFdmVudERpc3BhdGNoZXIoKSk7CisKKyAgICBvbGQgPSBteVRvcnJlbnRzU3RvcmFnZS5wdXRJZkFic2VudEFjdGl2ZVRvcnJlbnQoaGV4SW5mb0hhc2gsIHNoYXJlZFRvcnJlbnQpOworICAgIGlmIChvbGQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIG9sZDsKKyAgICB9CisgICAgcmV0dXJuIHNoYXJlZFRvcnJlbnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGM0OTEzCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUb3JyZW50TWFuYWdlciBleHRlbmRzIFRvcnJlbnRIYXNoIHsKKworICAvKioKKyAgICogYWRkIHNwZWNpZmllZCBsaXN0ZW5lciB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9uIG5ldyBldmVudHMKKyAgICoKKyAgICogQHBhcmFtIGxpc3RlbmVyIHNwZWNpZmllZCBsaXN0ZW5lcgorICAgKi8KKyAgdm9pZCBhZGRMaXN0ZW5lcihUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisgIC8qKgorICAgKiByZW1vdmUgc3BlY2lmaWVkIGxpc3RlbmVyIHdoaWNoIHdhcyBhZGRlZCBlYXJsaWVyIGJ5IHtAbGluayBUb3JyZW50TWFuYWdlciNhZGRMaXN0ZW5lcn0gbWV0aG9kLgorICAgKiBZb3UgY2FuIHJlY2VpdmUgZXZlbnRzIGluIHRoaXMgbGlzdGVuZXIgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2QgaWYgbm90aWZ5IG1ldGhvZCB3YXMgaW52b2tlZCBiZWZvcmUgdGhpcyBtZXRob2QKKyAgICoKKyAgICogQHBhcmFtIGxpc3RlbmVyIHNwZWNpZmllZCBsaXN0ZW5lcgorICAgKiBAcmV0dXJuIHRydWUgaWYgbGlzdGVuZXJzIHdhcyByZW1vdmVkIG90aGVyd2lzZSBmYWxzZSAoZS5nLiBsaXN0ZW5lciB3YXMgbm90IGZvdW5kKQorICAgKi8KKyAgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisgIC8qKgorICAgKiB3YWl0IHVudGlsIGRvd25sb2FkIHdpbGwgYmUgZmluaXNoZWQKKyAgICoKKyAgICogQHBhcmFtIHRpbWVvdXQgIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdAorICAgKiBAcGFyYW0gdGltZVVuaXQgdGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZW91dCBhcmd1bWVudAorICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoaXMgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZAorICAgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gICAgIGlmIHRpbWVvdXQgd2FzIGVsYXBzZWQKKyAgICovCisgIHZvaWQgYXdhaXREb3dubG9hZENvbXBsZXRlKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TWFuYWdlckltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5Y2Y1NwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1hbmFnZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEhhc2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworY2xhc3MgVG9ycmVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgVG9ycmVudE1hbmFnZXIgeworCisgIHByaXZhdGUgZmluYWwgRXZlbnREaXNwYXRjaGVyIGV2ZW50RGlzcGF0Y2hlcjsKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50SGFzaCBoYXNoOworCisgIFRvcnJlbnRNYW5hZ2VySW1wbChFdmVudERpc3BhdGNoZXIgZXZlbnREaXNwYXRjaGVyLCBUb3JyZW50SGFzaCBoYXNoKSB7CisgICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBldmVudERpc3BhdGNoZXI7CisgICAgdGhpcy5oYXNoID0gaGFzaDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihUb3JyZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBldmVudERpc3BhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHJlbW92ZUxpc3RlbmVyKFRvcnJlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHJldHVybiBldmVudERpc3BhdGNoZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBieXRlW10gZ2V0SW5mb0hhc2goKSB7CisgICAgcmV0dXJuIGhhc2guZ2V0SW5mb0hhc2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEhleEluZm9IYXNoKCkgeworICAgIHJldHVybiBoYXNoLmdldEhleEluZm9IYXNoKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgYXdhaXREb3dubG9hZENvbXBsZXRlKGludCB0aW1lb3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTZW1hcGhvcmUgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICBUb3JyZW50TGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyID0gbmV3IFRvcnJlbnRMaXN0ZW5lcldyYXBwZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRvd25sb2FkQ29tcGxldGUoKSB7CisgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfTsKKyAgICB0cnkgeworICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgaWYgKCFzZW1hcGhvcmUudHJ5QWNxdWlyZSh0aW1lb3V0LCB0aW1lVW5pdCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlVuYWJsZSB0byBkb3dubG9hZCB0b3JyZW50IGluIHNwZWNpZmllZCB0aW1lb3V0Iik7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudE1ldGFkYXRhUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzg5ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9Ub3JyZW50TWV0YWRhdGFQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkludmFsaWRCRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk5vdE51bGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRNZXRhZGF0YVByb3ZpZGVyIHsKKworICAvKioKKyAgICogbG9hZCBhbmQgcmV0dXJuIG5ldyB7QGxpbmsgVG9ycmVudE1ldGFkYXRhfSBpbnN0YW5jZSBmcm9tIGFueSBzb3VyY2UKKyAgICoKKyAgICogQHJldHVybiBuZXcgdG9ycmVudCBtZXRhZGF0YSBpbnN0YW5jZQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgaWYgYW55IElPIGVycm9yIG9jY3VycworICAgKiBAdGhyb3dzIEludmFsaWRCRW5jb2RpbmdFeGNlcHRpb24gaWYgc3BlY2lmaWVkIHNvdXJjZSBoYXMgaW52YWxpZCBCRVAgZm9ybWF0IG9yIG1pc3NlZCByZXF1aXJlZCBmaWVsZHMKKyAgICovCisgIEBOb3ROdWxsCisgIFRvcnJlbnRNZXRhZGF0YSBnZXRUb3JyZW50TWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvVG9ycmVudHNTdG9yYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRzU3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTU4NTYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1RvcnJlbnRzU3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudDsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGFpcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudFV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8vIOWuouaIt+err+iOt+WPlgorLy/otJ/otKPnrqHnkIbkuKTnsbsgdG9ycmVudO+8mua0u+i3g+eahO+8iOato+WcqOi/m+ihjOS4i+i9veaIluS4iuS8oOeahO+8ieWSjOW3suWKoOi9veeahO+8iOW3sue7j+iiq+ino+aekOW5tuWKoOi9vei/m+WGheWtmOS9huWPr+iDveacquiiq+a0u+i3g+S9v+eUqOeahO+8iSB0b3JyZW5044CCCisvL+ivpeexu+aPkOS+m+S6huaWueazleadpea3u+WKoOOAgeiOt+WPluOAgeenu+mZpOOAgeajgOafpei/meS6myB0b3JyZW5077yM5ZCM5pe25pSv5oyB6auY5pWI55qE5bm25Y+R6K6/6Zeu77yM56Gu5L+d57q/56iL5a6J5YWo44CCCitwdWJsaWMgY2xhc3MgVG9ycmVudHNTdG9yYWdlIHsKKworICBwcml2YXRlIGZpbmFsIFJlYWRXcml0ZUxvY2sgcmVhZFdyaXRlTG9jazsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTaGFyZWRUb3JyZW50PiBhY3RpdmVUb3JyZW50czsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMb2FkZWRUb3JyZW50PiBsb2FkZWRUb3JyZW50czsKKworICBwdWJsaWMgVG9ycmVudHNTdG9yYWdlKCkgeworICAgIHJlYWRXcml0ZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgIGFjdGl2ZVRvcnJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTaGFyZWRUb3JyZW50PigpOworICAgIGxvYWRlZFRvcnJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2FkZWRUb3JyZW50PigpOworICB9CisKKyAgLy/moLnmja5oYXNo5p+l5om+5piv5ZCm5pyJ5a+55bqU56eN5a2QCisgIHB1YmxpYyBib29sZWFuIGhhc1RvcnJlbnQoU3RyaW5nIGhhc2gpIHsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgIHJldHVybiBsb2FkZWRUb3JyZW50cy5jb250YWluc0tleShoYXNoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIC8v6I635Y+W5bey5Yqg6L2955qEdG9ycmVudAorICBwdWJsaWMgTG9hZGVkVG9ycmVudCBnZXRMb2FkZWRUb3JyZW50KFN0cmluZyBoYXNoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICByZXR1cm4gbG9hZGVkVG9ycmVudHMuZ2V0KGhhc2gpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgLy8g5aSE55CGcGVlcuaWreW8gOi/nuaOpeeahOaDheWGtSDnp43lrZDkuI3mtLvot4PkuoblnKjmraTlpITov5vooYzmk43kvZwKKyAgcHVibGljIHZvaWQgcGVlckRpc2Nvbm5lY3RlZChTdHJpbmcgdG9ycmVudEhhc2gpIHsKKyAgICBmaW5hbCBTaGFyZWRUb3JyZW50IHRvcnJlbnQ7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgdG9ycmVudCA9IGFjdGl2ZVRvcnJlbnRzLmdldCh0b3JyZW50SGFzaCk7CisgICAgICBpZiAodG9ycmVudCA9PSBudWxsKSByZXR1cm47CisKKyAgICAgIGJvb2xlYW4gaXNUb3JyZW50RmluaXNoZWQgPSB0b3JyZW50LmlzRmluaXNoZWQoKTsKKyAgICAgIGlmICh0b3JyZW50LmdldERvd25sb2FkZXJzQ291bnQoKSA9PSAwICYmIGlzVG9ycmVudEZpbmlzaGVkKSB7CisgICAgICAgIGFjdGl2ZVRvcnJlbnRzLnJlbW92ZSh0b3JyZW50SGFzaCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICAgIHRvcnJlbnQuY2xvc2UoKTsKKyAgfQorCisgIC8v6I635Y+W5rS76LeD55qEdG9ycmVudAorICBwdWJsaWMgU2hhcmVkVG9ycmVudCBnZXRUb3JyZW50KFN0cmluZyBoYXNoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICByZXR1cm4gYWN0aXZlVG9ycmVudHMuZ2V0KGhhc2gpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgLy8g5bCG5bey57uP5Yqg6L2955qE56eN5a2Q5Yqg5YWlCisgIHB1YmxpYyB2b2lkIGFkZFRvcnJlbnQoU3RyaW5nIGhhc2gsIExvYWRlZFRvcnJlbnQgdG9ycmVudCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGxvYWRlZFRvcnJlbnRzLnB1dChoYXNoLCB0b3JyZW50KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU2hhcmVkVG9ycmVudCBwdXRJZkFic2VudEFjdGl2ZVRvcnJlbnQoU3RyaW5nIGhhc2gsIFNoYXJlZFRvcnJlbnQgdG9ycmVudCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgb2xkID0gYWN0aXZlVG9ycmVudHMuZ2V0KGhhc2gpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSByZXR1cm4gb2xkOworCisgICAgICByZXR1cm4gYWN0aXZlVG9ycmVudHMucHV0KGhhc2gsIHRvcnJlbnQpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBQYWlyPFNoYXJlZFRvcnJlbnQsIExvYWRlZFRvcnJlbnQ+IHJlbW92ZShTdHJpbmcgaGFzaCkgeworICAgIGZpbmFsIFBhaXI8U2hhcmVkVG9ycmVudCwgTG9hZGVkVG9ycmVudD4gcmVzdWx0OworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgc2hhcmVkVG9ycmVudCA9IGFjdGl2ZVRvcnJlbnRzLnJlbW92ZShoYXNoKTsKKyAgICAgIGZpbmFsIExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCA9IGxvYWRlZFRvcnJlbnRzLnJlbW92ZShoYXNoKTsKKyAgICAgIHJlc3VsdCA9IG5ldyBQYWlyPFNoYXJlZFRvcnJlbnQsIExvYWRlZFRvcnJlbnQ+KHNoYXJlZFRvcnJlbnQsIGxvYWRlZFRvcnJlbnQpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgICBpZiAocmVzdWx0LnNlY29uZCgpICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlc3VsdC5zZWNvbmQoKS5nZXRQaWVjZVN0b3JhZ2UoKS5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0LmZpcnN0KCkgIT0gbnVsbCkgeworICAgICAgcmVzdWx0LmZpcnN0KCkuY2xvc2VGdWxseSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8g6I635Y+W5rS76LeD55qE56eN5a2QCisgIHB1YmxpYyBMaXN0PFNoYXJlZFRvcnJlbnQ+IGFjdGl2ZVRvcnJlbnRzKCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U2hhcmVkVG9ycmVudD4oYWN0aXZlVG9ycmVudHMudmFsdWVzKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+IGFubm91bmNlYWJsZVRvcnJlbnRzKCkgeworICAgIExpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+KCk7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICBmb3IgKExvYWRlZFRvcnJlbnQgbG9hZGVkVG9ycmVudCA6IGxvYWRlZFRvcnJlbnRzLnZhbHVlcygpKSB7CisgICAgICAgIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIGFubm91bmNlYWJsZUluZm9ybWF0aW9uID0gbG9hZGVkVG9ycmVudC5jcmVhdGVBbm5vdW5jZWFibGVJbmZvcm1hdGlvbigpOworICAgICAgICBpZiAoVG9ycmVudFV0aWxzLmlzVHJhY2tlckxlc3NJbmZvKGFubm91bmNlYWJsZUluZm9ybWF0aW9uKSkgY29udGludWU7CisgICAgICAgIHJlc3VsdC5hZGQoYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24pOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0PExvYWRlZFRvcnJlbnQ+IGdldExvYWRlZFRvcnJlbnRzKCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TG9hZGVkVG9ycmVudD4obG9hZGVkVG9ycmVudHMudmFsdWVzKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgZmluYWwgQ29sbGVjdGlvbjxTaGFyZWRUb3JyZW50PiBzaGFyZWRUb3JyZW50czsKKyAgICBmaW5hbCBDb2xsZWN0aW9uPExvYWRlZFRvcnJlbnQ+IGxvYWRlZFRvcnJlbnRzOworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgIHNoYXJlZFRvcnJlbnRzID0gbmV3IEFycmF5TGlzdDxTaGFyZWRUb3JyZW50PihhY3RpdmVUb3JyZW50cy52YWx1ZXMoKSk7CisgICAgICBsb2FkZWRUb3JyZW50cyA9IG5ldyBBcnJheUxpc3Q8TG9hZGVkVG9ycmVudD4odGhpcy5sb2FkZWRUb3JyZW50cy52YWx1ZXMoKSk7CisgICAgICB0aGlzLmxvYWRlZFRvcnJlbnRzLmNsZWFyKCk7CisgICAgICBhY3RpdmVUb3JyZW50cy5jbGVhcigpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgICBmb3IgKFNoYXJlZFRvcnJlbnQgc2hhcmVkVG9ycmVudCA6IHNoYXJlZFRvcnJlbnRzKSB7CisgICAgICBzaGFyZWRUb3JyZW50LmNsb3NlRnVsbHkoKTsKKyAgICB9CisgICAgZm9yIChMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgOiBsb2FkZWRUb3JyZW50cykgeworICAgICAgdHJ5IHsKKyAgICAgICAgbG9hZGVkVG9ycmVudC5nZXRQaWVjZVN0b3JhZ2UoKS5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzg3MDAKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlLmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LmFubm91bmNlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbnRleHQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkFubm91bmNlYWJsZUluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25TZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CisKKy8qKgorICogQml0VG9ycmVudCBhbm5vdW5jZSBzdWItc3lzdGVtLgorICogPHAvPgorICogPHA+CisgKiBBIEJpdFRvcnJlbnQgY2xpZW50IG11c3QgY2hlY2staW4gdG8gdGhlIHRvcnJlbnQncyB0cmFja2VyKHMpIHRvIGdldCBwZWVycworICogYW5kIHRvIHJlcG9ydCBjZXJ0YWluIGV2ZW50cy4KKyAqIDwvcD4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhpcyBBbm5vdW5jZSBjbGFzcyBpbXBsZW1lbnRzIGEgcGVyaW9kaWMgYW5ub3VuY2UgcmVxdWVzdCB0aHJlYWQgdGhhdCB3aWxsCisgKiBub3RpZnkgYW5ub3VuY2UgcmVxdWVzdCBldmVudCBsaXN0ZW5lcnMgZm9yIGVhY2ggdHJhY2tlciByZXNwb25zZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdW5jZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBbm5vdW5jZS5jbGFzcyk7CisKKyAgcHJpdmF0ZSBMaXN0PFBlZXI+IG15UGVlcnM7CisgIHByaXZhdGUgZmluYWwgVHJhY2tlckNsaWVudEZhY3RvcnkgbXlUcmFja2VyQ2xpZW50RmFjdG9yeTsKKworICAvKioKKyAgICogVGhlIHRpZXJzIG9mIHRyYWNrZXIgY2xpZW50cyBtYXRjaGluZyB0aGUgdHJhY2tlciBVUklzIGRlZmluZWQgaW4gdGhlCisgICAqIHRvcnJlbnQuCisgICAqLworICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBUcmFja2VyQ2xpZW50PiBjbGllbnRzOworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworCisgIC8qKgorICAgKiBBbm5vdW5jZSB0aHJlYWQgYW5kIGNvbnRyb2wuCisgICAqLworICBwcml2YXRlIFRocmVhZCB0aHJlYWQ7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wOworICBwcml2YXRlIGJvb2xlYW4gZm9yY2VTdG9wOworCisgIC8qKgorICAgKiBBbm5vdW5jZSBpbnRlcnZhbC4KKyAgICovCisgIHByaXZhdGUgaW50IG15QW5ub3VuY2VJbnRlcnZhbDsKKyAgcHJpdmF0ZSBUcmFja2VyQ2xpZW50IG15RGVmYXVsdFRyYWNrZXI7CisKKyAgLyoqCisgICAqIEluaXRpYWxpemUgdGhlIGJhc2UgYW5ub3VuY2UgY2xhc3MgbWVtYmVycyBmb3IgdGhlIGFubm91bmNlci4KKyAgICovCisgIHB1YmxpYyBBbm5vdW5jZShDb250ZXh0IGNvbnRleHQsIFRyYWNrZXJDbGllbnRGYWN0b3J5IHRyYWNrZXJDbGllbnRGYWN0b3J5KSB7CisgICAgdGhpcy5jbGllbnRzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgVHJhY2tlckNsaWVudD4oKTsKKyAgICB0aGlzLnRocmVhZCA9IG51bGw7CisgICAgbXlUcmFja2VyQ2xpZW50RmFjdG9yeSA9IHRyYWNrZXJDbGllbnRGYWN0b3J5OworICAgIG15Q29udGV4dCA9IGNvbnRleHQ7CisgICAgbXlQZWVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxQZWVyPigpOworICB9CisKKyAgcHVibGljIHZvaWQgZm9yY2VBbm5vdW5jZShBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50LCBBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIgbGlzdGVuZXIsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50KSB0aHJvd3MgVW5rbm93blNlcnZpY2VFeGNlcHRpb24sIFVua25vd25Ib3N0RXhjZXB0aW9uIHsKKyAgICBVUkkgdHJhY2tlclVybCA9IFVSSS5jcmVhdGUodG9ycmVudC5nZXRBbm5vdW5jZSgpKTsKKyAgICBUcmFja2VyQ2xpZW50IGNsaWVudCA9IHRoaXMuY2xpZW50cy5nZXQodHJhY2tlclVybC50b1N0cmluZygpKTsKKyAgICB0cnkgeworICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7CisgICAgICAgIGNsaWVudCA9IG15VHJhY2tlckNsaWVudEZhY3RvcnkuY3JlYXRlVHJhY2tlckNsaWVudChteVBlZXJzLCB0cmFja2VyVXJsKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKGxpc3RlbmVyKTsKKyAgICAgICAgdGhpcy5jbGllbnRzLnB1dCh0cmFja2VyVXJsLnRvU3RyaW5nKCksIGNsaWVudCk7CisgICAgICB9CisgICAgICBjbGllbnQuYW5ub3VuY2VBbGxJbnRlcmZhY2VzKGV2ZW50LCBmYWxzZSwgdG9ycmVudCk7CisgICAgfSBjYXRjaCAoQW5ub3VuY2VFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmluZm8oU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGZvcmNlIGFubm91bmNlIHRvcnJlbnQgJXMgb24gdHJhY2tlciAlcy4iLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCksIFN0cmluZy52YWx1ZU9mKHRyYWNrZXJVcmwpKSk7CisgICAgICBsb2dnZXIuZGVidWcoU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGZvcmNlIGFubm91bmNlIHRvcnJlbnQgJXMgb24gdHJhY2tlciAlcy4iLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCksIFN0cmluZy52YWx1ZU9mKHRyYWNrZXJVcmwpKSwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0YXJ0IHRoZSBhbm5vdW5jZSByZXF1ZXN0IHRocmVhZC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIFVSSSBkZWZhdWx0VHJhY2tlclVSSSwgZmluYWwgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGxpc3RlbmVyLCBmaW5hbCBQZWVyW10gcGVlcnMsIGZpbmFsIGludCBhbm5vdW5jZUludGVydmFsKSB7CisgICAgbXlBbm5vdW5jZUludGVydmFsID0gYW5ub3VuY2VJbnRlcnZhbDsKKyAgICBteVBlZXJzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBlZXJzKSk7CisgICAgaWYgKGRlZmF1bHRUcmFja2VyVVJJICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG15RGVmYXVsdFRyYWNrZXIgPSBteVRyYWNrZXJDbGllbnRGYWN0b3J5LmNyZWF0ZVRyYWNrZXJDbGllbnQobXlQZWVycywgZGVmYXVsdFRyYWNrZXJVUkkpOworICAgICAgICBteURlZmF1bHRUcmFja2VyLnJlZ2lzdGVyKGxpc3RlbmVyKTsKKyAgICAgICAgdGhpcy5jbGllbnRzLnB1dChkZWZhdWx0VHJhY2tlclVSSS50b1N0cmluZygpLCBteURlZmF1bHRUcmFja2VyKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG15RGVmYXVsdFRyYWNrZXIgPSBudWxsOworICAgIH0KKworICAgIHRoaXMuc3RvcCA9IGZhbHNlOworICAgIHRoaXMuZm9yY2VTdG9wID0gZmFsc2U7CisKKyAgICBpZiAodGhpcy50aHJlYWQgPT0gbnVsbCB8fCAhdGhpcy50aHJlYWQuaXNBbGl2ZSgpKSB7CisgICAgICB0aGlzLnRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICB0aGlzLnRocmVhZC5zZXROYW1lKCJ0b3JyZW50IHRyYWNrZXIgYW5ub3VuY2UgdGhyZWFkIik7CisgICAgICB0aGlzLnRocmVhZC5zdGFydCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGFubm91bmNlIGludGVydmFsLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QW5ub3VuY2VJbnRlcnZhbChpbnQgYW5ub3VuY2VJbnRlcnZhbCkgeworICAgIGlmIChhbm5vdW5jZUludGVydmFsIDw9IDApIHsKKyAgICAgIHRoaXMuc3RvcCh0cnVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhpcy5teUFubm91bmNlSW50ZXJ2YWwgPT0gYW5ub3VuY2VJbnRlcnZhbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZ2dlci50cmFjZSgiU2V0dGluZyBhbm5vdW5jZSBpbnRlcnZhbCB0byB7fXMgcGVyIHRyYWNrZXIgcmVxdWVzdC4iLAorICAgICAgICAgICAgYW5ub3VuY2VJbnRlcnZhbCk7CisgICAgdGhpcy5teUFubm91bmNlSW50ZXJ2YWwgPSBhbm5vdW5jZUludGVydmFsOworICB9CisKKyAgLyoqCisgICAqIFN0b3AgdGhlIGFubm91bmNlIHRocmVhZC4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogT25lIGxhc3QgJ3N0b3BwZWQnIGFubm91bmNlIGV2ZW50IG1pZ2h0IGJlIHNlbnQgdG8gdGhlIHRyYWNrZXIgdG8KKyAgICogYW5ub3VuY2Ugd2UncmUgZ29pbmcgYXdheSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKworICAgIHRoaXMuc3RvcCA9IHRydWU7CisKKyAgICBpZiAodGhpcy50aHJlYWQgIT0gbnVsbCAmJiB0aGlzLnRocmVhZC5pc0FsaXZlKCkpIHsKKyAgICAgIHRoaXMudGhyZWFkLmludGVycnVwdCgpOworCisgICAgICBmb3IgKFRyYWNrZXJDbGllbnQgY2xpZW50IDogdGhpcy5jbGllbnRzLnZhbHVlcygpKSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB0aGlzLnRocmVhZC5qb2luKCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAvLyBJZ25vcmUKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcy5teVBlZXJzLmNsZWFyKCk7CisKKyAgICB0aGlzLnRocmVhZCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogTWFpbiBhbm5vdW5jZSBsb29wLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGUgYW5ub3VuY2UgdGhyZWFkIHN0YXJ0cyBieSBtYWtpbmcgdGhlIGluaXRpYWwgJ3N0YXJ0ZWQnIGFubm91bmNlCisgICAqIHJlcXVlc3QgdG8gcmVnaXN0ZXIgb24gdGhlIHRyYWNrZXIgYW5kIGdldCB0aGUgYW5ub3VuY2UgaW50ZXJ2YWwgdmFsdWUuCisgICAqIFN1YnNlcXVlbnQgYW5ub3VuY2UgcmVxdWVzdHMgYXJlIG9yZGluYXJ5LCBldmVudC1sZXNzLCBwZXJpb2RpYyByZXF1ZXN0cworICAgKiBmb3IgcGVlcnMuCisgICAqIDwvcD4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVW5sZXNzIGZvcmNlZnVsbHkgc3RvcHBlZCwgdGhlIGFubm91bmNlIHRocmVhZCB3aWxsIHRlcm1pbmF0ZSBieSBzZW5kaW5nCisgICAqIGEgJ3N0b3BwZWQnIGFubm91bmNlIHJlcXVlc3QgYmVmb3JlIHN0b3BwaW5nLgorICAgKiA8L3A+CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyBhbm5vdW5jZSBsb29wLi4uIik7CisKKworICAgIHdoaWxlICghdGhpcy5zdG9wICYmICFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworCisgICAgICBmaW5hbCBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbkxpc3QgPSBteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkuYW5ub3VuY2VhYmxlVG9ycmVudHMoKTsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiU3RhcnRpbmcgYW5ub3VuY2UgZm9yIHt9IHRvcnJlbnRzIiwgYW5ub3VuY2VhYmxlSW5mb3JtYXRpb25MaXN0LnNpemUoKSk7CisgICAgICBhbm5vdW5jZUFsbFRvcnJlbnRzKGFubm91bmNlYWJsZUluZm9ybWF0aW9uTGlzdCwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuTk9ORSk7CisgICAgICB0cnkgeworICAgICAgICBUaHJlYWQuc2xlZXAodGhpcy5teUFubm91bmNlSW50ZXJ2YWwgKiAxMDAwKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGFubm91bmNlQWxsVG9ycmVudHMobXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmFubm91bmNlYWJsZVRvcnJlbnRzKCksIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50LlNUT1BQRUQpOworCisgICAgbG9nZ2VyLmluZm8oIkV4aXRlZCBhbm5vdW5jZSBsb29wLiIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRlZmF1bHRBbm5vdW5jZShMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiB0b3JyZW50c0ZvckFubm91bmNlKSB7CisgICAgZm9yIChBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50IDogdG9ycmVudHNGb3JBbm5vdW5jZSkgeworICAgICAgaWYgKHRoaXMuc3RvcCB8fCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIFRyYWNrZXJDbGllbnQgdHJhY2tlckNsaWVudCA9IHRoaXMuZ2V0Q3VycmVudFRyYWNrZXJDbGllbnQodG9ycmVudCk7CisgICAgICAgIGlmICh0cmFja2VyQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICB0cmFja2VyQ2xpZW50LmFubm91bmNlQWxsSW50ZXJmYWNlcyhBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5OT05FLCBmYWxzZSwgdG9ycmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbG9nZ2VyLndhcm4oIlRyYWNrZXIgY2xpZW50IGZvciB7fSBpcyBudWxsLiBUb3JyZW50IGlzIG5vdCBhbm5vdW5jZWQgb24gdHJhY2tlciIsIHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYW5ub3VuY2VBbGxUb3JyZW50cyhMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbkxpc3QsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50KSB7CisKKyAgICBsb2dnZXIuZGVidWcoIlN0YXJ0ZWQgbXVsdGkgYW5ub3VuY2UuIEV2ZW50IHt9LCB0b3JyZW50cyB7fSIsIGV2ZW50LCBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbkxpc3QpOworICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+PiB0b3JyZW50c0dyb3VwaW5nQnlBbm5vdW5jZVVybCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4+KCk7CisKKyAgICBmb3IgKEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnQgOiBhbm5vdW5jZWFibGVJbmZvcm1hdGlvbkxpc3QpIHsKKyAgICAgIGZpbmFsIFVSSSB1cmlGb3JUb3JyZW50ID0gZ2V0VVJJRm9yVG9ycmVudCh0b3JyZW50KTsKKyAgICAgIGlmICh1cmlGb3JUb3JyZW50ID09IG51bGwpIGNvbnRpbnVlOworICAgICAgU3RyaW5nIHRvcnJlbnRVUkkgPSB1cmlGb3JUb3JyZW50LnRvU3RyaW5nKCk7CisgICAgICBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiBzaGFyZWRUb3JyZW50cyA9IHRvcnJlbnRzR3JvdXBpbmdCeUFubm91bmNlVXJsLmdldCh0b3JyZW50VVJJKTsKKyAgICAgIGlmIChzaGFyZWRUb3JyZW50cyA9PSBudWxsKSB7CisgICAgICAgIHNoYXJlZFRvcnJlbnRzID0gbmV3IEFycmF5TGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4oKTsKKyAgICAgICAgdG9ycmVudHNHcm91cGluZ0J5QW5ub3VuY2VVcmwucHV0KHRvcnJlbnRVUkksIHNoYXJlZFRvcnJlbnRzKTsKKyAgICAgIH0KKyAgICAgIHNoYXJlZFRvcnJlbnRzLmFkZCh0b3JyZW50KTsKKyAgICB9CisKKyAgICBMaXN0PEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiB1bmFubm91bmNlZFRvcnJlbnRzID0gbmV3IEFycmF5TGlzdDxBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4oKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8QW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+PiBlIDogdG9ycmVudHNHcm91cGluZ0J5QW5ub3VuY2VVcmwuZW50cnlTZXQoKSkgeworICAgICAgVHJhY2tlckNsaWVudCB0cmFja2VyQ2xpZW50ID0gdGhpcy5jbGllbnRzLmdldChlLmdldEtleSgpKTsKKyAgICAgIGlmICh0cmFja2VyQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0cmFja2VyQ2xpZW50Lm11bHRpQW5ub3VuY2UoZXZlbnQsIGZhbHNlLCBlLmdldFZhbHVlKCksIG15UGVlcnMpOworICAgICAgICB9IGNhdGNoIChBbm5vdW5jZUV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJwcm9ibGVtIGluIG11bHRpIGFubm91bmNlIHt9IiwgdC5nZXRNZXNzYWdlKCksIHQpOworICAgICAgICAgIHVuYW5ub3VuY2VkVG9ycmVudHMuYWRkQWxsKGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gdCkgeworICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5XaXRoTWVzc2FnZUFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgdHJhY2tlciB7fSIsIGUuZ2V0S2V5KCksIHQpOworICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibmV4dCB0b3JyZW50cyBjb250YWluIHt9IGluIHRyYWNrZXIgbGlzdC4ge30iLCBlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2dnZXIud2FybigiVHJhY2tlciBjbGllbnQgZm9yIHt9IGlzIG51bGwuIFRvcnJlbnRzIGFyZSBub3QgYW5ub3VuY2VkIG9uIHRyYWNrZXIiLCBlLmdldEtleSgpKTsKKyAgICAgICAgaWYgKGUuZ2V0S2V5KCkgPT0gbnVsbCB8fCBlLmdldEtleSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgIGZvciAoQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgIG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKS5yZW1vdmUoYW5ub3VuY2VhYmxlSW5mb3JtYXRpb24uZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICh1bmFubm91bmNlZFRvcnJlbnRzLnNpemUoKSA+IDApIHsKKyAgICAgIGRlZmF1bHRBbm5vdW5jZSh1bmFubm91bmNlZFRvcnJlbnRzKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY3VycmVudCB0cmFja2VyIGNsaWVudCB1c2VkIGZvciBhbm5vdW5jZXMuCisgICAqLworICBwdWJsaWMgVHJhY2tlckNsaWVudCBnZXRDdXJyZW50VHJhY2tlckNsaWVudChBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50KSB7CisgICAgZmluYWwgVVJJIHVyaSA9IGdldFVSSUZvclRvcnJlbnQodG9ycmVudCk7CisgICAgaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gdGhpcy5jbGllbnRzLmdldCh1cmkudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIFVSSSBnZXRVUklGb3JUb3JyZW50KEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnQpIHsKKyAgICBMaXN0PExpc3Q8U3RyaW5nPj4gYW5ub3VuY2VMaXN0ID0gdG9ycmVudC5nZXRBbm5vdW5jZUxpc3QoKTsKKyAgICBpZiAoYW5ub3VuY2VMaXN0LnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKKyAgICBMaXN0PFN0cmluZz4gdXJpcyA9IGFubm91bmNlTGlzdC5nZXQoMCk7CisgICAgaWYgKHVyaXMuc2l6ZSgpID09IDApIHJldHVybiBudWxsOworICAgIHJldHVybiBVUkkuY3JlYXRlKHVyaXMuZ2V0KDApKTsKKyAgfQorCisgIHB1YmxpYyBVUkkgZ2V0RGVmYXVsdFRyYWNrZXJVUkkoKSB7CisgICAgaWYgKG15RGVmYXVsdFRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBteURlZmF1bHRUcmFja2VyLmdldFRyYWNrZXJVUkkoKTsKKyAgfQorCisgIC8qKgorICAgKiBTdG9wIHRoZSBhbm5vdW5jZSB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSBoYXJkIFdoZXRoZXIgdG8gZm9yY2Ugc3RvcCB0aGUgYW5ub3VuY2UgdGhyZWFkIG9yIG5vdCwgaS5lLiBub3QKKyAgICogICAgICAgICAgICAgc2VuZCB0aGUgZmluYWwgJ3N0b3BwZWQnIGFubm91bmNlIHJlcXVlc3Qgb3Igbm90LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHN0b3AoYm9vbGVhbiBoYXJkKSB7CisgICAgdGhpcy5mb3JjZVN0b3AgPSBoYXJkOworICAgIHRoaXMuc3RvcCgpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlRXhjZXB0aW9uLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0Fubm91bmNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2ODc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZTsKKworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhbiBhbm5vdW5jZSByZXF1ZXN0IGZhaWxlZC4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEFubm91bmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTsKKworICBwdWJsaWMgQW5ub3VuY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBBbm5vdW5jZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgIH0KKworICBwdWJsaWMgQW5ub3VuY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9Bbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4M2NiZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogRXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCB3YW50IHRvIHJlY2VpdmUgdHJhY2tlciByZXNwb25zZXMuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKKyAgLyoqCisgICAqIEhhbmRsZSBhbiBhbm5vdW5jZSByZXNwb25zZSBldmVudC4KKyAgICoKKyAgICogQHBhcmFtIGludGVydmFsICAgVGhlIGFubm91bmNlIGludGVydmFsIHJlcXVlc3RlZCBieSB0aGUgdHJhY2tlci4KKyAgICogQHBhcmFtIGNvbXBsZXRlICAgVGhlIG51bWJlciBvZiBzZWVkZXJzIG9uIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGluY29tcGxldGUgVGhlIG51bWJlciBvZiBsZWVjaGVycyBvbiB0aGlzIHRvcnJlbnQuCisgICAqLworICB2b2lkIGhhbmRsZUFubm91bmNlUmVzcG9uc2UoaW50IGludGVydmFsLCBpbnQgY29tcGxldGUsIGludCBpbmNvbXBsZXRlLCBTdHJpbmcgaGV4SW5mb0hhc2gpOworCisgIC8qKgorICAgKiBIYW5kbGUgdGhlIGRpc2NvdmVyeSBvZiBuZXcgcGVlcnMuCisgICAqCisgICAqIEBwYXJhbSBwZWVycyBUaGUgbGlzdCBvZiBwZWVycyBkaXNjb3ZlcmVkIChmcm9tIHRoZSBhbm5vdW5jZSByZXNwb25zZSBvcgorICAgKiAgICAgICAgICAgICAgYW55IG90aGVyIG1lYW5zIGxpa2UgREhUL1BFWCwgZXRjLikuCisgICAqLworICB2b2lkIGhhbmRsZURpc2NvdmVyZWRQZWVycyhMaXN0PFBlZXI+IHBlZXJzLCBTdHJpbmcgaGV4SW5mb0hhc2gpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9IVFRQVHJhY2tlckNsaWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9IVFRQVHJhY2tlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjViNWQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL0hUVFBUcmFja2VyQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzMzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRGVjb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5iY29kZWMuQkVWYWx1ZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHAuSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHAuSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBUcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQW5ub3VuY2VyIGZvciBIVFRQIHRyYWNrZXJzLgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICogQHNlZSA8YSBocmVmPSJodHRwOi8vd2lraS50aGVvcnkub3JnL0JpdFRvcnJlbnRTcGVjaWZpY2F0aW9uI1RyYWNrZXJfUmVxdWVzdF9QYXJhbWV0ZXJzIj5CaXRUb3JyZW50IHRyYWNrZXIgcmVxdWVzdCBzcGVjaWZpY2F0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgSFRUUFRyYWNrZXJDbGllbnQgZXh0ZW5kcyBUcmFja2VyQ2xpZW50IHsKKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIVFRQVHJhY2tlckNsaWVudC5jbGFzcyk7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBIVFRQIGFubm91bmNlciBmb3IgdGhlIGdpdmVuIHRvcnJlbnQuCisgICAqCisgICAqIEBwYXJhbSBwZWVycyBPdXIgb3duIHBlZXIgc3BlY2lmaWNhdGlvbi4KKyAgICovCisgIHB1YmxpYyBIVFRQVHJhY2tlckNsaWVudChMaXN0PFBlZXI+IHBlZXJzLCBVUkkgdHJhY2tlcikgeworICAgIHN1cGVyKHBlZXJzLCB0cmFja2VyKTsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZCwgc2VuZCBhbmQgcHJvY2VzcyBhIHRyYWNrZXIgYW5ub3VuY2UgcmVxdWVzdC4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgYnVpbGRzIGFuIGFubm91bmNlIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQKKyAgICogd2l0aCBhbGwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMuIFRoZW4sIHRoZSByZXF1ZXN0IGlzIG1hZGUgdG8gdGhlCisgICAqIHRyYWNrZXIgYW5kIHRoZSByZXNwb25zZSBhbmFseXplZC4KKyAgICogPC9wPgorICAgKgorICAgKiA8cD4KKyAgICogQWxsIHJlZ2lzdGVyZWQge0BsaW5rIEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lcn0gb2JqZWN0cyBhcmUgdGhlbiBmaXJlZAorICAgKiB3aXRoIHRoZSBkZWNvZGVkIHBheWxvYWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGV2ZW50ICAgICAgICAgVGhlIGFubm91bmNlIGV2ZW50IHR5cGUgKGNhbiBiZSBBbm5vdW5jZUV2ZW50Lk5PTkUgZm9yCisgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGljIHVwZGF0ZXMpLgorICAgKiBAcGFyYW0gaW5oaWJpdEV2ZW50cyBQcmV2ZW50IGV2ZW50IGxpc3RlbmVycyBmcm9tIGJlaW5nIG5vdGlmaWVkLgorICAgKiBAcGFyYW0gdG9ycmVudEluZm8KKyAgICovCisgIHB1YmxpYyB2b2lkIGFubm91bmNlKGZpbmFsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudHMsIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnRJbmZvLCBmaW5hbCBMaXN0PFBlZXI+IGFkcmVzc2VzKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIGxvZ0Fubm91bmNlUmVxdWVzdChldmVudCwgdG9ycmVudEluZm8pOworCisgICAgZmluYWwgTGlzdDxIVFRQVHJhY2tlck1lc3NhZ2U+IHRyYWNrZXJSZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PEhUVFBUcmFja2VyTWVzc2FnZT4oKTsKKyAgICBmb3IgKGZpbmFsIFBlZXIgYWRkcmVzcyA6IGFkcmVzc2VzKSB7CisgICAgICBmaW5hbCBVUkwgdGFyZ2V0ID0gZW5jb2RlQW5ub3VuY2VUb1VSTChldmVudCwgdG9ycmVudEluZm8sIGFkZHJlc3MpOworICAgICAgdHJ5IHsKKyAgICAgICAgc2VuZEFubm91bmNlKHRhcmdldCwgIkdFVCIsIG5ldyBSZXNwb25zZVBhcnNlcigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHJlc3BvbnNlQ29kZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICBsb2dnZXIuaW5mbygicmVjZWl2ZWQgbm90IGh0dHAgMjAwIGNvZGUgZnJvbSB0cmFja2VyIGZvciByZXF1ZXN0ICIgKyB0YXJnZXQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFja2VyUmVzcG9uc2VzLmFkZChIVFRQVHJhY2tlck1lc3NhZ2UucGFyc2UoaW5wdXRTdHJlYW0pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICB9CisgICAgfQorICAgIC8vIHdlIHByb2Nlc3Mgb25seSBmaXJzdCByZXF1ZXN0OgorICAgIGlmICh0cmFja2VyUmVzcG9uc2VzLnNpemUoKSA+IDApIHsKKyAgICAgIGZpbmFsIEhUVFBUcmFja2VyTWVzc2FnZSBtZXNzYWdlID0gdHJhY2tlclJlc3BvbnNlcy5nZXQoMCk7CisgICAgICB0aGlzLmhhbmRsZVRyYWNrZXJBbm5vdW5jZVJlc3BvbnNlKG1lc3NhZ2UsIGluaGliaXRFdmVudHMsIHRvcnJlbnRJbmZvLmdldEhleEluZm9IYXNoKCkpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBtdWx0aUFubm91bmNlKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5oaWJpdEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8PyBleHRlbmRzIEFubm91bmNlYWJsZUluZm9ybWF0aW9uPiB0b3JyZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBlZXI+IGFkZHJlc3NlcykgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uIHsKKyAgICBMaXN0PExpc3Q8SFRUUFRyYWNrZXJNZXNzYWdlPj4gdHJhY2tlclJlc3BvbnNlcyA9IG5ldyBBcnJheUxpc3Q8TGlzdDxIVFRQVHJhY2tlck1lc3NhZ2U+PigpOworCisgICAgVVJMIHRyYWNrZXJVcmw7CisgICAgdHJ5IHsKKyAgICAgIHRyYWNrZXJVcmwgPSB0aGlzLnRyYWNrZXIudG9VUkwoKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJJbnZhbGlkIHRyYWNrZXIgVVJMICIgKyB0aGlzLnRyYWNrZXIsIGUpOworICAgIH0KKworICAgIGZvciAoZmluYWwgUGVlciBhZGRyZXNzIDogYWRkcmVzc2VzKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIGJvZHkgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50SW5mbyA6IHRvcnJlbnRzKSB7CisgICAgICAgIGJvZHkuYXBwZW5kKGVuY29kZUFubm91bmNlVG9VUkwoZXZlbnQsIHRvcnJlbnRJbmZvLCBhZGRyZXNzKSkuYXBwZW5kKCJcbiIpOworICAgICAgfQorICAgICAgZmluYWwgTGlzdDxIVFRQVHJhY2tlck1lc3NhZ2U+IHJlc3BvbnNlc0ZvckN1cnJlbnRJcCA9IG5ldyBBcnJheUxpc3Q8SFRUUFRyYWNrZXJNZXNzYWdlPigpOworICAgICAgZmluYWwgU3RyaW5nIGJvZHlTdHIgPSBib2R5LnN1YnN0cmluZygwLCBib2R5Lmxlbmd0aCgpIC0gMSk7CisgICAgICBzZW5kQW5ub3VuY2UodHJhY2tlclVybCwgYm9keVN0ciwgIlBPU1QiLCBuZXcgUmVzcG9uc2VQYXJzZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHJlc3BvbnNlQ29kZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICBpZiAocmVzcG9uc2VDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oInJlY2VpdmVkIHt9IGNvZGUgZnJvbSB0cmFja2VyIGZvciBtdWx0aSBhbm5vdW5jZSByZXF1ZXN0LiIsIHJlc3BvbnNlQ29kZSk7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoYm9keVN0cik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgZmluYWwgQkVWYWx1ZSBiZGVjb2RlID0gQkRlY29kZXIuYmRlY29kZShpbnB1dFN0cmVhbSk7CisgICAgICAgICAgaWYgKGJkZWNvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oInRyYWNrZXIgc2VudCBiYWQgcmVzcG9uc2UgZm9yIG11bHRpIGFubm91bmNlIG1lc3NhZ2UuIik7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoYm9keVN0cik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsIExpc3Q8QkVWYWx1ZT4gbGlzdCA9IGJkZWNvZGUuZ2V0TGlzdCgpOworICAgICAgICAgIGZvciAoQkVWYWx1ZSB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlc0ZvckN1cnJlbnRJcC5hZGQoSFRUUFRyYWNrZXJNZXNzYWdlLnBhcnNlKHZhbHVlKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGlmICghcmVzcG9uc2VzRm9yQ3VycmVudElwLmlzRW1wdHkoKSkgeworICAgICAgICB0cmFja2VyUmVzcG9uc2VzLmFkZChyZXNwb25zZXNGb3JDdXJyZW50SXApOworICAgICAgfQorICAgIH0KKyAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgZmlyc3QgcmVxdWVzdDoKKyAgICBpZiAodHJhY2tlclJlc3BvbnNlcy5zaXplKCkgPiAwKSB7CisgICAgICBmaW5hbCBMaXN0PEhUVFBUcmFja2VyTWVzc2FnZT4gbWVzc2FnZXMgPSB0cmFja2VyUmVzcG9uc2VzLmdldCgwKTsKKyAgICAgIGZvciAoSFRUUFRyYWNrZXJNZXNzYWdlIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworCisgICAgICAgIGlmICghKG1lc3NhZ2UgaW5zdGFuY2VvZiBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UpKSB7CisgICAgICAgICAgbG9nZ2VyLmluZm8oIkluY29ycmVjdCBpbnN0YW5jZSBvZiBtZXNzYWdlIHt9LiBTa2lwcGluZy4uLiIsIG1lc3NhZ2UpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhleEluZm9IYXNoID0gKChIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UpIG1lc3NhZ2UpLmdldEhleEluZm9IYXNoKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGhpcy5oYW5kbGVUcmFja2VyQW5ub3VuY2VSZXNwb25zZShtZXNzYWdlLCBpbmhpYml0RXZlbnQsIGhleEluZm9IYXNoKTsKKyAgICAgICAgfSBjYXRjaCAoQW5ub3VuY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgIExvZ2dlclV0aWxzLmVycm9yQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgIlVuYWJsZSB0byBwcm9jZXNzIHRyYWNrZXIgcmVzcG9uc2Uge30iLCBtZXNzYWdlLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgVVJMIGVuY29kZUFubm91bmNlVG9VUkwoQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnRJbmZvLCBQZWVyIHBlZXIpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiB7CisgICAgVVJMIHJlc3VsdDsKKyAgICB0cnkgeworICAgICAgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCA9IHRoaXMuYnVpbGRBbm5vdW5jZVJlcXVlc3QoZXZlbnQsIHRvcnJlbnRJbmZvLCBwZWVyKTsKKyAgICAgIHJlc3VsdCA9IHJlcXVlc3QuYnVpbGRBbm5vdW5jZVVSTCh0aGlzLnRyYWNrZXIudG9VUkwoKSk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJJbnZhbGlkIGFubm91bmNlIFVSTCAoIiArCisgICAgICAgICAgICAgIG11ZS5nZXRNZXNzYWdlKCkgKyAiKSIsIG11ZSk7CisgICAgfSBjYXRjaCAoTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24gbXZlKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIkFubm91bmNlIHJlcXVlc3QgY3JlYXRpb24gdmlvbGF0ZWQgIiArCisgICAgICAgICAgICAgICJleHBlY3RlZCBwcm90b2NvbCAoIiArIG12ZS5nZXRNZXNzYWdlKCkgKyAiKSIsIG12ZSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIkVycm9yIGJ1aWxkaW5nIGFubm91bmNlIHJlcXVlc3QgKCIgKworICAgICAgICAgICAgICBpb2UuZ2V0TWVzc2FnZSgpICsgIikiLCBpb2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRBbm5vdW5jZShmaW5hbCBVUkwgdXJsLCBmaW5hbCBTdHJpbmcgbWV0aG9kLCBSZXNwb25zZVBhcnNlciBwYXJzZXIpCisgICAgICAgICAgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uIHsKKyAgICBzZW5kQW5ub3VuY2UodXJsLCAiIiwgbWV0aG9kLCBwYXJzZXIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRBbm5vdW5jZShmaW5hbCBVUkwgdXJsLCBmaW5hbCBTdHJpbmcgYm9keSwgZmluYWwgU3RyaW5nIG1ldGhvZCwgUmVzcG9uc2VQYXJzZXIgcGFyc2VyKQorICAgICAgICAgIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiB7CisgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgIHRyeSB7CisgICAgICBjb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBvcGVuQ29ubmVjdGlvbkNoZWNrUmVkaXJlY3RzKHVybCwgYm9keSwgbWV0aG9kKTsKKyAgICAgIGluID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICBpbiA9IGNvbm4uZ2V0RXJyb3JTdHJlYW0oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdCB0aGlzIHBvaW50IGlmIHRoZSBpbnB1dCBzdHJlYW0gaXMgbnVsbCBpdCBtZWFucyB3ZSBoYXZlIG5laXRoZXIgYQorICAgIC8vIHJlc3BvbnNlIGJvZHkgbm9yIGFuIGVycm9yIHN0cmVhbSBmcm9tIHRoZSBzZXJ2ZXIuIE5vIHBvaW50IGluIGdvaW5nCisgICAgLy8gYW55IGZ1cnRoZXIuCisgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBDb25uZWN0RXhjZXB0aW9uKCJObyByZXNwb25zZSBvciB1bnJlYWNoYWJsZSB0cmFja2VyISIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBwYXJzZXIucGFyc2UoaW4sIGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHRyYWNrZXIgcmVzcG9uc2UhIiwgaW9lKTsKKyAgICB9IGNhdGNoIChNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiBtdmUpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiVHJhY2tlciBtZXNzYWdlIHZpb2xhdGVzIGV4cGVjdGVkICIgKworICAgICAgICAgICAgICAicHJvdG9jb2wgKCIgKyBtdmUuZ2V0TWVzc2FnZSgpICsgIikiLCBtdmUpOworICAgIH0gZmluYWxseSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xvc2UgZXZlcnl0aGluZyBkb3duIGF0IHRoZSBlbmQgdG8gYXZvaWQgcmVzb3VyY2UKKyAgICAgIC8vIGxlYWtzLgorICAgICAgdHJ5IHsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBsb2dnZXIuaW5mbygiUHJvYmxlbSBlbnN1cmluZyBlcnJvciBzdHJlYW0gY2xvc2VkISIpOworICAgICAgICBsb2dnZXIuZGVidWcoIlByb2JsZW0gZW5zdXJpbmcgZXJyb3Igc3RyZWFtIGNsb3NlZCEiLCBpb2UpOworICAgICAgfQorCisgICAgICAvLyBUaGlzIG1lYW5zIHRyeWluZyB0byBjbG9zZSB0aGUgZXJyb3Igc3RyZWFtIGFzIHdlbGwuCisgICAgICBJbnB1dFN0cmVhbSBlcnIgPSBjb25uLmdldEVycm9yU3RyZWFtKCk7CisgICAgICBpZiAoZXJyICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBlcnIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgbG9nZ2VyLmluZm8oIlByb2JsZW0gZW5zdXJpbmcgZXJyb3Igc3RyZWFtIGNsb3NlZCEiKTsKKyAgICAgICAgICBsb2dnZXIuZGVidWcoIlByb2JsZW0gZW5zdXJpbmcgZXJyb3Igc3RyZWFtIGNsb3NlZCEiLCBpb2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uQ2hlY2tSZWRpcmVjdHMoVVJMIHVybCwgU3RyaW5nIGJvZHksIFN0cmluZyBtZXRob2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYm9vbGVhbiBuZWVkUmVkaXJlY3Q7CisgICAgaW50IHJlZGlyZWN0cyA9IDA7CisgICAgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgYm9vbGVhbiBmaXJzdEl0ZXJhdGlvbiA9IHRydWU7CisgICAgZG8geworICAgICAgbmVlZFJlZGlyZWN0ID0gZmFsc2U7CisgICAgICBjb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KDEwMDAwKTsKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVhZFRpbWVvdXQoMTAwMDApOworICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cCA9IG51bGw7CisgICAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7CisgICAgICAgIGh0dHAgPSAoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb247CisgICAgICAgIGh0dHAuc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoZmFsc2UpOworICAgICAgfQorICAgICAgaWYgKGh0dHAgIT0gbnVsbCkgeworCisgICAgICAgIGlmIChmaXJzdEl0ZXJhdGlvbikgeworICAgICAgICAgIGZpcnN0SXRlcmF0aW9uID0gZmFsc2U7CisgICAgICAgICAgaHR0cC5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Iik7CisgICAgICAgICAgaHR0cC5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoYm9keS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHN0YXQgPSBodHRwLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICBpZiAoc3RhdCA+PSAzMDAgJiYgc3RhdCA8PSAzMDcgJiYgc3RhdCAhPSAzMDYgJiYKKyAgICAgICAgICAgICAgICBzdGF0ICE9IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfTk9UX01PRElGSUVEKSB7CisgICAgICAgICAgVVJMIGJhc2UgPSBodHRwLmdldFVSTCgpOworICAgICAgICAgIFN0cmluZyBuZXdMb2NhdGlvbiA9IGh0dHAuZ2V0SGVhZGVyRmllbGQoIkxvY2F0aW9uIik7CisgICAgICAgICAgVVJMIHRhcmdldCA9IG5ld0xvY2F0aW9uID09IG51bGwgPyBudWxsIDogbmV3IFVSTChiYXNlLCBuZXdMb2NhdGlvbik7CisgICAgICAgICAgaHR0cC5kaXNjb25uZWN0KCk7CisgICAgICAgICAgLy8gUmVkaXJlY3Rpb24gc2hvdWxkIGJlIGFsbG93ZWQgb25seSBmb3IgSFRUUCBhbmQgSFRUUFMKKyAgICAgICAgICAvLyBhbmQgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gNSByZWRpcmVjdGlvbnMgYXQgbW9zdC4KKyAgICAgICAgICBpZiAocmVkaXJlY3RzID49IDUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidG9vIG1hbnkgcmVkaXJlY3RzIik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCAhKHRhcmdldC5nZXRQcm90b2NvbCgpLmVxdWFscygiaHR0cCIpCisgICAgICAgICAgICAgICAgICB8fCB0YXJnZXQuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImh0dHBzIikpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImlsbGVnYWwgVVJMIHJlZGlyZWN0IG9yIHByb3RvY29sIik7CisgICAgICAgICAgfQorICAgICAgICAgIG5lZWRSZWRpcmVjdCA9IHRydWU7CisgICAgICAgICAgY29ubmVjdGlvbiA9IHRhcmdldC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgIHJlZGlyZWN0cysrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHdoaWxlIChuZWVkUmVkaXJlY3QpOworICAgIHJldHVybiBjb25uZWN0aW9uOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkIHRoZSBhbm5vdW5jZSByZXF1ZXN0IHRyYWNrZXIgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIGV2ZW50IFRoZSBhbm5vdW5jZSBldmVudCAoY2FuIGJlIDx0dD5OT05FPC90dD4gb3IgPGVtPm51bGw8L2VtPikKKyAgICogQHJldHVybiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlfQorICAgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmdWxseSBxdWFsaWZpZWQgYW5ub3VuY2UgVVJMLCB3aXRoCisgICAqIHBhcmFtZXRlcnMsIHRvIG1ha2UgdGhlIGFubm91bmNlIHJlcXVlc3QuCisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAqIEB0aHJvd3MgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24KKyAgICovCisgIHByaXZhdGUgSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgYnVpbGRBbm5vdW5jZVJlcXVlc3QoCisgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnRJbmZvLCBQZWVyIHBlZXIpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgIE1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAvLyBCdWlsZCBhbm5vdW5jZSByZXF1ZXN0IG1lc3NhZ2UKKyAgICBmaW5hbCBsb25nIHVwbG9hZGVkID0gdG9ycmVudEluZm8uZ2V0VXBsb2FkZWQoKTsKKyAgICBmaW5hbCBsb25nIGRvd25sb2FkZWQgPSB0b3JyZW50SW5mby5nZXREb3dubG9hZGVkKCk7CisgICAgZmluYWwgbG9uZyBsZWZ0ID0gdG9ycmVudEluZm8uZ2V0TGVmdCgpOworICAgIHJldHVybiBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5jcmFmdCgKKyAgICAgICAgICAgIHRvcnJlbnRJbmZvLmdldEluZm9IYXNoKCksCisgICAgICAgICAgICBwZWVyLmdldFBlZXJJZEFycmF5KCksCisgICAgICAgICAgICBwZWVyLmdldFBvcnQoKSwKKyAgICAgICAgICAgIHVwbG9hZGVkLAorICAgICAgICAgICAgZG93bmxvYWRlZCwKKyAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICB0cnVlLCBmYWxzZSwgZXZlbnQsCisgICAgICAgICAgICBwZWVyLmdldElwKCksCisgICAgICAgICAgICBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLkRFRkFVTFRfTlVNX1dBTlQpOworICB9CisKKyAgcHJpdmF0ZSBpbnRlcmZhY2UgUmVzcG9uc2VQYXJzZXIgeworCisgICAgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHJlc3BvbnNlQ29kZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbjsKKworICB9CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9UcmFja2VyQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIFR1cm4sIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Bbm5vdW5jZWFibGVJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVzcG9uc2VNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuRXJyb3JNZXNzYWdlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFja2VyQ2xpZW50IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlckNsaWVudC5jbGFzcyk7CisKKworICAvKioKKyAgICogVGhlIHNldCBvZiBsaXN0ZW5lcnMgdG8gYW5ub3VuY2UgcmVxdWVzdCBhbnN3ZXJzLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8QW5ub3VuY2VSZXNwb25zZUxpc3RlbmVyPiBsaXN0ZW5lcnM7CisKKyAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8UGVlcj4gbXlBZGRyZXNzOworICBwcm90ZWN0ZWQgZmluYWwgVVJJIHRyYWNrZXI7CisKKyAgcHVibGljIFRyYWNrZXJDbGllbnQoZmluYWwgTGlzdDxQZWVyPiBwZWVycywgZmluYWwgVVJJIHRyYWNrZXIpIHsKKyAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBIYXNoU2V0PEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lcj4oKTsKKyAgICBteUFkZHJlc3MgPSBwZWVyczsKKyAgICB0aGlzLnRyYWNrZXIgPSB0cmFja2VyOworICB9CisKKyAgLyoqCisgICAqIFJlZ2lzdGVyIGEgbmV3IGFubm91bmNlIHJlc3BvbnNlIGxpc3RlbmVyLgorICAgKgorICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlZ2lzdGVyIG9uIHRoaXMgYW5ub3VuY2VyIGV2ZW50cy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgVVJJIHRoaXMgdHJhY2tlciBjbGllbnRzIGNvbm5lY3RzIHRvLgorICAgKi8KKyAgcHVibGljIFVSSSBnZXRUcmFja2VyVVJJKCkgeworICAgIHJldHVybiB0aGlzLnRyYWNrZXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBhbm5vdW5jZUFsbEludGVyZmFjZXMoZmluYWwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudCwgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCkgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYW5ub3VuY2UoZXZlbnQsIGluaGliaXRFdmVudCwgdG9ycmVudCwgbXlBZGRyZXNzKTsKKyAgICB9IGNhdGNoIChBbm5vdW5jZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGFubm91bmNlIHRyYWNrZXIgJXMgZXZlbnQgJXMgZm9yIHRvcnJlbnQgJXMgYW5kIHBlZXJzICVzLiBSZWFzb24gJXMiLAorICAgICAgICAgICAgICBnZXRUcmFja2VyVVJJKCksIGV2ZW50LmdldEV2ZW50TmFtZSgpLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCksIEFycmF5cy50b1N0cmluZyhteUFkZHJlc3MudG9BcnJheSgpKSwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQnVpbGQsIHNlbmQgYW5kIHByb2Nlc3MgYSB0cmFja2VyIGFubm91bmNlIHJlcXVlc3QuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGJ1aWxkcyBhbiBhbm5vdW5jZSByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50CisgICAqIHdpdGggYWxsIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLiBUaGVuLCB0aGUgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZQorICAgKiB0cmFja2VyIGFuZCB0aGUgcmVzcG9uc2UgYW5hbHl6ZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIEFsbCByZWdpc3RlcmVkIHtAbGluayBBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXJ9IG9iamVjdHMgYXJlIHRoZW4gZmlyZWQKKyAgICogd2l0aCB0aGUgZGVjb2RlZCBwYXlsb2FkLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBldmVudCAgICAgICAgVGhlIGFubm91bmNlIGV2ZW50IHR5cGUgKGNhbiBiZSBBbm5vdW5jZUV2ZW50Lk5PTkUgZm9yCisgICAqICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWMgdXBkYXRlcykuCisgICAqIEBwYXJhbSBpbmhpYml0RXZlbnQgUHJldmVudCBldmVudCBsaXN0ZW5lcnMgZnJvbSBiZWluZyBub3RpZmllZC4KKyAgICogQHBhcmFtIHRvcnJlbnQKKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFubm91bmNlKGZpbmFsIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudCwgZmluYWwgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24gdG9ycmVudCwgZmluYWwgTGlzdDxQZWVyPiBwZWVyKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb247CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbXVsdGlBbm5vdW5jZShmaW5hbCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbj4gdG9ycmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQZWVyPiBwZWVyKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb247CisKKyAgcHJvdGVjdGVkIHZvaWQgbG9nQW5ub3VuY2VSZXF1ZXN0KEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50KSB7CisgICAgaWYgKGV2ZW50ICE9IEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50Lk5PTkUpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQW5ub3VuY2luZyB7fSB0byB0cmFja2VyIHdpdGgge31VL3t9RC97fUwgYnl0ZXMuLi4iLAorICAgICAgICAgICAgICBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRBbm5vdW5jZUV2ZW50KGV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldFVwbG9hZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXREb3dubG9hZGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgdG9ycmVudC5nZXRMZWZ0KCkKKyAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiU2ltcGx5IGFubm91bmNpbmcgdG8gdHJhY2tlciB3aXRoIHt9VS97fUQve31MIGJ5dGVzLi4uIiwKKyAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0VXBsb2FkZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldERvd25sb2FkZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3JyZW50LmdldExlZnQoKQorICAgICAgICAgICAgICB9KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2UgYW55IG9wZW5lZCBhbm5vdW5jZSBjb25uZWN0aW9uLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIG1ha2Ugc3VyZSBhbGwgY29ubmVjdGlvbnMKKyAgICogYXJlIGNvcnJlY3RseSBjbG9zZWQgd2hlbiB0aGUgYW5ub3VuY2UgdGhyZWFkIGlzIGFza2VkIHRvIHN0b3AuCisgICAqIDwvcD4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGNsb3NlKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBvdmVybG9hZGVkLgorICB9CisKKyAgLyoqCisgICAqIEZvcm1hdHMgYW4gYW5ub3VuY2UgZXZlbnQgaW50byBhIHVzYWJsZSBzdHJpbmcuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEFubm91bmNlRXZlbnQoCisgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQpIHsKKyAgICByZXR1cm4gQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuTk9ORS5lcXVhbHMoZXZlbnQpCisgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICA6IFN0cmluZy5mb3JtYXQoIiAlcyIsIGV2ZW50Lm5hbWUoKSk7CisgIH0KKworICAvKioKKyAgICogSGFuZGxlIHRoZSBhbm5vdW5jZSByZXNwb25zZSBmcm9tIHRoZSB0cmFja2VyLgorICAgKgorICAgKiA8cD4KKyAgICogQW5hbHl6ZXMgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHRyYWNrZXIgYW5kIGFjdHMgb24gaXQuIElmIHRoZSByZXNwb25zZQorICAgKiBpcyBhbiBlcnJvciwgaXQgaXMgbG9nZ2VkLiBPdGhlcndpc2UsIHRoZSBhbm5vdW5jZSByZXNwb25zZSBpcyB1c2VkCisgICAqIHRvIGZpcmUgdGhlIGNvcnJlc3BvbmRpbmcgYW5ub3VuY2UgYW5kIHBlZXIgZXZlbnRzIHRvIGFsbCBhbm5vdW5jZQorICAgKiBsaXN0ZW5lcnMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgVGhlIGluY29taW5nIHtAbGluayBUcmFja2VyTWVzc2FnZX0uCisgICAqIEBwYXJhbSBpbmhpYml0RXZlbnRzIFdoZXRoZXIgb3Igbm90IHRvIHByZXZlbnQgZXZlbnRzIGZyb20gYmVpbmcgZmlyZWQuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUcmFja2VyQW5ub3VuY2VSZXNwb25zZShUcmFja2VyTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGliaXRFdmVudHMsIFN0cmluZyBoZXhJbmZvSGFzaCkgdGhyb3dzIEFubm91bmNlRXhjZXB0aW9uIHsKKyAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yTWVzc2FnZSkgeworICAgICAgRXJyb3JNZXNzYWdlIGVycm9yID0gKEVycm9yTWVzc2FnZSkgbWVzc2FnZTsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbihlcnJvci5nZXRSZWFzb24oKSk7CisgICAgfQorCisgICAgaWYgKCEobWVzc2FnZSBpbnN0YW5jZW9mIEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRyYWNrZXIgbWVzc2FnZSB0eXBlICIgKworICAgICAgICAgICAgICBtZXNzYWdlLmdldFR5cGUoKS5uYW1lKCkgKyAiISIpOworICAgIH0KKworCisgICAgQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgKEFubm91bmNlUmVzcG9uc2VNZXNzYWdlKSBtZXNzYWdlOworCisgICAgdGhpcy5maXJlQW5ub3VuY2VSZXNwb25zZUV2ZW50KAorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0Q29tcGxldGUoKSwKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEluY29tcGxldGUoKSwKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEludGVydmFsKCksCisgICAgICAgICAgICBoZXhJbmZvSGFzaCk7CisKKyAgICBpZiAoaW5oaWJpdEV2ZW50cykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMuZmlyZURpc2NvdmVyZWRQZWVyc0V2ZW50KAorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UGVlcnMoKSwKKyAgICAgICAgICAgIGhleEluZm9IYXNoKTsKKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBhbm5vdW5jZSByZXNwb25zZSBldmVudCB0byBhbGwgbGlzdGVuZXJzLgorICAgKgorICAgKiBAcGFyYW0gY29tcGxldGUgICBUaGUgbnVtYmVyIG9mIHNlZWRlcnMgb24gdGhpcyB0b3JyZW50LgorICAgKiBAcGFyYW0gaW5jb21wbGV0ZSBUaGUgbnVtYmVyIG9mIGxlZWNoZXJzIG9uIHRoaXMgdG9ycmVudC4KKyAgICogQHBhcmFtIGludGVydmFsICAgVGhlIGFubm91bmNlIGludGVydmFsIHJlcXVlc3RlZCBieSB0aGUgdHJhY2tlci4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGZpcmVBbm5vdW5jZVJlc3BvbnNlRXZlbnQoaW50IGNvbXBsZXRlLCBpbnQgaW5jb21wbGV0ZSwgaW50IGludGVydmFsLCBTdHJpbmcgaGV4SW5mb0hhc2gpIHsKKyAgICBmb3IgKEFubm91bmNlUmVzcG9uc2VMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lci5oYW5kbGVBbm5vdW5jZVJlc3BvbnNlKGludGVydmFsLCBjb21wbGV0ZSwgaW5jb21wbGV0ZSwgaGV4SW5mb0hhc2gpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBuZXcgcGVlciBkaXNjb3ZlcnkgZXZlbnQgdG8gYWxsIGxpc3RlbmVycy4KKyAgICoKKyAgICogQHBhcmFtIHBlZXJzIFRoZSBsaXN0IG9mIHBlZXJzIGRpc2NvdmVyZWQuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBmaXJlRGlzY292ZXJlZFBlZXJzRXZlbnQoTGlzdDxQZWVyPiBwZWVycywgU3RyaW5nIGhleEluZm9IYXNoKSB7CisgICAgZm9yIChBbm5vdW5jZVJlc3BvbnNlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlRGlzY292ZXJlZFBlZXJzKHBlZXJzLCBoZXhJbmZvSGFzaCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRGYWN0b3J5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L2Fubm91bmNlL1RyYWNrZXJDbGllbnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MWUzNgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5hbm5vdW5jZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25TZXJ2aWNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIFRyYWNrZXJDbGllbnRGYWN0b3J5IHsKKworICAvKioKKyAgICogQ3JlYXRlIGEge0BsaW5rIFRyYWNrZXJDbGllbnR9IGFubm91bmNpbmcgdG8gdGhlIGdpdmVuIHRyYWNrZXIgYWRkcmVzcy4KKyAgICoKKyAgICogQHBhcmFtIHBlZXJzICAgVGhlIGxpc3QgcGVlciB0aGUgdHJhY2tlciBjbGllbnQgd2lsbCBhbm5vdW5jZSBvbiBiZWhhbGYgb2YuCisgICAqIEBwYXJhbSB0cmFja2VyIFRoZSB0cmFja2VyIGFkZHJlc3MgYXMgYSB7QGxpbmsgamF2YS5uZXQuVVJJfS4KKyAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiAgICBJZiB0aGUgdHJhY2tlciBhZGRyZXNzIGlzIGludmFsaWQuCisgICAqIEB0aHJvd3MgVW5rbm93blNlcnZpY2VFeGNlcHRpb24gSWYgdGhlIHRyYWNrZXIgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KKyAgICovCisgIFRyYWNrZXJDbGllbnQgY3JlYXRlVHJhY2tlckNsaWVudChMaXN0PFBlZXI+IHBlZXJzLCBVUkkgdHJhY2tlcikgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBVbmtub3duU2VydmljZUV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9UcmFja2VyQ2xpZW50RmFjdG9yeUltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyYmRhMAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVHJhY2tlckNsaWVudEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duU2VydmljZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRyYWNrZXJDbGllbnRGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFRyYWNrZXJDbGllbnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRyYWNrZXJDbGllbnQgY3JlYXRlVHJhY2tlckNsaWVudChMaXN0PFBlZXI+IHBlZXJzLCBVUkkgdHJhY2tlcikgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBVbmtub3duU2VydmljZUV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNjaGVtZSA9IHRyYWNrZXIuZ2V0U2NoZW1lKCk7CisKKyAgICBpZiAoImh0dHAiLmVxdWFscyhzY2hlbWUpIHx8ICJodHRwcyIuZXF1YWxzKHNjaGVtZSkpIHsKKyAgICAgIHJldHVybiBuZXcgSFRUUFRyYWNrZXJDbGllbnQocGVlcnMsIHRyYWNrZXIpOworICAgIH0gZWxzZSBpZiAoInVkcCIuZXF1YWxzKHNjaGVtZSkpIHsKKyAgICAgIHJldHVybiBuZXcgVURQVHJhY2tlckNsaWVudChwZWVycywgdHJhY2tlcik7CisgICAgfQorCisgICAgdGhyb3cgbmV3IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uKAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGFubm91bmNlIHNjaGVtZTogIiArIHNjaGVtZSArICIhIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVURQVHJhY2tlckNsaWVudC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9hbm5vdW5jZS9VRFBUcmFja2VyQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0OTkwOAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvYW5ub3VuY2UvVURQVHJhY2tlckNsaWVudC5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKioKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuYW5ub3VuY2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uQW5ub3VuY2VhYmxlSW5mb3JtYXRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuQ29ubmVjdGlvblJlc3BvbnNlTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuRXJyb3JNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZS5NZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wudWRwLlVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcC5VRFBDb25uZWN0UmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLnVkcC5VRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC51ZHAuVURQVHJhY2tlck1lc3NhZ2U7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQW5ub3VuY2VyIGZvciBVRFAgdHJhY2tlcnMuCisgKgorICogPHA+CisgKiBUaGUgVURQIHRyYWNrZXIgcHJvdG9jb2wgcmVxdWlyZXMgYSB0d28tc3RlcCBhbm5vdW5jZSByZXF1ZXN0L3Jlc3BvbnNlCisgKiBleGNoYW5nZSB3aGVyZSB0aGUgcGVlciBpcyBmaXJzdCByZXF1aXJlZCB0byBlc3RhYmxpc2ggYSAiY29ubmVjdGlvbiIKKyAqIHdpdGggdGhlIHRyYWNrZXIgYnkgc2VuZGluZyBhIGNvbm5lY3Rpb24gcmVxdWVzdCBtZXNzYWdlIGFuZCByZXRyZWl2aW5nCisgKiBhIGNvbm5lY3Rpb24gSUQgZnJvbSB0aGUgdHJhY2tlciB0byB1c2UgaW4gdGhlIGZvbGxvd2luZyBhbm5vdW5jZQorICogcmVxdWVzdCBtZXNzYWdlcyAodmFsaWQgZm9yIDIgbWludXRlcykuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBJdCBhbHNvIGNvbnRhaW5zIGEgYmFja2luZy1vZmYgcmV0cnkgbWVjaGFuaXNtIChvbiBhIDE1KjJebiBzZWNvbmRzCisgKiBzY2hlbWUpLCBpbiB3aGljaCBpZiB0aGUgYW5ub3VuY2UgcmVxdWVzdCB0aW1lcy1vdXQgZm9yIG1vcmUgdGhhbiB0aGUKKyAqIGNvbm5lY3Rpb24gSUQgdmFsaWRpdHkgcGVyaW9kLCBhbm90aGVyIGNvbm5lY3Rpb24gcmVxdWVzdC9yZXNwb25zZQorICogZXhjaGFuZ2UgbXVzdCBiZSBtYWRlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJhbnNtaXQgdGhlIGFubm91bmNlCisgKiByZXF1ZXN0LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgVURQVHJhY2tlckNsaWVudCBleHRlbmRzIFRyYWNrZXJDbGllbnQgeworCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFVEUFRyYWNrZXJDbGllbnQuY2xhc3MpOworCisgIC8qKgorICAgKiBCYWNrLW9mZiB0aW1lb3V0IHVzZXMgMTUgKiAyIF4gbiBmb3JtdWxhLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9CQVNFX1RJTUVPVVRfU0VDT05EUyA9IDE1OworCisgIC8qKgorICAgKiBXZSBkb24ndCB0cnkgbW9yZSB0aGFuIDggdGltZXMgKDM4NDAgc2Vjb25kcywgYXMgcGVyIHRoZSBmb3JtdWxhIGRlZmluZWQKKyAgICogZm9yIHRoZSBiYWNraW5nLW9mZiB0aW1lb3V0LgorICAgKgorICAgKiBAc2VlICNVRFBfQkFTRV9USU1FT1VUX1NFQ09ORFMKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfTUFYX1RSSUVTID0gODsKKworICAvKioKKyAgICogRm9yIFNUT1BQRUQgYW5ub3VuY2UgZXZlbnQsIHdlIGRvbid0IHdhbnQgdG8gYmUgYm90aGVyZWQgd2l0aCB3YWl0aW5nCisgICAqIHRoYXQgbG9uZy4gV2UnbGwgdHJ5IG9uY2UgYW5kIGJhaWwtb3V0IGVhcmx5LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVEUF9NQVhfVFJJRVNfT05fU1RPUFBFRCA9IDE7CisKKyAgLyoqCisgICAqIE1heGltdW0gVURQIHBhY2tldCBzaXplIGV4cGVjdGVkLCBpbiBieXRlcy4KKyAgICoKKyAgICogVGhlIGJpZ2dlc3QgcGFja2V0IGluIHRoZSBleGNoYW5nZSBpcyB0aGUgYW5ub3VuY2UgcmVzcG9uc2UsIHdoaWNoIGluIDIwCisgICAqIGJ5dGVzICsgNiBieXRlcyBwZXIgcGVlci4gQ29tbW9uIG51bVdhbnQgaXMgNTAsIHNvIDIwICsgNiAqIDUwID0gMzIwLgorICAgKiBXaXRoIGhlYWRyb29tLCB3ZSdsbCBhc2sgZm9yIDUxMiBieXRlcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVRFBfUEFDS0VUX0xFTkdUSCA9IDUxMjsKKworICBwcml2YXRlIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3M7CisgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmRvbTsKKworICBwcml2YXRlIERhdGFncmFtU29ja2V0IHNvY2tldDsKKyAgcHJpdmF0ZSBEYXRlIGNvbm5lY3Rpb25FeHBpcmF0aW9uOworICBwcml2YXRlIGxvbmcgY29ubmVjdGlvbklkOworICBwcml2YXRlIGludCB0cmFuc2FjdGlvbklkOworICBwcml2YXRlIGJvb2xlYW4gc3RvcDsKKworICBwcml2YXRlIGVudW0gU3RhdGUgeworICAgIENPTk5FQ1RfUkVRVUVTVCwKKyAgICBBTk5PVU5DRV9SRVFVRVNUCisgIH0KKworICAvKioKKyAgICoKKyAgICovCisgIHByb3RlY3RlZCBVRFBUcmFja2VyQ2xpZW50KExpc3Q8UGVlcj4gcGVlcnMsIFVSSSB0cmFja2VyKQorICAgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgc3VwZXIocGVlcnMsIHRyYWNrZXIpOworCisgICAgLyoqCisgICAgICogVGhlIFVEUCBhbm5vdW5jZSByZXF1ZXN0IHByb3RvY29sIG9ubHkgc3VwcG9ydHMgSVB2NAorICAgICAqCisgICAgICogQHNlZSBodHRwOi8vYml0dG9ycmVudC5vcmcvYmVwcy9iZXBfMDAxNS5odG1sI2lwdjYKKyAgICAgKi8KKyAgICBmb3IgKFBlZXIgcGVlciA6IHBlZXJzKSB7CisgICAgICBpZiAoIShJbmV0QWRkcmVzcy5nZXRCeU5hbWUocGVlci5nZXRJcCgpKSBpbnN0YW5jZW9mIEluZXQ0QWRkcmVzcykpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQWRkcmVzc1R5cGVFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLmFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCisgICAgICAgICAgICB0cmFja2VyLmdldEhvc3QoKSwKKyAgICAgICAgICAgIHRyYWNrZXIuZ2V0UG9ydCgpKTsKKworICAgIHRoaXMuc29ja2V0ID0gbnVsbDsKKyAgICB0aGlzLnJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICB0aGlzLmNvbm5lY3Rpb25FeHBpcmF0aW9uID0gbnVsbDsKKyAgICB0aGlzLnN0b3AgPSBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBtdWx0aUFubm91bmNlKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBib29sZWFuIGluaGliaXRFdmVudCwgTGlzdDw/IGV4dGVuZHMgQW5ub3VuY2VhYmxlSW5mb3JtYXRpb24+IHRvcnJlbnRzLCBMaXN0PFBlZXI+IHBlZXIpIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhbm5vdW5jZShmaW5hbCBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhpYml0RXZlbnRzLCBmaW5hbCBBbm5vdW5jZWFibGVJbmZvcm1hdGlvbiB0b3JyZW50LCBmaW5hbCBMaXN0PFBlZXI+IHBlZXJzKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIGxvZ0Fubm91bmNlUmVxdWVzdChldmVudCwgdG9ycmVudCk7CisKKyAgICBTdGF0ZSBzdGF0ZSA9IFN0YXRlLkNPTk5FQ1RfUkVRVUVTVDsKKyAgICBpbnQgbWF4QXR0ZW1wdHMgPSBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudAorICAgICAgICAgICAgLlNUT1BQRUQuZXF1YWxzKGV2ZW50KQorICAgICAgICAgICAgPyBVRFBfTUFYX1RSSUVTX09OX1NUT1BQRUQKKyAgICAgICAgICAgIDogVURQX01BWF9UUklFUzsKKyAgICBpbnQgYXR0ZW1wdHMgPSAtMTsKKworICAgIHRyeSB7CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOworICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCh0aGlzLmFkZHJlc3MpOworCisgICAgICB3aGlsZSAoKythdHRlbXB0cyA8PSBtYXhBdHRlbXB0cykgeworICAgICAgICAvLyBUcmFuc2FjdGlvbiBJRCBpcyByYW5kb21pemVkIGZvciBlYWNoIGV4Y2hhbmdlLgorICAgICAgICB0aGlzLnRyYW5zYWN0aW9uSWQgPSB0aGlzLnJhbmRvbS5uZXh0SW50KCk7CisKKyAgICAgICAgLy8gSW1tZWRpYXRlbHkgZGVjaWRlIGlmIHdlIGNhbiBzZW5kIHRoZSBhbm5vdW5jZSByZXF1ZXN0CisgICAgICAgIC8vIGRpcmVjdGx5IG9yIG5vdC4gRm9yIHRoaXMsIHdlIG5lZWQgYSB2YWxpZCwgbm9uLWV4cGlyZWQKKyAgICAgICAgLy8gY29ubmVjdGlvbiBJRC4KKyAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbkV4cGlyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgIGlmIChuZXcgRGF0ZSgpLmJlZm9yZSh0aGlzLmNvbm5lY3Rpb25FeHBpcmF0aW9uKSkgeworICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5BTk5PVU5DRV9SRVFVRVNUOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkFubm91bmNlIGNvbm5lY3Rpb24gSUQgZXhwaXJlZCwgIiArCisgICAgICAgICAgICAgICAgICAgICJyZWNvbm5lY3Rpbmcgd2l0aCB0cmFja2VyLi4uIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgIGNhc2UgQ09OTkVDVF9SRVFVRVNUOgorICAgICAgICAgICAgdGhpcy5zZW5kKFVEUENvbm5lY3RSZXF1ZXN0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAuY3JhZnQodGhpcy50cmFuc2FjdGlvbklkKS5nZXREYXRhKCkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYWNrZXJDb25uZWN0UmVzcG9uc2UoCisgICAgICAgICAgICAgICAgICAgICAgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlKHRoaXMucmVjdihhdHRlbXB0cykpKTsKKyAgICAgICAgICAgICAgYXR0ZW1wdHMgPSAtMTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gc3RlKSB7CisgICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0aGUgdGltZW91dCBhbmQgcmV0cnkgd2l0aCBhCisgICAgICAgICAgICAgIC8vIGxvbmdlciB0aW1lb3V0LCB1bmxlc3MgYW5ub3VuY2Ugc3RvcCB3YXMKKyAgICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBleGl0IHJpZ2h0CisgICAgICAgICAgICAgIC8vIGF3YXkuCisgICAgICAgICAgICAgIGlmIChzdG9wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQU5OT1VOQ0VfUkVRVUVTVDoKKyAgICAgICAgICAgIGZvciAoUGVlciBwZWVyIDogcGVlcnMpIHsKKyAgICAgICAgICAgICAgdGhpcy5zZW5kKHRoaXMuYnVpbGRBbm5vdW5jZVJlcXVlc3QoZXZlbnQsIHRvcnJlbnQsIHBlZXIpLmdldERhdGEoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJhY2tlckFubm91bmNlUmVzcG9uc2UoCisgICAgICAgICAgICAgICAgICAgICAgVURQVHJhY2tlck1lc3NhZ2UuVURQVHJhY2tlclJlc3BvbnNlTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlKHRoaXMucmVjdihhdHRlbXB0cykpLCBpbmhpYml0RXZlbnRzLCB0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Ugc3VjY2VzZnVsbHkgY29tcGxldGVkIHRoaXMKKyAgICAgICAgICAgICAgLy8gYW5ub3VuY2UgZXhjaGFuZ2UgYW5kIGNhbiBzaW1wbHkgcmV0dXJuIHRvIGV4aXQgdGhlCisgICAgICAgICAgICAgIC8vIGxvb3AuCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gc3RlKSB7CisgICAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0aGUgdGltZW91dCBhbmQgcmV0cnkgd2l0aCBhCisgICAgICAgICAgICAgIC8vIGxvbmdlciB0aW1lb3V0LCB1bmxlc3MgYW5ub3VuY2Ugc3RvcCB3YXMKKyAgICAgICAgICAgICAgLy8gcmVxdWVzdGVkIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBleGl0IHJpZ2h0CisgICAgICAgICAgICAgIC8vIGF3YXkuCisgICAgICAgICAgICAgIGlmIChzdG9wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBhbm5vdW5jZSBzdGF0ZSEiKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBXaGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyB3YXMgcmVhY2hlZCwgdGhlIGFubm91bmNlCisgICAgICAvLyByZWFsbHkgdGltZWQtb3V0LiBXZSdsbCB0cnkgYWdhaW4gaW4gdGhlIG5leHQgYW5ub3VuY2UgbG9vcC4KKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiVGltZW91dCB3aGlsZSBhbm5vdW5jaW5nIiArCisgICAgICAgICAgICAgIHRoaXMuZm9ybWF0QW5ub3VuY2VFdmVudChldmVudCkgKyAiIHRvIHRyYWNrZXIhIik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIkVycm9yIHdoaWxlIGFubm91bmNpbmciICsKKyAgICAgICAgICAgICAgdGhpcy5mb3JtYXRBbm5vdW5jZUV2ZW50KGV2ZW50KSArCisgICAgICAgICAgICAgICIgdG8gdHJhY2tlcjogIiArIGlvZS5nZXRNZXNzYWdlKCksIGlvZSk7CisgICAgfSBjYXRjaCAoTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24gbXZlKSB7CisgICAgICB0aHJvdyBuZXcgQW5ub3VuY2VFeGNlcHRpb24oIlRyYWNrZXIgbWVzc2FnZSB2aW9sYXRlcyBleHBlY3RlZCAiICsKKyAgICAgICAgICAgICAgInByb3RvY29sICgiICsgbXZlLmdldE1lc3NhZ2UoKSArICIpIiwgbXZlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGFuZGxlcyB0aGUgdHJhY2tlciBhbm5vdW5jZSByZXNwb25zZSBtZXNzYWdlLgorICAgKgorICAgKiA8cD4KKyAgICogVmVyaWZpZXMgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSBwYXNzaW5nIGl0IG92ZXIgdG8KKyAgICoge0BsaW5rIEFubm91bmNlIygpfS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB0cmFja2VyIGluIHJlc3BvbnNlIHRvIHRoZQorICAgKiAgICAgICAgICAgICAgICBhbm5vdW5jZSByZXF1ZXN0LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVRyYWNrZXJBbm5vdW5jZVJlc3BvbnNlKFRyYWNrZXJNZXNzYWdlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5oaWJpdEV2ZW50cywgU3RyaW5nIGhleEluZm9IYXNoKSB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIHRoaXMudmFsaWRhdGVUcmFja2VyUmVzcG9uc2UobWVzc2FnZSk7CisgICAgc3VwZXIuaGFuZGxlVHJhY2tlckFubm91bmNlUmVzcG9uc2UobWVzc2FnZSwgaW5oaWJpdEV2ZW50cywgaGV4SW5mb0hhc2gpOworICB9CisKKyAgLyoqCisgICAqIENsb3NlIHRoaXMgYW5ub3VuY2UgY29ubmVjdGlvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICB0aGlzLnN0b3AgPSB0cnVlOworCisgICAgLy8gQ2xvc2UgdGhlIHNvY2tldCB0byBmb3JjZSBibG9ja2luZyBvcGVyYXRpb25zIHRvIHJldHVybi4KKyAgICBpZiAodGhpcy5zb2NrZXQgIT0gbnVsbCAmJiAhdGhpcy5zb2NrZXQuaXNDbG9zZWQoKSkgeworICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFVEUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UgYnVpbGRBbm5vdW5jZVJlcXVlc3QoCisgICAgICAgICAgZmluYWwgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQgZXZlbnQsIGZpbmFsIEFubm91bmNlYWJsZUluZm9ybWF0aW9uIHRvcnJlbnQsIGZpbmFsIFBlZXIgcGVlcikgeworICAgIHJldHVybiBVRFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLmNyYWZ0KAorICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgdG9ycmVudC5nZXRJbmZvSGFzaCgpLAorICAgICAgICAgICAgcGVlci5nZXRQZWVySWRBcnJheSgpLAorICAgICAgICAgICAgdG9ycmVudC5nZXREb3dubG9hZGVkKCksCisgICAgICAgICAgICB0b3JyZW50LmdldFVwbG9hZGVkKCksCisgICAgICAgICAgICB0b3JyZW50LmdldExlZnQoKSwKKyAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgcGVlci5nZXRBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuREVGQVVMVF9OVU1fV0FOVCwKKyAgICAgICAgICAgIHBlZXIuZ2V0UG9ydCgpKTsKKyAgfQorCisgIC8qKgorICAgKiBWYWxpZGF0ZXMgYW4gaW5jb21pbmcgdHJhY2tlciBtZXNzYWdlLgorICAgKgorICAgKiA8cD4KKyAgICogVmVyaWZpZXMgdGhhdCB0aGUgbWVzc2FnZSBpcyBub3QgYW4gZXJyb3IgbWVzc2FnZSAodGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBlcnJvciBtZXNzYWdlIGlmIGl0IGlzKSBhbmQgdGhhdCB0aGUgdHJhbnNhY3Rpb24gSUQgbWF0Y2hlcyB0aGUKKyAgICogY3VycmVudCBvbmUuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGluY29taW5nIHRyYWNrZXIgbWVzc2FnZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRyYWNrZXJSZXNwb25zZShUcmFja2VyTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICAgIHRocm93cyBBbm5vdW5jZUV4Y2VwdGlvbiB7CisgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvck1lc3NhZ2UpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigoKEVycm9yTWVzc2FnZSkgbWVzc2FnZSkuZ2V0UmVhc29uKCkpOworICAgIH0KKworICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgVURQVHJhY2tlck1lc3NhZ2UgJiYKKyAgICAgICAgICAgICgoKFVEUFRyYWNrZXJNZXNzYWdlKSBtZXNzYWdlKS5nZXRUcmFuc2FjdGlvbklkKCkgIT0gdGhpcy50cmFuc2FjdGlvbklkKSkgeworICAgICAgdGhyb3cgbmV3IEFubm91bmNlRXhjZXB0aW9uKCJJbnZhbGlkIHRyYW5zYWN0aW9uIElEISIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBIYW5kbGVzIHRoZSB0cmFja2VyIGNvbm5lY3QgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgdHJhY2tlciBpbiByZXNwb25zZSB0byB0aGUKKyAgICogICAgICAgICAgICAgICAgY29ubmVjdGlvbiByZXF1ZXN0LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyYWNrZXJDb25uZWN0UmVzcG9uc2UoVHJhY2tlck1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgICB0aHJvd3MgQW5ub3VuY2VFeGNlcHRpb24geworICAgIHRoaXMudmFsaWRhdGVUcmFja2VyUmVzcG9uc2UobWVzc2FnZSk7CisKKyAgICBpZiAoIShtZXNzYWdlIGluc3RhbmNlb2YgQ29ubmVjdGlvblJlc3BvbnNlTWVzc2FnZSkpIHsKKyAgICAgIHRocm93IG5ldyBBbm5vdW5jZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB0cmFja2VyIG1lc3NhZ2UgdHlwZSAiICsKKyAgICAgICAgICAgICAgbWVzc2FnZS5nZXRUeXBlKCkubmFtZSgpICsgIiEiKTsKKyAgICB9CisKKyAgICBVRFBDb25uZWN0UmVzcG9uc2VNZXNzYWdlIGNvbm5lY3RSZXNwb25zZSA9CisgICAgICAgICAgICAoVURQQ29ubmVjdFJlc3BvbnNlTWVzc2FnZSkgbWVzc2FnZTsKKworICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdFJlc3BvbnNlLmdldENvbm5lY3Rpb25JZCgpOworICAgIENhbGVuZGFyIG5vdyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgbm93LmFkZChDYWxlbmRhci5NSU5VVEUsIDEpOworICAgIHRoaXMuY29ubmVjdGlvbkV4cGlyYXRpb24gPSBub3cuZ2V0VGltZSgpOworICB9CisKKyAgLyoqCisgICAqIFNlbmQgYSBVRFAgcGFja2V0IHRvIHRoZSB0cmFja2VyLgorICAgKgorICAgKiBAcGFyYW0gZGF0YSBUaGUge0BsaW5rIEJ5dGVCdWZmZXJ9IHRvIHNlbmQgaW4gYSBkYXRhZ3JhbSBwYWNrZXQgdG8gdGhlCisgICAqICAgICAgICAgICAgIHRyYWNrZXIuCisgICAqLworICBwcml2YXRlIHZvaWQgc2VuZChCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICB0cnkgeworICAgICAgdGhpcy5zb2NrZXQuc2VuZChuZXcgRGF0YWdyYW1QYWNrZXQoCisgICAgICAgICAgICAgIGRhdGEuYXJyYXkoKSwKKyAgICAgICAgICAgICAgZGF0YS5jYXBhY2l0eSgpLAorICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJFcnJvciBzZW5kaW5nIGRhdGFncmFtIHBhY2tldCB0byB0cmFja2VyIGF0IHt9OiB7fS4iLCB0aGlzLmFkZHJlc3MsIGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWNlaXZlIGEgVURQIHBhY2tldCBmcm9tIHRoZSB0cmFja2VyLgorICAgKgorICAgKiBAcGFyYW0gYXR0ZW1wdCBUaGUgYXR0ZW1wdCBudW1iZXIsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0aW1lb3V0IGZvciB0aGUKKyAgICogICAgICAgICAgICAgICAgcmVjZWl2ZSBvcGVyYXRpb24uCisgICAqIEByZXR1biBSZXR1cm5zIGEge0BsaW5rIEJ5dGVCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHBhY2tldCBkYXRhLgorICAgKi8KKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJlY3YoaW50IGF0dGVtcHQpCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTb2NrZXRFeGNlcHRpb24sIFNvY2tldFRpbWVvdXRFeGNlcHRpb24geworICAgIGludCB0aW1lb3V0ID0gVURQX0JBU0VfVElNRU9VVF9TRUNPTkRTICogKGludCkgTWF0aC5wb3coMiwgYXR0ZW1wdCk7CisgICAgbG9nZ2VyLnRyYWNlKCJTZXR0aW5nIHJlY2VpdmUgdGltZW91dCB0byB7fXMgZm9yIGF0dGVtcHQge30uLi4iLAorICAgICAgICAgICAgdGltZW91dCwgYXR0ZW1wdCk7CisgICAgdGhpcy5zb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQgKiAxMDAwKTsKKworICAgIHRyeSB7CisgICAgICBEYXRhZ3JhbVBhY2tldCBwID0gbmV3IERhdGFncmFtUGFja2V0KAorICAgICAgICAgICAgICBuZXcgYnl0ZVtVRFBfUEFDS0VUX0xFTkdUSF0sCisgICAgICAgICAgICAgIFVEUF9QQUNLRVRfTEVOR1RIKTsKKyAgICAgIHRoaXMuc29ja2V0LnJlY2VpdmUocCk7CisgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKHAuZ2V0RGF0YSgpLCAwLCBwLmdldExlbmd0aCgpKTsKKyAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHN0ZSkgeworICAgICAgdGhyb3cgc3RlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0NvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0NvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWVlOGIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QZWVyc1N0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQubmV0d29yay5OZXdDb25uZWN0aW9uQWxsb3dlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgc3RhdGljIGNvbS50dXJuLnR0b3JyZW50LkNvbnN0YW50cy5ERUZBVUxUX01BWF9DT05ORUNUSU9OX0NPVU5UOworCisvKioKKyAqIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzIGZpeGVkIGNvdW50IG9mIG9wZW4gY29ubmVjdGlvbiBzaW11bHRhbmVvdXNseQorICovCisKKy8v6ZmQ5Yi25ZCM5pe25bu656uL6L+e5o6l55qE5pWw6YePCitwdWJsaWMgY2xhc3MgQ291bnRMaW1pdENvbm5lY3Rpb25BbGxvd2VyIGltcGxlbWVudHMgTmV3Q29ubmVjdGlvbkFsbG93ZXIgeworCisgIHByaXZhdGUgZmluYWwgUGVlcnNTdG9yYWdlIG15UGVlcnNTdG9yYWdlOworCisgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBteU1heENvbm5lY3Rpb25Db3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgcHVibGljIENvdW50TGltaXRDb25uZWN0aW9uQWxsb3dlcihQZWVyc1N0b3JhZ2UgcGVlcnNTdG9yYWdlKSB7CisgICAgdGhpcy5teVBlZXJzU3RvcmFnZSA9IHBlZXJzU3RvcmFnZTsKKyAgICBteU1heENvbm5lY3Rpb25Db3VudC5zZXQoREVGQVVMVF9NQVhfQ09OTkVDVElPTl9DT1VOVCk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE15TWF4Q29ubmVjdGlvbkNvdW50KGludCBuZXdNYXhDb3VudCkgeworICAgIG15TWF4Q29ubmVjdGlvbkNvdW50LnNldChuZXdNYXhDb3VudCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNOZXdDb25uZWN0aW9uQWxsb3dlZCgpIHsKKyAgICByZXR1cm4gbXlQZWVyc1N0b3JhZ2UuZ2V0U2hhcmluZ1BlZXJzKCkuc2l6ZSgpIDwgbXlNYXhDb25uZWN0aW9uQ291bnQuZ2V0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9EYXRhUHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvRGF0YVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTY0NWEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvRGF0YVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworCitwdWJsaWMgaW50ZXJmYWNlIERhdGFQcm9jZXNzb3IgeworCisgIC8qKgorICAgKiB0aGUgbWV0aG9kIG11c3QgcmVhZCBkYXRhIGZyb20gY2hhbm5lbCBhbmQgcHJvY2VzcyBpdAorICAgKgorICAgKiBAcGFyYW0gc29ja2V0Q2hhbm5lbCBzcGVjaWZpZWQgc29ja2V0IGNoYW5uZWwgd2l0aCBkYXRhCisgICAqIEByZXR1cm4gZGF0YSBwcm9jZXNzb3Igd2hpY2ggbXVzdCBwcm9jZXNzIG5leHQgZGF0YQorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIERhdGFQcm9jZXNzb3IgcHJvY2Vzc0FuZEdldE5leHQoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiB0aGUgbWV0aG9kIG11c3QgaGFuZGxlIGVycm9yIGFuZCBjb3JyZWN0bHkgcmVsZWFzZSByZXNvdXJjZXMKKyAgICoKKyAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgc3BlY2lmaWVkIGNoYW5uZWwKKyAgICogQHBhcmFtIGUgICAgICAgICAgICAgc3BlY2lmaWVkIGV4Y2VwdGlvbgorICAgKiBAcmV0dXJuIGRhdGEgcHJvY2Vzc29yIHdoaWNoIG11c3QgcHJvY2VzcyBuZXh0IGVycm9yLiBDYW4gYmUgbnVsbAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICovCisgIERhdGFQcm9jZXNzb3IgaGFuZGxlRXJyb3IoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0RhdGFQcm9jZXNzb3JVdGlsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvRGF0YVByb2Nlc3NvclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E2Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0RhdGFQcm9jZXNzb3JVdGlsLmphdmEKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKKworcHVibGljIGZpbmFsIGNsYXNzIERhdGFQcm9jZXNzb3JVdGlsIHsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VDaGFubmVsSWZPcGVuKExvZ2dlciBsb2dnZXIsIEJ5dGVDaGFubmVsIGNoYW5uZWwpIHsKKyAgICBpZiAoY2hhbm5lbC5pc09wZW4oKSkgeworICAgICAgbG9nZ2VyLnRyYWNlKCJjbG9zZSBjaGFubmVsIHt9IiwgY2hhbm5lbCk7CisgICAgICB0cnkgeworICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExvZ2dlclV0aWxzLmVycm9yQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgInVuYWJsZSB0byBjbG9zZSBjaGFubmVsIHt9IiwgY2hhbm5lbCwgZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlUmVjZWl2ZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9IYW5kc2hha2VSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZmViNzkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlUmVjZWl2ZXIuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5IYW5kc2hha2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkxvYWRlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNoYXJlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyVUlEOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgSGFuZHNoYWtlUmVjZWl2ZXIgaW1wbGVtZW50cyBEYXRhUHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhhbmRzaGFrZVJlY2VpdmVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworICBwcml2YXRlIGZpbmFsIFN0cmluZyBteUhvc3RBZGRyZXNzOworICBwcml2YXRlIGZpbmFsIGludCBteVBvcnQ7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBteUlzT3V0Z29pbmdDb25uZWN0aW9uOworICBwcml2YXRlIEJ5dGVCdWZmZXIgbWVzc2FnZUJ5dGVzOworICBwcml2YXRlIGludCBwc3RyTGVuZ3RoOworCisgIEhhbmRzaGFrZVJlY2VpdmVyKENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc091dGdvaW5nTGlzdGVuZXIpIHsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICAgIG15SG9zdEFkZHJlc3MgPSBob3N0QWRkcmVzczsKKyAgICBteVBvcnQgPSBwb3J0OworICAgIHRoaXMucHN0ckxlbmd0aCA9IC0xOworICAgIHRoaXMubXlJc091dGdvaW5nQ29ubmVjdGlvbiA9IGlzT3V0Z29pbmdMaXN0ZW5lcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YVByb2Nlc3NvciBwcm9jZXNzQW5kR2V0TmV4dChCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgaWYgKHBzdHJMZW5ndGggPT0gLTEpIHsKKyAgICAgIEJ5dGVCdWZmZXIgbGVuID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKTsKKyAgICAgIGludCByZWFkQnl0ZXMgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWRCeXRlcyA9IHNvY2tldENoYW5uZWwucmVhZChsZW4pOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgfQorICAgICAgaWYgKHJlYWRCeXRlcyA9PSAtMSkgeworICAgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgICB9CisgICAgICBpZiAocmVhZEJ5dGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisgICAgICBsZW4ucmV3aW5kKCk7CisgICAgICBieXRlIHBzdHJMZW4gPSBsZW4uZ2V0KCk7CisgICAgICB0aGlzLnBzdHJMZW5ndGggPSBwc3RyTGVuOworICAgICAgbWVzc2FnZUJ5dGVzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0aGlzLnBzdHJMZW5ndGggKyBIYW5kc2hha2UuQkFTRV9IQU5EU0hBS0VfTEVOR1RIKTsKKyAgICAgIG1lc3NhZ2VCeXRlcy5wdXQocHN0ckxlbik7CisgICAgfQorICAgIGludCByZWFkQnl0ZXMgPSAtMTsKKyAgICB0cnkgeworICAgICAgcmVhZEJ5dGVzID0gc29ja2V0Q2hhbm5lbC5yZWFkKG1lc3NhZ2VCeXRlcyk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmFibGUgdG8gcmVhZCBkYXRhIGZyb20ge30iLCBzb2NrZXRDaGFubmVsLCBlKTsKKyAgICB9CisgICAgaWYgKHJlYWRCeXRlcyA9PSAtMSkgeworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93blByb2Nlc3NvcigpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKyAgICBpZiAobWVzc2FnZUJ5dGVzLnJlbWFpbmluZygpICE9IDApIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICBIYW5kc2hha2UgaHMgPSBwYXJzZUhhbmRzaGFrZShzb2NrZXRDaGFubmVsLnRvU3RyaW5nKCkpOworCisgICAgaWYgKGhzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisKKyAgICBmaW5hbCBMb2FkZWRUb3JyZW50IGFubm91bmNlYWJsZVRvcnJlbnQgPSBteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkuZ2V0TG9hZGVkVG9ycmVudChocy5nZXRIZXhJbmZvSGFzaCgpKTsKKworICAgIGlmIChhbm5vdW5jZWFibGVUb3JyZW50ID09IG51bGwpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiQW5ub3VuY2VhYmxlIHRvcnJlbnQge30gaXMgbm90IGZvdW5kIGluIHN0b3JhZ2UiLCBocy5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisKKyAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQ7CisgICAgdHJ5IHsKKyAgICAgIHRvcnJlbnQgPSBteUNvbnRleHQuZ2V0VG9ycmVudExvYWRlcigpLmxvYWRUb3JyZW50KGFubm91bmNlYWJsZVRvcnJlbnQpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duUHJvY2Vzc29yKCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybldpdGhNZXNzYWdlQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgImNhbm5vdCBsb2FkIHRvcnJlbnQge30iLCBocy5nZXRIZXhJbmZvSGFzaCgpLCBlKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisKKyAgICBsb2dnZXIudHJhY2UoImdvdCBoYW5kc2hha2Uge30gZnJvbSB7fSIsIEFycmF5cy50b1N0cmluZyhtZXNzYWdlQnl0ZXMuYXJyYXkoKSksIHNvY2tldENoYW5uZWwpOworCisgICAgU3RyaW5nIGNsaWVudFR5cGVWZXJzaW9uID0gbmV3IFN0cmluZyhBcnJheXMuY29weU9mKGhzLmdldFBlZXJJZCgpLCA4KSk7CisgICAgU3RyaW5nIGNsaWVudFR5cGUgPSBjbGllbnRUeXBlVmVyc2lvbi5zdWJzdHJpbmcoMSwgMyk7CisgICAgaW50IGNsaWVudFZlcnNpb24gPSAwOworICAgIHRyeSB7CisgICAgICBjbGllbnRWZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChjbGllbnRUeXBlVmVyc2lvbi5zdWJzdHJpbmcoMywgNykpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7fQorICAgIGZpbmFsIFNoYXJpbmdQZWVyIHNoYXJpbmdQZWVyID0KKyAgICAgICAgICAgIG15Q29udGV4dC5jcmVhdGVTaGFyaW5nUGVlcihteUhvc3RBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBteVBvcnQsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIud3JhcChocy5nZXRQZWVySWQoKSksCisgICAgICAgICAgICAgICAgICAgIHRvcnJlbnQsCisgICAgICAgICAgICAgICAgICAgIHNvY2tldENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFZlcnNpb24pOworICAgIFBlZXJVSUQgcGVlclVJRCA9IG5ldyBQZWVyVUlEKHNoYXJpbmdQZWVyLmdldEFkZHJlc3MoKSwgaHMuZ2V0SGV4SW5mb0hhc2goKSk7CisKKyAgICBTaGFyaW5nUGVlciBvbGQgPSBteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCkucHV0SWZBYnNlbnQocGVlclVJRCwgc2hhcmluZ1BlZXIpOworICAgIGlmIChvbGQgIT0gbnVsbCkgeworICAgICAgbG9nZ2VyLmRlYnVnKCJBbHJlYWR5IGNvbm5lY3RlZCB0byBvbGQgcGVlciB7fSwgY2xvc2UgY3VycmVudCBjb25uZWN0aW9uIHdpdGgge30iLCBvbGQsIHNoYXJpbmdQZWVyKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgICB9CisKKyAgICAvLyBJZiBJIGFtIG5vdCBhIGxlZWNoZXIKKyAgICBpZiAoIW15SXNPdXRnb2luZ0Nvbm5lY3Rpb24pIHsKKyAgICAgIGxvZ2dlci50cmFjZSgic2VuZCBoYW5kc2hha2UgdG8ge30iLCBzb2NrZXRDaGFubmVsKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIEhhbmRzaGFrZSBjcmFmdCA9IEhhbmRzaGFrZS5jcmFmdChocy5nZXRJbmZvSGFzaCgpLCBteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCkuZ2V0U2VsZigpLmdldFBlZXJJZEFycmF5KCkpOworICAgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKGNyYWZ0LmdldERhdGEoKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiZXJyb3IgaW4gc2VuZGluZyBoYW5kc2hha2UgdG8ge30iLCBzb2NrZXRDaGFubmVsLCBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IocGVlclVJRCwgbXlDb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsb2dnZXIuZGVidWcoInNldHVwIG5ldyBjb25uZWN0aW9uIHdpdGgge30iLCBzaGFyaW5nUGVlcik7CisKKyAgICB0cnkgeworICAgICAgbXlDb250ZXh0LmdldEV4ZWN1dG9yKCkuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgc2hhcmluZ1BlZXIub25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKTsKKyAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ1bmhhbmRsZWQgZXhjZXB0aW9uIHt9IGluIGV4ZWN1dG9yIHRhc2sgKG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKSIsIGUudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHRvcnJlbnQuYWRkQ29ubmVjdGVkUGVlcihzaGFyaW5nUGVlcik7CisgICAgfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ0YXNrICdvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCcgc3VibWl0IGlzIGZhaWxlZC4gUmVhc29uOiB7fSIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKHBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBXb3JraW5nUmVjZWl2ZXIocGVlclVJRCwgbXlDb250ZXh0KTsKKyAgfQorCisgIHByaXZhdGUgSGFuZHNoYWtlIHBhcnNlSGFuZHNoYWtlKFN0cmluZyBzb2NrZXRDaGFubmVsRm9yTG9nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBtZXNzYWdlQnl0ZXMucmV3aW5kKCk7CisgICAgICByZXR1cm4gSGFuZHNoYWtlLnBhcnNlKG1lc3NhZ2VCeXRlcywgcHN0ckxlbmd0aCk7CisgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmluZm8oImluY29ycmVjdCBoYW5kc2hha2UgbWVzc2FnZSBmcm9tICIgKyBzb2NrZXRDaGFubmVsRm9yTG9nLCBlKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgaGFuZGxlRXJyb3IoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTaHV0ZG93blByb2Nlc3NvcigpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlU2VuZGVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0MGVmYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9IYW5kc2hha2VTZW5kZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbnRleHQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkhhbmRzaGFrZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEhhc2g7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIEhhbmRzaGFrZVNlbmRlciBpbXBsZW1lbnRzIERhdGFQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSGFuZHNoYWtlU2VuZGVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFRvcnJlbnRIYXNoIG15VG9ycmVudEhhc2g7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15UmVtb3RlUGVlcklwOworICBwcml2YXRlIGZpbmFsIGludCBteVJlbW90ZVBlZXJQb3J0OworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworCisgIHB1YmxpYyBIYW5kc2hha2VTZW5kZXIoVG9ycmVudEhhc2ggdG9ycmVudEhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW90ZVBlZXJJcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlUGVlclBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB7CisgICAgbXlUb3JyZW50SGFzaCA9IHRvcnJlbnRIYXNoOworICAgIG15UmVtb3RlUGVlcklwID0gcmVtb3RlUGVlcklwOworICAgIG15UmVtb3RlUGVlclBvcnQgPSByZW1vdGVQZWVyUG9ydDsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIHByb2Nlc3NBbmRHZXROZXh0KEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBQZWVyIHNlbGYgPSBteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCkuZ2V0U2VsZigpOworICAgIEhhbmRzaGFrZSBoYW5kc2hha2UgPSBIYW5kc2hha2UuY3JhZnQobXlUb3JyZW50SGFzaC5nZXRJbmZvSGFzaCgpLCBzZWxmLmdldFBlZXJJZEFycmF5KCkpOworICAgIGlmIChoYW5kc2hha2UgPT0gbnVsbCkgeworICAgICAgbG9nZ2VyLndhcm4oImNhbiBub3QgY3JhZnQgaGFuZHNoYWtlIG1lc3NhZ2UuIFNlbGYgcGVlciBpZCBpcyB7fSwgdG9ycmVudCBoYXNoIGlzIHt9IiwKKyAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHNlbGYuZ2V0UGVlcklkQXJyYXkoKSksCisgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhteVRvcnJlbnRIYXNoLmdldEluZm9IYXNoKCkpKTsKKyAgICAgIHJldHVybiBuZXcgU2h1dGRvd25Qcm9jZXNzb3IoKTsKKyAgICB9CisgICAgQnl0ZUJ1ZmZlciBtZXNzYWdlVG9TZW5kID0gQnl0ZUJ1ZmZlci53cmFwKGhhbmRzaGFrZS5nZXREYXRhKCkuYXJyYXkoKSk7CisgICAgbG9nZ2VyLnRyYWNlKCJ0cnkgc2VuZCBoYW5kc2hha2Uge30gdG8ge30iLCBoYW5kc2hha2UsIHNvY2tldENoYW5uZWwpOworICAgIHdoaWxlIChtZXNzYWdlVG9TZW5kLmhhc1JlbWFpbmluZygpKSB7CisgICAgICBzb2NrZXRDaGFubmVsLndyaXRlKG1lc3NhZ2VUb1NlbmQpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEhhbmRzaGFrZVJlY2VpdmVyKAorICAgICAgICAgICAgbXlDb250ZXh0LAorICAgICAgICAgICAgbXlSZW1vdGVQZWVySXAsCisgICAgICAgICAgICBteVJlbW90ZVBlZXJQb3J0LAorICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgaGFuZGxlRXJyb3IoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTaHV0ZG93blByb2Nlc3NvcigpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvT3V0Z29pbmdDb25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9PdXRnb2luZ0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2Q0YzYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvT3V0Z29pbmdDb25uZWN0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbnRleHQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRIYXNoOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkxpc3RlbmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCitwdWJsaWMgY2xhc3MgT3V0Z29pbmdDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgeworCisgIHByaXZhdGUgdm9sYXRpbGUgRGF0YVByb2Nlc3NvciBteU5leHQ7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudEhhc2ggdG9ycmVudEhhc2g7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15UmVtb3RlUGVlcklwOworICBwcml2YXRlIGZpbmFsIGludCBteVJlbW90ZVBlZXJQb3J0OworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworCisgIHB1YmxpYyBPdXRnb2luZ0Nvbm5lY3Rpb25MaXN0ZW5lcihDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JyZW50SGFzaCB0b3JyZW50SGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdGVQZWVySXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtb3RlUGVlclBvcnQpIHsKKyAgICB0aGlzLnRvcnJlbnRIYXNoID0gdG9ycmVudEhhc2g7CisgICAgbXlSZW1vdGVQZWVySXAgPSByZW1vdGVQZWVySXA7CisgICAgbXlSZW1vdGVQZWVyUG9ydCA9IHJlbW90ZVBlZXJQb3J0OworICAgIG15TmV4dCA9IG5ldyBTaHV0ZG93blByb2Nlc3NvcigpOworICAgIG15Q29udGV4dCA9IGNvbnRleHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25OZXdEYXRhQXZhaWxhYmxlKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLm15TmV4dCA9IHRoaXMubXlOZXh0LnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBIYW5kc2hha2VTZW5kZXIgaGFuZHNoYWtlU2VuZGVyID0gbmV3IEhhbmRzaGFrZVNlbmRlcigKKyAgICAgICAgICAgIHRvcnJlbnRIYXNoLAorICAgICAgICAgICAgbXlSZW1vdGVQZWVySXAsCisgICAgICAgICAgICBteVJlbW90ZVBlZXJQb3J0LAorICAgICAgICAgICAgbXlDb250ZXh0KTsKKyAgICB0aGlzLm15TmV4dCA9IGhhbmRzaGFrZVNlbmRlci5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkVycm9yKFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMubXlOZXh0LmhhbmRsZUVycm9yKHNvY2tldENoYW5uZWwsIGV4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1NodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3Nvci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1NodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjM2NzYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQubmV0d29yazsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5Db250ZXh0OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QZWVyc1N0b3JhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXJVSUQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworCitwdWJsaWMgY2xhc3MgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yIGltcGxlbWVudHMgRGF0YVByb2Nlc3NvciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgUGVlclVJRCBteVBlZXJVSUQ7CisgIHByaXZhdGUgZmluYWwgQ29udGV4dCBteUNvbnRleHQ7CisKKyAgcHVibGljIFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihQZWVyVUlEIHBlZXJJZCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgbXlQZWVyVUlEID0gcGVlcklkOworICAgIG15Q29udGV4dCA9IGNvbnRleHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgcHJvY2Vzc0FuZEdldE5leHQoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBEYXRhUHJvY2Vzc29yVXRpbC5jbG9zZUNoYW5uZWxJZk9wZW4obG9nZ2VyLCBzb2NrZXRDaGFubmVsKTsKKyAgICBsb2dnZXIudHJhY2UoInRyeSByZW1vdmUgYW5kIHVuYmluZCBwZWVyLiBQZWVyIFVJRCAtIHt9IiwgbXlQZWVyVUlEKTsKKyAgICByZW1vdmVQZWVyKCk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVtb3ZlUGVlcigpIHsKKyAgICBQZWVyc1N0b3JhZ2UgcGVlcnNTdG9yYWdlID0gbXlDb250ZXh0LmdldFBlZXJzU3RvcmFnZSgpOworICAgIFNoYXJpbmdQZWVyIHJlbW92ZWRQZWVyID0gcGVlcnNTdG9yYWdlLnJlbW92ZVNoYXJpbmdQZWVyKG15UGVlclVJRCk7CisgICAgaWYgKHJlbW92ZWRQZWVyID09IG51bGwpIHsKKyAgICAgIGxvZ2dlci5pbmZvKCJ0cnkgdG8gc2h1dGRvd24gcGVlciB3aXRoIGlkIHt9LCBidXQgaXQgaXMgbm90IGZvdW5kIGluIHN0b3JhZ2UiLCBteVBlZXJVSUQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZW1vdmVkUGVlci51bmJpbmQodHJ1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgaGFuZGxlRXJyb3IoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCwgVGhyb3dhYmxlIGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU2h1dGRvd25Qcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TaHV0ZG93blByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmE4ODMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvU2h1dGRvd25Qcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworCitwdWJsaWMgY2xhc3MgU2h1dGRvd25Qcm9jZXNzb3IgaW1wbGVtZW50cyBEYXRhUHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNodXRkb3duUHJvY2Vzc29yLmNsYXNzKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhdGFQcm9jZXNzb3IgcHJvY2Vzc0FuZEdldE5leHQoQnl0ZUNoYW5uZWwgc29ja2V0Q2hhbm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBEYXRhUHJvY2Vzc29yVXRpbC5jbG9zZUNoYW5uZWxJZk9wZW4obG9nZ2VyLCBzb2NrZXRDaGFubmVsKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGF0YVByb2Nlc3NvciBoYW5kbGVFcnJvcihCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsLCBUaHJvd2FibGUgZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TdGF0ZUNoYW5uZWxMaXN0ZW5lci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1N0YXRlQ2hhbm5lbExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlNjZmMQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9TdGF0ZUNoYW5uZWxMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuQ29udGV4dDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKKworcHVibGljIGNsYXNzIFN0YXRlQ2hhbm5lbExpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIHsKKworICBwcml2YXRlIHZvbGF0aWxlIERhdGFQcm9jZXNzb3IgbXlOZXh0OworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworCisgIHB1YmxpYyBTdGF0ZUNoYW5uZWxMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICBteUNvbnRleHQgPSBjb250ZXh0OworICAgIG15TmV4dCA9IG5ldyBTaHV0ZG93blByb2Nlc3NvcigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uTmV3RGF0YUF2YWlsYWJsZShTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teU5leHQgPSB0aGlzLm15TmV4dC5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teU5leHQgPSBuZXcgSGFuZHNoYWtlUmVjZWl2ZXIoCisgICAgICAgICAgICBteUNvbnRleHQsCisgICAgICAgICAgICBzb2NrZXRDaGFubmVsLnNvY2tldCgpLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSwKKyAgICAgICAgICAgIHNvY2tldENoYW5uZWwuc29ja2V0KCkuZ2V0UG9ydCgpLAorICAgICAgICAgICAgZmFsc2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU29ja2V0Q2hhbm5lbCBzb2NrZXRDaGFubmVsLCBUaHJvd2FibGUgZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5teU5leHQgPSB0aGlzLm15TmV4dC5oYW5kbGVFcnJvcihzb2NrZXRDaGFubmVsLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9Xb3JraW5nUmVjZWl2ZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvbmV0d29yay9Xb3JraW5nUmVjZWl2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ2ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL1dvcmtpbmdSZWNlaXZlci5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5uZXR3b3JrOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LkNvbnRleHQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlNoYXJlZFRvcnJlbnQ7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyVUlEOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuUGVlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmpldGJyYWlucy5hbm5vdGF0aW9ucy5Ob3ROdWxsOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBXb3JraW5nUmVjZWl2ZXIgaW1wbGVtZW50cyBEYXRhUHJvY2Vzc29yIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFdvcmtpbmdSZWNlaXZlci5jbGFzcyk7CisgIC8vMTYgYnl0ZXMgaXMgc3VmZmljaWVudCBmb3IgYWxsIHRvcnJlbnRzIG1lc3NhZ2VzIGV4Y2VwdCBiaXRmaWVsZCBhbmQgcGllY2UuCisgIC8vU28gcGllY2UgYW5kIGJpdGZpZWxkIGhhdmUgZHluYW1pYyBzaXplIGJlY2F1c2UgYnl0ZWJ1ZmZlciBmb3IgdGhpcyBtZXNzYWdlcyB3aWxsIGJlIGFsbG9jYXRlZCBhZnRlciBnZXQgbWVzc2FnZSBsZW5ndGgKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRl9CVUZGRVJfU0laRSA9IDE2OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX01FU1NBR0VfU0laRSA9IDIgKiAxMDI0ICogMTAyNDsKKworICBwcml2YXRlIGZpbmFsIFBlZXJVSUQgbXlQZWVyVUlEOworICBwcml2YXRlIGZpbmFsIENvbnRleHQgbXlDb250ZXh0OworICBATm90TnVsbAorICBwcml2YXRlIEJ5dGVCdWZmZXIgbWVzc2FnZUJ5dGVzOworICBwcml2YXRlIGludCBwc3RyTGVuZ3RoOworCisgIFdvcmtpbmdSZWNlaXZlcihQZWVyVUlEIHBlZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQpIHsKKyAgICBteVBlZXJVSUQgPSBwZWVySWQ7CisgICAgbXlDb250ZXh0ID0gY29udGV4dDsKKworICAgIHRoaXMubWVzc2FnZUJ5dGVzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShERUZfQlVGRkVSX1NJWkUpOworICAgIHRoaXMucHN0ckxlbmd0aCA9IC0xOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIHByb2Nlc3NBbmRHZXROZXh0KEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbG9nZ2VyLnRyYWNlKCJyZWNlaXZlZCBkYXRhIGZyb20gY2hhbm5lbCIsIHNvY2tldENoYW5uZWwpOworICAgIGlmIChwc3RyTGVuZ3RoID09IC0xKSB7CisgICAgICBtZXNzYWdlQnl0ZXMubGltaXQoUGVlck1lc3NhZ2UuTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSk7CisgICAgICBmaW5hbCBpbnQgcmVhZDsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWQgPSBzb2NrZXRDaGFubmVsLnJlYWQobWVzc2FnZUJ5dGVzKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy9Tb21lIGNsaWVudHMgY2xvc2UgY29ubmVjdGlvbiBzbyB0aGF0IGphdmEgdGhyb3dzIElPRXhjZXB0aW9uICJBbiBleGlzdGluZyBjb25uZWN0aW9uIHdhcyBmb3JjaWJseSBjbG9zZWQgYnkgdGhlIHJlbW90ZSBob3N0IgorICAgICAgICBsb2dnZXIuZGVidWcoInVuYWJsZSB0byByZWFkIGRhdGEgZnJvbSBjaGFubmVsICIgKyBzb2NrZXRDaGFubmVsLCBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgICAgfQorICAgICAgaWYgKHJlYWQgPCAwKSB7CisgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbm5lbCB7fSBpcyBjbG9zZWQgYnkgb3RoZXIgcGVlciIsIHNvY2tldENoYW5uZWwpOworICAgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgICB9CisgICAgICBpZiAobWVzc2FnZUJ5dGVzLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgdGhpcy5wc3RyTGVuZ3RoID0gbWVzc2FnZUJ5dGVzLmdldEludCgwKTsKKyAgICAgIGxvZ2dlci50cmFjZSgicmVhZCBvZiBtZXNzYWdlIGxlbmd0aCBmaW5pc2hlZCwgTWVzc2FnZSBsZW5ndGggaXMge30iLCB0aGlzLnBzdHJMZW5ndGgpOworCisgICAgICBpZiAodGhpcy5wc3RyTGVuZ3RoID4gTUFYX01FU1NBR0VfU0laRSkgeworICAgICAgICBsb2dnZXIud2FybigiUHJvcG9zZWQgbGltaXQgb2Yge30gaXMgbGFyZ2VyIHRoYW4gbWF4IG1lc3NhZ2Ugc2l6ZSB7fSIsCisgICAgICAgICAgICAgICAgUGVlck1lc3NhZ2UuTUVTU0FHRV9MRU5HVEhfRklFTERfU0laRSArIHRoaXMucHN0ckxlbmd0aCwgTUFYX01FU1NBR0VfU0laRSk7CisgICAgICAgIGxvZ2dlci53YXJuKCJjdXJyZW50IGJ5dGVzIGluIGJ1ZmZlciBpcyB7fSIsIEFycmF5cy50b1N0cmluZyhtZXNzYWdlQnl0ZXMuYXJyYXkoKSkpOworICAgICAgICBsb2dnZXIud2FybigiQ2xvc2UgY29ubmVjdGlvbiB3aXRoIHBlZXIge30iLCBteVBlZXJVSUQpOworICAgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKFBlZXJNZXNzYWdlLk1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyB0aGlzLnBzdHJMZW5ndGggPiBtZXNzYWdlQnl0ZXMuY2FwYWNpdHkoKSkgeworICAgICAgQnl0ZUJ1ZmZlciBvbGQgPSBtZXNzYWdlQnl0ZXM7CisgICAgICBvbGQucmV3aW5kKCk7CisgICAgICBtZXNzYWdlQnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKFBlZXJNZXNzYWdlLk1FU1NBR0VfTEVOR1RIX0ZJRUxEX1NJWkUgKyB0aGlzLnBzdHJMZW5ndGgpOworICAgICAgbWVzc2FnZUJ5dGVzLnB1dChvbGQpOworICAgIH0KKworICAgIG1lc3NhZ2VCeXRlcy5saW1pdChQZWVyTWVzc2FnZS5NRVNTQUdFX0xFTkdUSF9GSUVMRF9TSVpFICsgdGhpcy5wc3RyTGVuZ3RoKTsKKworICAgIGxvZ2dlci50cmFjZSgidHJ5IHJlYWQgZGF0YSBmcm9tIHt9Iiwgc29ja2V0Q2hhbm5lbCk7CisgICAgaW50IHJlYWRCeXRlczsKKyAgICB0cnkgeworICAgICAgcmVhZEJ5dGVzID0gc29ja2V0Q2hhbm5lbC5yZWFkKG1lc3NhZ2VCeXRlcyk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKyAgICBpZiAocmVhZEJ5dGVzIDwgMCkgeworICAgICAgbG9nZ2VyLmRlYnVnKCJjaGFubmVsIHt9IGlzIGNsb3NlZCBieSBvdGhlciBwZWVyIiwgc29ja2V0Q2hhbm5lbCk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorICAgIGlmIChtZXNzYWdlQnl0ZXMuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgIGxvZ2dlci50cmFjZSgiYnVmZmVyIGlzIG5vdCBmdWxsLCBjb250aW51ZSByZWFkaW5nLi4uIik7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgbG9nZ2VyLnRyYWNlKCJmaW5pc2hlZCByZWFkIGRhdGEgZnJvbSB7fSIsIHNvY2tldENoYW5uZWwpOworCisgICAgbWVzc2FnZUJ5dGVzLnJld2luZCgpOworICAgIHRoaXMucHN0ckxlbmd0aCA9IC0xOworCisgICAgZmluYWwgU2hhcmluZ1BlZXIgcGVlciA9IG15Q29udGV4dC5nZXRQZWVyc1N0b3JhZ2UoKS5nZXRTaGFyaW5nUGVlcihteVBlZXJVSUQpOworCisgICAgZmluYWwgU3RyaW5nIGhleEluZm9IYXNoID0gcGVlci5nZXRIZXhJbmZvSGFzaCgpOworICAgIFNoYXJlZFRvcnJlbnQgdG9ycmVudCA9IG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKS5nZXRUb3JyZW50KGhleEluZm9IYXNoKTsKKyAgICBpZiAodG9ycmVudCA9PSBudWxsIHx8ICFteUNvbnRleHQuZ2V0VG9ycmVudHNTdG9yYWdlKCkuaGFzVG9ycmVudChoZXhJbmZvSGFzaCkpIHsKKyAgICAgIGxvZ2dlci5kZWJ1ZygidG9ycmVudCB3aXRoIGhhc2gge30gZm9yIHBlZXIge30gZG9lc24ndCBmb3VuZCBpbiBzdG9yYWdlLiBNYXliZSBzb21lYm9keSBkZWxldGVzIGl0IG1hbnVhbGx5IiwgaGV4SW5mb0hhc2gsIHBlZXIpOworICAgICAgcmV0dXJuIG5ldyBTaHV0ZG93bkFuZFJlbW92ZVBlZXJQcm9jZXNzb3IobXlQZWVyVUlELCBteUNvbnRleHQpLnByb2Nlc3NBbmRHZXROZXh0KHNvY2tldENoYW5uZWwpOworICAgIH0KKworICAgIGxvZ2dlci50cmFjZSgidHJ5IHBhcnNlIG1lc3NhZ2UgZnJvbSB7fS4gVG9ycmVudCB7fSIsIHBlZXIsIHRvcnJlbnQpOworICAgIEJ5dGVCdWZmZXIgYnVmZmVyQ29weSA9IEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKG1lc3NhZ2VCeXRlcy5hcnJheSgpLCBtZXNzYWdlQnl0ZXMubGltaXQoKSkpOworCisgICAgdGhpcy5tZXNzYWdlQnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKERFRl9CVUZGRVJfU0laRSk7CisgICAgZmluYWwgUGVlck1lc3NhZ2UgbWVzc2FnZTsKKworICAgIHRyeSB7CisgICAgICBtZXNzYWdlID0gUGVlck1lc3NhZ2UucGFyc2UoYnVmZmVyQ29weSwgdG9ycmVudCk7CisgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJpbmNvcnJlY3QgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgZnJvbSBwZWVyIHt9IiwgcGVlciwgZSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorCisgICAgbG9nZ2VyLnRyYWNlKCJnZXQgbWVzc2FnZSB7fSBmcm9tIHt9IiwgbWVzc2FnZSwgc29ja2V0Q2hhbm5lbCk7CisKKyAgICB0cnkgeworICAgICAgbXlDb250ZXh0LmdldEV4ZWN1dG9yKCkuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBmaW5hbCBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgZmluYWwgU3RyaW5nIG9sZE5hbWUgPSBjdXJyZW50VGhyZWFkLmdldE5hbWUoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgY3VycmVudFRocmVhZC5zZXROYW1lKG9sZE5hbWUgKyAiIGhhbmRsZSBtZXNzYWdlIGZvciB0b3JyZW50ICIgKyBteVBlZXJVSUQuZ2V0VG9ycmVudEhhc2goKSArICIgcGVlcjogIiArIHBlZXIuZ2V0SG9zdElkZW50aWZpZXIoKSk7CisgICAgICAgICAgICBwZWVyLmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAidW5oYW5kbGVkIGV4Y2VwdGlvbiB7fSBpbiBleGVjdXRvciB0YXNrIChoYW5kbGVNZXNzYWdlKSIsIGUudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGN1cnJlbnRUaHJlYWQuc2V0TmFtZShvbGROYW1lKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgTG9nZ2VyVXRpbHMud2FybkFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJ0YXNrIHN1Ym1pdCBpcyBmYWlsZWQuIFJlYXNvbjoge30iLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICByZXR1cm4gbmV3IFNodXRkb3duQW5kUmVtb3ZlUGVlclByb2Nlc3NvcihteVBlZXJVSUQsIG15Q29udGV4dCkucHJvY2Vzc0FuZEdldE5leHQoc29ja2V0Q2hhbm5lbCk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXRhUHJvY2Vzc29yIGhhbmRsZUVycm9yKEJ5dGVDaGFubmVsIHNvY2tldENoYW5uZWwsIFRocm93YWJsZSBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgU2h1dGRvd25BbmRSZW1vdmVQZWVyUHJvY2Vzc29yKG15UGVlclVJRCwgbXlDb250ZXh0KS5wcm9jZXNzQW5kR2V0TmV4dChzb2NrZXRDaGFubmVsKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL01lc3NhZ2VMaXN0ZW5lci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL01lc3NhZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGNhMzMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvTWVzc2FnZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5QZWVyTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisKKy8qKgorICogRXZlbnRMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCB3YW50IHRvIHJlY2VpdmUgaW5jb21pbmcgbWVzc2FnZXMKKyAqIGZyb20gcGVlcnMuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisKKyAgdm9pZCBoYW5kbGVNZXNzYWdlKFBlZXJNZXNzYWdlIG1zZyk7Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvUGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9QZWVyQWN0aXZpdHlMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmU4ODkKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvUGVlckFjdGl2aXR5TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCisvKioKKyAqIEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgd2FudCB0byBoYW5kbGUgcGVlciBhY3Rpdml0eQorICogZXZlbnRzIGxpa2UgcGllY2UgYXZhaWxhYmlsaXR5LCBvciBwaWVjZSBjb21wbGV0aW9uIGV2ZW50cywgYW5kIG1vcmUuCisgKgorICogQGF1dGhvciBtcGV0YXp6b25pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGVlckFjdGl2aXR5TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKworICAvKioKKyAgICogUGVlciBjaG9rZWQgaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGEgcGVlciBjaG9rZWQgYW5kIG5vdyByZWZ1c2VzIHRvIHNlbmQgZGF0YSB0bworICAgKiB1cy4gVGhpcyBtZWFucyB3ZSBzaG91bGQgbm90IHRyeSB0byByZXF1ZXN0IG9yIGV4cGVjdCBhbnl0aGluZyBmcm9tIGl0CisgICAqIHVudGlsIGl0IGJlY29tZXMgcmVhZHkgYWdhaW4uCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHBlZXIgdGhhdCBjaG9rZWQuCisgICAqLworICB2b2lkIGhhbmRsZVBlZXJDaG9rZWQoU2hhcmluZ1BlZXIgcGVlcik7CisKKyAgLyoqCisgICAqIFBlZXIgcmVhZHkgaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGEgcGVlciBub3RpZmllZCB0aGF0IGl0IGlzIG5vIGxvbmdlciBjaG9rZWQuCisgICAqIFRoaXMgbWVhbnMgd2UgY2FuIHNlbmQgcGllY2UgYmxvY2sgcmVxdWVzdHMgdG8gaXQgYW5kIHN0YXJ0IGRvd25sb2FkaW5nLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyIFRoZSBwZWVyIHRoYXQgYmVjYW1lIHJlYWR5LgorICAgKi8KKyAgdm9pZCBoYW5kbGVQZWVyUmVhZHkoU2hhcmluZ1BlZXIgcGVlcik7CisKKyAgLyoqCisgICAqIFBpZWNlIGF2YWlsYWJpbGl0eSBoYW5kbGVyLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBoYW5kbGVyIGlzIGZpcmVkIHdoZW4gYW4gdXBkYXRlIGluIHBpZWNlIGF2YWlsYWJpbGl0eSBpcyByZWNlaXZlZAorICAgKiBmcm9tIGEgcGVlcidzIEhBVkUgbWVzc2FnZS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGVlciAgVGhlIHBlZXIgd2UgZ290IHRoZSB1cGRhdGUgZnJvbS4KKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSB0aGF0IGJlY2FtZSBhdmFpbGFibGUgZnJvbSB0aGlzIHBlZXIuCisgICAqLworICB2b2lkIGhhbmRsZVBpZWNlQXZhaWxhYmlsaXR5KFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKTsKKworICAvKioKKyAgICogQml0IGZpZWxkIGF2YWlsYWJpbGl0eSBoYW5kbGVyLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBoYW5kbGVyIGlzIGZpcmVkIHdoZW4gYW4gdXBkYXRlIGluIHBpZWNlIGF2YWlsYWJpbGl0eSBpcyByZWNlaXZlZAorICAgKiBmcm9tIGEgcGVlcidzIEJJVEZJRUxEIG1lc3NhZ2UuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgICAgICAgICAgICBUaGUgcGVlciB3ZSBnb3QgdGhlIHVwZGF0ZSBmcm9tLgorICAgKiBAcGFyYW0gYXZhaWxhYmxlUGllY2VzIFRoZSBwaWVjZXMgYXZhaWxhYmlsaXR5IGJpdCBmaWVsZCBvZiB0aGUgcGVlci4KKyAgICovCisgIHZvaWQgaGFuZGxlQml0ZmllbGRBdmFpbGFiaWxpdHkoU2hhcmluZ1BlZXIgcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzKTsKKworICAvKioKKyAgICogUGllY2UgdXBsb2FkIGNvbXBsZXRpb24gaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGEgcGllY2UgaGFzIGJlZW4gdXBsb2FkZWQgZW50aXJlbHkgdG8gYSBwZWVyLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyICBUaGUgcGVlciB0aGUgcGllY2Ugd2FzIHNlbnQgdG8uCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgaW4gcXVlc3Rpb24uCisgICAqLworICB2b2lkIGhhbmRsZVBpZWNlU2VudChTaGFyaW5nUGVlciBwZWVyLCBQaWVjZSBwaWVjZSk7CisKKyAgLyoqCisgICAqIFBpZWNlIGRvd25sb2FkIGNvbXBsZXRpb24gaGFuZGxlci4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgaGFuZGxlciBpcyBmaXJlZCB3aGVuIGEgcGllY2UgaGFzIGJlZW4gZG93bmxvYWRlZCBlbnRpcmVseSBhbmQgdGhlCisgICAqIHBpZWNlIGRhdGEgaGFzIGJlZW4gcmV2YWxpZGF0ZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIDxiPk5vdGU6PC9iPiB0aGUgcGllY2UgbWF5IDxlbT5ub3Q8L2VtPiBiZSB2YWxpZCBhZnRlciBpdCBoYXMgYmVlbgorICAgKiBkb3dubG9hZGVkLCBpbiB3aGljaCBjYXNlIGFwcHJvcHJpYXRlIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gdG8KKyAgICogcmVkb3dubG9hZCB0aGUgcGllY2UuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgIFRoZSBwZWVyIHdlIGdvdCB0aGlzIHBpZWNlIGZyb20uCisgICAqIEBwYXJhbSBwaWVjZSBUaGUgcGllY2UgaW4gcXVlc3Rpb24uCisgICAqLworICB2b2lkIGhhbmRsZVBpZWNlQ29tcGxldGVkKFNoYXJpbmdQZWVyIHBlZXIsIFBpZWNlIHBpZWNlKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogUGVlciBkaXNjb25uZWN0aW9uIGhhbmRsZXIuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGhhbmRsZXIgaXMgZmlyZWQgd2hlbiBhIHBlZXIgZGlzY29ubmVjdHMsIG9yIGlzIGRpc2Nvbm5lY3RlZCBkdWUgdG8KKyAgICogcHJvdG9jb2wgdmlvbGF0aW9uLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSBwZWVyIFRoZSBwZWVyIHdlIGdvdCB0aGlzIHBpZWNlIGZyb20uCisgICAqLworICB2b2lkIGhhbmRsZVBlZXJEaXNjb25uZWN0ZWQoU2hhcmluZ1BlZXIgcGVlcik7CisKKyAgLyoqCisgICAqIEhhbmRsZXIgZm9yIElPRXhjZXB0aW9uIGR1cmluZyBwZWVyIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHBlZXIgVGhlIHBlZXIgd2hvc2UgYWN0aXZpdHkgdHJpZ2dlciB0aGUgZXhjZXB0aW9uLgorICAgKiBAcGFyYW0gaW9lICBUaGUgSU9FeGNlcHRpb24gb2JqZWN0LCBmb3IgcmVwb3J0aW5nLgorICAgKi8KKyAgdm9pZCBoYW5kbGVJT0V4Y2VwdGlvbihTaGFyaW5nUGVlciBwZWVyLCBJT0V4Y2VwdGlvbiBpb2UpOworCisKKyAgdm9pZCBoYW5kbGVOZXdQZWVyQ29ubmVjdGVkKFNoYXJpbmdQZWVyIHBlZXIpOworCisgIHZvaWQgYWZ0ZXJQZWVyUmVtb3ZlZChTaGFyaW5nUGVlciBwZWVyKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1JhdGUuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9SYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiODhmMwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9SYXRlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlcjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisKKy8qKgorICogQSBkYXRhIGV4Y2hhbmdlIHJhdGUgcmVwcmVzZW50YXRpb24uCisgKgorICogPHA+CisgKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBrZWVwIHRyYWNrLCBhbmQgY29tcGFyZSwgb2YgdGhlIGRhdGEgZXhjaGFuZ2UKKyAqIHJhdGUgKGVpdGhlciBkb3dubG9hZCBvciB1cGxvYWQpIHdpdGggYSBwZWVyLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCitwdWJsaWMgY2xhc3MgUmF0ZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8UmF0ZT4geworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxSYXRlPiBSQVRFX0NPTVBBUkFUT1IgPQorICAgICAgICAgIG5ldyBSYXRlQ29tcGFyYXRvcigpOworCisgIHByaXZhdGUgbG9uZyBieXRlcyA9IDA7CisgIHByaXZhdGUgbG9uZyByZXNldCA9IDA7CisgIHByaXZhdGUgbG9uZyBsYXN0ID0gMDsKKworICAvKioKKyAgICogQWRkIGEgYnl0ZSBjb3VudCB0byB0aGUgY3VycmVudCBtZWFzdXJlbWVudC4KKyAgICoKKyAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgZXhjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHJlc2V0LgorICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChsb25nIGNvdW50KSB7CisgICAgdGhpcy5ieXRlcyArPSBjb3VudDsKKyAgICBpZiAodGhpcy5yZXNldCA9PSAwKSB7CisgICAgICB0aGlzLnJlc2V0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorICAgIHRoaXMubGFzdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgY3VycmVudCByYXRlLgorICAgKgorICAgKiA8cD4KKyAgICogVGhlIGV4Y2hhbmdlIHJhdGUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBleGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKKyAgICogcmVzZXQgYW5kIHRoZSBsYXN0IGlucHV0LgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIGZsb2F0IGdldCgpIHsKKyAgICBpZiAodGhpcy5sYXN0IC0gdGhpcy5yZXNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy5ieXRlcyAvICgodGhpcy5sYXN0IC0gdGhpcy5yZXNldCkgLyAxMDAwLjBmKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXNldCB0aGUgbWVhc3VyZW1lbnQuCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7CisgICAgdGhpcy5ieXRlcyA9IDA7CisgICAgdGhpcy5yZXNldCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIHRoaXMubGFzdCA9IHRoaXMucmVzZXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oUmF0ZSBvdGhlcikgeworICAgIHJldHVybiBSQVRFX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvdGhlcik7CisgIH0KKworICAvKioKKyAgICogQSByYXRlIGNvbXBhcmF0b3IuCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29tcGFyYXRvciB0byBzb3J0IHBlZXJzIGJ5IGFuIGV4Y2hhbmdlIHJhdGUsCisgICAqIGNvbXBhcmluZyB0d28gcmF0ZXMgYW5kIHJldHVybmluZyBhbiBhc2NlbmRpbmcgb3JkZXJpbmcuCisgICAqIDwvcD4KKyAgICoKKyAgICogPHA+CisgICAqIDxiPk5vdGU6PC9iPiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBoZXJlIHRoYXQgd2UgZG9uJ3QgcmV0dXJuIDAsIHdoaWNoCisgICAqIHdvdWxkIHByb3ZpZGUgYW4gb3JkZXJpbmcgdGhhdCBpcyBpbmNvbnNpc3RlbnQgd2l0aAorICAgKiA8Y29kZT5lcXVhbHMoKTwvY29kZT4ncyBiZWhhdmlvciwgYW5kIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW9yCisgICAqIGZvciBzb3J0ZWQgY29sbGVjdGlvbnMgdXNpbmcgdGhpcyBjb21wYXJhdG9yLgorICAgKiA8L3A+CisgICAqCisgICAqIEBhdXRob3IgbXBldGF6em9uaQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmF0ZUNvbXBhcmF0b3IKKyAgICAgICAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3I8UmF0ZT4sIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjQ2MDIzMzAwMzYwMEw7CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byByYXRlcyB0b2dldGhlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGNvbXBhcmVzIGZsb2F0LCBidXQgd2UgZG9uJ3QgY2FyZSB0b28gbXVjaCBhYm91dAorICAgICAqIHJvdW5kaW5nIGVycm9ycy4gSXQncyBqdXN0IHRvIG9yZGVyIHBlZXJzIHNvIHN1cGVyLXN0cmljdCByYXRlIGJhc2VkCisgICAgICogb3JkZXIgaXMgbm90IHJlcXVpcmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhCisgICAgICogQHBhcmFtIGIKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoUmF0ZSBhLCBSYXRlIGIpIHsKKyAgICAgIGlmIChhLmdldCgpID4gYi5nZXQoKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1NoYXJpbmdQZWVyLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3BlZXIvU2hhcmluZ1BlZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2IzYjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1NoYXJpbmdQZWVyLmphdmEKQEAgLTAsMCArMSw4MDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGVlckluZm9ybWF0aW9uOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuU2hhcmVkVG9ycmVudDsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uTG9nZ2VyVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlBlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlBlZXJNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25NYW5hZ2VyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50Lm5ldHdvcmsuV3JpdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLldyaXRlVGFzazsKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKworLyoqCisgKiBBIHBlZXIgZXhjaGFuZ2luZyBvbiBhIHRvcnJlbnQgd2kgdGggdGhlIEJpdFRvcnJlbnQgY2xpZW50LgorICog5pWw5o2u5Lqk5o2iCisgKiA8cC8+CisgKiA8cD4KKyAqIEEgU2hhcmluZ1BlZXIgZXh0ZW5kcyB0aGUgYmFzZSBQZWVyIGNsYXNzIHdpdGggYWxsIHRoZSBkYXRhIGFuZCBsb2dpYyBuZWVkZWQKKyAqIGJ5IHRoZSBCaXRUb3JyZW50IGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIGEgcGVlciBleGNoYW5naW5nIG9uIHRoZSBzYW1lCisgKiB0b3JyZW50LgorICogPC9wPgorICogPHAvPgorICogPHA+CisgKiBQZWVycyBhcmUgZGVmaW5lZCBieSB0aGVpciBwZWVyIElELCBJUCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciwganVzdCBsaWtlCisgKiBiYXNlIHBlZXJzLiBQZWVycyB3ZSBleGNoYW5nZSB3aXRoIGFsc28gY29udGFpbiBmb3VyIGNydWNpYWwgYXR0cmlidXRlczoKKyAqIDwvcD4KKyAqIDxwLz4KKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5jaG9raW5nPC9jb2RlPiwgd2hpY2ggbWVhbnMgd2UgYXJlIGNob2tpbmcgdGhpcyBwZWVyIGFuZCB3ZSdyZQorICogbm90IHdpbGxpbmcgdG8gc2VuZCBoaW0gYW55dGhpbmcgZm9yIG5vdzs8L2xpPgorICogPGxpPjxjb2RlPmludGVyZXN0aW5nPC9jb2RlPiwgd2hpY2ggbWVhbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4gYSBwaWVjZQorICogdGhpcyBwZWVyIGhhczs8L2xpPgorICogPGxpPjxjb2RlPmNob2tlZDwvY29kZT4sIGlmIHRoaXMgcGVlciBpcyBjaG9raW5nIGFuZCB3b24ndCBzZW5kIHVzCisgKiBhbnl0aGluZyByaWdodCBub3c7PC9saT4KKyAqIDxsaT48Y29kZT5pbnRlcmVzdGVkPC9jb2RlPiwgaWYgdGhpcyBwZWVyIGlzIGludGVyZXN0ZWQgaW4gc29tZXRoaW5nIHdlCisgKiBoYXZlLjwvbGk+CisgKiA8L3VsPgorICogPHAvPgorICogPHA+CisgKiBQZWVycyBzdGFydCBjaG9rZWQgYW5kIHVuaW50ZXJlc3RlZC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIFNoYXJpbmdQZWVyIGV4dGVuZHMgUGVlciBpbXBsZW1lbnRzIE1lc3NhZ2VMaXN0ZW5lciwgUGVlckluZm9ybWF0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVG9ycmVudExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoYXJpbmdQZWVyLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIE9iamVjdCBhdmFpbGFibGVQaWVjZXNMb2NrOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY2hva2luZzsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGludGVyZXN0aW5nOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY2hva2VkOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaW50ZXJlc3RlZDsKKyAgcHJpdmF0ZSBmaW5hbCBTaGFyZWRUb3JyZW50IHRvcnJlbnQ7CisgIHByaXZhdGUgZmluYWwgQml0U2V0IGF2YWlsYWJsZVBpZWNlczsKKyAgcHJpdmF0ZSBCaXRTZXQgcG9vcmx5QXZhaWxhYmxlUGllY2VzOworICBwcml2YXRlIGZpbmFsIE1hcDxQaWVjZSwgSW50ZWdlcj4gbXlSZXF1ZXN0ZWRQaWVjZXM7CisKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGRvd25sb2FkaW5nOworCisgIHByaXZhdGUgZmluYWwgUmF0ZSBkb3dubG9hZDsKKyAgcHJpdmF0ZSBmaW5hbCBSYXRlIHVwbG9hZDsKKyAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGRvd25sb2FkZWRQaWVjZXNDb3VudDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlZXJBY3Rpdml0eUxpc3RlbmVyPiBsaXN0ZW5lcnM7CisKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVxdWVzdHNMb2NrOworCisgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBpc1N0b3BwZWQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQ2hhbm5lbCBzb2NrZXRDaGFubmVsOworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsaWVudElkZW50aWZpZXI7CisgIHByaXZhdGUgZmluYWwgaW50IGNsaWVudFZlcnNpb247CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBzaGFyaW5nIHBlZXIgb24gYSBnaXZlbiB0b3JyZW50LgorICAgKiAgQHBhcmFtIGlwICAgICAgVGhlIHBlZXIncyBJUCBhZGRyZXNzLgorICAgKiBAcGFyYW0gcG9ydCAgICBUaGUgcGVlcidzIHBvcnQuCisgICAqIEBwYXJhbSBwZWVySWQgIFRoZSBieXRlLWVuY29kZWQgcGVlciBJRC4KKyAgICogQHBhcmFtIHRvcnJlbnQgVGhlIHRvcnJlbnQgdGhpcyBwZWVyIGV4Y2hhbmdlcyB3aXRoIHVzIG9uLgorICAgKiBAcGFyYW0gY2xpZW50SWRlbnRpZmllcgorICAgKiBAcGFyYW0gY2xpZW50VmVyc2lvbgorICAgKi8KKyAgcHVibGljIFNoYXJpbmdQZWVyKFN0cmluZyBpcCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwZWVySWQsCisgICAgICAgICAgICAgICAgICAgICBTaGFyZWRUb3JyZW50IHRvcnJlbnQsCisgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgIFBlZXJBY3Rpdml0eUxpc3RlbmVyIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgIEJ5dGVDaGFubmVsIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50SWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRWZXJzaW9uKSB7CisgICAgc3VwZXIoaXAsIHBvcnQsIHBlZXJJZCk7CisKKyAgICB0aGlzLnRvcnJlbnQgPSB0b3JyZW50OworICAgIHRoaXMuY2xpZW50SWRlbnRpZmllciA9IGNsaWVudElkZW50aWZpZXI7CisgICAgdGhpcy5jbGllbnRWZXJzaW9uID0gY2xpZW50VmVyc2lvbjsKKyAgICB0aGlzLmxpc3RlbmVycyA9IEFycmF5cy5hc0xpc3QoY2xpZW50LCB0b3JyZW50KTsKKyAgICB0aGlzLmF2YWlsYWJsZVBpZWNlcyA9IG5ldyBCaXRTZXQodG9ycmVudC5nZXRQaWVjZUNvdW50KCkpOworICAgIHRoaXMucG9vcmx5QXZhaWxhYmxlUGllY2VzID0gbmV3IEJpdFNldCh0b3JyZW50LmdldFBpZWNlQ291bnQoKSk7CisKKyAgICB0aGlzLnJlcXVlc3RzTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICB0aGlzLnNvY2tldENoYW5uZWwgPSBjaGFubmVsOworICAgIHRoaXMuaXNTdG9wcGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICB0aGlzLm15UmVxdWVzdGVkUGllY2VzID0gbmV3IEhhc2hNYXA8UGllY2UsIEludGVnZXI+KCk7CisgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IGNvbm5lY3Rpb25NYW5hZ2VyOworICAgIHRoaXMuZG93bmxvYWQgPSBuZXcgUmF0ZSgpOworICAgIHRoaXMudXBsb2FkID0gbmV3IFJhdGUoKTsKKyAgICB0aGlzLnNldFRvcnJlbnRIYXNoKHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgdGhpcy5jaG9raW5nID0gdHJ1ZTsKKyAgICB0aGlzLmludGVyZXN0aW5nID0gZmFsc2U7CisgICAgdGhpcy5jaG9rZWQgPSB0cnVlOworICAgIHRoaXMuaW50ZXJlc3RlZCA9IGZhbHNlOworICAgIHRoaXMuZG93bmxvYWRpbmcgPSBmYWxzZTsKKyAgICB0aGlzLmRvd25sb2FkZWRQaWVjZXNDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgUmF0ZSBnZXRETFJhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMuZG93bmxvYWQ7CisgIH0KKworICBwdWJsaWMgUmF0ZSBnZXRVTFJhdGUoKSB7CisgICAgcmV0dXJuIHRoaXMudXBsb2FkOworICB9CisKKyAgLyoqCisgICAqIENob2tlIHRoaXMgcGVlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogV2UgZG9uJ3Qgd2FudCB0byB1cGxvYWQgdG8gdGhpcyBwZWVyIGFueW1vcmUsIHNvIG1hcmsgdGhhdCB3ZSdyZSBjaG9raW5nCisgICAqIGZyb20gdGhpcyBwZWVyLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgdm9pZCBjaG9rZSgpIHsKKyAgICBpZiAoIXRoaXMuY2hva2luZykgeworICAgICAgbG9nZ2VyLnRyYWNlKCJDaG9raW5nIHt9IiwgdGhpcyk7CisgICAgICB0aGlzLnNlbmQoUGVlck1lc3NhZ2UuQ2hva2VNZXNzYWdlLmNyYWZ0KCkpOworICAgICAgdGhpcy5jaG9raW5nID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRJZCgpIHsKKyAgICByZXR1cm4gZ2V0UGVlcklkQXJyYXkoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkZW50aWZpZXIoKSB7CisgICAgcmV0dXJuIGNsaWVudElkZW50aWZpZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRDbGllbnRWZXJzaW9uKCkgeworICAgIHJldHVybiBjbGllbnRWZXJzaW9uOworICB9CisKKyAgcHVibGljIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoKSB7CisgICAgZmlyZVBlZXJDb25uZWN0ZWQoKTsKKyAgICBCaXRTZXQgcGllY2VzID0gdGhpcy50b3JyZW50LmdldENvbXBsZXRlZFBpZWNlcygpOworICAgIGlmIChwaWVjZXMuY2FyZGluYWxpdHkoKSA+IDApIHsKKyAgICAgIHRoaXMuc2VuZChQZWVyTWVzc2FnZS5CaXRmaWVsZE1lc3NhZ2UuY3JhZnQocGllY2VzKSk7CisgICAgfQorICAgIHJlc2V0UmF0ZXMoKTsKKyAgfQorCisgIC8qKgorICAgKiBVbmNob2tlIHRoaXMgcGVlci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogTWFyayB0aGF0IHdlIGFyZSBubyBsb25nZXIgY2hva2luZyBmcm9tIHRoaXMgcGVlciBhbmQgY2FuIHJlc3VtZQorICAgKiB1cGxvYWRpbmcgdG8gaXQuCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyB2b2lkIHVuY2hva2UoKSB7CisgICAgbG9nZ2VyLnRyYWNlKCJVbmNob2tpbmcge30iLCB0aGlzKTsKKyAgICB0aGlzLnNlbmQoUGVlck1lc3NhZ2UuVW5jaG9rZU1lc3NhZ2UuY3JhZnQoKSk7CisgICAgdGhpcy5jaG9raW5nID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0Nob2tpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuY2hva2luZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGludGVyZXN0aW5nKCkgeworICAgIGlmICghdGhpcy5pbnRlcmVzdGluZykgeworICAgICAgbG9nZ2VyLnRyYWNlKCJUZWxsaW5nIHt9IHdlJ3JlIGludGVyZXN0ZWQuIiwgdGhpcyk7CisgICAgICB0aGlzLnNlbmQoUGVlck1lc3NhZ2UuSW50ZXJlc3RlZE1lc3NhZ2UuY3JhZnQoKSk7CisgICAgICB0aGlzLmludGVyZXN0aW5nID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBub3RJbnRlcmVzdGluZygpIHsKKyAgICBpZiAodGhpcy5pbnRlcmVzdGluZykgeworICAgICAgbG9nZ2VyLnRyYWNlKCJUZWxsaW5nIHt9IHdlJ3JlIG5vIGxvbmdlciBpbnRlcmVzdGVkLiIsIHRoaXMpOworICAgICAgdGhpcy5zZW5kKFBlZXJNZXNzYWdlLk5vdEludGVyZXN0ZWRNZXNzYWdlLmNyYWZ0KCkpOworICAgICAgdGhpcy5pbnRlcmVzdGluZyA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJlc3RpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuaW50ZXJlc3Rpbmc7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0Nob2tlZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jaG9rZWQ7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuaW50ZXJlc3RlZDsKKyAgfQorCisgIHB1YmxpYyBCaXRTZXQgZ2V0UG9vcmx5QXZhaWxhYmxlUGllY2VzKCkgeworICAgIHJldHVybiBwb29ybHlBdmFpbGFibGVQaWVjZXM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIHBpZWNlcyBmcm9tIHRoaXMgcGVlci4KKyAgICoKKyAgICogQHJldHVybiBBIGNsb25lIG9mIHRoZSBhdmFpbGFibGUgcGllY2VzIGJpdCBmaWVsZCBmcm9tIHRoaXMgcGVlci4KKyAgICovCisgIHB1YmxpYyBCaXRTZXQgZ2V0QXZhaWxhYmxlUGllY2VzKCkgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5hdmFpbGFibGVQaWVjZXNMb2NrKSB7CisgICAgICByZXR1cm4gKEJpdFNldCkgdGhpcy5hdmFpbGFibGVQaWVjZXMuY2xvbmUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBwaWVjZSwgaWYgYW55LgorICAgKi8KKyAgcHVibGljIFNldDxQaWVjZT4gZ2V0UmVxdWVzdGVkUGllY2VzKCkgeworICAgIHN5bmNocm9uaXplZCAocmVxdWVzdHNMb2NrKSB7CisgICAgICByZXR1cm4gbXlSZXF1ZXN0ZWRQaWVjZXMua2V5U2V0KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgcmVzZXRSYXRlcygpIHsKKyAgICB0aGlzLmRvd25sb2FkLnJlc2V0KCk7CisgICAgdGhpcy51cGxvYWQucmVzZXQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHBpZWNlRG93bmxvYWRlZCgpIHsKKyAgICBkb3dubG9hZGVkUGllY2VzQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgIH0KKworICBwdWJsaWMgaW50IGdldERvd25sb2FkZWRQaWVjZXNDb3VudCgpIHsKKyAgICByZXR1cm4gZG93bmxvYWRlZFBpZWNlc0NvdW50LmdldCgpOworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBwZWVyIGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHRocm91Z2ggYSBwZWVyIGV4Y2hhbmdlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuc29ja2V0Q2hhbm5lbC5pc09wZW4oKTsKKyAgfQorCisgIC8qKgorICAgKiBVbmJpbmQgYW5kIGRpc2Nvbm5lY3QgdGhpcyBwZWVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBUaGlzIHRlcm1pbmF0ZXMgdGhlIGV2ZW50dWFsbHkgcHJlc2VudCBhbmQvb3IgY29ubmVjdGVkIHBlZXIgZXhjaGFuZ2UKKyAgICogd2l0aCB0aGUgcGVlciBhbmQgZmlyZXMgdGhlIHBlZXIgZGlzY29ubmVjdGVkIGV2ZW50IHRvIGFueSBwZWVyIGFjdGl2aXR5CisgICAqIGxpc3RlbmVycyByZWdpc3RlcmVkIG9uIHRoaXMgcGVlci4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gZm9yY2UgRm9yY2UgdW5iaW5kIHdpdGhvdXQgc2VuZGluZyBjYW5jZWwgcmVxdWVzdHMuCisgICAqLworICBwdWJsaWMgdm9pZCB1bmJpbmQoYm9vbGVhbiBmb3JjZSkgeworICAgIGlmIChpc1N0b3BwZWQuZ2V0QW5kU2V0KHRydWUpKQorICAgICAgcmV0dXJuOworCisgICAgdHJ5IHsKKyAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLmNsb3NlQ2hhbm5lbChzb2NrZXRDaGFubmVsKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJjYW5ub3QgY2xvc2Ugc29ja2V0IGNoYW5uZWwuIFBlZXIge30iLCB0aGlzLCBlKTsKKyAgICB9CisKKyAgICB0aGlzLmZpcmVQZWVyRGlzY29ubmVjdGVkKCk7CisKKyAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RzTG9jaykgeworICAgICAgdGhpcy5kb3dubG9hZGluZyA9IG15UmVxdWVzdGVkUGllY2VzLnNpemUoKSA+IDA7CisgICAgICBteVJlcXVlc3RlZFBpZWNlcy5jbGVhcigpOworICAgIH0KKworICAgIHRoaXMuYWZ0ZXJQZWVyRGlzY29ubmVjdGVkKCk7CisgIH0KKworICAvKioKKyAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHBlZXIuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIERlbGl2ZXJ5IG9mIHRoZSBtZXNzYWdlIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgcGVlciBpcyBjb25uZWN0ZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgcmVtb3RlIHBlZXIgdGhyb3VnaCBvdXIgcGVlcgorICAgKiAgICAgICAgICAgICAgICBleGNoYW5nZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNlbmQoUGVlck1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgbG9nZ2VyLnRyYWNlKCJTZW5kaW5nIG1zZyB7fSB0byB7fSIsIG1lc3NhZ2UuZ2V0VHlwZSgpLCB0aGlzKTsKKyAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBtZXNzYWdlLmdldERhdGEoKTsKKyAgICAgIGRhdGEucmV3aW5kKCk7CisgICAgICBjb25uZWN0aW9uTWFuYWdlci5vZmZlcldyaXRlKG5ldyBXcml0ZVRhc2soc29ja2V0Q2hhbm5lbCwgZGF0YSwgbmV3IFdyaXRlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbldyaXRlRmFpbGVkKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgeworICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2UpOworICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24peworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIGUpOworICAgICAgICAgICAgdW5iaW5kKHRydWUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgbWVzc2FnZSwgZSk7CisgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Xcml0ZURvbmUoKSB7CisgICAgICAgIH0KKyAgICAgIH0pLCAxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9nZ2VyLnRyYWNlKCJBdHRlbXB0aW5nIHRvIHNlbmQgYSBtZXNzYWdlIHRvIG5vbi1jb25uZWN0ZWQgcGVlciB7fSEiLCB0aGlzKTsKKyAgICAgIHVuYmluZCh0cnVlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRG93bmxvYWQgdGhlIGdpdmVuIHBpZWNlIGZyb20gdGhpcyBwZWVyLgorICAgKiA8cC8+CisgICAqIDxwPgorICAgKiBTdGFydHMgYSBibG9jayByZXF1ZXN0IHF1ZXVlIGFuZCBwcmUtZmlsbCBpdCB3aXRoIE1BWF9QSVBFTElORURfUkVRVUVTVFMKKyAgICogYmxvY2sgcmVxdWVzdHMuCisgICAqIDwvcD4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogRnVydGhlciByZXF1ZXN0cyB3aWxsIGJlIGFkZGVkLCBvbmUgYnkgb25lLCBldmVyeSB0aW1lIGEgYmxvY2sgaXMKKyAgICogcmV0dXJuZWQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSBjaG9zZW4gdG8gYmUgZG93bmxvYWRlZCBmcm9tIHRoaXMgcGVlci4KKyAgICovCisgIHB1YmxpYyB2b2lkIGRvd25sb2FkUGllY2UoZmluYWwgUGllY2UgcGllY2UpCisgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgTGlzdDxQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZT4gdG9TZW5kID0gbmV3IEFycmF5TGlzdDxQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZT4oKTsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMucmVxdWVzdHNMb2NrKSB7CisgICAgICBpZiAobXlSZXF1ZXN0ZWRQaWVjZXMuY29udGFpbnNLZXkocGllY2UpKSB7CisgICAgICAgIC8vYWxyZWFkeSByZXF1ZXN0ZWQKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaW50IHJlcXVlc3RlZEJsb2Nrc0NvdW50ID0gMDsKKyAgICAgIGludCBsYXN0UmVxdWVzdGVkT2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChsYXN0UmVxdWVzdGVkT2Zmc2V0IDwgcGllY2Uuc2l6ZSgpKSB7CisgICAgICAgIFBlZXJNZXNzYWdlLlJlcXVlc3RNZXNzYWdlIHJlcXVlc3QgPSBQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZQorICAgICAgICAgICAgICAgIC5jcmFmdChwaWVjZS5nZXRJbmRleCgpLCBsYXN0UmVxdWVzdGVkT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oKGludCkgKHBpZWNlLnNpemUoKSAtIGxhc3RSZXF1ZXN0ZWRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZS5ERUZBVUxUX1JFUVVFU1RfU0laRSkpOworICAgICAgICB0b1NlbmQuYWRkKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0ZWRCbG9ja3NDb3VudCsrOworICAgICAgICBsYXN0UmVxdWVzdGVkT2Zmc2V0ID0gcmVxdWVzdC5nZXRMZW5ndGgoKSArIGxhc3RSZXF1ZXN0ZWRPZmZzZXQ7CisgICAgICB9CisgICAgICBteVJlcXVlc3RlZFBpZWNlcy5wdXQocGllY2UsIHJlcXVlc3RlZEJsb2Nrc0NvdW50KTsKKyAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBteVJlcXVlc3RlZFBpZWNlcy5zaXplKCkgPiAwOworICAgIH0KKyAgICBmb3IgKFBlZXJNZXNzYWdlLlJlcXVlc3RNZXNzYWdlIHJlcXVlc3RNZXNzYWdlIDogdG9TZW5kKSB7CisgICAgICB0aGlzLnNlbmQocmVxdWVzdE1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRG93bmxvYWRpbmcoKSB7CisgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRpbmc7CisgIH0KKworICAvKioKKyAgICogUmVtb3ZlIHRoZSBSRVFVRVNUIG1lc3NhZ2UgZnJvbSB0aGUgcmVxdWVzdCBwaXBlbGluZSBtYXRjaGluZyB0aGlzCisgICAqIFBJRUNFIG1lc3NhZ2UuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFVwb24gcmVjZXB0aW9uIG9mIGEgcGllY2UgYmxvY2sgd2l0aCBhIFBJRUNFIG1lc3NhZ2UsIHJlbW92ZSB0aGUKKyAgICogY29ycmVzcG9uZGluZyByZXF1ZXN0IGZyb20gdGhlIHBpcGVsaW5lIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgYmxvY2sKKyAgICogcmVxdWVzdHMuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBpZWNlIFRoZSBwaWVjZSBvZiBQSUVDRSBtZXNzYWdlIHJlY2VpdmVkLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZUJsb2NrUmVxdWVzdChmaW5hbCBQaWVjZSBwaWVjZSkgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5yZXF1ZXN0c0xvY2spIHsKKyAgICAgIEludGVnZXIgcmVxdWVzdGVkQmxvY2tzQ291bnQgPSBteVJlcXVlc3RlZFBpZWNlcy5nZXQocGllY2UpOworICAgICAgaWYgKHJlcXVlc3RlZEJsb2Nrc0NvdW50ID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKHJlcXVlc3RlZEJsb2Nrc0NvdW50IDw9IDEpIHsKKyAgICAgICAgLy9pdCdzIGxhc3QgYmxvY2sKKyAgICAgICAgbXlSZXF1ZXN0ZWRQaWVjZXMucmVtb3ZlKHBpZWNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG15UmVxdWVzdGVkUGllY2VzLnB1dChwaWVjZSwgcmVxdWVzdGVkQmxvY2tzQ291bnQgLSAxKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBteVJlcXVlc3RlZFBpZWNlcy5zaXplKCkgPiAwOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYW5jZWwgYWxsIHBlbmRpbmcgcmVxdWVzdHMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoaXMgcXVldWVzIENBTkNFTCBtZXNzYWdlcyBmb3IgYWxsIHRoZSByZXF1ZXN0cyBpbiB0aGUgcXVldWUsIGFuZAorICAgKiByZXR1cm5zIHRoZSBsaXN0IG9mIHJlcXVlc3RzIHRoYXQgd2VyZSBpbiB0aGUgcXVldWUuCisgICAqIDwvcD4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogSWYgbm8gcmVxdWVzdCBxdWV1ZSBleGlzdGVkLCBvciBpZiBpdCB3YXMgZW1wdHksIGFuIGVtcHR5IHNldCBvZiByZXF1ZXN0CisgICAqIG1lc3NhZ2VzIGlzIHJldHVybmVkLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgdm9pZCBjYW5jZWxQZW5kaW5nUmVxdWVzdHMoKSB7CisgICAgY2FuY2VsUGVuZGluZ1JlcXVlc3RzKG51bGwpOworICB9CisKKyAgcHVibGljIHZvaWQgY2FuY2VsUGVuZGluZ1JlcXVlc3RzKEBOdWxsYWJsZSBmaW5hbCBQaWVjZSBwaWVjZSkgeworICAgIHN5bmNocm9uaXplZCAodGhpcy5yZXF1ZXN0c0xvY2spIHsKKyAgICAgIGlmIChwaWVjZSAhPSBudWxsKSB7CisgICAgICAgIG15UmVxdWVzdGVkUGllY2VzLnJlbW92ZShwaWVjZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBteVJlcXVlc3RlZFBpZWNlcy5jbGVhcigpOworICAgICAgfQorICAgICAgdGhpcy5kb3dubG9hZGluZyA9IG15UmVxdWVzdGVkUGllY2VzLnNpemUoKSA+IDA7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRSZW1haW5pbmdSZXF1ZXN0ZWRQaWVjZXMoZmluYWwgUGllY2UgcGllY2UpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHRoaXMucmVxdWVzdHNMb2NrKSB7CisgICAgICBJbnRlZ2VyIHJlcXVlc3RlZEJsb2Nrc0NvdW50ID0gbXlSZXF1ZXN0ZWRQaWVjZXMuZ2V0KHBpZWNlKTsKKyAgICAgIGlmIChyZXF1ZXN0ZWRCbG9ja3NDb3VudCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgIHJldHVybiByZXF1ZXN0ZWRCbG9ja3NDb3VudDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGFuZGxlIGFuIGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGlzIHBlZXIuCisgICAqCisgICAqIEBwYXJhbSBtc2cgVGhlIGluY29taW5nLCBwYXJzZWQgbWVzc2FnZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKFBlZXJNZXNzYWdlIG1zZykgeworLy8gICAgbG9nZ2VyLnRyYWNlKCJSZWNlaXZlZCBtc2cge30gZnJvbSB7fSIsIG1zZy5nZXRUeXBlKCksIHRoaXMpOworICAgIGlmIChpc1N0b3BwZWQuZ2V0KCkpCisgICAgICByZXR1cm47CisgICAgaWYgKCF0b3JyZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgdG9ycmVudC5pbml0SWZOZWNlc3NhcnkodGhpcyk7CisgICAgfQorICAgIHN3aXRjaCAobXNnLmdldFR5cGUoKSkgeworICAgICAgY2FzZSBLRUVQX0FMSVZFOgorICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLCB3ZSdyZSBrZWVwaW5nIHRoZSBjb25uZWN0aW9uIG9wZW4gYW55d2F5cy4KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENIT0tFOgorICAgICAgICB0aGlzLmNob2tlZCA9IHRydWU7CisgICAgICAgIHRoaXMuZmlyZVBlZXJDaG9rZWQoKTsKKyAgICAgICAgdGhpcy5jYW5jZWxQZW5kaW5nUmVxdWVzdHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVOQ0hPS0U6CisgICAgICAgIHRoaXMuY2hva2VkID0gZmFsc2U7CisgICAgICAgIGxvZ2dlci50cmFjZSgiUGVlciB7fSBpcyBub3cgYWNjZXB0aW5nIHJlcXVlc3RzLiIsIHRoaXMpOworICAgICAgICB0aGlzLmZpcmVQZWVyUmVhZHkoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIElOVEVSRVNURUQ6CisgICAgICAgIHRoaXMuaW50ZXJlc3RlZCA9IHRydWU7CisgICAgICAgIGlmICh0aGlzLmNob2tpbmcpIHsKKyAgICAgICAgICB1bmNob2tlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE5PVF9JTlRFUkVTVEVEOgorICAgICAgICB0aGlzLmludGVyZXN0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFpbnRlcmVzdGluZykgeworICAgICAgICAgIHVuYmluZCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFWRToKKyAgICAgICAgLy8gUmVjb3JkIHRoaXMgcGVlciBoYXMgdGhlIGdpdmVuIHBpZWNlCisgICAgICAgIFBlZXJNZXNzYWdlLkhhdmVNZXNzYWdlIGhhdmUgPSAoUGVlck1lc3NhZ2UuSGF2ZU1lc3NhZ2UpIG1zZzsKKyAgICAgICAgUGllY2UgaGF2ZVBpZWNlID0gdGhpcy50b3JyZW50LmdldFBpZWNlKGhhdmUuZ2V0UGllY2VJbmRleCgpKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXZhaWxhYmxlUGllY2VzTG9jaykgeworICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzLnNldChoYXZlUGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJQZWVyIHt9IG5vdyBoYXMge30gW3t9L3t9XS4iLAorICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlUGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9ycmVudC5nZXRQaWVjZUNvdW50KCkKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5maXJlUGllY2VBdmFpbGFiaXR5KGhhdmVQaWVjZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCSVRGSUVMRDoKKyAgICAgICAgLy8gQXVnbWVudCB0aGUgaGFzUGllY2UgYml0IGZpZWxkIGZyb20gdGhpcyBCSVRGSUVMRCBtZXNzYWdlCisgICAgICAgIFBlZXJNZXNzYWdlLkJpdGZpZWxkTWVzc2FnZSBiaXRmaWVsZCA9CisgICAgICAgICAgICAgICAgKFBlZXJNZXNzYWdlLkJpdGZpZWxkTWVzc2FnZSkgbXNnOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5hdmFpbGFibGVQaWVjZXNMb2NrKSB7CisgICAgICAgICAgdGhpcy5hdmFpbGFibGVQaWVjZXMub3IoYml0ZmllbGQuZ2V0Qml0ZmllbGQoKSk7CisgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJSZWNvcmRlZCBiaXRmaWVsZCBmcm9tIHt9IHdpdGgge30gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWVjZXMocykgW3t9L3t9XS4iLAorICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRmaWVsZC5nZXRCaXRmaWVsZCgpLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzLmNhcmRpbmFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9ycmVudC5nZXRQaWVjZUNvdW50KCkKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5maXJlQml0ZmllbGRBdmFpbGFiaXR5KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVFVRVNUOgorICAgICAgICBQZWVyTWVzc2FnZS5SZXF1ZXN0TWVzc2FnZSByZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAoUGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2UpIG1zZzsKKyAgICAgICAgbG9nZ2VyLnRyYWNlKCJHb3QgcmVxdWVzdCBtZXNzYWdlIGZvciB7fSAoe30ge31Ae30pIGZyb20ge30iLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKFRvcnJlbnRVdGlscy5nZXRUb3JyZW50RmlsZU5hbWVzKHRvcnJlbnQpLnRvQXJyYXkoKSksCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQaWVjZSgpLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICB0aGlzCisgICAgICAgIH0pOworICAgICAgICBQaWVjZSBycCA9IHRoaXMudG9ycmVudC5nZXRQaWVjZShyZXF1ZXN0LmdldFBpZWNlKCkpOworCisgICAgICAgIC8vIElmIHdlIGFyZSBjaG9raW5nIGZyb20gdGhpcyBwZWVyIGFuZCBpdCBzdGlsbCBzZW5kcyB1cworICAgICAgICAvLyByZXF1ZXN0cywgaXQgaXMgYSB2aW9sYXRpb24gb2YgdGhlIEJpdFRvcnJlbnQgcHJvdG9jb2wuCisgICAgICAgIC8vIFNpbWlsYXJseSwgaWYgdGhlIHBlZXIgcmVxdWVzdHMgYSBwaWVjZSB3ZSBkb24ndCBoYXZlLCBpdAorICAgICAgICAvLyBpcyBhIHZpb2xhdGlvbiBvZiB0aGUgQml0VG9ycmVudCBwcm90b2NvbC4gSW4gdGhlc2UKKyAgICAgICAgLy8gc2l0dWF0aW9uLCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgIGlmICghcnAuaXNWYWxpZCgpKSB7CisgICAgICAgICAgbG9nZ2VyLndhcm4oIlBlZXIge30gdmlvbGF0ZWQgcHJvdG9jb2wsIHRlcm1pbmF0aW5nIGV4Y2hhbmdlOiAiICsgdGhpcy5pc0Nob2tpbmcoKSArICIgIiArIHJwLmlzVmFsaWQoKSwgdGhpcyk7CisgICAgICAgICAgdGhpcy51bmJpbmQodHJ1ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC5nZXRMZW5ndGgoKSA+CisgICAgICAgICAgICAgICAgUGVlck1lc3NhZ2UuUmVxdWVzdE1lc3NhZ2UuTUFYX1JFUVVFU1RfU0laRSkgeworICAgICAgICAgIGxvZ2dlci53YXJuKCJQZWVyIHt9IHJlcXVlc3RlZCBhIGJsb2NrIHRvbyBiaWcsIHRlcm1pbmF0aW5nIGV4Y2hhbmdlLiIsIHRoaXMpOworICAgICAgICAgIHRoaXMudW5iaW5kKHRydWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhZ3JlZSB0byBzZW5kIHRoZSByZXF1ZXN0ZWQgcGllY2UgYmxvY2sgdG8KKyAgICAgICAgLy8gdGhlIHJlbW90ZSBwZWVyLCBzbyBsZXQncyBxdWV1ZSBhIG1lc3NhZ2Ugd2l0aCB0aGF0IGJsb2NrCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlckZvck1lc3NhZ2UgPSBQZWVyTWVzc2FnZS5QaWVjZU1lc3NhZ2UuY3JlYXRlQnVmZmVyV2l0aEhlYWRlckZvck1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBpZWNlKCksIHJlcXVlc3QuZ2V0T2Zmc2V0KCksIHJlcXVlc3QuZ2V0TGVuZ3RoKCkpOworCisgICAgICAgICAgcnAucmVhZChyZXF1ZXN0LmdldE9mZnNldCgpLCByZXF1ZXN0LmdldExlbmd0aCgpLCBidWZmZXJGb3JNZXNzYWdlKTsKKworICAgICAgICAgIHRoaXMuc2VuZChQZWVyTWVzc2FnZS5QaWVjZU1lc3NhZ2UuY3JhZnQocmVxdWVzdC5nZXRQaWVjZSgpLAorICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRPZmZzZXQoKSwgYnVmZmVyRm9yTWVzc2FnZSkpOworICAgICAgICAgIHRoaXMudXBsb2FkLmFkZChyZXF1ZXN0LmdldExlbmd0aCgpKTsKKworICAgICAgICAgIGlmIChyZXF1ZXN0LmdldE9mZnNldCgpICsgcmVxdWVzdC5nZXRMZW5ndGgoKSA9PSBycC5zaXplKCkpIHsKKyAgICAgICAgICAgIHRoaXMuZmlyZVBpZWNlU2VudChycCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICBsb2dnZXIuZGVidWcoImVycm9yIiwgaW9lKTsKKyAgICAgICAgICB0aGlzLmZpcmVJT0V4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgc2VuZGluZyBwaWVjZSBibG9jayByZXF1ZXN0ISIsIGlvZSkpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBJRUNFOgorICAgICAgICAvLyBSZWNvcmQgdGhlIGluY29taW5nIHBpZWNlIGJsb2NrLgorCisgICAgICAgIC8vIFNob3VsZCB3ZSBrZWVwIHRyYWNrIG9mIHRoZSByZXF1ZXN0ZWQgcGllY2VzIGFuZCBhY3Qgd2hlbiB3ZQorICAgICAgICAvLyBnZXQgYSBwaWVjZSB3ZSBkaWRuJ3QgYXNrIGZvciwgb3Igc2hvdWxkIHdlIGp1c3Qgc3RheQorICAgICAgICAvLyBncmVlZHk/CisgICAgICAgIFBlZXJNZXNzYWdlLlBpZWNlTWVzc2FnZSBwaWVjZSA9IChQZWVyTWVzc2FnZS5QaWVjZU1lc3NhZ2UpIG1zZzsKKyAgICAgICAgUGllY2UgcCA9IHRoaXMudG9ycmVudC5nZXRQaWVjZShwaWVjZS5nZXRQaWVjZSgpKTsKKworICAgICAgICBsb2dnZXIudHJhY2UoIkdvdCBwaWVjZSAoe30ge31Ae30pIGZyb20ge30iLCBuZXcgT2JqZWN0W117CisgICAgICAgICAgICAgICAgcC5nZXRJbmRleCgpLAorICAgICAgICAgICAgICAgIHAuc2l6ZSgpLAorICAgICAgICAgICAgICAgIHBpZWNlLmdldE9mZnNldCgpLAorICAgICAgICAgICAgICAgIHRoaXMKKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5kb3dubG9hZC5hZGQocGllY2UuZ2V0QmxvY2soKS5jYXBhY2l0eSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIGJvb2xlYW4gaXNQaWVjZURvd25sb2FkZWQgPSBmYWxzZTsKKyAgICAgICAgICBzeW5jaHJvbml6ZWQgKHApIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyByZXF1ZXN0IGZyb20gdGhlIHJlcXVlc3QgcXVldWUgdG8KKyAgICAgICAgICAgIC8vICBtYWtlIHJvb20gZm9yIG5leHQgYmxvY2sgcmVxdWVzdHMuCisgICAgICAgICAgICB0aGlzLnJlbW92ZUJsb2NrUmVxdWVzdChwKTsKKyAgICAgICAgICAgIGlmIChwLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICB0aGlzLmNhbmNlbFBlbmRpbmdSZXF1ZXN0cyhwKTsKKyAgICAgICAgICAgICAgdGhpcy5maXJlUGVlclJlYWR5KCk7CisgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiRGlzY2FyZGluZyBibG9jayBmb3IgYWxyZWFkeSBjb21wbGV0ZWQgIiArIHApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vVE9ETyBhZGQgcHJvcGVyIGNhdGNoIGZvciBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgcC5yZWNvcmQocGllY2UuZ2V0QmxvY2soKSwgcGllY2UuZ2V0T2Zmc2V0KCkpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgYmxvY2sgb2Zmc2V0IGVxdWFscyB0aGUgcGllY2Ugc2l6ZSBhbmQgdGhlIGJsb2NrCisgICAgICAgICAgICAvLyBsZW5ndGggaXMgMCwgaXQgbWVhbnMgdGhlIHBpZWNlIGhhcyBiZWVuIGVudGlyZWx5CisgICAgICAgICAgICAvLyBkb3dubG9hZGVkLiBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgbm90aGluZyB0byBzYXZlLCBidXQKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCB2YWxpZGF0ZSB0aGUgcGllY2UuCisgICAgICAgICAgICBpZiAoZ2V0UmVtYWluaW5nUmVxdWVzdGVkUGllY2VzKHApID09IDApIHsKKyAgICAgICAgICAgICAgdGhpcy5maXJlUGllY2VDb21wbGV0ZWQocCk7CisgICAgICAgICAgICAgIGlzUGllY2VEb3dubG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlzUGllY2VEb3dubG9hZGVkKSB7CisgICAgICAgICAgICBmaXJlUGVlclJlYWR5KCk7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICBsb2dnZXIuZXJyb3IoaW9lLmdldE1lc3NhZ2UoKSwgaW9lKTsKKyAgICAgICAgICB0aGlzLmZpcmVJT0V4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgc3RvcmluZyByZWNlaXZlZCBwaWVjZSBibG9jayEiLCBpb2UpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FOQ0VMOgorICAgICAgICAvLyBObyBuZWVkIHRvIHN1cHBvcnQKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBlZXIgY2hva2VkIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSBwZWVyIHRoYXQgY2hvY2tlZC4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVQZWVyQ2hva2VkKCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGVlckNob2tlZCh0aGlzKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgcGVlciByZWFkeSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciB0aGF0IHVuY2hva2VkIG9yIGJlY2FtZSByZWFkeS4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVQZWVyUmVhZHkoKSB7CisgICAgZm9yIChQZWVyQWN0aXZpdHlMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lci5oYW5kbGVQZWVyUmVhZHkodGhpcyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBpZWNlIGF2YWlsYWJpbGl0eSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciAodGhpcyksIGFuZCB0aGUgcGllY2UgdGhhdCBiZWNhbWUgYXZhaWxhYmxlLgorICAgKiA8L3A+CisgICAqLworICBwcml2YXRlIHZvaWQgZmlyZVBpZWNlQXZhaWxhYml0eShQaWVjZSBwaWVjZSkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGllY2VBdmFpbGFiaWxpdHkodGhpcywgcGllY2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBiaXQgZmllbGQgYXZhaWxhYmlsaXR5IGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICogPHAvPgorICAgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHBlZXIgKHRoaXMpLCBhbmQgdGhlIGJpdCBmaWVsZCBvZiBhdmFpbGFibGUgcGllY2VzCisgICAqIGZyb20gdGhpcyBwZWVyLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVCaXRmaWVsZEF2YWlsYWJpdHkoKSB7CisgICAgZm9yIChQZWVyQWN0aXZpdHlMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lci5oYW5kbGVCaXRmaWVsZEF2YWlsYWJpbGl0eSh0aGlzLAorICAgICAgICAgICAgICB0aGlzLmdldEF2YWlsYWJsZVBpZWNlcygpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgcGllY2Ugc2VudCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciAodGhpcyksIGFuZCB0aGUgcGllY2UgbnVtYmVyIHRoYXQgd2FzCisgICAqIHNlbnQgdG8gdGhlIHBlZXIuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHBpZWNlIFRoZSBjb21wbGV0ZWQgcGllY2UuCisgICAqLworICBwcml2YXRlIHZvaWQgZmlyZVBpZWNlU2VudChQaWVjZSBwaWVjZSkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGllY2VTZW50KHRoaXMsIHBpZWNlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmlyZSB0aGUgcGllY2UgY29tcGxldGlvbiBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciAodGhpcyksIGFuZCB0aGUgcGllY2UgbnVtYmVyIHRoYXQgd2FzCisgICAqIGNvbXBsZXRlZC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gcGllY2UgVGhlIGNvbXBsZXRlZCBwaWVjZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBmaXJlUGllY2VDb21wbGV0ZWQoUGllY2UgcGllY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChQZWVyQWN0aXZpdHlMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lci5oYW5kbGVQaWVjZUNvbXBsZXRlZCh0aGlzLCBwaWVjZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIHBlZXIgZGlzY29ubmVjdGVkIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogVGhlIGV2ZW50IGNvbnRhaW5zIHRoZSBwZWVyIHRoYXQgZGlzY29ubmVjdGVkICh0aGlzKS4KKyAgICogPC9wPgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGZpcmVQZWVyRGlzY29ubmVjdGVkKCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlUGVlckRpc2Nvbm5lY3RlZCh0aGlzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWZ0ZXJQZWVyRGlzY29ubmVjdGVkKCkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuYWZ0ZXJQZWVyUmVtb3ZlZCh0aGlzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZmlyZVBlZXJDb25uZWN0ZWQoKSB7CisgICAgZm9yIChQZWVyQWN0aXZpdHlMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICBsaXN0ZW5lci5oYW5kbGVOZXdQZWVyQ29ubmVjdGVkKHRoaXMpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaXJlIHRoZSBJT0V4Y2VwdGlvbiBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoZSBldmVudCBjb250YWlucyB0aGUgcGVlciB0aGF0IHRyaWdnZXJlZCB0aGUgcHJvYmxlbSwgYW5kIHRoZQorICAgKiBleGNlcHRpb24gb2JqZWN0LgorICAgKiA8L3A+CisgICAqLworICBwcml2YXRlIHZvaWQgZmlyZUlPRXhjZXB0aW9uKElPRXhjZXB0aW9uIGlvZSkgeworICAgIGZvciAoUGVlckFjdGl2aXR5TGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgbGlzdGVuZXIuaGFuZGxlSU9FeGNlcHRpb24odGhpcywgaW9lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU2hhcmVkVG9ycmVudCBnZXRUb3JyZW50KCkgeworICAgIHJldHVybiB0aGlzLnRvcnJlbnQ7CisgIH0KKworICBwdWJsaWMgaW50IGdldERvd25sb2FkaW5nUGllY2VzQ291bnQoKSB7CisgICAgc3luY2hyb25pemVkIChyZXF1ZXN0c0xvY2spIHsKKyAgICAgIHJldHVybiBteVJlcXVlc3RlZFBpZWNlcy5zaXplKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERvd25sb2FkIHJhdGUgY29tcGFyYXRvci4KKyAgICogPHAvPgorICAgKiA8cD4KKyAgICogQ29tcGFyZXMgc2hhcmluZyBwZWVycyBiYXNlZCBvbiB0aGVpciBjdXJyZW50IGRvd25sb2FkIHJhdGUuCisgICAqIDwvcD4KKyAgICoKKyAgICogQGF1dGhvciBtcGV0YXp6b25pCisgICAqIEBzZWUgUmF0ZS5SYXRlQ29tcGFyYXRvcgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBETFJhdGVDb21wYXJhdG9yCisgICAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhdG9yPFNoYXJpbmdQZWVyPiwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDk2MzA3MjI5OTY0NzMwTDsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZShTaGFyaW5nUGVlciBhLCBTaGFyaW5nUGVlciBiKSB7CisgICAgICByZXR1cm4gUmF0ZS5SQVRFX0NPTVBBUkFUT1IuY29tcGFyZShhLmdldERMUmF0ZSgpLCBiLmdldERMUmF0ZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9TaGFyaW5nUGVlckluZm8uamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvcGVlci9TaGFyaW5nUGVlckluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQyOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9wZWVyL1NoYXJpbmdQZWVySW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudEhhc2g7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEBhdXRob3IgU2VyZ2V5LlBhaworICogRGF0ZTogOC85LzEzCisgKiBUaW1lOiA2OjQwIFBNCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2hhcmluZ1BlZXJJbmZvIHsKKworICBTdHJpbmcgZ2V0SXAoKTsKKworICBpbnQgZ2V0UG9ydCgpOworCisgIFRvcnJlbnRIYXNoIGdldFRvcnJlbnRIYXNoKCk7CisKKyAgQnl0ZUJ1ZmZlciBnZXRQZWVySWQoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0VtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0VtcHR5UGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWEzMmMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TWV0YWRhdGE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCitwdWJsaWMgY2xhc3MgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5IGltcGxlbWVudHMgUGllY2VTdG9yYWdlRmFjdG9yeSB7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRW1wdHlQaWVjZVN0b3JhZ2VGYWN0b3J5KCk7CisKKyAgcHJpdmF0ZSBFbXB0eVBpZWNlU3RvcmFnZUZhY3RvcnkoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBpZWNlU3RvcmFnZSBjcmVhdGVTdG9yYWdlKFRvcnJlbnRNZXRhZGF0YSBtZXRhZGF0YSwgVG9ycmVudEJ5dGVTdG9yYWdlIGJ5dGVTdG9yYWdlKSB7CisgICAgcmV0dXJuIG5ldyBQaWVjZVN0b3JhZ2VJbXBsKAorICAgICAgICAgICAgYnl0ZVN0b3JhZ2UsCisgICAgICAgICAgICBuZXcgQml0U2V0KG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkpLAorICAgICAgICAgICAgbWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSwKKyAgICAgICAgICAgIG1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCkKKyAgICApOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GYWlyUGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzAwYmUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY2IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50RmlsZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50VXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCisvKioKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCByZWFkIGFsbCBwaWVjZXMgZnJvbSBzdG9yYWdlIGFuZCBjb21wYXJlIGhhc2hlcyBvZiBwaWVjZXMgd2l0aCByZWFsbHkgaGFzaGVkCisgKiBmcm9tIG1ldGFkYXRhCisgKi8KK3B1YmxpYyBjbGFzcyBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeSBpbXBsZW1lbnRzIFBpZWNlU3RvcmFnZUZhY3RvcnkgeworCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkoKTsKKworICBwcml2YXRlIEZhaXJQaWVjZVN0b3JhZ2VGYWN0b3J5KCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQaWVjZVN0b3JhZ2UgY3JlYXRlU3RvcmFnZShUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEsIFRvcnJlbnRCeXRlU3RvcmFnZSBieXRlU3RvcmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBsb25nIHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChUb3JyZW50RmlsZSBmaWxlIDogbWV0YWRhdGEuZ2V0RmlsZXMoKSkgeworICAgICAgdG90YWxTaXplICs9IGZpbGUuc2l6ZTsKKyAgICB9CisKKyAgICBieXRlU3RvcmFnZS5vcGVuKGZhbHNlKTsKKyAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gbmV3IEJpdFNldChtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpKTsKKyAgICB0cnkgeworICAgICAgaWYgKCFieXRlU3RvcmFnZS5pc0JsYW5rKCkpIHsKKyAgICAgICAgaW50IHBpZWNlTGVuZ3RoID0gbWV0YWRhdGEuZ2V0UGllY2VMZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBsb25nIHBvc2l0aW9uID0gKGxvbmcpIGkgKiBwaWVjZUxlbmd0aDsKKyAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgIGlmICh0b3RhbFNpemUgLSBwb3NpdGlvbiA+IHBpZWNlTGVuZ3RoKSB7CisgICAgICAgICAgICBsZW4gPSBwaWVjZUxlbmd0aDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVuID0gKGludCkgKHRvdGFsU2l6ZSAtIHBvc2l0aW9uKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFieXRlU3RvcmFnZS5pc0JsYW5rKHBvc2l0aW9uLCBsZW4pKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobGVuKTsKKyAgICAgICAgICAgIGJ5dGVTdG9yYWdlLnJlYWQoYnVmZmVyLCBwb3NpdGlvbik7CisgICAgICAgICAgICBieXRlW10gZXhwZWN0ZWRIYXNoID0gQXJyYXlzLmNvcHlPZlJhbmdlKG1ldGFkYXRhLmdldFBpZWNlc0hhc2hlcygpLCBpICogQ29uc3RhbnRzLlBJRUNFX0hBU0hfU0laRSwgKGkgKyAxKSAqIENvbnN0YW50cy5QSUVDRV9IQVNIX1NJWkUpOworICAgICAgICAgICAgYnl0ZVtdIGFjdHVhbEhhc2ggPSBUb3JyZW50VXRpbHMuY2FsY3VsYXRlU2hhMUhhc2goYnVmZmVyLmFycmF5KCkpOworICAgICAgICAgICAgaWYgKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRIYXNoLCBhY3R1YWxIYXNoKSkgeworICAgICAgICAgICAgICBhdmFpbGFibGVQaWVjZXMuc2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBieXRlU3RvcmFnZS5jbG9zZSgpOworICAgIH0KKworICAgIHJldHVybiBuZXcgUGllY2VTdG9yYWdlSW1wbCgKKyAgICAgICAgICAgIGJ5dGVTdG9yYWdlLAorICAgICAgICAgICAgYXZhaWxhYmxlUGllY2VzLAorICAgICAgICAgICAgbWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSwKKyAgICAgICAgICAgIG1ldGFkYXRhLmdldFBpZWNlTGVuZ3RoKCkKKyAgICApOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZUNvbGxlY3Rpb25TdG9yYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZUNvbGxlY3Rpb25TdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZTNlNAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlQ29sbGVjdGlvblN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50RmlsZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCisvKioKKyAqIE11bHRpLWZpbGUgdG9ycmVudCBieXRlIHN0b3JhZ2UuCisgKgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0b3JyZW50IGJ5dGUgc3RvcmFnZSBwcm92aWRlcyBzdXBwb3J0IGZvcgorICogbXVsdGktZmlsZSB0b3JyZW50cyBhbmQgY29tcGxldGVseSBhYnN0cmFjdHMgdGhlIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyBmcm9tCisgKiB0aGUgbm90aW9uIG9mIGRpZmZlcmVudCBmaWxlcy4gVGhlIGJ5dGUgc3RvcmFnZSBpcyByZXByZXNlbnRlZCBhcyBvbmUKKyAqIGNvbnRpbnVvdXMgYnl0ZSBzdG9yYWdlLCBkaXJlY3RseSBhY2Nlc3NpYmxlIGJ5IG9mZnNldCByZWdhcmRsZXNzIG9mIHdoaWNoCisgKiBmaWxlIHRoaXMgb2Zmc2V0IGxhbmRzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICogQGF1dGhvciBkZ2lmZmluCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlQ29sbGVjdGlvblN0b3JhZ2UgaW1wbGVtZW50cyBUb3JyZW50Qnl0ZVN0b3JhZ2UgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxlQ29sbGVjdGlvblN0b3JhZ2UuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlU3RvcmFnZT4gZmlsZXM7CisgIHByaXZhdGUgZmluYWwgbG9uZyBzaXplOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbXlJc09wZW47CisKKyAgLyoqCisgICAqIEluaXRpYWxpemUgYSBuZXcgbXVsdGktZmlsZSB0b3JyZW50IGJ5dGUgc3RvcmFnZS4KKyAgICoKKyAgICogQHBhcmFtIGZpbGVzIFRoZSBsaXN0IG9mIGluZGl2aWR1YWwge0BsaW5rIEZpbGVTdG9yYWdlfQorICAgKiAgICAgICAgICAgICAgb2JqZWN0cyBtYWtpbmcgdXAgdGhlIHRvcnJlbnQuCisgICAqIEBwYXJhbSBzaXplICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgdG9ycmVudCBkYXRhLCBpbiBieXRlcy4KKyAgICovCisgIHB1YmxpYyBGaWxlQ29sbGVjdGlvblN0b3JhZ2UoTGlzdDxGaWxlU3RvcmFnZT4gZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzaXplKSB7CisgICAgdGhpcy5maWxlcyA9IGZpbGVzOworICAgIHRoaXMuc2l6ZSA9IHNpemU7CisKKyAgICBsb2dnZXIuZGVidWcoIkluaXRpYWxpemVkIHRvcnJlbnQgYnl0ZSBzdG9yYWdlIG9uIHt9IGZpbGUocykgIiArCisgICAgICAgICAgICAiKHt9IHRvdGFsIGJ5dGUocykpLiIsIGZpbGVzLnNpemUoKSwgc2l6ZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEZpbGVDb2xsZWN0aW9uU3RvcmFnZSBjcmVhdGUoVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhLCBGaWxlIHBhcmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIXBhcmVudC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBhcmVudCBkaXJlY3RvcnkhIik7CisgICAgfQorICAgIExpc3Q8RmlsZVN0b3JhZ2U+IGZpbGVzID0gbmV3IExpbmtlZExpc3Q8RmlsZVN0b3JhZ2U+KCk7CisgICAgbG9uZyBvZmZzZXQgPSAwTDsKKyAgICBsb25nIHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChUb3JyZW50RmlsZSBmaWxlIDogbWV0YWRhdGEuZ2V0RmlsZXMoKSkgeworICAgICAgRmlsZSBhY3R1YWwgPSBuZXcgRmlsZShwYXJlbnQsIGZpbGUuZ2V0UmVsYXRpdmVQYXRoQXNTdHJpbmcoKSk7CisKKyAgICAgIGlmICghYWN0dWFsLmdldENhbm9uaWNhbFBhdGgoKS5zdGFydHNXaXRoKHBhcmVudC5nZXRDYW5vbmljYWxQYXRoKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVG9ycmVudCBmaWxlIHBhdGggYXR0ZW1wdGVkICIgKworICAgICAgICAgICAgICAgICJ0byBicmVhayBkaXJlY3RvcnkgamFpbCEiKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFhY3R1YWwuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICYmICFhY3R1YWwuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyAiICsgYWN0dWFsLmdldFBhcmVudCgpICsgIiBmb3Igc3RvcmluZyB0b3JyZW50IGZpbGUgIiArIGFjdHVhbC5nZXROYW1lKCkpOworICAgICAgfQorICAgICAgZmlsZXMuYWRkKG5ldyBGaWxlU3RvcmFnZShhY3R1YWwsIG9mZnNldCwgZmlsZS5zaXplKSk7CisgICAgICBvZmZzZXQgKz0gZmlsZS5zaXplOworICAgICAgdG90YWxTaXplICs9IGZpbGUuc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBGaWxlQ29sbGVjdGlvblN0b3JhZ2UoZmlsZXMsIHRvdGFsU2l6ZSk7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb3BlbihmaW5hbCBib29sZWFuIHNlZWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKEZpbGVTdG9yYWdlIGZpbGUgOiBmaWxlcykgeworICAgICAgaWYgKCFmaWxlLmlzT3BlbigpKQorICAgICAgICBmaWxlLm9wZW4oc2VlZGVyKTsKKyAgICB9CisgICAgbXlJc09wZW4gPSB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgcmVxdWVzdGVkID0gYnVmZmVyLnJlbWFpbmluZygpOworICAgIGludCBieXRlcyA9IDA7CisKKyAgICBmb3IgKEZpbGVPZmZzZXQgZm8gOiB0aGlzLnNlbGVjdChwb3NpdGlvbiwgcmVxdWVzdGVkKSkgeworICAgICAgLy8gVE9ETzogcmVtb3ZlIGNhc3QgdG8gaW50IHdoZW4gbGFyZ2UgQnl0ZUJ1ZmZlciBzdXBwb3J0IGlzCisgICAgICAvLyBpbXBsZW1lbnRlZCBpbiBKYXZhLgorICAgICAgYnVmZmVyLmxpbWl0KChpbnQpIChidWZmZXIucG9zaXRpb24oKSArIGZvLmxlbmd0aCkpOworICAgICAgYnl0ZXMgKz0gZm8uZmlsZS5yZWFkKGJ1ZmZlciwgZm8ub2Zmc2V0KTsKKyAgICB9CisKKyAgICBpZiAoYnl0ZXMgPCByZXF1ZXN0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZSBjb2xsZWN0aW9uIHJlYWQgdW5kZXJydW4hIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50IHJlcXVlc3RlZCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKworICAgIGludCBieXRlcyA9IDA7CisKKyAgICBmb3IgKEZpbGVPZmZzZXQgZm8gOiB0aGlzLnNlbGVjdChwb3NpdGlvbiwgcmVxdWVzdGVkKSkgeworICAgICAgYnVmZmVyLmxpbWl0KGJ5dGVzICsgKGludCkgZm8ubGVuZ3RoKTsKKyAgICAgIGJ5dGVzICs9IGZvLmZpbGUud3JpdGUoYnVmZmVyLCBmby5vZmZzZXQpOworICAgIH0KKworICAgIGlmIChieXRlcyA8IHJlcXVlc3RlZCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdG9yYWdlIGNvbGxlY3Rpb24gd3JpdGUgdW5kZXJydW4hIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKSB7CisgICAgZm9yIChGaWxlT2Zmc2V0IGZvIDogdGhpcy5zZWxlY3QocG9zaXRpb24sIHNpemUpKSB7CisgICAgICBpZiAoIWZvLmZpbGUuaXNCbGFuayhmby5vZmZzZXQsIGZvLmxlbmd0aCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0JsYW5rKCkgeworICAgIGZvciAoRmlsZVN0b3JhZ2UgZmlsZSA6IHRoaXMuZmlsZXMpIHsKKyAgICAgIGlmICghZmlsZS5pc0JsYW5rKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZvciAoRmlsZVN0b3JhZ2UgZmlsZSA6IHRoaXMuZmlsZXMpIHsKKyAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICB9CisgICAgbXlJc09wZW4gPSBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKEZpbGVTdG9yYWdlIGZpbGUgOiB0aGlzLmZpbGVzKSB7CisgICAgICBmaWxlLmZpbmlzaCgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworICAgIGZvciAoRmlsZVN0b3JhZ2UgZmlsZSA6IHRoaXMuZmlsZXMpIHsKKyAgICAgIGlmICghZmlsZS5pc0ZpbmlzaGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChGaWxlU3RvcmFnZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZpbGUgb3BlcmF0aW9uIGRldGFpbHMgaG9sZGVyLgorICAgKgorICAgKiA8cD4KKyAgICogVGhpcyBzaW1wbGUgaW5uZXIgY2xhc3MgaG9sZHMgdGhlIGRldGFpbHMgZm9yIGEgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24KKyAgICogb24gb25lIG9mIHRoZSB1bmRlcmx5aW5nIHtAbGluayBGaWxlU3RvcmFnZX1zLgorICAgKiA8L3A+CisgICAqCisgICAqIEBhdXRob3IgZGdpZmZpbgorICAgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVPZmZzZXQgeworCisgICAgcHVibGljIGZpbmFsIEZpbGVTdG9yYWdlIGZpbGU7CisgICAgcHVibGljIGZpbmFsIGxvbmcgb2Zmc2V0OworICAgIHB1YmxpYyBmaW5hbCBsb25nIGxlbmd0aDsKKworICAgIEZpbGVPZmZzZXQoRmlsZVN0b3JhZ2UgZmlsZSwgbG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKSB7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VsZWN0IHRoZSBncm91cCBvZiBmaWxlcyBpbXBhY3RlZCBieSBhbiBvcGVyYXRpb24uCisgICAqCisgICAqIDxwPgorICAgKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgd2hpY2ggZmlsZXMgYXJlIGltcGFjdGVkIGJ5IGEgcmVhZCBvciB3cml0ZQorICAgKiBvcGVyYXRpb24sIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSByZWxhdGl2ZSBvZmZzZXQgYW5kIGNodW5rIGxlbmd0aC4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIG9wZXJhdGlvbiwgaW4gYnl0ZXMsIHJlbGF0aXZlIHRvIHRoZQorICAgKiAgICAgICAgICAgICAgIGNvbXBsZXRlIGJ5dGUgc3RvcmFnZS4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgb3Igd3JpdGUuCisgICAqIEByZXR1cm4gQSBsaXN0IG9mIHtAbGluayBGaWxlT2Zmc2V0fSBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUge0BsaW5rCisgICAqIEZpbGVTdG9yYWdlfXMgaW1wYWN0ZWQgYnkgdGhlIG9wZXJhdGlvbiwgYnVuZGxlZCB3aXRoIHRoZWlyCisgICAqIHJlc3BlY3RpdmUgcmVsYXRpdmUgb2Zmc2V0IGFuZCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBvciB3cml0ZS4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIGdvIG92ZXIgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgc3RvcmFnZSBzaXplLgorICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgICBJZiB0aGUgZmlsZXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgYnl0ZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlIGNhbid0IGFjY29tbW9kYXRlIHRoZSByZXF1ZXN0IChzaG91bGQgbm90IGhhcHBlbiwgcmVhbGx5KS4KKyAgICovCisgIHByaXZhdGUgTGlzdDxGaWxlT2Zmc2V0PiBzZWxlY3QobG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKSB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IHRoaXMuc2l6ZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIG92ZXJydW4gKCIgKworICAgICAgICAgICAgICBvZmZzZXQgKyAiICsgIiArIGxlbmd0aCArICIgPiAiICsgdGhpcy5zaXplICsgIikgISIpOworICAgIH0KKworICAgIExpc3Q8RmlsZU9mZnNldD4gc2VsZWN0ZWQgPSBuZXcgTGlua2VkTGlzdDxGaWxlT2Zmc2V0PigpOworICAgIGxvbmcgYnl0ZXMgPSAwOworCisgICAgZm9yIChGaWxlU3RvcmFnZSBmaWxlIDogdGhpcy5maWxlcykgeworICAgICAgaWYgKGZpbGUub2Zmc2V0KCkgPj0gb2Zmc2V0ICsgbGVuZ3RoKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoZmlsZS5vZmZzZXQoKSArIGZpbGUuc2l6ZSgpIDwgb2Zmc2V0KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBsb25nIHBvc2l0aW9uID0gb2Zmc2V0IC0gZmlsZS5vZmZzZXQoKTsKKyAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPiAwID8gcG9zaXRpb24gOiAwOworICAgICAgbG9uZyBzaXplID0gTWF0aC5taW4oCisgICAgICAgICAgICAgIGZpbGUuc2l6ZSgpIC0gcG9zaXRpb24sCisgICAgICAgICAgICAgIGxlbmd0aCAtIGJ5dGVzKTsKKyAgICAgIHNlbGVjdGVkLmFkZChuZXcgRmlsZU9mZnNldChmaWxlLCBwb3NpdGlvbiwgc2l6ZSkpOworICAgICAgYnl0ZXMgKz0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0ZWQuc2l6ZSgpID09IDAgfHwgYnl0ZXMgPCBsZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJ1ZmZlciB1bmRlcnJ1biAob25seSBnb3QgIiArCisgICAgICAgICAgICAgIGJ5dGVzICsgIiBvdXQgb2YgIiArIGxlbmd0aCArICIgYnl0ZShzKSByZXF1ZXN0ZWQpISIpOworICAgIH0KKworICAgIHJldHVybiBzZWxlY3RlZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVTdG9yYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmlsZVN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBkZGRlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVTdG9yYWdlLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworCisKKy8qKgorICogU2luZ2xlLWZpbGUgdG9ycmVudCBieXRlIGRhdGEgc3RvcmFnZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgVG9ycmVudEJ5dGVTdG9yYWdlRmlsZSBwcm92aWRlcyBhIHRvcnJlbnQgYnl0ZSBkYXRhCisgKiBzdG9yYWdlIHJlbHlpbmcgb24gYSBzaW5nbGUgdW5kZXJseWluZyBmaWxlIGFuZCB1c2VzIGEgUmFuZG9tQWNjZXNzRmlsZQorICogRmlsZUNoYW5uZWwgdG8gZXhwb3NlIHRocmVhZC1zYWZlIHJlYWQvd3JpdGUgbWV0aG9kcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqLworcHVibGljIGNsYXNzIEZpbGVTdG9yYWdlIGltcGxlbWVudHMgVG9ycmVudEJ5dGVTdG9yYWdlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElBTF9GSUxFX05BTUVfU1VGRklYID0gIi5wYXJ0IjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmlsZVN0b3JhZ2UuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgRmlsZSB0YXJnZXQ7CisgIHByaXZhdGUgRmlsZSBwYXJ0aWFsOworICBwcml2YXRlIGZpbmFsIGxvbmcgb2Zmc2V0OworICBwcml2YXRlIGZpbmFsIGxvbmcgc2l6ZTsKKworICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmOworICBwcml2YXRlIEZpbGVDaGFubmVsIGNoYW5uZWw7CisgIHByaXZhdGUgRmlsZSBjdXJyZW50OworICBwcml2YXRlIGJvb2xlYW4gbXlJc09wZW4gPSBmYWxzZTsKKyAgcHJpdmF0ZSBib29sZWFuIGlzQmxhbms7CisKKyAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIG15TG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgcHVibGljIEZpbGVTdG9yYWdlKEZpbGUgZmlsZSwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSkgeworICAgIHRoaXMudGFyZ2V0ID0gZmlsZTsKKyAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICB0aGlzLnNpemUgPSBzaXplOworCisgIH0KKworICBwdWJsaWMgdm9pZCBvcGVuKGZpbmFsIGJvb2xlYW4gc2VlZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgaWYgKHNlZWRlcikgeworICAgICAgICBpZiAoIXRhcmdldC5leGlzdHMoKSkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGFyZ2V0IGZpbGUgIiArIHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lc24ndCBleGlzdC4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnRhcmdldDsKKyAgICAgICAgdGhpcy5yYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0aGlzLmN1cnJlbnQsICJyIik7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzLnBhcnRpYWwgPSBuZXcgRmlsZSh0aGlzLnRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSArIFBBUlRJQUxfRklMRV9OQU1FX1NVRkZJWCk7CisKKyAgICAgICAgaWYgKHRoaXMucGFydGlhbC5leGlzdHMoKSkgeworICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiUGFydGlhbCBkb3dubG9hZCBmb3VuZCBhdCB7fS4gQ29udGludWluZy4uLiIsCisgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpYWwuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMucGFydGlhbDsKKyAgICAgICAgICB0aGlzLmlzQmxhbmsgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICghdGhpcy50YXJnZXQuZXhpc3RzKCkpIHsKKyAgICAgICAgICBsb2dnZXIuZGVidWcoIkRvd25sb2FkaW5nIG5ldyBmaWxlIHRvIHt9Li4uIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5wYXJ0aWFsOworICAgICAgICAgIHRoaXMuaXNCbGFuayA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJVc2luZyBleGlzdGluZyBmaWxlIHt9LiIsCisgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy50YXJnZXQ7CisgICAgICAgICAgdGhpcy5pc0JsYW5rID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5yYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0aGlzLmN1cnJlbnQsICJydyIpOworICAgICAgICB0aGlzLnJhZi5zZXRMZW5ndGgodGhpcy5zaXplKTsKKyAgICAgIH0KKworICAgICAgLy8gU2V0IHRoZSBmaWxlIGxlbmd0aCB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZSwgZXZlbnR1YWxseSB0cnVuY2F0aW5nCisgICAgICAvLyBvciBleHRlbmRpbmcgdGhlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCBzaXplLgorICAgICAgbXlJc09wZW4gPSB0cnVlOworICAgICAgdGhpcy5jaGFubmVsID0gcmFmLmdldENoYW5uZWwoKTsKKworICAgICAgbG9nZ2VyLmRlYnVnKCJPcGVuZWQgYnl0ZSBzdG9yYWdlIGZpbGUgYXQge30gKHt9K3t9IGJ5dGUocykpLiIsCisgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXplLAorICAgICAgICAgICAgICB9KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBsb25nIG9mZnNldCgpIHsKKyAgICByZXR1cm4gdGhpcy5vZmZzZXQ7CisgIH0KKworICBwdWJsaWMgbG9uZyBzaXplKCkgeworICAgIHJldHVybiB0aGlzLnNpemU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKEJ5dGVCdWZmZXIgYnVmZmVyLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBteUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICBpbnQgcmVxdWVzdGVkID0gYnVmZmVyLnJlbWFpbmluZygpOworCisgICAgICBpZiAocG9zaXRpb24gKyByZXF1ZXN0ZWQgPiB0aGlzLnNpemUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdG9yYWdlIHJlYWQgcmVxdWVzdCEiKTsKKyAgICAgIH0KKworICAgICAgaW50IGJ5dGVzID0gdGhpcy5jaGFubmVsLnJlYWQoYnVmZmVyLCBwb3NpdGlvbik7CisgICAgICBpZiAoYnl0ZXMgPCByZXF1ZXN0ZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdG9yYWdlIHVuZGVycnVuISIpOworICAgICAgfQorCisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgYnVmZmVyLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgaW50IHJlcXVlc3RlZCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKyAgICAgIHRoaXMuaXNCbGFuayA9IGZhbHNlOworCisgICAgICBpZiAocG9zaXRpb24gKyByZXF1ZXN0ZWQgPiB0aGlzLnNpemUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdG9yYWdlIHdyaXRlIHJlcXVlc3QhIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwud3JpdGUoYnVmZmVyLCBwb3NpdGlvbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgaWYgKCFteUlzT3BlbikgcmV0dXJuOworICAgICAgbG9nZ2VyLmRlYnVnKCJDbG9zaW5nIGZpbGUgY2hhbm5lbCB0byB7fS4gQ2hhbm5lbCBvcGVuOiB7fSIsIGN1cnJlbnQuZ2V0TmFtZSgpLCBjaGFubmVsLmlzT3BlbigpKTsKKyAgICAgIGlmICh0aGlzLmNoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0aGlzLmNoYW5uZWwuZm9yY2UodHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZEJ5SW50ZXJydXB0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy5yYWYuY2xvc2UoKTsKKyAgICAgIG15SXNPcGVuID0gZmFsc2U7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTW92ZSB0aGUgcGFydGlhbCBmaWxlIHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBteUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgbG9nZ2VyLmRlYnVnKCJDbG9zaW5nIGZpbGUgY2hhbm5lbCB0byAiICsgdGhpcy5jdXJyZW50LmdldE5hbWUoKSArCisgICAgICAgICAgICAgICIgKGRvd25sb2FkIGNvbXBsZXRlKS4iKTsKKyAgICAgIGlmICh0aGlzLmNoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgdGhpcy5jaGFubmVsLmZvcmNlKHRydWUpOworICAgICAgfQorCisgICAgICAvLyBOb3RoaW5nIG1vcmUgdG8gZG8gaWYgd2UncmUgYWxyZWFkeSBvbiB0aGUgdGFyZ2V0IGZpbGUuCisgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUXVpZXRseSh0aGlzLnRhcmdldCk7CisgICAgICAgIHRoaXMucmFmLmNsb3NlKCk7CisgICAgICAgIEZpbGVVdGlscy5tb3ZlRmlsZSh0aGlzLmN1cnJlbnQsIHRoaXMudGFyZ2V0KTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICBsb2dnZXIuZXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG1vdmluZyBmaWxlIHRvIGl0cyBmaW5hbCBsb2NhdGlvbiIsIGV4KTsKKyAgICAgICAgaWYgKHRoaXMudGFyZ2V0LmV4aXN0cygpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJXYXMgdW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlICIgKyB0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCksIGV4KTsKKyAgICAgICAgfQorICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUodGhpcy5jdXJyZW50LCB0aGlzLnRhcmdldCk7CisgICAgICB9CisKKyAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMudGFyZ2V0OworCisgICAgICBGaWxlVXRpbHMuZGVsZXRlUXVpZXRseSh0aGlzLnBhcnRpYWwpOworICAgICAgbXlJc09wZW4gPSBmYWxzZTsKKyAgICAgIGxvZ2dlci5kZWJ1ZygiTW92ZWQgdG9ycmVudCBkYXRhIGZyb20ge30gdG8ge30uIiwKKyAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgdGhpcy50YXJnZXQuZ2V0TmFtZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbXlMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIG15SXNPcGVuOworICAgIH0gZmluYWxseSB7CisgICAgICBteUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNCbGFuayhsb25nIHBvc2l0aW9uLCBsb25nIHNpemUpIHsKKyAgICAgIHJldHVybiBpc0JsYW5rKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNCbGFuaygpIHsKKyAgICB0cnkgeworICAgICAgbXlMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgcmV0dXJuIGlzQmxhbms7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG15TG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnQuZXF1YWxzKHRoaXMudGFyZ2V0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNsb3NlKCk7CisgICAgZmluYWwgRmlsZSBsb2NhbCA9IHRoaXMuY3VycmVudDsKKyAgICBpZiAobG9jYWwgIT0gbnVsbCkgbG9jYWwuZGVsZXRlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GdWxseVBpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc2M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0Z1bGx5UGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworcHVibGljIGNsYXNzIEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeSBpbXBsZW1lbnRzIFBpZWNlU3RvcmFnZUZhY3RvcnkgeworCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEZ1bGx5UGllY2VTdG9yYWdlRmFjdG9yeSgpOworCisgIHByaXZhdGUgRnVsbHlQaWVjZVN0b3JhZ2VGYWN0b3J5KCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQaWVjZVN0b3JhZ2UgY3JlYXRlU3RvcmFnZShUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEsIFRvcnJlbnRCeXRlU3RvcmFnZSBieXRlU3RvcmFnZSkgeworCisgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IG5ldyBCaXRTZXQobWV0YWRhdGEuZ2V0UGllY2VzQ291bnQoKSk7CisgICAgYXZhaWxhYmxlUGllY2VzLnNldCgwLCBtZXRhZGF0YS5nZXRQaWVjZXNDb3VudCgpKTsKKyAgICByZXR1cm4gbmV3IFBpZWNlU3RvcmFnZUltcGwoCisgICAgICAgICAgICBieXRlU3RvcmFnZSwKKyAgICAgICAgICAgIGF2YWlsYWJsZVBpZWNlcywKKyAgICAgICAgICAgIG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCksCisgICAgICAgICAgICBtZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpCisgICAgKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvUGllY2VTdG9yYWdlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworcHVibGljIGludGVyZmFjZSBQaWVjZVN0b3JhZ2UgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgIHZvaWQgc2F2ZVBpZWNlKGludCBwaWVjZUluZGV4LCBieXRlW10gcGllY2VEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgYnl0ZVtdIHJlYWRQaWVjZVBhcnQoaW50IHBpZWNlSW5kZXgsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICBCaXRTZXQgZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisKKyAgYm9vbGVhbiBpc0ZpbmlzaGVkKCk7CisKKyAgdm9pZCBjbG9zZUZ1bGx5KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvUGllY2VTdG9yYWdlRmFjdG9yeS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBkNDRlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdG9yYWdlOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRNZXRhZGF0YTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgUGllY2VTdG9yYWdlRmFjdG9yeSB7CisKKyAgLyoqCisgICAqIGNyZWF0ZSBuZXcge0BsaW5rIFBpZWNlU3RvcmFnZX0gZm9yIHNwZWNpZmllZCB0b3JyZW50IHdpdGggc3BlY2lmaWVkIGJ5dGUgc3RvcmFnZQorICAgKgorICAgKiBAcGFyYW0gbWV0YWRhdGEgICAgc3BlY2lmaWVkIG1ldGFkYXRhCisgICAqIEBwYXJhbSBieXRlU3RvcmFnZSBzcGVjaWZpZWQgYnl0ZSBzdG9yYWdlIHdoZXJlIHdpbGwgYmUgc3RvcmVkIHBpZWNlcworICAgKiBAcmV0dXJuIG5ldyB7QGxpbmsgUGllY2VTdG9yYWdlfQorICAgKi8KKyAgUGllY2VTdG9yYWdlIGNyZWF0ZVN0b3JhZ2UoVG9ycmVudE1ldGFkYXRhIG1ldGFkYXRhLCBUb3JyZW50Qnl0ZVN0b3JhZ2UgYnl0ZVN0b3JhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZDc0OQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9QaWVjZVN0b3JhZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBvcmcuamV0YnJhaW5zLmFubm90YXRpb25zLk51bGxhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworCitwdWJsaWMgY2xhc3MgUGllY2VTdG9yYWdlSW1wbCBpbXBsZW1lbnRzIFBpZWNlU3RvcmFnZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50Qnl0ZVN0b3JhZ2UgZmlsZUNvbGxlY3Rpb25TdG9yYWdlOworICBwcml2YXRlIGZpbmFsIFJlYWRXcml0ZUxvY2sgcmVhZFdyaXRlTG9jazsKKworICBwcml2YXRlIGZpbmFsIE9iamVjdCBvcGVuU3RvcmFnZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgQE51bGxhYmxlCisgIHByaXZhdGUgdm9sYXRpbGUgQml0U2V0IGF2YWlsYWJsZVBpZWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgcGllY2VzQ291bnQ7CisgIHByaXZhdGUgZmluYWwgaW50IHBpZWNlU2l6ZTsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzT3BlbjsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNsb3NlZEZ1bGx5ID0gZmFsc2U7CisKKyAgcHVibGljIFBpZWNlU3RvcmFnZUltcGwoVG9ycmVudEJ5dGVTdG9yYWdlIGZpbGVDb2xsZWN0aW9uU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZWNlc0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VTaXplKSB7CisgICAgdGhpcy5maWxlQ29sbGVjdGlvblN0b3JhZ2UgPSBmaWxlQ29sbGVjdGlvblN0b3JhZ2U7CisgICAgdGhpcy5yZWFkV3JpdGVMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICB0aGlzLnBpZWNlc0NvdW50ID0gcGllY2VzQ291bnQ7CisgICAgdGhpcy5waWVjZVNpemUgPSBwaWVjZVNpemU7CisgICAgQml0U2V0IGJpdFNldCA9IG5ldyBCaXRTZXQocGllY2VzQ291bnQpOworICAgIGJpdFNldC5vcihhdmFpbGFibGVQaWVjZXMpOworICAgIGlmIChiaXRTZXQuY2FyZGluYWxpdHkoKSAhPSBwaWVjZXNDb3VudCkgeworICAgICAgdGhpcy5hdmFpbGFibGVQaWVjZXMgPSBiaXRTZXQ7CisgICAgfQorICAgIGlzT3BlbiA9IGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrUGllY2VJbmRleChpbnQgcGllY2VJbmRleCkgeworICAgIGlmIChwaWVjZUluZGV4IDwgMCB8fCBwaWVjZUluZGV4ID49IHBpZWNlc0NvdW50KSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvcnJlY3QgcGllY2UgaW5kZXggIiArIHBpZWNlSW5kZXggKyAiLiBQaWVjZSBpbmRleCBtdXN0IGJlIHBvc2l0aXZlIGxlc3MgdGhhbiIgKyBwaWVjZXNDb3VudCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNhdmVQaWVjZShpbnQgcGllY2VJbmRleCwgYnl0ZVtdIHBpZWNlRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBjaGVja1BpZWNlSW5kZXgocGllY2VJbmRleCk7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworCisgICAgICBpZiAoY2xvc2VkRnVsbHkpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZSBpcyBjbG9zZWQiKTsKKworICAgICAgQml0U2V0IGF2YWlsYWJsZVBpZWNlcyA9IHRoaXMuYXZhaWxhYmxlUGllY2VzOworCisgICAgICBib29sZWFuIGlzRnVsbHlEb3dubG9hZGVkID0gYXZhaWxhYmxlUGllY2VzID09IG51bGw7CisKKyAgICAgIGlmIChpc0Z1bGx5RG93bmxvYWRlZCkgcmV0dXJuOworCisgICAgICBpZiAoYXZhaWxhYmxlUGllY2VzLmdldChwaWVjZUluZGV4KSkgcmV0dXJuOworCisgICAgICBvcGVuU3RvcmFnZUlzTmVjZXNzYXJ5KGZhbHNlKTsKKworICAgICAgbG9uZyBwb3MgPSBwaWVjZUluZGV4OworICAgICAgcG9zID0gcG9zICogcGllY2VTaXplOworICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLndyYXAocGllY2VEYXRhKTsKKyAgICAgIGZpbGVDb2xsZWN0aW9uU3RvcmFnZS53cml0ZShidWZmZXIsIHBvcyk7CisKKyAgICAgIGF2YWlsYWJsZVBpZWNlcy5zZXQocGllY2VJbmRleCk7CisgICAgICBib29sZWFuIGlzRnVsbHlOb3cgPSBhdmFpbGFibGVQaWVjZXMuY2FyZGluYWxpdHkoKSA9PSBwaWVjZXNDb3VudDsKKyAgICAgIGlmIChpc0Z1bGx5Tm93KSB7CisgICAgICAgIHRoaXMuYXZhaWxhYmxlUGllY2VzID0gbnVsbDsKKyAgICAgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLmZpbmlzaCgpOworICAgICAgICBmaWxlQ29sbGVjdGlvblN0b3JhZ2UuY2xvc2UoKTsKKyAgICAgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLm9wZW4odHJ1ZSk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIG9wZW5TdG9yYWdlSXNOZWNlc3NhcnkoYm9vbGVhbiBvbmx5UmVhZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbikgeworICAgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLm9wZW4ob25seVJlYWQpOworICAgICAgaXNPcGVuID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSByZWFkUGllY2VQYXJ0KGludCBwaWVjZUluZGV4LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGNoZWNrUGllY2VJbmRleChwaWVjZUluZGV4KTsKKyAgICB0cnkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKworICAgICAgaWYgKGNsb3NlZEZ1bGx5KSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0b3JhZ2UgaXMgY2xvc2VkIik7CisKKyAgICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSB0aGlzLmF2YWlsYWJsZVBpZWNlczsKKyAgICAgIGlmIChhdmFpbGFibGVQaWVjZXMgIT0gbnVsbCAmJiAhYXZhaWxhYmxlUGllY2VzLmdldChwaWVjZUluZGV4KSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0cnlpbmcgcmVhZGluZyBwYXJ0IG9mIG5vdCBhdmFpbGFibGUgcGllY2UiKTsKKyAgICAgIH0KKworICAgICAgc3luY2hyb25pemVkIChvcGVuU3RvcmFnZUxvY2spIHsKKyAgICAgICAgb3BlblN0b3JhZ2VJc05lY2Vzc2FyeShhdmFpbGFibGVQaWVjZXMgPT0gbnVsbCk7CisgICAgICB9CisKKyAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShsZW5ndGgpOworICAgICAgbG9uZyBwb3MgPSBwaWVjZUluZGV4OworICAgICAgcG9zID0gcG9zICogcGllY2VTaXplICsgb2Zmc2V0OworICAgICAgZmlsZUNvbGxlY3Rpb25TdG9yYWdlLnJlYWQoYnVmZmVyLCBwb3MpOworICAgICAgcmV0dXJuIGJ1ZmZlci5hcnJheSgpOworICAgIH0gZmluYWxseSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICByZXR1cm4gYXZhaWxhYmxlUGllY2VzID09IG51bGw7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2VGdWxseSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgY2xvc2UwKCk7CisgICAgICBjbG9zZWRGdWxseSA9IHRydWU7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCaXRTZXQgZ2V0QXZhaWxhYmxlUGllY2VzKCkgeworICAgIHRyeSB7CisgICAgICByZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgQml0U2V0IHJlc3VsdCA9IG5ldyBCaXRTZXQocGllY2VzQ291bnQpOworCisgICAgICBCaXRTZXQgYXZhaWxhYmxlUGllY2VzID0gdGhpcy5hdmFpbGFibGVQaWVjZXM7CisgICAgICBib29sZWFuIGlzRnVsbHlEb3dubG9hZGVkID0gYXZhaWxhYmxlUGllY2VzID09IG51bGw7CisKKyAgICAgIGlmIChpc0Z1bGx5RG93bmxvYWRlZCkgeworICAgICAgICByZXN1bHQuc2V0KDAsIHBpZWNlc0NvdW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5vcihhdmFpbGFibGVQaWVjZXMpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVhZFdyaXRlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgY2xvc2UwKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNsb3NlMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKyAgICBmaWxlQ29sbGVjdGlvblN0b3JhZ2UuY2xvc2UoKTsKKyAgICBpc09wZW4gPSBmYWxzZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1RvcnJlbnRCeXRlU3RvcmFnZS5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1RvcnJlbnRCeXRlU3RvcmFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvVG9ycmVudEJ5dGVTdG9yYWdlLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKworLyoqCisgKiBBYnN0cmFjdCB0b3JyZW50IGJ5dGUgc3RvcmFnZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBhbiBhYnN0cmFjdGVkIHRvcnJlbnQgYnl0ZQorICogc3RvcmFnZS4gQSB0b3JyZW50LCBlc3BlY2lhbGx5IHdoZW4gaXQgY29udGFpbnMgbXVsdGlwbGUgZmlsZXMsIG5lZWRzIHRvIGJlCisgKiBzZWVuIGFzIG9uZSBzaW5nbGUgY29udGludW91cyBzdHJlYW0gb2YgYnl0ZXMuIFRvcnJlbnQgcGllY2VzIHdpbGwgbW9zdAorICogbGlrZWx5IHNwYW4gYWNjcm9zcyBmaWxlIGJvdW5kYXJpZXMuIFRoaXMgYWJzdHJhY3RlZCBieXRlIHN0b3JhZ2UgYWltcyBhdAorICogcHJvdmlkaW5nIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIHRvcnJlbnQgZGF0YSwKKyAqIHJlZ2FyZGxlc3Mgb2YgaG93IGl0IGlzIGNvbXBvc2VkIHVuZGVybmVhdGggdGhlIHBpZWNlIHN0cnVjdHVyZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBhdXRob3IgZGdpZmZpbgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRvcnJlbnRCeXRlU3RvcmFnZSBleHRlbmRzIENsb3NlYWJsZSB7CisKKyAgdm9pZCBvcGVuKGJvb2xlYW4gc2VlZGVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFJlYWQgZnJvbSB0aGUgYnl0ZSBzdG9yYWdlLgorICAgKgorICAgKiA8cD4KKyAgICogUmVhZCB7QGNvZGUgbGVuZ3RofSBieXRlcyBhdCBwb3NpdGlvbiB7QGNvZGUgcG9zaXRpb259IGZyb20gdGhlIHVuZGVybHlpbmcKKyAgICogYnl0ZSBzdG9yYWdlIGFuZCByZXR1cm4gdGhlbSBpbiBhIHtAbGluayBCeXRlQnVmZmVyfS4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gYnVmZmVyICAgVGhlIGJ1ZmZlciB0byByZWFkIHRoZSBieXRlcyBpbnRvLiBUaGUgYnVmZmVyJ3MgbGltaXQgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgY29udHJvbCBob3cgbWFueSBieXRlcyBhcmUgcmVhZCBmcm9tIHRoZSBzdG9yYWdlLgorICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uLCBpbiBieXRlcywgdG8gcmVhZCBmcm9tLiBUaGlzIG11c3QgYmUgd2l0aGluCisgICAqICAgICAgICAgICAgICAgICB0aGUgc3RvcmFnZSBib3VuZGFyeS4KKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RvcmFnZS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICBieXRlIHN0b3JhZ2UuCisgICAqLworICBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBXcml0ZSBieXRlcyB0byB0aGUgYnl0ZSBzdG9yYWdlLgorICAgKgorICAgKiA8cD4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gYmxvY2sgICAgQSB7QGxpbmsgQnl0ZUJ1ZmZlcn0gY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlCisgICAqICAgICAgICAgICAgICAgICBzdG9yYWdlLiBUaGUgYnVmZmVyIGxpbWl0IGlzIGV4cGVjdGVkIHRvIGJlIHNldCBjb3JyZWN0bHk6IGFsbCBieXRlcworICAgKiAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYnVmZmVyIHdpbGwgYmUgdXNlZC4KKyAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSB1bmRlcmx5aW5nIGJ5dGUgc3RvcmFnZSB0byB3cml0ZSB0aGUgYmxvY2sKKyAgICogICAgICAgICAgICAgICAgIGF0LgorICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgc3RvcmFnZS4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIGJ5dGUKKyAgICogICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLgorICAgKi8KKyAgaW50IHdyaXRlKEJ5dGVCdWZmZXIgYmxvY2ssIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogRmluYWxpemUgdGhlIGJ5dGUgc3RvcmFnZSB3aGVuIHRoZSBkb3dubG9hZCBpcyBjb21wbGV0ZS4KKyAgICoKKyAgICogPHA+CisgICAqIFRoaXMgZ2l2ZXMgdGhlIGJ5dGUgc3RvcmFnZSB0aGUgb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBmaW5hbGl6YXRpb24KKyAgICogb3BlcmF0aW9ucyB3aGVuIHRoZSBkb3dubG9hZCBjb21wbGV0ZXMsIGxpa2UgbW92aW5nIHRoZSBmaWxlcyBmcm9tIGEKKyAgICogdGVtcG9yYXJ5IGxvY2F0aW9uIHRvIHRoZWlyIGRlc3RpbmF0aW9uLgorICAgKiA8L3A+CisgICAqCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIGZpbmFsaXphdGlvbiBmYWlsZWQuCisgICAqLworICB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIGJ5dGUgc3RvcmFnZSBoYXMgYmVlbiBmaW5hbGl6ZWQuCisgICAqLworICBib29sZWFuIGlzRmluaXNoZWQoKTsKKworICAvKioKKyAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSB1bmRlcmx5aW5nIGJ5dGUgc3RvcmFnZSB0byB3cml0ZSB0aGUgYmxvY2sgYXQuCisgICAqIEBwYXJhbSBzaXplIFNpemUgb2YgcmVnaW9uIHRvIGNoZWNrLgorICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlZ2lvbiBzdGFydGluZyB3aXRoIHBvc2l0aW9ucyBvbmx5IGNvbnRhaW5zIHplcm9zCisgICAqLworICBib29sZWFuIGlzQmxhbmsobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKTsKKworICAvKioKKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbnRlciBzdG9yYWdlIG9ubHkgY29udGFpbnMgemVyb3MKKyAgICovCisgIGJvb2xlYW4gaXNCbGFuaygpOworCisgIC8qKgorICAgKiBEZWxldGUgYnl0ZSBzdG9yYWdlIGluZm9ybWF0aW9uCisgICAqLworICB2b2lkIGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvRW5kR2FtZVN0cmF0ZWd5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L0VuZEdhbWVTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWM4NmQKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L0VuZEdhbWVTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgRW5kR2FtZVN0cmF0ZWd5IHsKKworICBSZXF1ZXN0c0NvbGxlY3Rpb24gY29sbGVjdFJlcXVlc3RzKFBpZWNlW10gYWxsUGllY2VzLCBMaXN0PFNoYXJpbmdQZWVyPiBjb25uZWN0ZWRQZWVycyk7CisKK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvRW5kR2FtZVN0cmF0ZWd5SW1wbC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9FbmRHYW1lU3RyYXRlZ3lJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjMDU4OQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvRW5kR2FtZVN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5wZWVyLlNoYXJpbmdQZWVyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBFbmRHYW1lU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgRW5kR2FtZVN0cmF0ZWd5IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOworCisgIHByaXZhdGUgZmluYWwgaW50IHBlZXJzUGVyUGllY2U7CisKKyAgcHVibGljIEVuZEdhbWVTdHJhdGVneUltcGwoaW50IHBlZXJzUGVyUGllY2UpIHsKKyAgICB0aGlzLnBlZXJzUGVyUGllY2UgPSBwZWVyc1BlclBpZWNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXF1ZXN0c0NvbGxlY3Rpb24gY29sbGVjdFJlcXVlc3RzKFBpZWNlW10gYWxsUGllY2VzLCBMaXN0PFNoYXJpbmdQZWVyPiBjb25uZWN0ZWRQZWVycykgeworICAgIExpc3Q8U2hhcmluZ1BlZXI+IHNvcnRlZCA9IG5ldyBBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KGNvbm5lY3RlZFBlZXJzKTsKKyAgICBNYXA8UGllY2UsIExpc3Q8U2hhcmluZ1BlZXI+PiBzZWxlY3RlZFBpZWNlcyA9IG5ldyBIYXNoTWFwPFBpZWNlLCBMaXN0PFNoYXJpbmdQZWVyPj4oKTsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZCwgbmV3IENvbXBhcmF0b3I8U2hhcmluZ1BlZXI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2hhcmluZ1BlZXIgbzEsIFNoYXJpbmdQZWVyIG8yKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YobzEuZ2V0RG93bmxvYWRlZFBpZWNlc0NvdW50KCkpLmNvbXBhcmVUbyhvMi5nZXREb3dubG9hZGVkUGllY2VzQ291bnQoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgZm9yIChQaWVjZSBwaWVjZSA6IGFsbFBpZWNlcykgeworICAgICAgaWYgKHBpZWNlLmlzVmFsaWQoKSkgY29udGludWU7CisKKyAgICAgIC8vaWYgd2UgZG9uJ3QgaGF2ZSBwaWVjZSwgdGhlbiByZXF1ZXN0IHRoaXMgcGllY2UgZnJvbSB0d28gcmFuZG9tIHBlZXJzCisgICAgICAvLyhwZWVycyBhcmUgc2VsZWN0ZWQgYnkgcGVlciByYW5rLCBwZWVyIHdpdGggYmV0dGVyIHJhbmsgd2lsbCBiZSBzZWxlY3RlZCBtb3JlIG9mdGVuIHRoZW4gcGVlciB3aXRoIGJhZCByYW5rCisgICAgICBMaXN0PFNoYXJpbmdQZWVyPiBzZWxlY3RlZFBlZXJzID0gc2VsZWN0R29vZFBlZXJzKHBpZWNlLCBwZWVyc1BlclBpZWNlLCBzb3J0ZWQpOworICAgICAgc2VsZWN0ZWRQaWVjZXMucHV0KHBpZWNlLCBzZWxlY3RlZFBlZXJzKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZXF1ZXN0c0NvbGxlY3Rpb25JbXBsKHNlbGVjdGVkUGllY2VzKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTaGFyaW5nUGVlcj4gc2VsZWN0R29vZFBlZXJzKFBpZWNlIHBpZWNlLCBpbnQgY291bnQsIExpc3Q8U2hhcmluZ1BlZXI+IHNvcnRlZFBlZXJzKSB7CisgICAgTGlzdDxTaGFyaW5nUGVlcj4gbm90U2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFNoYXJpbmdQZWVyPihzb3J0ZWRQZWVycyk7CisgICAgSXRlcmF0b3I8U2hhcmluZ1BlZXI+IGl0ZXJhdG9yID0gbm90U2VsZWN0ZWQuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBTaGFyaW5nUGVlciBwZWVyID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgYm9vbGVhbiBwZWVySGFzQ3VycmVudFBpZWNlID0gcGVlci5nZXRBdmFpbGFibGVQaWVjZXMoKS5nZXQocGllY2UuZ2V0SW5kZXgoKSk7CisgICAgICBib29sZWFuIGFscmVhZHlSZXF1ZXN0ZWQgPSBwZWVyLmdldFJlcXVlc3RlZFBpZWNlcygpLmNvbnRhaW5zKHBpZWNlKTsKKworICAgICAgaWYgKCFwZWVySGFzQ3VycmVudFBpZWNlIHx8IGFscmVhZHlSZXF1ZXN0ZWQpIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgIH0KKyAgICBpZiAobm90U2VsZWN0ZWQuc2l6ZSgpIDw9IGNvdW50KSByZXR1cm4gbm90U2VsZWN0ZWQ7CisKKyAgICBMaXN0PFNoYXJpbmdQZWVyPiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U2hhcmluZ1BlZXI+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBTaGFyaW5nUGVlciBzaGFyaW5nUGVlciA9IHNlbGVjdFBlZXIobm90U2VsZWN0ZWQpOworICAgICAgaWYgKHNoYXJpbmdQZWVyID09IG51bGwpIGNvbnRpbnVlOworICAgICAgbm90U2VsZWN0ZWQucmVtb3ZlKHNoYXJpbmdQZWVyKTsKKyAgICAgIHNlbGVjdGVkLmFkZChzaGFyaW5nUGVlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNlbGVjdGVkOworICB9CisKKyAgcHJpdmF0ZSBTaGFyaW5nUGVlciBzZWxlY3RQZWVyKExpc3Q8U2hhcmluZ1BlZXI+IG5vdFNlbGVjdGVkKSB7CisgICAgZm9yIChTaGFyaW5nUGVlciBzaGFyaW5nUGVlciA6IG5vdFNlbGVjdGVkKSB7CisgICAgICBpZiAoUkFORE9NLm5leHREb3VibGUoKSA8IDAuOCkgeworICAgICAgICByZXR1cm4gc2hhcmluZ1BlZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBub3RTZWxlY3RlZC5nZXQoUkFORE9NLm5leHRJbnQobm90U2VsZWN0ZWQuc2l6ZSgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTNiODYKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGEgcGllY2UgcmVxdWVzdCBzdHJhdGVneSBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIGNqbWFsbG95CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdFN0cmF0ZWd5IHsKKworICAvKioKKyAgICogQ2hvb3NlIGEgcGllY2UgZnJvbSB0aGUgcmVtYWluaW5nIHBpZWNlcy4KKyAgICoKKyAgICogQHBhcmFtIGludGVyZXN0aW5nIEEgc2V0IG9mIHRoZSBpbmRleCBvZiBhbGwgaW50ZXJlc3RpbmcgcGllY2VzCisgICAqIEBwYXJhbSBwaWVjZXMgICAgICBUaGUgY29tcGxldGUgYXJyYXkgb2YgcGllY2VzCisgICAqIEByZXR1cm4gVGhlIGNob3NlbiBwaWVjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcGllY2UgaXMgaW50ZXJlc3RpbmcKKyAgICovCisgIFBpZWNlIGNob29zZVBpZWNlKEJpdFNldCBpbnRlcmVzdGluZywgUGllY2VbXSBwaWVjZXMpOworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3RpbmcuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhOGFlNAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3k7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuUGllY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworcHVibGljIGNsYXNzIFJlcXVlc3RTdHJhdGVneUltcGxBbnlJbnRlcmVzdGluZyBpbXBsZW1lbnRzIFJlcXVlc3RTdHJhdGVneSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBSYW5kb20gbXlSYW5kb20gPSBuZXcgUmFuZG9tKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQaWVjZSBjaG9vc2VQaWVjZShCaXRTZXQgaW50ZXJlc3RpbmcsIFBpZWNlW10gcGllY2VzKSB7CisgICAgTGlzdDxQaWVjZT4gb25seUludGVyZXN0aW5nUGllY2VzID0gbmV3IEFycmF5TGlzdDxQaWVjZT4oKTsKKyAgICBmb3IgKFBpZWNlIHAgOiBwaWVjZXMpIHsKKyAgICAgIGlmIChpbnRlcmVzdGluZy5nZXQocC5nZXRJbmRleCgpKSkgb25seUludGVyZXN0aW5nUGllY2VzLmFkZChwKTsKKyAgICB9CisgICAgaWYgKG9ubHlJbnRlcmVzdGluZ1BpZWNlcy5pc0VtcHR5KCkpIHJldHVybiBudWxsOworICAgIHJldHVybiBvbmx5SW50ZXJlc3RpbmdQaWVjZXMuZ2V0KG15UmFuZG9tLm5leHRJbnQob25seUludGVyZXN0aW5nUGllY2VzLnNpemUoKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxTZXF1ZW50aWFsLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RTdHJhdGVneUltcGxTZXF1ZW50aWFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiYzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbFNlcXVlbnRpYWwuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKKworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKKy8qKgorICogQSBzZXF1ZW50aWFsIHJlcXVlc3Qgc3RyYXRlZ3kgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBjam1hbGxveQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFN0cmF0ZWd5SW1wbFNlcXVlbnRpYWwgaW1wbGVtZW50cyBSZXF1ZXN0U3RyYXRlZ3kgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGllY2UgY2hvb3NlUGllY2UoQml0U2V0IGludGVyZXN0aW5nLCBQaWVjZVtdIHBpZWNlcykgeworCisgICAgZm9yIChQaWVjZSBwIDogcGllY2VzKSB7CisgICAgICBpZiAoaW50ZXJlc3RpbmcuZ2V0KHAuZ2V0SW5kZXgoKSkpIHJldHVybiBwOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0c0NvbGxlY3Rpb24uamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdHNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI0MTg0OQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdHNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLTIwMTggSmV0QnJhaW5zIHMuci5vLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RyYXRlZ3k7CisKK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdHNDb2xsZWN0aW9uIHsKKworICB2b2lkIHNlbmRBbGxSZXF1ZXN0cygpOworCisgIGZpbmFsIGNsYXNzIEVtcHR5IGltcGxlbWVudHMgUmVxdWVzdHNDb2xsZWN0aW9uIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRW1wdHkgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKKworICAgIHByaXZhdGUgRW1wdHkoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEFsbFJlcXVlc3RzKCkgeworICAgICAgLy9kbyBub3RoaW5nCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RzQ29sbGVjdGlvbkltcGwuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdHNDb2xsZWN0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMThlM2EKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0cmF0ZWd5L1JlcXVlc3RzQ29sbGVjdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAtMjAxOCBKZXRCcmFpbnMgcy5yLm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5zdHJhdGVneTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5QaWVjZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0c0NvbGxlY3Rpb25JbXBsIGltcGxlbWVudHMgUmVxdWVzdHNDb2xsZWN0aW9uIHsKKworICBwcml2YXRlIGZpbmFsIE1hcDxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+IHNlbGVjdGVkUGllY2VzOworCisgIHB1YmxpYyBSZXF1ZXN0c0NvbGxlY3Rpb25JbXBsKE1hcDxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+IHNlbGVjdGVkUGllY2VzKSB7CisgICAgdGhpcy5zZWxlY3RlZFBpZWNlcyA9IHNlbGVjdGVkUGllY2VzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRBbGxSZXF1ZXN0cygpIHsKKyAgICBmb3IgKE1hcC5FbnRyeTxQaWVjZSwgTGlzdDxTaGFyaW5nUGVlcj4+IGVudHJ5IDogc2VsZWN0ZWRQaWVjZXMuZW50cnlTZXQoKSkgeworICAgICAgUGllY2UgcGllY2UgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGZvciAoU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgIHNoYXJpbmdQZWVyLmRvd25sb2FkUGllY2UocGllY2UpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9CeXRlQXJyYXlTdG9yYWdlLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L0J5dGVBcnJheVN0b3JhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgzMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9CeXRlQXJyYXlTdG9yYWdlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZS5Ub3JyZW50Qnl0ZVN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBCeXRlQXJyYXlTdG9yYWdlIGltcGxlbWVudHMgVG9ycmVudEJ5dGVTdG9yYWdlIHsKKworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBhcnJheTsKKyAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBpc0JsYW5rOworCisgIHB1YmxpYyBCeXRlQXJyYXlTdG9yYWdlKGludCBtYXhTaXplKSB7CisgICAgYXJyYXkgPSBuZXcgYnl0ZVttYXhTaXplXTsKKyAgICBpc0JsYW5rID0gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKGJvb2xlYW4gc2VlZGVyKSB7CisgIH0KKworICBwcml2YXRlIGludCBpbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uKSB7CisgICAgaWYgKHBvc2l0aW9uID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgcG9zaXRpb24gPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQb3NpdGlvbiBpcyB0b28gbGFyZ2UiKTsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpIHBvc2l0aW9uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgeworCisgICAgaW50IHBvcyA9IGludFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKyAgICBidWZmZXIucHV0KEFycmF5cy5jb3B5T2ZSYW5nZShhcnJheSwgcG9zLCBwb3MgKyBieXRlc0NvdW50KSk7CisgICAgcmV0dXJuIGJ5dGVzQ291bnQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJsb2NrLCBsb25nIHBvc2l0aW9uKSB7CisgICAgaW50IHBvcyA9IGludFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IGJsb2NrLnJlbWFpbmluZygpOworICAgIGJ5dGVbXSB0b1dyaXRlID0gbmV3IGJ5dGVbYnl0ZXNDb3VudF07CisgICAgYmxvY2suZ2V0KHRvV3JpdGUpOworICAgIFN5c3RlbS5hcnJheWNvcHkodG9Xcml0ZSwgMCwgYXJyYXksIHBvcywgdG9Xcml0ZS5sZW5ndGgpOworICAgIGlzQmxhbmsgPSBmYWxzZTsKKyAgICByZXR1cm4gYnl0ZXNDb3VudDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgZmluaXNoZWQgPSB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgcmV0dXJuIGZpbmlzaGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQmxhbmsobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKSB7CisgICAgcmV0dXJuIGlzQmxhbms7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNCbGFuaygpIHsKKyAgICByZXR1cm4gaXNCbGFuazsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRXZlbnREaXNwYXRjaGVyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9FdmVudERpc3BhdGNoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkZThlYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvRXZlbnREaXNwYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMC0yMDE4IEpldEJyYWlucyBzLnIuby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK0BUZXN0CitwdWJsaWMgY2xhc3MgRXZlbnREaXNwYXRjaGVyVGVzdCB7CisKKyAgcHJpdmF0ZSBFdmVudERpc3BhdGNoZXIgZXZlbnREaXNwYXRjaGVyOworICBwcml2YXRlIFBlZXJJbmZvcm1hdGlvbiBwZWVySW5mbzsKKyAgcHJpdmF0ZSBQaWVjZUluZm9ybWF0aW9uIHBpZWNlSW5mbzsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIGV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKworICAgIHBlZXJJbmZvID0gbW9jayhQZWVySW5mb3JtYXRpb24uY2xhc3MpOworICAgIHBpZWNlSW5mbyA9IG1vY2soUGllY2VJbmZvcm1hdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dExpc3RlbmVycygpIHsKKworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLmRvd25sb2FkRmFpbGVkKG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBlZXJDb25uZWN0ZWQocGVlckluZm8pOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnZhbGlkYXRpb25Db21wbGV0ZSgxLCA0KTsKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5waWVjZURvd25sb2FkZWQocGllY2VJbmZvLCBwZWVySW5mbyk7CisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkuZG93bmxvYWRDb21wbGV0ZSgpOworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBpZWNlUmVjZWl2ZWQocGllY2VJbmZvLCBwZWVySW5mbyk7CisgICAgZXZlbnREaXNwYXRjaGVyLm11bHRpY2FzdGVyKCkucGVlckRpc2Nvbm5lY3RlZChwZWVySW5mbyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW52b2NhdGlvbigpIHsKKworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgaW52b2NhdGlvbkNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBpbnQgY291bnQgPSA1OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgZXZlbnREaXNwYXRjaGVyLmFkZExpc3RlbmVyKG5ldyBUb3JyZW50TGlzdGVuZXJXcmFwcGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZG93bmxvYWRDb21wbGV0ZSgpIHsKKyAgICAgICAgICBpbnZvY2F0aW9uQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIGV2ZW50RGlzcGF0Y2hlci5tdWx0aWNhc3RlcigpLnBlZXJDb25uZWN0ZWQocGVlckluZm8pOworCisgICAgYXNzZXJ0RXF1YWxzKGludm9jYXRpb25Db3VudC5nZXQoKSwgMCk7CisKKyAgICBldmVudERpc3BhdGNoZXIubXVsdGljYXN0ZXIoKS5kb3dubG9hZENvbXBsZXRlKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoaW52b2NhdGlvbkNvdW50LmdldCgpLCBjb3VudCk7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2VUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L1BlZXJzU3RvcmFnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU1ZThmCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9QZWVyc1N0b3JhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQ7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5QZWVyQWN0aXZpdHlMaXN0ZW5lcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jbGllbnQucGVlci5TaGFyaW5nUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlclVJRDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5CeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBQZWVyc1N0b3JhZ2VUZXN0IHsKKworICBwcml2YXRlIFBlZXJzU3RvcmFnZSBteVBlZXJzU3RvcmFnZTsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXlQZWVyc1N0b3JhZ2UgPSBuZXcgUGVlcnNTdG9yYWdlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBnZXRTZXRTZWxmVGVzdCgpIHsKKworICAgIGFzc2VydE51bGwobXlQZWVyc1N0b3JhZ2UuZ2V0U2VsZigpKTsKKyAgICBQZWVyIHNlbGYgPSBuZXcgUGVlcigiIiwgMSk7CisgICAgbXlQZWVyc1N0b3JhZ2Uuc2V0U2VsZihzZWxmKTsKKyAgICBhc3NlcnRFcXVhbHMobXlQZWVyc1N0b3JhZ2UuZ2V0U2VsZigpLCBzZWxmKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0UGVlcnNTdG9yYWdlUmV0dXJuTmV3Q29sbGVjdGlvbigpIHsKKyAgICBTaGFyaW5nUGVlciBzaGFyaW5nUGVlciA9IGdldE1vY2tTaGFyaW5nUGVlcigpOworICAgIG15UGVlcnNTdG9yYWdlLnB1dElmQWJzZW50KG5ldyBQZWVyVUlEKG5ldyBJbmV0U29ja2V0QWRkcmVzcygiMTI3LjAuMC4xIiwgNjg4MSksICIiKSwgc2hhcmluZ1BlZXIpOworICAgIENvbGxlY3Rpb248U2hhcmluZ1BlZXI+IHNoYXJpbmdQZWVycyA9IG15UGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIG15UGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHNoYXJpbmdQZWVycy5zaXplKCkpOworCisgICAgc2hhcmluZ1BlZXJzLmFkZChzaGFyaW5nUGVlcik7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgbXlQZWVyc1N0b3JhZ2UuZ2V0U2hhcmluZ1BlZXJzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgc2hhcmluZ1BlZXJzLnNpemUoKSk7CisgIH0KKworICBwcml2YXRlIFNoYXJpbmdQZWVyIGdldE1vY2tTaGFyaW5nUGVlcigpIHsKKyAgICByZXR1cm4gbmV3IFNoYXJpbmdQZWVyKCIxIiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgbW9jayhTaGFyZWRUb3JyZW50LmNsYXNzKSwKKyAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICBtb2NrKFBlZXJBY3Rpdml0eUxpc3RlbmVyLmNsYXNzKSwKKyAgICAgICAgICAgIG1vY2soQnl0ZUNoYW5uZWwuY2xhc3MpLCAiVE8iLCAxMjM0KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGdldEFuZFJlbW92ZVNoYXJpbmdQZWVyc1Rlc3QoKSB7CisgICAgU2hhcmluZ1BlZXIgc2hhcmluZ1BlZXIgPSBnZXRNb2NrU2hhcmluZ1BlZXIoKTsKKyAgICBQZWVyVUlEIHBlZXJVaWQgPSBuZXcgUGVlclVJRChuZXcgSW5ldFNvY2tldEFkZHJlc3MoIjEyNy4wLjAuMSIsIDY4ODEpLCAiIik7CisgICAgU2hhcmluZ1BlZXIgb2xkUGVlciA9IG15UGVlcnNTdG9yYWdlLnB1dElmQWJzZW50KHBlZXJVaWQsIHNoYXJpbmdQZWVyKTsKKworICAgIGFzc2VydE51bGwob2xkUGVlcik7CisgICAgYXNzZXJ0RXF1YWxzKG15UGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVyKHBlZXJVaWQpLCBzaGFyaW5nUGVlcik7CisKKyAgICBhc3NlcnRFcXVhbHMobXlQZWVyc1N0b3JhZ2UucmVtb3ZlU2hhcmluZ1BlZXIocGVlclVpZCksIHNoYXJpbmdQZWVyKTsKKyAgICBhc3NlcnROdWxsKG15UGVlcnNTdG9yYWdlLnJlbW92ZVNoYXJpbmdQZWVyKHBlZXJVaWQpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVJlY2VpdmVyVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9uZXR3b3JrL0hhbmRzaGFrZVJlY2VpdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzg0OWEKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L25ldHdvcmsvSGFuZHNoYWtlUmVjZWl2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODcgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lm5ldHdvcms7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5UZW1wRmlsZXM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50Lio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuUGVlckFjdGl2aXR5TGlzdGVuZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnBlZXIuU2hhcmluZ1BlZXI7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuRmFpclBpZWNlU3RvcmFnZUZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0b3JhZ2UuRmlsZUNvbGxlY3Rpb25TdG9yYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5QZWVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50Q3JlYXRvcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50U2VyaWFsaXplcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5uZXR3b3JrLkNvbm5lY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlBpcGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBIYW5kc2hha2VSZWNlaXZlclRlc3QgeworCisgIHByaXZhdGUgSGFuZHNoYWtlUmVjZWl2ZXIgbXlIYW5kc2hha2VSZWNlaXZlcjsKKyAgcHJpdmF0ZSBieXRlW10gbXlTZWxmSWQ7CisgIHByaXZhdGUgQ29udGV4dCBteUNvbnRleHQ7CisgIHByaXZhdGUgVGVtcEZpbGVzIG15VGVtcEZpbGVzOworCisgIHB1YmxpYyBIYW5kc2hha2VSZWNlaXZlclRlc3QoKSB7CisgICAgaWYgKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0QWxsQXBwZW5kZXJzKCkuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICByZXR1cm47CisgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKG5ldyBDb25zb2xlQXBwZW5kZXIobmV3IFBhdHRlcm5MYXlvdXQoIlslZHtNTWRkIEhIOm1tOnNzLFNTU30gJXRdICU2cCAtICUyMC4yMGMgLSAlbSAlbiIpKSk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXlUZW1wRmlsZXMgPSBuZXcgVGVtcEZpbGVzKCk7CisgICAgTG9nZ2VyLmdldFJvb3RMb2dnZXIoKS5zZXRMZXZlbChVdGlscy5nZXRMb2dMZXZlbCgpKTsKKyAgICBteVNlbGZJZCA9ICJzZWxmSWQxc2VsZklkMnNlbGZJZCIuZ2V0Qnl0ZXMoKTsKKyAgICBCeXRlQnVmZmVyIHNlbGZJZCA9IEJ5dGVCdWZmZXIud3JhcChteVNlbGZJZCk7CisgICAgbXlDb250ZXh0ID0gbW9jayhDb250ZXh0LmNsYXNzKTsKKyAgICBQZWVyc1N0b3JhZ2UgcGVlcnNTdG9yYWdlID0gbmV3IFBlZXJzU3RvcmFnZSgpOworICAgIFRvcnJlbnRzU3RvcmFnZSB0b3JyZW50c1N0b3JhZ2UgPSBuZXcgVG9ycmVudHNTdG9yYWdlKCk7CisgICAgd2hlbihteUNvbnRleHQuZ2V0UGVlcnNTdG9yYWdlKCkpLnRoZW5SZXR1cm4ocGVlcnNTdG9yYWdlKTsKKyAgICB3aGVuKG15Q29udGV4dC5nZXRUb3JyZW50c1N0b3JhZ2UoKSkudGhlblJldHVybih0b3JyZW50c1N0b3JhZ2UpOworICAgIHBlZXJzU3RvcmFnZS5zZXRTZWxmKG5ldyBQZWVyKCIxMjcuMC4wLjEiLCA1NDY0NSwgc2VsZklkKSk7CisgICAgQ29tbXVuaWNhdGlvbk1hbmFnZXIgY29tbXVuaWNhdGlvbk1hbmFnZXIgPSBtb2NrKENvbW11bmljYXRpb25NYW5hZ2VyLmNsYXNzKTsKKyAgICB3aGVuKGNvbW11bmljYXRpb25NYW5hZ2VyLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkpLnRoZW5SZXR1cm4obW9jayhDb25uZWN0aW9uTWFuYWdlci5jbGFzcykpOworICAgIG15SGFuZHNoYWtlUmVjZWl2ZXIgPSBuZXcgSGFuZHNoYWtlUmVjZWl2ZXIoCisgICAgICAgICAgICBteUNvbnRleHQsCisgICAgICAgICAgICAiMTI3LjAuMC4xIiwKKyAgICAgICAgICAgIDQ1NjY0LAorICAgICAgICAgICAgZmFsc2UpOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXlUZW1wRmlsZXMuY2xlYW51cCgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVIYW5kc2hha2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBQaXBlIHAxID0gUGlwZS5vcGVuKCk7CisgICAgUGlwZSBwMiA9IFBpcGUub3BlbigpOworICAgIEJ5dGVDaGFubmVsIGNsaWVudCA9IG5ldyBCeXRlU291cmNlQ2hhbm5lbChwMS5zb3VyY2UoKSwgcDIuc2luaygpKTsKKyAgICBCeXRlQ2hhbm5lbCBzZXJ2ZXIgPSBuZXcgQnl0ZVNvdXJjZUNoYW5uZWwocDIuc291cmNlKCksIHAxLnNpbmsoKSk7CisgICAgU3RyaW5nIHBlZXJJZFN0ciA9ICJwZWVySWRwZWVySWRwZWVySWQyMiI7CisgICAgU3RyaW5nIHRvcnJlbnRIYXNoU3RyID0gInRvcnJlbnR0b3JyZW50dG9ycmVuIjsKKyAgICBieXRlW10gcGVlcklkID0gcGVlcklkU3RyLmdldEJ5dGVzKCk7CisgICAgYnl0ZVtdIHRvcnJlbnRIYXNoID0gdG9ycmVudEhhc2hTdHIuZ2V0Qnl0ZXMoKTsKKyAgICBIYW5kc2hha2UgaHMgPSBIYW5kc2hha2UuY3JhZnQodG9ycmVudEhhc2gsIHBlZXJJZCk7CisKKyAgICBpZiAoaHMgPT0gbnVsbCkgeworICAgICAgZmFpbCgiSGFuZHNoYWtlIGluc3RhbmNlIGlzIG51bGwiKTsKKyAgICB9CisKKyAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBocy5nZXREYXRhKCk7CisgICAgY2xpZW50LndyaXRlKGJ5dGVCdWZmZXIpOworCisgICAgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG15VGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKDEwMjQgKiAxMDI0KTsKKyAgICBUb3JyZW50TWV0YWRhdGEgdG9ycmVudCA9IFRvcnJlbnRDcmVhdG9yLmNyZWF0ZSh0ZW1wRmlsZSwgVVJJLmNyZWF0ZSgiIiksICJ0ZXN0Iik7CisgICAgRmlsZSB0b3JyZW50RmlsZSA9IG15VGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0b3JyZW50RmlsZSk7CisgICAgZm9zLndyaXRlKG5ldyBUb3JyZW50U2VyaWFsaXplcigpLnNlcmlhbGl6ZSh0b3JyZW50KSk7CisgICAgZm9zLmNsb3NlKCk7CisKKyAgICBmaW5hbCBMb2FkZWRUb3JyZW50IGxvYWRlZFRvcnJlbnQgPSBtb2NrKExvYWRlZFRvcnJlbnQuY2xhc3MpOworICAgIGZpbmFsIFNoYXJlZFRvcnJlbnQgc2hhcmVkVG9ycmVudCA9CisgICAgICAgICAgICBTaGFyZWRUb3JyZW50LmZyb21GaWxlKHRvcnJlbnRGaWxlLAorICAgICAgICAgICAgICAgICAgICBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVTdG9yYWdlKHRvcnJlbnQsIEZpbGVDb2xsZWN0aW9uU3RvcmFnZS5jcmVhdGUodG9ycmVudCwgdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpKSksCisgICAgICAgICAgICAgICAgICAgIGxvYWRlZFRvcnJlbnQuZ2V0VG9ycmVudFN0YXRpc3RpYygpKTsKKworICAgIFRvcnJlbnRMb2FkZXIgdG9ycmVudHNMb2FkZXIgPSBtb2NrKFRvcnJlbnRMb2FkZXIuY2xhc3MpOworICAgIHdoZW4odG9ycmVudHNMb2FkZXIubG9hZFRvcnJlbnQobG9hZGVkVG9ycmVudCkpLnRoZW5SZXR1cm4oc2hhcmVkVG9ycmVudCk7CisgICAgd2hlbihteUNvbnRleHQuZ2V0VG9ycmVudExvYWRlcigpKS50aGVuUmV0dXJuKHRvcnJlbnRzTG9hZGVyKTsKKyAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKTsKKyAgICB3aGVuKG15Q29udGV4dC5nZXRFeGVjdXRvcigpKS50aGVuUmV0dXJuKGV4ZWN1dG9yU2VydmljZSk7CisgICAgbXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmFkZFRvcnJlbnQoaHMuZ2V0SGV4SW5mb0hhc2goKSwgbG9hZGVkVG9ycmVudCk7CisKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkSW52b2tlciA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgIGZpbmFsIFNlbWFwaG9yZSBzZW1hcGhvcmUgPSBuZXcgU2VtYXBob3JlKDApOworICAgIHdoZW4obXlDb250ZXh0LmNyZWF0ZVNoYXJpbmdQZWVyKGFueShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgYW55SW50KCksCisgICAgICAgICAgICBhbnkoQnl0ZUJ1ZmZlci5jbGFzcyksCisgICAgICAgICAgICBhbnkoU2hhcmVkVG9ycmVudC5jbGFzcyksCisgICAgICAgICAgICBhbnkoQnl0ZUNoYW5uZWwuY2xhc3MpLAorICAgICAgICAgICAgYW55KFN0cmluZy5jbGFzcyksCisgICAgICAgICAgICBhbnlJbnQoKSkpCisgICAgICAgICAgICAudGhlblJldHVybihuZXcgU2hhcmluZ1BlZXIoIjEyNy4wLjAuMSIsIDY4ODEsIEJ5dGVCdWZmZXIud3JhcChwZWVySWQpLCBzaGFyZWRUb3JyZW50LCBudWxsLAorICAgICAgICAgICAgICAgICAgICBtb2NrKFBlZXJBY3Rpdml0eUxpc3RlbmVyLmNsYXNzKSwgc2VydmVyLCAiVE8iLCAxMjM0KSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgpIHsKKyAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZEludm9rZXIuc2V0KHRydWUpOworICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgUGVlcnNTdG9yYWdlIHBlZXJzU3RvcmFnZSA9IG15Q29udGV4dC5nZXRQZWVyc1N0b3JhZ2UoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbXlDb250ZXh0LmdldFRvcnJlbnRzU3RvcmFnZSgpLmFjdGl2ZVRvcnJlbnRzKCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocGVlcnNTdG9yYWdlLmdldFNoYXJpbmdQZWVycygpLnNpemUoKSwgMCk7CisgICAgbXlIYW5kc2hha2VSZWNlaXZlci5wcm9jZXNzQW5kR2V0TmV4dChzZXJ2ZXIpOworICAgIGFzc2VydEVxdWFscyhwZWVyc1N0b3JhZ2UuZ2V0U2hhcmluZ1BlZXJzKCkuc2l6ZSgpLCAxKTsKKyAgICBCeXRlQnVmZmVyIGFuc3dlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZUJ1ZmZlci5jYXBhY2l0eSgpKTsKKyAgICBjbGllbnQucmVhZChhbnN3ZXIpOworICAgIGFuc3dlci5yZXdpbmQoKTsKKyAgICBIYW5kc2hha2UgYW5zd2VySHMgPSBIYW5kc2hha2UucGFyc2UoYW5zd2VyKTsKKyAgICBhc3NlcnRFcXVhbHMoYW5zd2VySHMuZ2V0UGVlcklkKCksIG15U2VsZklkKTsKKyAgICBzZW1hcGhvcmUudHJ5QWNxdWlyZSgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICBhc3NlcnRUcnVlKG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkSW52b2tlci5nZXQoKSk7CisgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgIH0KKworICAvLyBUT0RPOiAxMS8xNS8xNyBiYWQgdGVzdHMgKGUuZy4gaW5jb3JyZWN0IHRvcnJlbnRJRCwgaW5jb3JyZWN0IGhhbmRzaGFrZSwgZXRjCisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnl0ZVNvdXJjZUNoYW5uZWwgaW1wbGVtZW50cyBCeXRlQ2hhbm5lbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFBpcGUuU291cmNlQ2hhbm5lbCByZWFkQ2hhbm5lbDsKKyAgICBwcml2YXRlIGZpbmFsIFBpcGUuU2lua0NoYW5uZWwgd3JpdGVDaGFubmVsOworCisgICAgcHVibGljIEJ5dGVTb3VyY2VDaGFubmVsKFBpcGUuU291cmNlQ2hhbm5lbCByZWFkQ2hhbm5lbCwgUGlwZS5TaW5rQ2hhbm5lbCB3cml0ZUNoYW5uZWwpIHsKKyAgICAgIHRoaXMucmVhZENoYW5uZWwgPSByZWFkQ2hhbm5lbDsKKyAgICAgIHRoaXMud3JpdGVDaGFubmVsID0gd3JpdGVDaGFubmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiByZWFkQ2hhbm5lbC5yZWFkKGRzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiB0aGlzLndyaXRlQ2hhbm5lbC53cml0ZShzcmMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJub3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZWFkQ2hhbm5lbC5jbG9zZSgpOworICAgICAgd3JpdGVDaGFubmVsLmNsb3NlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnlUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvRmFpclBpZWNlU3RvcmFnZUZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzNTUwNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GYWlyUGllY2VTdG9yYWdlRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50RmlsZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudE1ldGFkYXRhOworaW1wb3J0IG9yZy5qZXRicmFpbnMuYW5ub3RhdGlvbnMuTm90TnVsbDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBGYWlyUGllY2VTdG9yYWdlRmFjdG9yeVRlc3QgeworCisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGluZ1N0b3JhZ2VGb3JMYXJnZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCisgICAgaW50IHBpZWNlTGVuZ3RoID0gMTAyNCAqIDEwMjQ7CisgICAgaW50IHBpZWNlQ291bnQgPSAzMDAwOworCisgICAgLy9sYXN0IHBpZWNlIGNhbiBoYXZlIG5vdCBmdWxseSBzaXplCisgICAgZmluYWwgaW50IGxhc3RQaWVjZUxlbmd0aCA9IHBpZWNlTGVuZ3RoIC8gMjsKKyAgICBsb25nIHRvdGFsU2l6ZSA9IChsb25nKSAocGllY2VDb3VudCAtIDEpICogcGllY2VMZW5ndGggKyBsYXN0UGllY2VMZW5ndGg7CisKKyAgICBUb3JyZW50TWV0YWRhdGEgbWV0YWRhdGEgPSBtb2NrKFRvcnJlbnRNZXRhZGF0YS5jbGFzcyk7CisgICAgd2hlbihtZXRhZGF0YS5nZXRQaWVjZUxlbmd0aCgpKS50aGVuUmV0dXJuKHBpZWNlTGVuZ3RoKTsKKyAgICB3aGVuKG1ldGFkYXRhLmdldFBpZWNlc0NvdW50KCkpLnRoZW5SZXR1cm4ocGllY2VDb3VudCk7CisgICAgd2hlbihtZXRhZGF0YS5nZXRGaWxlcygpKS50aGVuUmV0dXJuKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFRvcnJlbnRGaWxlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInRlc3QuYXZpIiksIHRvdGFsU2l6ZSwgIiIpKSk7CisgICAgd2hlbihtZXRhZGF0YS5nZXRQaWVjZXNIYXNoZXMoKSkudGhlblJldHVybihuZXcgYnl0ZVtwaWVjZUNvdW50ICogMjBdKTsKKworICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNSZWFkSW52b2tlZEZvckxhc3RQaWVjZSA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBUb3JyZW50Qnl0ZVN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBUb3JyZW50Qnl0ZVN0b3JhZ2UoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9wZW4oYm9vbGVhbiBzZWVkZXIpIHsKKworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikgeworICAgICAgICBpZiAoYnVmZmVyLmNhcGFjaXR5KCkgPT0gbGFzdFBpZWNlTGVuZ3RoKSB7CisgICAgICAgICAgaXNSZWFkSW52b2tlZEZvckxhc3RQaWVjZS5zZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLnB1dEludCgxKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJsb2NrLCBsb25nIHBvc2l0aW9uKSB7CisgICAgICAgIHRocm93IG5vdEltcGxlbWVudGVkKCk7CisgICAgICB9CisKKyAgICAgIEBOb3ROdWxsCisgICAgICBwcml2YXRlIFJ1bnRpbWVFeGNlcHRpb24gbm90SW1wbGVtZW50ZWQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUnVudGltZUV4Y2VwdGlvbigibm90SW1wbGVtZW50ZWQiKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIHRocm93IG5vdEltcGxlbWVudGVkKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICAgICAgdGhyb3cgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsYW5rKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gaXNCbGFuaygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgdGhyb3cgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKworICAgICAgfQorICAgIH07CisKKyAgICBQaWVjZVN0b3JhZ2UgcGllY2VTdG9yYWdlID0gRmFpclBpZWNlU3RvcmFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3RvcmFnZShtZXRhZGF0YSwgc3RvcmFnZSk7CisKKyAgICBhc3NlcnRUcnVlKGlzUmVhZEludm9rZWRGb3JMYXN0UGllY2UuZ2V0KCkpOworICAgIGFzc2VydEVxdWFscygwLCBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSk7CisgICAgYXNzZXJ0RmFsc2UocGllY2VTdG9yYWdlLmlzRmluaXNoZWQoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL0ZpbGVDb2xsZWN0aW9uU3RvcmFnZVRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlQ29sbGVjdGlvblN0b3JhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkYjcxOAotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RvcmFnZS9GaWxlQ29sbGVjdGlvblN0b3JhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LlRlbXBGaWxlczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVXNlcjogbG95ZAorICogRGF0ZTogMTEvMjQvMTMKKyAqLworcHVibGljIGNsYXNzIEZpbGVDb2xsZWN0aW9uU3RvcmFnZVRlc3QgeworCisgIHByaXZhdGUgVGVtcEZpbGVzIHRlbXBGaWxlczsKKworICBAQmVmb3JlTWV0aG9kCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIHRlbXBGaWxlcyA9IG5ldyBUZW1wRmlsZXMoKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB0ZW1wRmlsZXMuY2xlYW51cCgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIEZpbGUgZmlsZTEgPSB0ZW1wRmlsZXMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICBmaW5hbCBGaWxlIGZpbGUyID0gdGVtcEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCk7CisKKyAgICBmaW5hbCBMaXN0PEZpbGVTdG9yYWdlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZVN0b3JhZ2U+KCk7CisgICAgZmlsZXMuYWRkKG5ldyBGaWxlU3RvcmFnZShmaWxlMSwgMCwgMikpOworICAgIGZpbGVzLmFkZChuZXcgRmlsZVN0b3JhZ2UoZmlsZTIsIDIsIDIpKTsKKyAgICBmaW5hbCBGaWxlQ29sbGVjdGlvblN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBGaWxlQ29sbGVjdGlvblN0b3JhZ2UoZmlsZXMsIDQpOworCisgICAgc3RvcmFnZS5vcGVuKGZhbHNlKTsKKyAgICB0cnkgeworICAgICAgLy8gc2luY2UgYWxsIG9mIHRoZXNlIGZpbGVzIGFscmVhZHkgZXhpc3QsIHdlIGFyZSBjb25zaWRlcmVkIGZpbmlzaGVkCisgICAgICBhc3NlcnRUcnVlKHN0b3JhZ2UuaXNGaW5pc2hlZCgpKTsKKworICAgICAgLy8gd3JpdGUgdG8gZmlyc3QgZmlsZSB3b3JrcworICAgICAgd3JpdGUobmV3IGJ5dGVbXXsxLCAyfSwgMCwgc3RvcmFnZSk7CisgICAgICBjaGVjayhuZXcgYnl0ZVtdezEsIDJ9LCBmaWxlMSk7CisKKyAgICAgIC8vIHdyaXRlIHRvIHNlY29uZCBmaWxlIHdvcmtzCisgICAgICB3cml0ZShuZXcgYnl0ZVtdezUsIDZ9LCAyLCBzdG9yYWdlKTsKKyAgICAgIGNoZWNrKG5ldyBieXRlW117NSwgNn0sIGZpbGUyKTsKKworICAgICAgLy8gd3JpdGUgdG8gdHdvIGZpbGVzIHdvcmtzCisgICAgICB3cml0ZShuZXcgYnl0ZVtdezgsIDksIDEwLCAxMX0sIDAsIHN0b3JhZ2UpOworICAgICAgY2hlY2sobmV3IGJ5dGVbXXs4LCA5fSwgZmlsZTEpOworICAgICAgY2hlY2sobmV3IGJ5dGVbXXsxMCwgMTF9LCBmaWxlMik7CisKKyAgICAgIC8vIG1ha2Ugc3VyZSBwYXJ0aWFsIHdyaXRlIGludG8gbmV4dCBmaWxlIHdvcmtzCisgICAgICB3cml0ZShuZXcgYnl0ZVtdezEwMCwgMTAxLCAxMDJ9LCAwLCBzdG9yYWdlKTsKKyAgICAgIGNoZWNrKG5ldyBieXRlW117MTAyLCAxMX0sIGZpbGUyKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc3RvcmFnZS5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZShieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIEZpbGVDb2xsZWN0aW9uU3RvcmFnZSBzdG9yYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0b3JhZ2Uud3JpdGUoQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKSwgb2Zmc2V0KTsKKyAgICBzdG9yYWdlLmZpbmlzaCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrKGJ5dGVbXSBieXRlcywgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoXTsKKyAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKKyAgICBmaW5hbCBpbnQgdG90YWxSZWFkOworICAgIHRyeSB7CisgICAgICB0b3RhbFJlYWQgPSBmaWxlSW5wdXRTdHJlYW0ucmVhZCh0ZW1wKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZmlsZUlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyh0b3RhbFJlYWQsIHRlbXAubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHModGVtcCwgYnl0ZXMpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUltcGxUZXN0LmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvY2xpZW50L3N0b3JhZ2UvUGllY2VTdG9yYWdlSW1wbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FjNzcwCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdG9yYWdlL1BpZWNlU3RvcmFnZUltcGxUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC5jbGllbnQuc3RvcmFnZTsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNsaWVudC5CeXRlQXJyYXlTdG9yYWdlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgUGllY2VTdG9yYWdlSW1wbFRlc3QgeworCisgIHByaXZhdGUgUGllY2VTdG9yYWdlIHBpZWNlU3RvcmFnZTsKKyAgcHJpdmF0ZSBpbnQgcGllY2VTaXplOworICBwcml2YXRlIGludCBwaWVjZUNvdW50OworICBwcml2YXRlIGJ5dGVbXSBhbGxQaWVjZXM7CisKKyAgQEJlZm9yZU1ldGhvZAorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBwaWVjZVNpemUgPSAxMjsKKyAgICBwaWVjZUNvdW50ID0gODsKKyAgICBCeXRlQXJyYXlTdG9yYWdlIHN0b3JhZ2UgPSBuZXcgQnl0ZUFycmF5U3RvcmFnZShwaWVjZVNpemUgKiBwaWVjZUNvdW50KTsKKyAgICBwaWVjZVN0b3JhZ2UgPSBuZXcgUGllY2VTdG9yYWdlSW1wbChzdG9yYWdlLCBuZXcgQml0U2V0KCksIHBpZWNlQ291bnQsIHBpZWNlU2l6ZSk7CisgICAgYWxsUGllY2VzID0gbmV3IGJ5dGVbcGllY2VDb3VudCAqIHBpZWNlU2l6ZV07CisgICAgZm9yIChieXRlIGkgPSAwOyBpIDwgYWxsUGllY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBhbGxQaWVjZXNbaV0gPSBpOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RTdG9yYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIGFzc2VydEVxdWFscyhwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwgMCk7CisgICAgYnl0ZVtdIGZpcnN0UGllY2VEYXRhID0gQXJyYXlzLmNvcHlPZlJhbmdlKGFsbFBpZWNlcywgcGllY2VTaXplLCAyICogcGllY2VTaXplKTsKKyAgICBwaWVjZVN0b3JhZ2Uuc2F2ZVBpZWNlKDEsIGZpcnN0UGllY2VEYXRhKTsKKyAgICBieXRlW10gdGhpcmRQaWVjZURhdGEgPSBBcnJheXMuY29weU9mUmFuZ2UoYWxsUGllY2VzLCAzICogcGllY2VTaXplLCA0ICogcGllY2VTaXplKTsKKyAgICBwaWVjZVN0b3JhZ2Uuc2F2ZVBpZWNlKDMsIHRoaXJkUGllY2VEYXRhKTsKKworICAgIEJpdFNldCBhdmFpbGFibGVQaWVjZXMgPSBwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCk7CisgICAgYXNzZXJ0RXF1YWxzKGF2YWlsYWJsZVBpZWNlcy5jYXJkaW5hbGl0eSgpLCAyKTsKKyAgICBhc3NlcnRUcnVlKGF2YWlsYWJsZVBpZWNlcy5nZXQoMSkpOworICAgIGFzc2VydFRydWUoYXZhaWxhYmxlUGllY2VzLmdldCgzKSk7CisKKyAgICBieXRlW10gYWN0dWFsRmlyc3RQaWVjZURhdGEgPSBwaWVjZVN0b3JhZ2UucmVhZFBpZWNlUGFydCgxLCAwLCBwaWVjZVNpemUpOworICAgIGJ5dGVbXSBhY3R1YWxUaGlyZFBpZWNlRGF0YSA9IHBpZWNlU3RvcmFnZS5yZWFkUGllY2VQYXJ0KDMsIDAsIHBpZWNlU2l6ZSk7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbEZpcnN0UGllY2VEYXRhLCBmaXJzdFBpZWNlRGF0YSk7CisgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbFRoaXJkUGllY2VEYXRhLCB0aGlyZFBpZWNlRGF0YSk7CisKKyAgICAvL2NoZWNrIHRoYXQgcmVhZGluZyBieSBwYXJ0cyB3b3JrcyBjb3JyZWN0bHkKKyAgICBieXRlW10gZmlyc3RQaWVjZVBhcnQgPSBwaWVjZVN0b3JhZ2UucmVhZFBpZWNlUGFydCgxLCAwLCBwaWVjZVNpemUgLyAyKTsKKyAgICBieXRlW10gc2Vjb25kUGllY2VQYXJ0ID0gcGllY2VTdG9yYWdlLnJlYWRQaWVjZVBhcnQoMSwgcGllY2VTaXplIC8gMiwgcGllY2VTaXplIC8gMik7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBvdXRwdXRTdHJlYW0ud3JpdGUoZmlyc3RQaWVjZVBhcnQpOworICAgIG91dHB1dFN0cmVhbS53cml0ZShzZWNvbmRQaWVjZVBhcnQpOworICAgIGFzc2VydEVxdWFscyhmaXJzdFBpZWNlRGF0YSwgb3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOworCisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RnVsbFN0b3JhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwgMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWVjZUNvdW50OyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhwaWVjZVN0b3JhZ2UuZ2V0QXZhaWxhYmxlUGllY2VzKCkuY2FyZGluYWxpdHkoKSwgaSk7CisgICAgICBwaWVjZVN0b3JhZ2Uuc2F2ZVBpZWNlKGksIEFycmF5cy5jb3B5T2ZSYW5nZShhbGxQaWVjZXMsIGkgKiBwaWVjZVNpemUsIChpICsgMSkgKiBwaWVjZVNpemUpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKHBpZWNlU3RvcmFnZS5nZXRBdmFpbGFibGVQaWVjZXMoKS5jYXJkaW5hbGl0eSgpLCBwaWVjZUNvdW50KTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkRXhjZXB0aW9ucyA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRVbmF2YWlsYWJsZVBpZWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwaWVjZVN0b3JhZ2UucmVhZFBpZWNlUGFydCg0NSwgMCwgcGllY2VTaXplKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcGllY2VTdG9yYWdlLmNsb3NlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nVGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L2NsaWVudC9zdHJhdGVneS9SZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0NTdiNwotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC9jbGllbnQvc3RyYXRlZ3kvUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LnN0cmF0ZWd5OworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY2xpZW50LlBpZWNlOworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCitwdWJsaWMgY2xhc3MgUmVxdWVzdFN0cmF0ZWd5SW1wbEFueUludGVyZXN0aW5nVGVzdCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRTZXQ8UGllY2U+IG15UmFyZXN0ID0gbnVsbDsvL215UmFyZXN0IGRvbid0IG5lZWQgZm9yIGl0IHN0cmF0ZWd5CisgIHByaXZhdGUgZmluYWwgaW50IG15UGllY2VzVG90YWwgPSAxMDsKKyAgcHJpdmF0ZSBmaW5hbCBQaWVjZVtdIG15UGllY2VzID0gbmV3IFBpZWNlW215UGllY2VzVG90YWxdOworICBwcml2YXRlIGZpbmFsIFJlcXVlc3RTdHJhdGVneSBteVJlcXVlc3RTdHJhdGVneSA9IG5ldyBSZXF1ZXN0U3RyYXRlZ3lJbXBsQW55SW50ZXJlc3RpbmcoKTsKKworICBAQmVmb3JlQ2xhc3MKKyAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG15UGllY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBteVBpZWNlc1tpXSA9IG5ldyBQaWVjZShudWxsLCBpLCAwLCBuZXcgYnl0ZVswXSk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hvb3NlUGllY2VOb0ludGVyZXN0aW5nVGVzdCgpIHsKKyAgICBQaWVjZSBhY3R1YWwgPSBteVJlcXVlc3RTdHJhdGVneS5jaG9vc2VQaWVjZShuZXcgQml0U2V0KCksIG15UGllY2VzKTsKKyAgICBBc3NlcnQuYXNzZXJ0TnVsbChhY3R1YWwpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hvb3NlUGllY2VPbmVJbnRlcmVzdGluZ1Rlc3QoKSB7CisgICAgQml0U2V0IGludGVyZXN0aW5nID0gbmV3IEJpdFNldCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXlQaWVjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGludGVyZXN0aW5nLmNsZWFyKCk7CisgICAgICBpbnRlcmVzdGluZy5zZXQoaSk7CisgICAgICBQaWVjZSBleHBlY3RlZCA9IG15UGllY2VzW2ldOworICAgICAgUGllY2UgYWN0dWFsID0gbXlSZXF1ZXN0U3RyYXRlZ3kuY2hvb3NlUGllY2UoaW50ZXJlc3RpbmcsIG15UGllY2VzKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgY2hvb3NlUGllY2VUZXN0KCkgeworICAgIEJpdFNldCBpbnRlcmVzdGluZyA9IG5ldyBCaXRTZXQoKTsKKyAgICBpbnQgaW50ZXJlc3RpbmdGcm9tID0gMTsKKyAgICBpbnQgaW50ZXJlc3RpbmdUbyA9IDU7CisgICAgaW50ZXJlc3Rpbmcuc2V0KGludGVyZXN0aW5nRnJvbSwgaW50ZXJlc3RpbmdUbyk7CisgICAgUGllY2UgYWN0dWFsID0gbXlSZXF1ZXN0U3RyYXRlZ3kuY2hvb3NlUGllY2UoaW50ZXJlc3RpbmcsIG15UGllY2VzKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhY3R1YWwuZ2V0SW5kZXgoKSA+PSBpbnRlcmVzdGluZ0Zyb20gJiYgYWN0dWFsLmdldEluZGV4KCkgPD0gaW50ZXJlc3RpbmdUbyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvcG9tLnhtbCBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViMWJlYgotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPmNvbS50dXJuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD50dG9ycmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPG5hbWU+dHRvcnJlbnQvdHJhY2tlcjwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly90dXJuLmdpdGh1Yi5jb20vdHRvcnJlbnQvPC91cmw+CisgICAgPGFydGlmYWN0SWQ+dHRvcnJlbnQtdHJhY2tlcjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjMuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LWJlbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMy4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20udHVybjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnR0b3JyZW50LXRlc3QtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9BZGRyZXNzQ2hlY2tlci5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL0FkZHJlc3NDaGVja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyNDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9BZGRyZXNzQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworcHVibGljIGludGVyZmFjZSBBZGRyZXNzQ2hlY2tlciB7CisKKyAgLyoqCisgICAqIHRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRydWUgaWYgaXMgaW5jb3JyZWN0IGlwIGFuZCBvdGhlciBwZWVycyBjYW4gbm90IGNvbm5lY3QgdG8gdGhpcyBwZWVyLiBJZiB0aGlzIG1ldGhvZCByZXR1cm4gdHJ1ZQorICAgKiB0cmFja2VyIGRvZXNuJ3QgcmVnaXN0ZXIgdGhlIHBlZXIgZm9yIGN1cnJlbnQgdG9ycmVudAorICAgKgorICAgKiDmo4DpqozkvKDlhaXnmoRwZWVyIGlw5piv5ZCm5piv5q2j56Gu55qECisgICAqIEBwYXJhbSBpcCBzcGVjaWZpZWQgYWRkcmVzcworICAgKi8KKyAgYm9vbGVhbiBpc0JhZEFkZHJlc3MoU3RyaW5nIGlwKTsKKworfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL011bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNiZDRlCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL011bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJEZWNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRW5jb2RlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBUcmFja2VyRXJyb3JNZXNzYWdlOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5TdGF0dXM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitwdWJsaWMgY2xhc3MgTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IgeworCisgIHByaXZhdGUgZmluYWwgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgbXlUcmFja2VyUmVxdWVzdFByb2Nlc3NvcjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IuY2xhc3MpOworCisgIHB1YmxpYyBNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvcihUcmFja2VyUmVxdWVzdFByb2Nlc3NvciB0cmFja2VyUmVxdWVzdFByb2Nlc3NvcikgeworICAgIG15VHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgPSB0cmFja2VyUmVxdWVzdFByb2Nlc3NvcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgU3RyaW5nIGJvZHksIGZpbmFsIFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyBob3N0QWRkcmVzcywgZmluYWwgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBMaXN0PEJFVmFsdWU+IHJlc3BvbnNlTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PEJFVmFsdWU+KCk7CisgICAgZmluYWwgQXRvbWljQm9vbGVhbiBpc0FueVN1Y2Nlc3MgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgZm9yIChTdHJpbmcgcyA6IGJvZHkuc3BsaXQoIlxuIikpIHsKKyAgICAgIG15VHJhY2tlclJlcXVlc3RQcm9jZXNzb3IucHJvY2VzcyhzLCBob3N0QWRkcmVzcywgbmV3IFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLlJlcXVlc3RIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VydmVSZXNwb25zZShpbnQgY29kZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBCeXRlQnVmZmVyIHJlc3BvbnNlRGF0YSkgeworICAgICAgICAgIGlzQW55U3VjY2Vzcy5zZXQoaXNBbnlTdWNjZXNzLmdldCgpIHx8IChjb2RlID09IFN0YXR1cy5PSy5nZXRDb2RlKCkpKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlcy5hZGQoQkRlY29kZXIuYmRlY29kZShyZXNwb25zZURhdGEpKTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiY2Fubm90IGRlY29kZSBtZXNzYWdlIGZyb20gYnl0ZSBidWZmZXIiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgICBpZiAocmVzcG9uc2VNZXNzYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgIEJ5dGVCdWZmZXIgcmVzOworICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgIHJlcyA9IEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlLmNyYWZ0KCIiKS5nZXREYXRhKCk7CisgICAgICBzdGF0dXMgPSBTdGF0dXMuQkFEX1JFUVVFU1Q7CisgICAgICByZXF1ZXN0SGFuZGxlci5zZXJ2ZVJlc3BvbnNlKHN0YXR1cy5nZXRDb2RlKCksICIiLCByZXMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIEJFbmNvZGVyLmJlbmNvZGUocmVzcG9uc2VNZXNzYWdlcywgb3V0KTsKKyAgICByZXF1ZXN0SGFuZGxlci5zZXJ2ZVJlc3BvbnNlKGlzQW55U3VjY2Vzcy5nZXQoKSA/IFN0YXR1cy5PSy5nZXRDb2RlKCkgOiBTdGF0dXMuQkFEX1JFUVVFU1QuZ2V0Q29kZSgpLCAiIiwgQnl0ZUJ1ZmZlci53cmFwKG91dC50b0J5dGVBcnJheSgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9QZWVyQ29sbGVjdG9yVGhyZWFkLmphdmEgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvUGVlckNvbGxlY3RvclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmQwZTIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvUGVlckNvbGxlY3RvclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworLyoqCisgKiBUaGUgdW5mcmVzaCBwZWVyIGNvbGxlY3RvciB0aHJlYWQuCisgKiA8cD4KKyAqIDxwPgorICogRXZlcnkgUEVFUl9DT0xMRUNUSU9OX0ZSRVFVRU5DWV9TRUNPTkRTLCB0aGlzIHRocmVhZCB3aWxsIGNvbGxlY3QKKyAqIHVuZnJlc2ggcGVlcnMgZnJvbSBhbGwgYW5ub3VuY2VkIHRvcnJlbnRzLgorICogPC9wPgorICovCisKKy8vIOWRqOacn+aAp+WcsOa4heeQhuS4jeWGjea0u+i3g+eahCBwZWVycworcHVibGljIGNsYXNzIFBlZXJDb2xsZWN0b3JUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTExFQ1RJT05fRlJFUVVFTkNZID0gMTA7CisgIHByaXZhdGUgZmluYWwgVG9ycmVudHNSZXBvc2l0b3J5IG15VG9ycmVudHNSZXBvc2l0b3J5OworICBwcml2YXRlIHZvbGF0aWxlIGludCBteVRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjID0gMjAgKiA2MDsKKworICBwdWJsaWMgUGVlckNvbGxlY3RvclRocmVhZChUb3JyZW50c1JlcG9zaXRvcnkgdG9ycmVudHNSZXBvc2l0b3J5KSB7CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkgPSB0b3JyZW50c1JlcG9zaXRvcnk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRUb3JyZW50RXhwaXJlVGltZW91dFNlYyhpbnQgdG9ycmVudEV4cGlyZVRpbWVvdXRTZWMpIHsKKyAgICBteVRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjID0gdG9ycmVudEV4cGlyZVRpbWVvdXRTZWM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIHdoaWxlICghaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5jbGVhbnVwKG15VG9ycmVudEV4cGlyZVRpbWVvdXRTZWMpOworICAgICAgdHJ5IHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKENPTExFQ1RJT05fRlJFUVVFTkNZICogMTAwMCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9Ub3JyZW50c1JlcG9zaXRvcnkuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9Ub3JyZW50c1JlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFlODkyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RvcnJlbnRzUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKK3BhY2thZ2UgY29tLnR1cm4udHRvcnJlbnQudHJhY2tlcjsKKworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKKy8vIOeuoeeQhuWSjOWtmOWCqCB0b3JyZW50c++8iOenjeWtkOaWh+S7tu+8ieS/oeaBr+eahOS7k+W6k++8jOWug+WunueOsOS6huWvuSB0b3JyZW50cyDnmoTlop7jgIHmn6XjgIHmm7TmlrDjgIHmuIXnkIbnrYnmk43kvZzjgIIKKy8vIOi/meS4quexu+eahOWunueOsOS4u+imgeeUqOS6juS4gOS4qiBUcmFja2VyIOacjeWKoeWZqO+8jOi0n+i0o+euoeeQhiB0b3JyZW50IOS/oeaBr+W5tuWvueWPguS4juS4i+i9veWSjOS4iuS8oOeahCBwZWVyIOi/m+ihjOi3n+i4quOAggorCisvL3RvcnJlbnTlrZjlgqjku5PlupPvvIzog73moLnmja5pbmZvaGFzaOeahOWAvO+8jOiOt+WPluWUr+S4gOeahHRvcnJlbnTvvIzog73lrp7njrDkuIrkvKAKKy8vIHRvcnJlbnQg55u45YWz5L+h5oGv77ya5pW05LiqIEJUIOenjeWtkOaWh+S7tuWunumZheS4iuWwseaYr+S4gOS4qiBiZW5jb2Rpbmcg57yW56CB55qEIERpY3Rpb25hcnksIOWug+acieS4pOS4qiBLZXksIOWIhuWIq+aYryBhbm5vdW5jZSDlkowgaW5mbworLy8gYW5ub3VuY2XmmK9idFRyYWNrZXLnmoR1cmwKKy8vIGluZm/mmK/lrZflhbjvvIzlr7nlupTotYTmupDnm7jlhbPkv6Hmga/vvIxuYW1l77yMcGllY2UgbGVuZ3Ro77yI5YiG54mH6ZW/5bqm77yJCisvLyAgICAgIHBpZWNl77yI5aSE55CG5bCG5pWw5o2u5YiG54mH77yJCisvLyAgICAgIGxlbmd0aCAvIGZpbGVz77yI6L+Z5Lik5Liq6ZSu5LiN6IO95ZCM5pe25a2Y5ZyoLCDmnInkuJTku4XmnInlhbbkuK3kuIDkuKrvvIzlj6rmmK/kuIDkuKrmlofku7bmmK9sZW5ndGjvvIzmlofku7blpLnmmK9maWxlc++8iQorCitwdWJsaWMgY2xhc3MgVG9ycmVudHNSZXBvc2l0b3J5IHsKKworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9ja1tdIG15TG9ja3M7CisgICAgLy8gIENvbmN1cnJlbnRNYXDkuIDnp43nur/nqIvlronlhajnmoRtYXDmmKDlsITvvIzplK7lgLzlr7nlupTvvIx0b3JyZW50IOeahOWTiOW4jOWAvC0tVHJhY2tlZFRvcnJlbnQKKyAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBUcmFja2VkVG9ycmVudD4gbXlUb3JyZW50czsKKworICAgIC8vIOaehOmAoOWHveaVsAorICAgIHB1YmxpYyBUb3JyZW50c1JlcG9zaXRvcnkoaW50IGxvY2tzQ291bnQpIHsKKworICAgICAgICBpZiAobG9ja3NDb3VudCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMb2NrIGNvdW50IG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIG15TG9ja3MgPSBuZXcgUmVlbnRyYW50TG9ja1tsb2Nrc0NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteUxvY2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBteUxvY2tzW2ldID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgfQorICAgICAgICBteVRvcnJlbnRzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgVHJhY2tlZFRvcnJlbnQ+KCk7CisgICAgfQorCisgICAgLy8gIOagueaNruS8oOWFpeeahOenjeWtkOeahOWTiOW4jOWAvGhleEluZm9IYXNo77yM6I635Y+WVHJhY2tlZFRvcnJlbnTlr7nosaEKKyAgICBwdWJsaWMgVHJhY2tlZFRvcnJlbnQgZ2V0VG9ycmVudChTdHJpbmcgaGV4SW5mb0hhc2gpIHsKKyAgICAgICAgcmV0dXJuIG15VG9ycmVudHMuZ2V0KGhleEluZm9IYXNoKTsKKyAgICB9CisKKyAgICAvLyB0b3JyZW505LiN5a2Y5Zyo77yM6L+b6KGM5re75Yqg5pON5L2cCisgICAgcHVibGljIHZvaWQgcHV0SWZBYnNlbnQoU3RyaW5nIGhleEluZm9IYXNoLCBUcmFja2VkVG9ycmVudCB0b3JyZW50KSB7CisgICAgICAgIG15VG9ycmVudHMucHV0SWZBYnNlbnQoaGV4SW5mb0hhc2gsIHRvcnJlbnQpOworICAgICAgICAvL+iwg+eUqG15VG9ycmVudHPnsbvlnotDb25jdXJyZW50TWFw5LiL55qE5re75Yqg5Ye95pWwCisgICAgfQorICAgIC8vIOabtOaWsHRvcnJlbnTmlbDmja4KKyAgICBwdWJsaWMgVHJhY2tlZFRvcnJlbnQgcHV0SWZBYnNlbnRBbmRVcGRhdGUoU3RyaW5nIGhleEluZm9IYXNoLCBUcmFja2VkVG9ycmVudCB0b3JyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudCBldmVudCwgQnl0ZUJ1ZmZlciBwZWVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZXhQZWVySWQsIFN0cmluZyBpcCwgaW50IHBvcnQsIGxvbmcgdXBsb2FkZWQsIGxvbmcgZG93bmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsZWZ0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIFRyYWNrZWRUb3JyZW50IGFjdHVhbFRvcnJlbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrRm9yKGhleEluZm9IYXNoKS5sb2NrKCk7CisgICAgICAgICAgICBUcmFja2VkVG9ycmVudCBvbGRUb3JyZW50ID0gbXlUb3JyZW50cy5wdXRJZkFic2VudChoZXhJbmZvSGFzaCwgdG9ycmVudCk7CisgICAgICAgICAgICBhY3R1YWxUb3JyZW50ID0gb2xkVG9ycmVudCA9PSBudWxsID8gdG9ycmVudCA6IG9sZFRvcnJlbnQ7CisgICAgICAgICAgICBhY3R1YWxUb3JyZW50LnVwZGF0ZShldmVudCwgcGVlcklkLCBoZXhQZWVySWQsIGlwLCBwb3J0LCB1cGxvYWRlZCwgZG93bmxvYWRlZCwgbGVmdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrRm9yKGhleEluZm9IYXNoKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0dWFsVG9ycmVudDsKKyAgICB9CisKKyAgICAvLyDplIHvvIzpgb/lhY3pmLvloZ7lhbbku5Z0b3JyZW505pON5L2cCisgICAgcHJpdmF0ZSBSZWVudHJhbnRMb2NrIGxvY2tGb3IoU3RyaW5nIHRvcnJlbnRIYXNoKSB7CisgICAgICAgIHJldHVybiBteUxvY2tzW01hdGguYWJzKHRvcnJlbnRIYXNoLmhhc2hDb2RlKCkpICUgbXlMb2Nrcy5sZW5ndGhdOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBteVRvcnJlbnRzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW51cChpbnQgdG9ycmVudEV4cGlyZVRpbWVvdXRTZWMpIHsKKyAgICAgICAgZm9yIChUcmFja2VkVG9ycmVudCB0cmFja2VkVG9ycmVudCA6IG15VG9ycmVudHMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9ja0Zvcih0cmFja2VkVG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgdHJhY2tlZFRvcnJlbnQuY29sbGVjdFVuZnJlc2hQZWVycyh0b3JyZW50RXhwaXJlVGltZW91dFNlYyk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrZWRUb3JyZW50LmdldFBlZXJzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXlUb3JyZW50cy5yZW1vdmUodHJhY2tlZFRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsb2NrRm9yKHRyYWNrZWRUb3JyZW50LmdldEhleEluZm9IYXNoKCkpLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgVHJhY2tlZFRvcnJlbnQ+IGdldFRvcnJlbnRzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmFja2VkVG9ycmVudD4obXlUb3JyZW50cyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFBlZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VkUGVlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDU3YzUKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFBlZXIuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKiA8cD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi4qOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQSBCaXRUb3JyZW50IHRyYWNrZXIgcGVlci4KKyAqIDxwPgorICogPHA+CisgKiBSZXByZXNlbnRzIGEgcGVlciBleGNoYW5naW5nIG9uIGEgZ2l2ZW4gdG9ycmVudC4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKyAqIHdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIHBlZXJzIGFuZCBob3cgbXVjaCB0aGV5CisgKiBoYXZlIGRvd25sb2FkZWQgLyBleGNoYW5nZWQgYmVjYXVzZSB3ZSBhcmUgbm90IGEgdG9ycmVudCBleGNoYW5nZSBhbmQKKyAqIGRvbid0IG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IHBlZXJzIGFyZSBkb2luZyB3aGlsZSB0aGV5J3JlCisgKiBkb3dubG9hZGluZy4gV2Ugb25seSBjYXJlIGFib3V0IHdoZW4gdGhleSBzdGFydCwgYW5kIHdoZW4gdGhleSBhcmUgZG9uZS4KKyAqIDwvcD4KKyAqIDxwPgorICogPHA+CisgKiBXZSBhbHNvIG5ldmVyIGV4cGlyZSBwZWVycyBhdXRvbWF0aWNhbGx5LiBVbmxlc3MgcGVlcnMgc2VuZCBhIFNUT1BQRUQKKyAqIGFubm91bmNlIHJlcXVlc3QsIHRoZXkgcmVtYWluIGFzIGxvbmcgYXMgdGhlIHRvcnJlbnQgb2JqZWN0IHRoZXkgYXJlIGEKKyAqIHBhcnQgb2YuCisgKiA8L3A+CisgKi8KKworLy8g6Lef6LiqcGVlcu+8iOWvueetiee7k+eCue+8jOebuOW9k+S6juS9v+eUqOivpXRyYWNrZXLnmoTnlKjmiLfvvIkKKy8qIOeuoeeQhuS4gOS4qlRyYWNrZWRUb3JyZW5056eN5a2Q55qE55u45YWz55qE55So5oi35a+56LGh77yM6IO95biu5Yqp5Zyo5LiL6L295pe25YCZ5om+5Yiw5a+56LGh44CCCisqIOaWsOS4i+i9veeUqOaIt+WujOaIkOS4i+i9veWQjuiiq+agh+iusOS4uuWujOaIkO+8jOWPr+S7pea3u+WKoAorKiAqLworLy8g566h55CG55So5oi355m75b2V5pe26Ze0CitwdWJsaWMgY2xhc3MgVHJhY2tlZFBlZXIgZXh0ZW5kcyBQZWVyIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlZFBlZXIuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgVGltZVNlcnZpY2UgbXlUaW1lU2VydmljZTsKKyAgcHJpdmF0ZSBsb25nIHVwbG9hZGVkOworICBwcml2YXRlIGxvbmcgZG93bmxvYWRlZDsKKyAgcHJpdmF0ZSBsb25nIGxlZnQ7CisgIHByaXZhdGUgVHJhY2tlZFRvcnJlbnQgdG9ycmVudDsvL+S4uuS7gOS5iOWMheWQq+i/meS4quWunuS+i++8n++8nworCisgIC8qKgorICAgKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIHBlZXIgZXhjaGFuZ2luZyBvbiB0aGlzIHRvcnJlbnQuCisgICAqIOWxleekuueUqOaIt+WSjOenjeWtkOmXtOeahOeKtuaAgeWFs+ezuworICAgKiA8cD4KKyAgICogPHA+CisgICAqIFBlZXJzIGNhbiBiZSBpbiB0aGUgU1RBUlRFRCBzdGF0ZSwgbWVhbmluZyB0aGV5IGhhdmUgYW5ub3VuY2VkCisgICAqIHRoZW1zZWx2ZXMgdG8gdXMgYW5kIGFyZSBldmVudHVhbGx5IGV4Y2hhbmdpbmcgZGF0YSB3aXRoIG90aGVyIHBlZXJzLgorICAgKiBOb3RlIHRoYXQgYSBwZWVyIHN0YXJ0aW5nIHdpdGggYSBjb21wbGV0ZWQgZmlsZSB3aWxsIGFsc28gYmUgaW4gdGhlCisgICAqIHN0YXJ0ZWQgc3RhdGUgYW5kIHdpbGwgbmV2ZXIgbm90aWZ5IGFzIGJlaW5nIGluIHRoZSBjb21wbGV0ZWQgc3RhdGUuCisgICAqIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIGZhY3QgdGhhdCB0aGUgcGVlciByZXBvcnRzIDAKKyAgICogYnl0ZXMgbGVmdCB0byBkb3dubG9hZC4KKyAgICogPC9wPgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIFBlZXJzIGVudGVyIHRoZSBDT01QTEVURUQgc3RhdGUgd2hlbiB0aGV5IGFubm91bmNlIHRoZXkgaGF2ZSBlbnRpcmVseQorICAgKiBkb3dubG9hZGVkIHRoZSBmaWxlLiBBcyBzdGF0ZWQgYWJvdmUsIHdlIG1heSBhbHNvIGVsZWN0IHRoZW0gZm9yIHRoaXMKKyAgICogc3RhdGUgaWYgdGhleSByZXBvcnQgMCBieXRlcyBsZWZ0IHRvIGRvd25sb2FkLgorICAgKiA8L3A+CisgICAqIDxwPgorICAgKiA8cD4KKyAgICogUGVlcnMgZW50ZXIgdGhlIFNUT1BQRUQgc3RhdGUgdmVyeSBicmllZmx5IGJlZm9yZSBiZWluZyByZW1vdmVkLiBXZQorICAgKiBzdGlsbCBwYXNzIHRoZW0gdG8gdGhlIFNUT1BQRUQgc3RhdGUgaW4gY2FzZSBzb21lb25lIGVsc2Uga2VwdCBhCisgICAqIHJlZmVyZW5jZSBvbiB0aGVtLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgZW51bSBQZWVyU3RhdGUgeworICAgIFVOS05PV04sCisgICAgU1RBUlRFRCwKKyAgICBDT01QTEVURUQsCisgICAgU1RPUFBFRAorICB9CisKKyAgcHJpdmF0ZSBQZWVyU3RhdGUgc3RhdGU7CisgIHByaXZhdGUgbG9uZyBsYXN0QW5ub3VuY2U7IC8v55m75b2V5pe26Ze06K6w5b2VCisKKyAgLyoqCisgICAqIEluc3RhbnRpYXRlIGEgbmV3IHRyYWNrZWQgcGVlciBmb3IgdGhlIGdpdmVuIHRvcnJlbnQuCisgICAqIOS4uue7meWumueahCB0b3JyZW50IOWunuS+i+WMluS4gOS4quaWsOeahOi3n+i4quWvueetieeCueOAggorICAgKgorICAgKiBAcGFyYW0gdG9ycmVudCBUaGUgdG9ycmVudCB0aGlzIHBlZXIgZXhjaGFuZ2VzIG9uLgorICAgKiBAcGFyYW0gaXAgICAgICBUaGUgcGVlcidzIElQIGFkZHJlc3MuCisgICAqIEBwYXJhbSBwb3J0ICAgIFRoZSBwZWVyJ3MgcG9ydC4KKyAgICogQHBhcmFtIHBlZXJJZCAgVGhlIGJ5dGUtZW5jb2RlZCBwZWVyIElELgorICAgKi8KKyAgcHVibGljIFRyYWNrZWRQZWVyKFRyYWNrZWRUb3JyZW50IHRvcnJlbnQsIFN0cmluZyBpcCwgaW50IHBvcnQsIEJ5dGVCdWZmZXIgcGVlcklkKSB7CisgICAgdGhpcyh0b3JyZW50LCBpcCwgcG9ydCwgcGVlcklkLCBuZXcgU3lzdGVtVGltZVNlcnZpY2UoKSk7CisgIH0KKworICBUcmFja2VkUGVlcihUcmFja2VkVG9ycmVudCB0b3JyZW50LCBTdHJpbmcgaXAsIGludCBwb3J0LAorICAgICAgICAgICAgICBCeXRlQnVmZmVyIHBlZXJJZCwgVGltZVNlcnZpY2UgdGltZVNlcnZpY2UpIHsKKyAgICBzdXBlcihpcCwgcG9ydCwgcGVlcklkKTsKKyAgICBteVRpbWVTZXJ2aWNlID0gdGltZVNlcnZpY2U7CisgICAgdGhpcy50b3JyZW50ID0gdG9ycmVudDsKKworICAgIC8vIEluc3RhbnRpYXRlZCBwZWVycyBzdGFydCBpbiB0aGUgVU5LTk9XTiBzdGF0ZS4KKyAgICB0aGlzLnN0YXRlID0gUGVlclN0YXRlLlVOS05PV047CisgICAgdGhpcy5sYXN0QW5ub3VuY2UgPSBteVRpbWVTZXJ2aWNlLm5vdygpOworCisgICAgdGhpcy51cGxvYWRlZCA9IDA7CisgICAgdGhpcy5kb3dubG9hZGVkID0gMDsKKyAgICB0aGlzLmxlZnQgPSAwOworICB9CisKKyAgLyoqCisgICAqIFVwZGF0ZSB0aGlzIHBlZXIncyBzdGF0ZSBhbmQgaW5mb3JtYXRpb24uCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogPGI+Tm90ZTo8L2I+IGlmIHRoZSBwZWVyIHJlcG9ydHMgMCBieXRlcyBsZWZ0IHRvIGRvd25sb2FkLCBpdHMgc3RhdGUgd2lsbAorICAgKiBiZSBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byBDT01QTEVURUQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIHN0YXRlICAgICAgVGhlIHBlZXIncyBzdGF0ZS4KKyAgICogQHBhcmFtIHVwbG9hZGVkICAgVXBsb2FkZWQgYnl0ZSBjb3VudCwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBlZXIuCisgICAqIEBwYXJhbSBkb3dubG9hZGVkIERvd25sb2FkZWQgYnl0ZSBjb3VudCwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBlZXIuCisgICAqIEBwYXJhbSBsZWZ0ICAgICAgIExlZnQtdG8tZG93bmxvYWQgYnl0ZSBjb3VudCwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBlZXIuCisgICAqLworICBwdWJsaWMgdm9pZCB1cGRhdGUoUGVlclN0YXRlIHN0YXRlLCBsb25nIHVwbG9hZGVkLCBsb25nIGRvd25sb2FkZWQsCisgICAgICAgICAgICAgICAgICAgICBsb25nIGxlZnQpIHsKKworICAgIC8vIOiHquWKqOajgOa1i+S4i+i9veWujOaIkAorICAgIGlmIChQZWVyU3RhdGUuU1RBUlRFRC5lcXVhbHMoc3RhdGUpICYmIGxlZnQgPT0gMCkgeworICAgICAgc3RhdGUgPSBQZWVyU3RhdGUuQ09NUExFVEVEOworICAgIH0KKworICAgIGlmICghc3RhdGUuZXF1YWxzKHRoaXMuc3RhdGUpKSB7CisgICAgICBsb2dnZXIudHJhY2UoIlBlZXIge30ge30gZG93bmxvYWQgb2Yge30uIiwKKyAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeworICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubmFtZSgpLnRvTG93ZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3JyZW50LAorICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgdGhpcy5sYXN0QW5ub3VuY2UgPSBteVRpbWVTZXJ2aWNlLm5vdygpOworICAgIHRoaXMudXBsb2FkZWQgPSB1cGxvYWRlZDsKKyAgICB0aGlzLmRvd25sb2FkZWQgPSBkb3dubG9hZGVkOworICAgIHRoaXMubGVmdCA9IGxlZnQ7CisgIH0KKworICAvKioKKyAgICogVGVsbHMgd2hldGhlciB0aGlzIHBlZXIgaGFzIGNvbXBsZXRlZCBpdHMgZG93bmxvYWQgYW5kIGNhbiB0aHVzIGJlCisgICAqIGNvbnNpZGVyZWQgYSBzZWVkZXIuCisgICAqIOWRiuefpei/meS4qnBlZXLmmK/lkKblrozmiJDkuIrkvKDvvIzog73lkKbkvZzkuLrkuIDkuKpzZWVkZXLnp43lrZDmjIHmnInogIUKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGVkKCkgeworICAgIHJldHVybiBQZWVyU3RhdGUuQ09NUExFVEVELmVxdWFscyh0aGlzLnN0YXRlKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGhvdyBtYW55IGJ5dGVzIHRoZSBwZWVyIHJlcG9ydGVkIGl0IGhhcyB1cGxvYWRlZCBzbyBmYXIuCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRVcGxvYWRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy51cGxvYWRlZDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGhvdyBtYW55IGJ5dGVzIHRoZSBwZWVyIHJlcG9ydGVkIGl0IGhhcyBkb3dubG9hZGVkIHNvIGZhci4KKyAgICovCisgIHB1YmxpYyBsb25nIGdldERvd25sb2FkZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRlZDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGhvdyBtYW55IGJ5dGVzIHRoZSBwZWVyIHJlcG9ydGVkIGl0IG5lZWRzIHRvIHJldHJpZXZlIGJlZm9yZQorICAgKiBpdHMgZG93bmxvYWQgaXMgY29tcGxldGUuCisgICAqIOebruWJjei/mOWJqeS9meWkmuWwkeWGheWuueayoeacieS4i+i9vQorICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0TGVmdCgpIHsKKyAgICByZXR1cm4gdGhpcy5sZWZ0OworICB9CisKKyAgLyoqCisgICAqIFRlbGxzIHdoZXRoZXIgdGhpcyBwZWVyIGhhcyBjaGVja2VkIGluIHdpdGggdGhlIHRyYWNrZXIgcmVjZW50bHkuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogTm9uLWZyZXNoIHBlZXJzIGFyZSBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYW5kIGNvbGxlY3RlZCBieSB0aGUKKyAgICogVHJhY2tlci4KKyAgICog55So5oi35piv5ZCm5rS76LeDCisgICAqIDwvcD4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzRnJlc2goaW50IGV4cGlyZVRpbWVvdXRTZWMpIHsKKyAgICByZXR1cm4gdGhpcy5sYXN0QW5ub3VuY2UgKyBleHBpcmVUaW1lb3V0U2VjICogMTAwMCA+IG15VGltZVNlcnZpY2Uubm93KCk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIEJFVmFsdWUgcmVwcmVzZW50aW5nIHRoaXMgcGVlciBmb3IgaW5jbHVzaW9uIGluIGFuCisgICAqIGFubm91bmNlIHJlcGx5IGZyb20gdGhlIHRyYWNrZXIuCisgICAqIDxwPgorICAgKiBUaGUgcmV0dXJuZWQgQkVWYWx1ZSBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcGVlciBJRCAoaW4gaXRzCisgICAqIG9yaWdpbmFsIGJ5dGUtZW5jb2RlZCBmb3JtKSwgdGhlIHBlZXIncyBJUCBhbmQgdGhlIHBlZXIncyBwb3J0LgorICAgKi8KKyAgcHVibGljIEJFVmFsdWUgdG9CRVZhbHVlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBlZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJFVmFsdWU+KCk7CisgICAgaWYgKHRoaXMuaGFzUGVlcklkKCkpIHsKKyAgICAgIHBlZXIucHV0KCJwZWVyIGlkIiwgbmV3IEJFVmFsdWUodGhpcy5nZXRQZWVySWRBcnJheSgpKSk7CisgICAgfQorICAgIHBlZXIucHV0KCJpcCIsIG5ldyBCRVZhbHVlKHRoaXMuZ2V0SXAoKSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICBwZWVyLnB1dCgicG9ydCIsIG5ldyBCRVZhbHVlKHRoaXMuZ2V0UG9ydCgpKSk7CisgICAgcmV0dXJuIG5ldyBCRVZhbHVlKHBlZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFRvcnJlbnQuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VkVG9ycmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDg5NzIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlZFRvcnJlbnQuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKiA8cD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLio7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworCisvKioKKyAqIFRyYWNrZWQgdG9ycmVudHMgYXJlIHRvcnJlbnQgZm9yIHdoaWNoIHdlIGRvbid0IGV4cGVjdCB0byBoYXZlIGRhdGEgZmlsZXMKKyAqIGZvci4KKyAqIDxwPgorICogPHA+CisgKiB7QGxpbmsgVHJhY2tlZFRvcnJlbnR9IG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlIEJpdFRvcnJlbnQgdHJhY2tlciB0bworICogcmVwcmVzZW50IGEgdG9ycmVudCB0aGF0IGlzIGFubm91bmNlZCBieSB0aGUgdHJhY2tlci4gQXMgc3VjaCwgaXQgaXMgbm90CisgKiBleHBlY3RlZCB0byBwb2ludCB0byBhbnkgdmFsaWQgbG9jYWwgZGF0YSBsaWtlLiBJdCBhbHNvIGNvbnRhaW5zIHNvbWUKKyAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgdHJhY2tlciB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHBlZXJzCisgKiBleGNoYW5nZSBvbiBpdCwgZXRjLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCisKKy8v6KGo56S65LiA5Liq6KKrIEJpdFRvcnJlbnQg6Lef6Liq5Zmo77yIdHJhY2tlcu+8iei3n+i4queahOenjeWtkO+8iHRvcnJlbnTvvInjgIIKKy8vIOi/meS4quexu+W5tuS4jea2ieWPiuWunumZheeahOaVsOaNruaWh+S7tu+8jOiAjOaYr+eUqOS6jueuoeeQhuS4juivpeenjeWtkOebuOWFs+eahOi/nuaOpe+8iHBlZXJz77yJ5Lul5Y+K6Lef6Liq56eN5a2Q54q25oCB55qE5L+h5oGv44CCCisvLyDlrp7njrDnlKjmiLfojrflj5bkuIDkuKrnp43lrZDnmoRwZWVy5YC877yM5pa55L6/6L+b6KGM5YiG54mH5LiL6L29CisKK3B1YmxpYyBjbGFzcyBUcmFja2VkVG9ycmVudCBpbXBsZW1lbnRzIFRvcnJlbnRIYXNoIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICBUb3JyZW50TG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJhY2tlZFRvcnJlbnQuY2xhc3MpOworCisgIC8qKgorICAgKiBNaW5pbXVtIGFubm91bmNlIGludGVydmFsIHJlcXVlc3RlZCBmcm9tIHBlZXJzLCBpbiBzZWNvbmRzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0FOTk9VTkNFX0lOVEVSVkFMX1NFQ09ORFMgPSA1OworCisgIC8qKgorICAgKiBEZWZhdWx0IG51bWJlciBvZiBwZWVycyBpbmNsdWRlZCBpbiBhIHRyYWNrZXIgcmVzcG9uc2UuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BTlNXRVJfTlVNX1BFRVJTID0gMzA7CisKKyAgLyoqCisgICAqIERlZmF1bHQgYW5ub3VuY2UgaW50ZXJ2YWwgcmVxdWVzdGVkIGZyb20gcGVlcnMsIGluIHNlY29uZHMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9BTk5PVU5DRV9JTlRFUlZBTF9TRUNPTkRTID0gMTA7CisKKyAgcHJpdmF0ZSBpbnQgYW5zd2VyUGVlcnM7CisgIHByaXZhdGUgaW50IGFubm91bmNlSW50ZXJ2YWw7CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5mb19oYXNoOworICAvL+ihqOekuuenjeWtkOeahOWTiOW4jOWAvO+8iOmAmui/h+enjeWtkOaWh+S7tueahOWFg+aVsOaNruW+l+WIsO+8ieOAggorICAvLyBpbmZvIOmUruWvueW6lOeahOWAvOeUn+aIkOeahCBTSEExIOWTiOW4jCwg6K+l5ZOI5biM5YC85Y+v5L2c5Li65omA6KaB6K+35rGC55qE6LWE5rqQ55qE5qCH6K+G56ymCisKKyAgLyoqCisgICAqIFBlZXJzIGN1cnJlbnRseSBleGNoYW5naW5nIG9uIHRoaXMgdG9ycmVudC4KKyAgICog55uu5YmN5pyN5Yqh5Zmo5Lit5a2Y5Zyo55qE55So5oi3CisgICAqLworICBwcml2YXRlIENvbmN1cnJlbnRNYXA8UGVlclVJRCwgVHJhY2tlZFBlZXI+IHBlZXJzOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgdHJhY2tlZCB0b3JyZW50IGZyb20gbWV0YS1pbmZvIGJpbmFyeSBkYXRhLgorICAgKiDliJvlu7rnqbpUcmFja2VkVG9ycmVudAorICAgKgorICAgKiBAcGFyYW0gaW5mb19oYXNoIFRoZSBtZXRhLWluZm8gYnl0ZSBkYXRhLgorICAgKiAgICAgICAgICAgICAgICAgIGVuY29kZWQgYW5kIGhhc2hlZCBiYWNrIHRvIGNyZWF0ZSB0aGUgdG9ycmVudCdzIFNIQS0xIGhhc2guCisgICAqICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgKi8KKyAgcHVibGljIFRyYWNrZWRUb3JyZW50KGJ5dGVbXSBpbmZvX2hhc2gpIHsKKyAgICB0aGlzLmluZm9faGFzaCA9IGluZm9faGFzaDsKKworICAgIHRoaXMucGVlcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8UGVlclVJRCwgVHJhY2tlZFBlZXI+KCk7CisgICAgdGhpcy5hbnN3ZXJQZWVycyA9IFRyYWNrZWRUb3JyZW50LkRFRkFVTFRfQU5TV0VSX05VTV9QRUVSUzsKKyAgICB0aGlzLmFubm91bmNlSW50ZXJ2YWwgPSBUcmFja2VkVG9ycmVudC5ERUZBVUxUX0FOTk9VTkNFX0lOVEVSVkFMX1NFQ09ORFM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWFwIG9mIGFsbCBwZWVycyBjdXJyZW50bHkgZXhjaGFuZ2luZyBvbiB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgTWFwPFBlZXJVSUQsIFRyYWNrZWRQZWVyPiBnZXRQZWVycygpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVyczsKKyAgfQorCisgIC8qKgorICAgKiBBZGQgYSBwZWVyIGV4Y2hhbmdpbmcgb24gdGhpcyB0b3JyZW50LgorICAgKgorICAgKiBAcGFyYW0gcGVlciBUaGUgbmV3IFBlZXIgaW52b2x2ZWQgd2l0aCB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgdm9pZCBhZGRQZWVyKFRyYWNrZWRQZWVyIHBlZXIpIHsKKyAgICB0aGlzLnBlZXJzLnB1dChuZXcgUGVlclVJRChwZWVyLmdldEFkZHJlc3MoKSwgdGhpcy5nZXRIZXhJbmZvSGFzaCgpKSwgcGVlcik7CisgIH0KKworICBwdWJsaWMgVHJhY2tlZFBlZXIgZ2V0UGVlcihQZWVyVUlEIHBlZXJVSUQpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVycy5nZXQocGVlclVJRCk7CisgIH0KKworICBwdWJsaWMgVHJhY2tlZFBlZXIgcmVtb3ZlUGVlcihQZWVyVUlEIHBlZXJVSUQpIHsKKyAgICByZXR1cm4gdGhpcy5wZWVycy5yZW1vdmUocGVlclVJRCk7CisgIH0KKworICAvKioKKyAgICogQ291bnQgdGhlIG51bWJlciBvZiBzZWVkZXJzIChwZWVycyBpbiB0aGUgQ09NUExFVEVEIHN0YXRlKSBvbiB0aGlzCisgICAqIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgaW50IHNlZWRlcnMoKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKFRyYWNrZWRQZWVyIHBlZXIgOiB0aGlzLnBlZXJzLnZhbHVlcygpKSB7CisgICAgICBpZiAocGVlci5pc0NvbXBsZXRlZCgpKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKKyAgfQorCisgIC8qKgorICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGxlZWNoZXJzIChub24tQ09NUExFVEVEIHBlZXJzKSBvbiB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgaW50IGxlZWNoZXJzKCkgeworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChUcmFja2VkUGVlciBwZWVyIDogdGhpcy5wZWVycy52YWx1ZXMoKSkgeworICAgICAgaWYgKCFwZWVyLmlzQ29tcGxldGVkKCkpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZSB1bmZyZXNoIHBlZXJzIGZyb20gdGhpcyB0b3JyZW50LgorICAgKiA8cD4KKyAgICogPHA+CisgICAqIENvbGxlY3QgYW5kIHJlbW92ZSBhbGwgbm9uLWZyZXNoIHBlZXJzIGZyb20gdGhpcyB0b3JyZW50LiBUaGlzIGlzCisgICAqIHVzdWFsbHkgY2FsbGVkIGJ5IHRoZSBwZXJpb2RpYyBwZWVyIGNvbGxlY3RvciBvZiB0aGUgQml0VG9ycmVudCB0cmFja2VyLgorICAgKiA8L3A+CisgICAqLworICBwdWJsaWMgdm9pZCBjb2xsZWN0VW5mcmVzaFBlZXJzKGludCBleHBpcmVUaW1lb3V0U2VjKSB7CisgICAgZm9yIChUcmFja2VkUGVlciBwZWVyIDogdGhpcy5wZWVycy52YWx1ZXMoKSkgeworICAgICAgaWYgKCFwZWVyLmlzRnJlc2goZXhwaXJlVGltZW91dFNlYykpIHsKKyAgICAgICAgdGhpcy5wZWVycy5yZW1vdmUobmV3IFBlZXJVSUQocGVlci5nZXRBZGRyZXNzKCksIHRoaXMuZ2V0SGV4SW5mb0hhc2goKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGFubm91bmNlIGludGVydmFsIGZvciB0aGlzIHRvcnJlbnQuCisgICAqLworICBwdWJsaWMgaW50IGdldEFubm91bmNlSW50ZXJ2YWwoKSB7CisgICAgcmV0dXJuIHRoaXMuYW5ub3VuY2VJbnRlcnZhbDsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGFubm91bmNlIGludGVydmFsIGZvciB0aGlzIHRvcnJlbnQuCisgICAqCisgICAqIEBwYXJhbSBpbnRlcnZhbCBOZXcgYW5ub3VuY2UgaW50ZXJ2YWwsIGluIHNlY29uZHMuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBbm5vdW5jZUludGVydmFsKGludCBpbnRlcnZhbCkgeworICAgIGlmIChpbnRlcnZhbCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGFubm91bmNlIGludGVydmFsIik7CisgICAgfQorCisgICAgdGhpcy5hbm5vdW5jZUludGVydmFsID0gaW50ZXJ2YWw7CisgIH0KKworICAvKioKKyAgICogVXBkYXRlIHRoaXMgdG9ycmVudCdzIHN3YXJtIGZyb20gYW4gYW5ub3VuY2UgZXZlbnQuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbmV3IHBlZXIgb24gYSAnc3RhcnRlZCcgYW5ub3VuY2UgZXZlbnQsCisgICAqIGFuZCByZW1vdmUgdGhlIHBlZXIgb24gYSAnc3RvcHBlZCcgYW5ub3VuY2UgZXZlbnQuCisgICAqIDwvcD4KKyAgICoKKyAgICogQHBhcmFtIGV2ZW50ICAgICAgVGhlIHJlcG9ydGVkIGV2ZW50LiBJZiA8ZW0+bnVsbDwvZW0+LCBtZWFucyBhIHJlZ3VsYXIKKyAgICogICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgYW5ub3VuY2UgZXZlbnQsIGFzIGRlZmluZWQgaW4gdGhlIEJpdFRvcnJlbnQgc3BlY2lmaWNhdGlvbi4KKyAgICogQHBhcmFtIHBlZXJJZCAgICAgVGhlIGJ5dGUtZW5jb2RlZCBwZWVyIElELgorICAgKiBAcGFyYW0gaGV4UGVlcklkICBUaGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBlZXIncyBJRC4KKyAgICogQHBhcmFtIGlwICAgICAgICAgVGhlIHBlZXIncyBJUCBhZGRyZXNzLgorICAgKiBAcGFyYW0gcG9ydCAgICAgICBUaGUgcGVlcidzIGluYm91bmQgcG9ydC4KKyAgICogQHBhcmFtIHVwbG9hZGVkICAgVGhlIHBlZXIncyByZXBvcnRlZCB1cGxvYWRlZCBieXRlIGNvdW50LgorICAgKiBAcGFyYW0gZG93bmxvYWRlZCBUaGUgcGVlcidzIHJlcG9ydGVkIGRvd25sb2FkZWQgYnl0ZSBjb3VudC4KKyAgICogQHBhcmFtIGxlZnQgICAgICAgVGhlIHBlZXIncyByZXBvcnRlZCBsZWZ0IHRvIGRvd25sb2FkIGJ5dGUgY291bnQuCisgICAqIEByZXR1cm4gVGhlIHBlZXIgdGhhdCBzZW50IHVzIHRoZSBhbm5vdW5jZSByZXF1ZXN0LgorICAgKi8KKyAgcHVibGljIFRyYWNrZWRQZWVyIHVwZGF0ZShSZXF1ZXN0RXZlbnQgZXZlbnQsIEJ5dGVCdWZmZXIgcGVlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZXhQZWVySWQsIFN0cmluZyBpcCwgaW50IHBvcnQsIGxvbmcgdXBsb2FkZWQsIGxvbmcgZG93bmxvYWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlZnQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBsb2dnZXIudHJhY2UoImV2ZW50IHt9LCBQZWVyOiB7fTp7fSIsIG5ldyBPYmplY3RbXXtldmVudC5nZXRFdmVudE5hbWUoKSwgaXAsIHBvcnR9KTsKKyAgICBUcmFja2VkUGVlciBwZWVyID0gbnVsbDsKKyAgICBUcmFja2VkUGVlci5QZWVyU3RhdGUgc3RhdGUgPSBUcmFja2VkUGVlci5QZWVyU3RhdGUuVU5LTk9XTjsKKworICAgIFBlZXJVSUQgcGVlclVJRCA9IG5ldyBQZWVyVUlEKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhpcCwgcG9ydCksIGdldEhleEluZm9IYXNoKCkpOworICAgIGlmIChSZXF1ZXN0RXZlbnQuU1RBUlRFRC5lcXVhbHMoZXZlbnQpKSB7CisgICAgICBzdGF0ZSA9IFRyYWNrZWRQZWVyLlBlZXJTdGF0ZS5TVEFSVEVEOworICAgIH0gZWxzZSBpZiAoUmVxdWVzdEV2ZW50LlNUT1BQRUQuZXF1YWxzKGV2ZW50KSkgeworICAgICAgcGVlciA9IHRoaXMucmVtb3ZlUGVlcihwZWVyVUlEKTsKKyAgICAgIHN0YXRlID0gVHJhY2tlZFBlZXIuUGVlclN0YXRlLlNUT1BQRUQ7CisgICAgfSBlbHNlIGlmIChSZXF1ZXN0RXZlbnQuQ09NUExFVEVELmVxdWFscyhldmVudCkpIHsKKyAgICAgIHBlZXIgPSB0aGlzLmdldFBlZXIocGVlclVJRCk7CisgICAgICBzdGF0ZSA9IFRyYWNrZWRQZWVyLlBlZXJTdGF0ZS5DT01QTEVURUQ7CisgICAgfSBlbHNlIGlmIChSZXF1ZXN0RXZlbnQuTk9ORS5lcXVhbHMoZXZlbnQpKSB7CisgICAgICBwZWVyID0gdGhpcy5nZXRQZWVyKHBlZXJVSUQpOworICAgICAgc3RhdGUgPSBUcmFja2VkUGVlci5QZWVyU3RhdGUuU1RBUlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBhbm5vdW5jZSBldmVudCB0eXBlISIpOworICAgIH0KKworICAgIGlmIChwZWVyID09IG51bGwpIHsKKyAgICAgIHBlZXIgPSBuZXcgVHJhY2tlZFBlZXIodGhpcywgaXAsIHBvcnQsIHBlZXJJZCk7CisgICAgICB0aGlzLmFkZFBlZXIocGVlcik7CisgICAgfQorICAgIHBlZXIudXBkYXRlKHN0YXRlLCB1cGxvYWRlZCwgZG93bmxvYWRlZCwgbGVmdCk7CisgICAgcmV0dXJuIHBlZXI7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgbGlzdCBvZiBwZWVycyB3ZSBjYW4gcmV0dXJuIGluIGFuIGFubm91bmNlIHJlc3BvbnNlIGZvciB0aGlzCisgICAqIHRvcnJlbnQuCisgICAqCisgICAqIEBwYXJhbSBwZWVyIFRoZSBwZWVyIG1ha2luZyB0aGUgcmVxdWVzdCwgc28gd2UgY2FuIGV4Y2x1ZGUgaXQgZnJvbSB0aGUKKyAgICogICAgICAgICAgICAgbGlzdCBvZiByZXR1cm5lZCBwZWVycy4KKyAgICogQHJldHVybiBBIGxpc3Qgb2YgcGVlcnMgd2UgY2FuIGluY2x1ZGUgaW4gYW4gYW5ub3VuY2UgcmVzcG9uc2UuCisgICAqLworICBwdWJsaWMgTGlzdDxQZWVyPiBnZXRTb21lUGVlcnMoUGVlciBwZWVyKSB7CisgICAgTGlzdDxQZWVyPiBwZWVycyA9IG5ldyBMaW5rZWRMaXN0PFBlZXI+KCk7CisKKyAgICAvLyBFeHRyYWN0IGFuc3dlclBlZXJzIHJhbmRvbSBwZWVycworICAgIExpc3Q8VHJhY2tlZFBlZXI+IGNhbmRpZGF0ZXMgPSBuZXcgTGlua2VkTGlzdDxUcmFja2VkUGVlcj4odGhpcy5wZWVycy52YWx1ZXMoKSk7CisgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShjYW5kaWRhdGVzKTsKKworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChUcmFja2VkUGVlciBjYW5kaWRhdGUgOiBjYW5kaWRhdGVzKSB7CisgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSByZXF1ZXN0aW5nIHBlZXIgaW4gdGhlIGFuc3dlci4KKyAgICAgIGlmIChwZWVyICE9IG51bGwgJiYgcGVlci5sb29rc0xpa2UoY2FuZGlkYXRlKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gT25seSBzZXJ2ZSBhdCBtb3N0IEFOU1dFUl9OVU1fUEVFUlMgcGVlcnMKKyAgICAgIGlmIChjb3VudCsrID4gdGhpcy5hbnN3ZXJQZWVycykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcGVlcnMuYWRkKGNhbmRpZGF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHBlZXJzOworICB9CisKKyAgLyoqCisgICAqIExvYWQgYSB0cmFja2VkIHRvcnJlbnQgZnJvbSB0aGUgZ2l2ZW4gdG9ycmVudCBmaWxlLgorICAgKgorICAgKiBAcGFyYW0gdG9ycmVudCBUaGUgYWJzdHJhY3Qge0BsaW5rIEZpbGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlCisgICAqICAgICAgICAgICAgICAgIDx0dD4udG9ycmVudDwvdHQ+IGZpbGUgdG8gbG9hZC4KKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgV2hlbiB0aGUgdG9ycmVudCBmaWxlIGNhbm5vdCBiZSByZWFkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUcmFja2VkVG9ycmVudCBsb2FkKEZpbGUgdG9ycmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgIFRvcnJlbnRNZXRhZGF0YSB0b3JyZW50TWV0YWRhdGEgPSBuZXcgVG9ycmVudFBhcnNlcigpLnBhcnNlRnJvbUZpbGUodG9ycmVudCk7CisgICAgcmV0dXJuIG5ldyBUcmFja2VkVG9ycmVudCh0b3JyZW50TWV0YWRhdGEuZ2V0SW5mb0hhc2goKSk7CisgIH0KKworCisgIC8vIOi/lOWbnuenjeWtkOWTiOW4jOWAvAorICBAT3ZlcnJpZGUKKyAgcHVibGljIGJ5dGVbXSBnZXRJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gdGhpcy5pbmZvX2hhc2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRIZXhJbmZvSGFzaCgpIHsKKyAgICByZXR1cm4gVG9ycmVudFV0aWxzLmJ5dGVBcnJheVRvSGV4U3RyaW5nKHRoaXMuaW5mb19oYXNoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiVHJhY2tlZFRvcnJlbnR7IiArCisgICAgICAgICAgICAiaW5mb19oYXNoPSIgKyBnZXRIZXhJbmZvSGFzaCgpICsKKyAgICAgICAgICAgICd9JzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL21haW4vamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RyYWNrZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNzhmOQotLS0gL2Rldi9udWxsCisrKyBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyLmphdmEKQEAgLTAsMCArMSwyODkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgVHVybiwgSW5jLgorICogPHA+CisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHA+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gdHJhY2tlcuWuouaIt+errworcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLlRvcnJlbnRMb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5jb3JlLkNvbnRhaW5lclNlcnZlcjsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLnRyYW5zcG9ydC5jb25uZWN0LkNvbm5lY3Rpb247CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay50cmFuc3BvcnQuY29ubmVjdC5Tb2NrZXRDb25uZWN0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQml0VG9ycmVudCB0cmFja2VyLgorICogPHA+CisgKiA8cD4KKyAqIFRoZSB0cmFja2VyIHVzdWFsbHkgbGlzdGVucyBvbiBwb3J0IDY5NjkgKHRoZSBzdGFuZGFyZCBCaXRUb3JyZW50IHRyYWNrZXIKKyAqIHBvcnQpLiBUb3JyZW50cyBtdXN0IGJlIHJlZ2lzdGVyZWQgZGlyZWN0bHkgdG8gdGhpcyB0cmFja2VyIHdpdGggdGhlCisgKiB7QGxpbmsgI2Fubm91bmNlKFRyYWNrZWRUb3JyZW50IHRvcnJlbnQpfTwvY29kZT4gbWV0aG9kLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgbXBldGF6em9uaQorICovCisKKy8vIOe/u+ivke+8mnRyYWNrZXIg55uR5ZCsNjk2Oeerr+WPo++8jOenjeWtkOiiq1RyYWNrZWRUb3JyZW5057G76KGo56S6CitwdWJsaWMgY2xhc3MgVHJhY2tlciB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmFja2VyLmNsYXNzKTsvLyDml6Xlv5forrDlvZUKKworICAvKioKKyAgICogUmVxdWVzdCBwYXRoIGhhbmRsZWQgYnkgdGhlIHRyYWNrZXIgYW5ub3VuY2UgcmVxdWVzdCBoYW5kbGVyLgorICAgKiDnlLHot5/ouKrlmajlhazlkYror7fmsYLlpITnkIbnqIvluo/lpITnkIbnmoTor7fmsYLot6/lvoQgIOS/neWtmOi3r+W+hOerr+WPo2lwCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVU5DRV9VUkwgPSAiL2Fubm91bmNlIjsKKworICAvKioKKyAgICogRGVmYXVsdCB0cmFja2VyIGxpc3RlbmluZyBwb3J0IChCaXRUb3JyZW50J3MgZGVmYXVsdCBpcyA2OTY5KS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVFJBQ0tFUl9QT1JUID0gNjk2OTsKKworICAvKioKKyAgICogRGVmYXVsdCBzZXJ2ZXIgbmFtZSBhbmQgdmVyc2lvbiBhbm5vdW5jZWQgYnkgdGhlIHRyYWNrZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZFUlNJT05fU1RSSU5HID0gIkJpdFRvcnJlbnQgVHJhY2tlciAodHRvcnJlbnQpIjsKKworICBwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKworICAvKioKKyAgICogVGhlIGluLW1lbW9yeSByZXBvc2l0b3J5IG9mIHRvcnJlbnRzIHRyYWNrZWQuCisgICAqLworICAvLyDnp43lrZDku5PlupPnrqHnkIYKKyAgcHJpdmF0ZSBmaW5hbCBUb3JyZW50c1JlcG9zaXRvcnkgbXlUb3JyZW50c1JlcG9zaXRvcnk7CisKKyAgcHJpdmF0ZSBQZWVyQ29sbGVjdG9yVGhyZWFkIG15UGVlckNvbGxlY3RvclRocmVhZDsKKyAgcHJpdmF0ZSBib29sZWFuIHN0b3A7CisgIHByaXZhdGUgU3RyaW5nIG15QW5ub3VuY2VVcmw7CisgIHByaXZhdGUgZmluYWwgaW50IG15UG9ydDsKKyAgcHJpdmF0ZSBTb2NrZXRBZGRyZXNzIG15Qm91bmRBZGRyZXNzID0gbnVsbDsKKworICBwcml2YXRlIGZpbmFsIFRyYWNrZXJTZXJ2aWNlQ29udGFpbmVyIG15VHJhY2tlclNlcnZpY2VDb250YWluZXI7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBCaXRUb3JyZW50IHRyYWNrZXIgbGlzdGVuaW5nIGF0IHRoZSBnaXZlbiBhZGRyZXNzLgorICAgKgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93cyBhbiA8ZW0+SU9FeGNlcHRpb248L2VtPiBpZiB0aGUgdHJhY2tlcgorICAgKiAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBpbml0aWFsaXplZC4KKyAgICovCisgIC8v5paw5bu6dHJhY2tlcueahOWjsOaYjiBwb3J05piv6L+Q6KGM56uv5Y+jCisgIHB1YmxpYyBUcmFja2VyKGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMocG9ydCwKKyAgICAgICAgICAgIGdldERlZmF1bHRBbm5vdW5jZVVybChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHBvcnQpKS50b1N0cmluZygpCisgICAgKTsKKyAgICAvL+iwg+eUqOS4i+S4gOS4quWjsOaYjiDlvojlpJrmlbDmja7mmK/oh6rliqjnlJ/miJDnmoTvvIzliJvlu7p0cmFja2Vy55qE5pe25YCZ5Y+q6KaB5aOw5piO6buY6K6k56uv5Y+jCisgIH0KKworICBwdWJsaWMgVHJhY2tlcihpbnQgcG9ydCwgU3RyaW5nIGFubm91bmNlVVJMKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG15UG9ydCA9IHBvcnQ7CisgICAgbXlBbm5vdW5jZVVybCA9IGFubm91bmNlVVJMOworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5ID0gbmV3IFRvcnJlbnRzUmVwb3NpdG9yeSgxMCk7CisgICAgZmluYWwgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgcmVxdWVzdFByb2Nlc3NvciA9IG5ldyBUcmFja2VyUmVxdWVzdFByb2Nlc3NvcihteVRvcnJlbnRzUmVwb3NpdG9yeSk7CisgICAgbXlUcmFja2VyU2VydmljZUNvbnRhaW5lciA9IG5ldyBUcmFja2VyU2VydmljZUNvbnRhaW5lcihyZXF1ZXN0UHJvY2Vzc29yLAorICAgICAgICAgICAgbmV3IE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yKHJlcXVlc3RQcm9jZXNzb3IpKTsKKyAgICBteVBlZXJDb2xsZWN0b3JUaHJlYWQgPSBuZXcgUGVlckNvbGxlY3RvclRocmVhZChteVRvcnJlbnRzUmVwb3NpdG9yeSk7CisgIH0KKworICBwdWJsaWMgVHJhY2tlcihpbnQgcG9ydCwgU3RyaW5nIGFubm91bmNlVVJMLCBUcmFja2VyUmVxdWVzdFByb2Nlc3NvciByZXF1ZXN0UHJvY2Vzc29yLCBUb3JyZW50c1JlcG9zaXRvcnkgdG9ycmVudHNSZXBvc2l0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIG15UG9ydCA9IHBvcnQ7CisgICAgbXlBbm5vdW5jZVVybCA9IGFubm91bmNlVVJMOworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5ID0gdG9ycmVudHNSZXBvc2l0b3J5OworICAgIG15VHJhY2tlclNlcnZpY2VDb250YWluZXIgPSBuZXcgVHJhY2tlclNlcnZpY2VDb250YWluZXIocmVxdWVzdFByb2Nlc3NvciwgbmV3IE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yKHJlcXVlc3RQcm9jZXNzb3IpKTsKKyAgICBteVBlZXJDb2xsZWN0b3JUaHJlYWQgPSBuZXcgUGVlckNvbGxlY3RvclRocmVhZChteVRvcnJlbnRzUmVwb3NpdG9yeSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZnVsbCBhbm5vdW5jZSBVUkwgc2VydmVkIGJ5IHRoaXMgdHJhY2tlci4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiBUaGlzIGhhcyB0aGUgZm9ybSBodHRwOi8vaG9zdDpwb3J0L2Fubm91bmNlLgorICAgKiA8L3A+CisgICAqLworICBwcml2YXRlIHN0YXRpYyBVUkwgZ2V0RGVmYXVsdEFubm91bmNlVXJsKEluZXRTb2NrZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG5ldyBVUkwoImh0dHAiLAorICAgICAgICAgICAgICBhZGRyZXNzLmdldEFkZHJlc3MoKS5nZXRDYW5vbmljYWxIb3N0TmFtZSgpLAorICAgICAgICAgICAgICBhZGRyZXNzLmdldFBvcnQoKSwKKyAgICAgICAgICAgICAgQU5OT1VOQ0VfVVJMKTsKKyAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBidWlsZCB0cmFja2VyIFVSTDoge30hIiwgbXVlLCBtdWUpOworICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRBbm5vdW5jZVVybCgpIHsKKyAgICByZXR1cm4gbXlBbm5vdW5jZVVybDsKKyAgfQorCisgIHB1YmxpYyBVUkkgZ2V0QW5ub3VuY2VVUkkoKSB7CisgICAgdHJ5IHsKKyAgICAgIFVSTCBhbm5vdW5jZVVSTCA9IG5ldyBVUkwoZ2V0QW5ub3VuY2VVcmwoKSk7CisgICAgICBpZiAoYW5ub3VuY2VVUkwgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gYW5ub3VuY2VVUkwudG9VUkkoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgY29udmVydCBhbm5vdW5jZSBVUkwgdG8gVVJJIiwgZSk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGNyZWF0ZSBVUkwgZnJvbSBhbm5vdW5jZVVSTCIsIGUpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBTdGFydCB0aGUgdHJhY2tlciB0aHJlYWQuCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBib29sZWFuIHN0YXJ0UGVlckNsZWFuaW5nVGhyZWFkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyBCaXRUb3JyZW50IHRyYWNrZXIgb24ge30uLi4iLAorICAgICAgICAgICAgZ2V0QW5ub3VuY2VVcmwoKSk7CisgICAgY29ubmVjdGlvbiA9IG5ldyBTb2NrZXRDb25uZWN0aW9uKG5ldyBDb250YWluZXJTZXJ2ZXIobXlUcmFja2VyU2VydmljZUNvbnRhaW5lcikpOworCisgICAgTGlzdDxTb2NrZXRBZGRyZXNzPiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8U29ja2V0QWRkcmVzcz4oKSB7eworICAgICAgdHJ5IHsKKyAgICAgICAgYWRkKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MobmV3IGJ5dGVbNF0pLCBteVBvcnQpKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYWRkKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgbXlQb3J0KSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG5ldyBVUkwoZ2V0QW5ub3VuY2VVcmwoKSkuZ2V0SG9zdCgpKSwgbXlQb3J0KSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIH0KKyAgICB9fTsKKworICAgIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworICAgIGZvciAoU29ja2V0QWRkcmVzcyBhZGRyZXNzIDogdHJpZXMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICgobXlCb3VuZEFkZHJlc3MgPSBjb25uZWN0aW9uLmNvbm5lY3QoYWRkcmVzcykpICE9IG51bGwpIHsKKyAgICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRlZCB0b3JyZW50IHRyYWNrZXIgb24ge30iLCBhZGRyZXNzKTsKKyAgICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJDYW4ndCBzdGFydCB0aGUgdHJhY2tlciB1c2luZyBhZGRyZXNze30gOiAiLCBhZGRyZXNzLnRvU3RyaW5nKCksIGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IHN0YXJ0IHRyYWNrZXIgb24gcG9ydCB7fS4gU3RvcHBpbmcgbm93Li4uIiwgbXlQb3J0KTsKKyAgICAgIHN0b3AoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0YXJ0UGVlckNsZWFuaW5nVGhyZWFkKSB7CisgICAgICBpZiAobXlQZWVyQ29sbGVjdG9yVGhyZWFkID09IG51bGwgfHwgIW15UGVlckNvbGxlY3RvclRocmVhZC5pc0FsaXZlKCkgfHwgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLmdldFN0YXRlKCkgIT0gVGhyZWFkLlN0YXRlLk5FVykgeworICAgICAgICBteVBlZXJDb2xsZWN0b3JUaHJlYWQgPSBuZXcgUGVlckNvbGxlY3RvclRocmVhZChteVRvcnJlbnRzUmVwb3NpdG9yeSk7CisgICAgICB9CisKKyAgICAgIG15UGVlckNvbGxlY3RvclRocmVhZC5zZXROYW1lKCJwZWVyLXBlZXJDb2xsZWN0b3JUaHJlYWQ6IiArIG15UG9ydCk7CisgICAgICBteVBlZXJDb2xsZWN0b3JUaHJlYWQuc3RhcnQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU3RvcCB0aGUgdHJhY2tlci4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiBUaGlzIGVmZmVjdGl2ZWx5IGNsb3NlcyB0aGUgbGlzdGVuaW5nIEhUVFAgY29ubmVjdGlvbiB0byB0ZXJtaW5hdGUKKyAgICogdGhlIHNlcnZpY2UsIGFuZCBpbnRlcnJ1cHRzIHRoZSBwZWVyIG15UGVlckNvbGxlY3RvclRocmVhZCB0aHJlYWQgYXMgd2VsbC4KKyAgICogPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICB0aGlzLnN0b3AgPSB0cnVlOworCisgICAgdHJ5IHsKKyAgICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgbG9nZ2VyLmluZm8oIkJpdFRvcnJlbnQgdHJhY2tlciBjbG9zZWQuIik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICBsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBzdG9wIHRoZSB0cmFja2VyOiB7fSEiLCBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBpZiAobXlQZWVyQ29sbGVjdG9yVGhyZWFkICE9IG51bGwgJiYgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLmlzQWxpdmUoKSkgeworICAgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLmludGVycnVwdCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLmpvaW4oKTsKKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8KKyAgICAgIH0KKyAgICAgIGxvZ2dlci5pbmZvKCJQZWVyIGNvbGxlY3Rpb24gdGVybWluYXRlZC4iKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQW5ub3VuY2UgYSBuZXcgdG9ycmVudCBvbiB0aGlzIHRyYWNrZXIuCisgICAqIDxwPgorICAgKiA8cD4KKyAgICogVGhlIGZhY3QgdGhhdCB0b3JyZW50cyBtdXN0IGJlIGFubm91bmNlZCBoZXJlIGZpcnN0IG1ha2VzIHRoaXMgdHJhY2tlciBhCisgICAqIGNsb3NlZCBCaXRUb3JyZW50IHRyYWNrZXI6IGl0IHdpbGwgb25seSBhY2NlcHQgY2xpZW50cyBmb3IgdG9ycmVudHMgaXQKKyAgICoga25vd3MgYWJvdXQsIGFuZCB0aGlzIGxpc3Qgb2YgdG9ycmVudHMgaXMgbWFuYWdlZCBieSB0aGUgcHJvZ3JhbQorICAgKiBpbnN0cnVtZW50aW5nIHRoaXMgVHJhY2tlciBjbGFzcy4KKyAgICogPC9wPgorICAgKgorICAgKiBAcGFyYW0gdG9ycmVudCBUaGUgVG9ycmVudCBvYmplY3QgdG8gc3RhcnQgdHJhY2tpbmcuCisgICAqIEByZXR1cm4gVGhlIHRvcnJlbnQgb2JqZWN0IGZvciB0aGlzIHRvcnJlbnQgb24gdGhpcyB0cmFja2VyLiBUaGlzIG1heSBiZQorICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgc3VwcGxpZWQgVG9ycmVudCBvYmplY3QgaWYgdGhlIHRyYWNrZXIgYWxyZWFkeQorICAgKiBjb250YWluZWQgYSB0b3JyZW50IHdpdGggdGhlIHNhbWUgaGFzaC4KKyAgICovCisKKyAgLy9zeW5jaHJvbml6ZWQg56Gu5L+d5aSa57q/56iL6K6/6Zeu5YWx5Lqr6LWE5rqQ5LiN5Lya5Ye66ZSZCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVHJhY2tlZFRvcnJlbnQgYW5ub3VuY2UoVHJhY2tlZFRvcnJlbnQgdG9ycmVudCkgeworICAgIFRyYWNrZWRUb3JyZW50IGV4aXN0aW5nID0gbXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCkpOworCisgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKKyAgICAgIGxvZ2dlci53YXJuKCJUcmFja2VyIGFscmVhZHkgYW5ub3VuY2VkIHRvcnJlbnQgd2l0aCBoYXNoIHt9LiIsIGV4aXN0aW5nLmdldEhleEluZm9IYXNoKCkpOworICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgIH0KKworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSwgdG9ycmVudCk7CisgICAgbG9nZ2VyLmluZm8oIlJlZ2lzdGVyZWQgbmV3IHRvcnJlbnQgd2l0aCBoYXNoIHt9LiIsIHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgcmV0dXJuIHRvcnJlbnQ7CisgIH0KKworICAvKioKKyAgICogU2V0IHRvIHRydWUgdG8gYWxsb3cgdGhpcyB0cmFja2VyIHRvIHRyYWNrIGV4dGVybmFsIHRvcnJlbnRzIChpLmUuIHRob3NlIHRoYXQgd2VyZSBub3QgZXhwbGljaXRseSBhbm5vdW5jZWQgaGVyZSkuCisgICAqCisgICAqIEBwYXJhbSBhY2NlcHRGb3JlaWduVG9ycmVudHMgdHJ1ZSB0byBhY2NlcHQgZm9yZWlnbiB0b3JyZW50cyAoZmFsc2Ugb3RoZXJ3aXNlKQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKGJvb2xlYW4gYWNjZXB0Rm9yZWlnblRvcnJlbnRzKSB7CisgICAgbXlUcmFja2VyU2VydmljZUNvbnRhaW5lci5zZXRBY2NlcHRGb3JlaWduVG9ycmVudHMoYWNjZXB0Rm9yZWlnblRvcnJlbnRzKTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGFsbCB0cmFja2VkIHRvcnJlbnRzLgorICAgKi8KKyAgcHVibGljIENvbGxlY3Rpb248VHJhY2tlZFRvcnJlbnQ+IGdldFRyYWNrZWRUb3JyZW50cygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnZhbHVlcygpKTsKKyAgfQorCisgIHB1YmxpYyBUcmFja2VkVG9ycmVudCBnZXRUcmFja2VkVG9ycmVudChTdHJpbmcgaGFzaCkgeworICAgIHJldHVybiBteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50KGhhc2gpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QW5ub3VuY2VJbnRlcnZhbChpbnQgYW5ub3VuY2VJbnRlcnZhbCkgeworICAgIG15VHJhY2tlclNlcnZpY2VDb250YWluZXIuc2V0QW5ub3VuY2VJbnRlcnZhbChhbm5vdW5jZUludGVydmFsKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KGludCBleHBpcmVUaW1lb3V0KSB7CisgICAgbXlQZWVyQ29sbGVjdG9yVGhyZWFkLnNldFRvcnJlbnRFeHBpcmVUaW1lb3V0U2VjKGV4cGlyZVRpbWVvdXQpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyUmVxdWVzdFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjUxZmIKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBUdXJuLCBJbmMuCisgKiA8cD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuQ29uc3RhbnRzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Mb2dnZXJVdGlsczsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uUGVlcjsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24uVG9ycmVudExvZ2dlckZhY3Rvcnk7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLkFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLlRyYWNrZXJNZXNzYWdlLkVycm9yTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuVHJhY2tlck1lc3NhZ2UuTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHAuSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2U7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLnByb3RvY29sLmh0dHAuSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5odHRwLkhUVFBUcmFja2VyRXJyb3JNZXNzYWdlOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5TdGF0dXM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIFRyYWNrZXIgc2VydmljZSB0byBzZXJ2ZSB0aGUgdHJhY2tlcidzIGFubm91bmNlIHJlcXVlc3RzLgorICogYW5ub3VuY2Ug5a6i5oi356uv5ZKMdHJhY2tlcuacjeWKoeWZqOi/m+ihjOmAmuS/oQorICogPHA+CisgKiA8cD4KKyAqIEl0IG9ubHkgc2VydmVzIGFubm91bmNlIHJlcXVlc3RzIG9uIC9hbm5vdW5jZSwgYW5kIG9ubHkgc2VydmVzIHRvcnJlbnRzIHRoZQorICoge0BsaW5rIFRyYWNrZXJ9IGl0IHNlcnZlcyBrbm93cyBhYm91dC4KKyAqIDwvcD4KKyAqIDxwPgorICogPHA+CisgKiBUaGUgbGlzdCBvZiB0b3JyZW50cyB7QHNlZSAjcmVxdWVzdEhhbmRsZXIuZ2V0VG9ycmVudHNNYXAoKX0gaXMgYSBtYXAgb2YgdG9ycmVudCBoYXNoZXMgdG8gdGhlaXIKKyAqIGNvcnJlc3BvbmRpbmcgVG9ycmVudCBvYmplY3RzLCBhbmQgaXMgbWFpbnRhaW5lZCBieSB0aGUge0BsaW5rIFRyYWNrZXJ9IHRoaXMKKyAqIHNlcnZpY2UgaXMgcGFydCBvZi4gVGhlIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yIG9ubHkgaGFzIGEgcmVmZXJlbmNlIHRvIHRoaXMgbWFwLCBhbmQKKyAqIGRvZXMgbm90IG1vZGlmeSBpdC4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIG1wZXRhenpvbmkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3dpa2kudGhlb3J5Lm9yZy9CaXRUb3JyZW50U3BlY2lmaWNhdGlvbiI+Qml0VG9ycmVudCBwcm90b2NvbCBzcGVjaWZpY2F0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmFja2VyUmVxdWVzdFByb2Nlc3Nvci5jbGFzcyk7CisKKyAgLyoqCisgICAqIFRoZSBsaXN0IG9mIGFubm91bmNlIHJlcXVlc3QgVVJMIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICogbnVtZXJpYyBhbmQgdGh1cyBjb252ZXJ0ZWQgYXMgc3VjaCBpbiB0aGUgcmVxdWVzdCBtZXNzYWdlIHBhcnNpbmcuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOVU1FUklDX1JFUVVFU1RfRklFTERTID0KKyAgICAgICAgICBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAgICAgICAicG9ydCIsICJ1cGxvYWRlZCIsICJkb3dubG9hZGVkIiwgImxlZnQiLAorICAgICAgICAgICAgICAgICAgImNvbXBhY3QiLCAibm9fcGVlcl9pZCIsICJudW13YW50IgorICAgICAgICAgIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVERVJfQU5OT1VOQ0VfSU5URVJWQUwgPSAxNTA7CisgIC8vICBzZWVkZXLpgJrnn6Xpl7TpmpQKKworICBwcml2YXRlIGJvb2xlYW4gbXlBY2NlcHRGb3JlaWduVG9ycmVudHMgPSB0cnVlOyAvL2RlZmF1bHQgdG8gdHJ1ZQorICBwcml2YXRlIGludCBteUFubm91bmNlSW50ZXJ2YWwgPSA2MDsgLy9kZWZhdWx0IHZhbHVlCisgIHByaXZhdGUgZmluYWwgQWRkcmVzc0NoZWNrZXIgbXlBZGRyZXNzQ2hlY2tlcjsgLy9pcOWcsOWdgOajgOafpeWZqAorICBwcml2YXRlIGZpbmFsIFRvcnJlbnRzUmVwb3NpdG9yeSBteVRvcnJlbnRzUmVwb3NpdG9yeTsKKworCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3Igc2VydmluZyB0aGUgZ2l2ZW4gdG9ycmVudHMuCisgICAqIOaYr+S4gOS4quWvueenjeWtkOS7k+W6k+i/m+ihjOeuoeeQhueahOexuworICAgKi8KKyAgcHVibGljIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yKFRvcnJlbnRzUmVwb3NpdG9yeSB0b3JyZW50c1JlcG9zaXRvcnkpIHsKKyAgICB0aGlzKHRvcnJlbnRzUmVwb3NpdG9yeSwgbmV3IEFkZHJlc3NDaGVja2VyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JhZEFkZHJlc3MoU3RyaW5nIGlwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBUcmFja2VyUmVxdWVzdFByb2Nlc3NvcihUb3JyZW50c1JlcG9zaXRvcnkgdG9ycmVudHNSZXBvc2l0b3J5LCBBZGRyZXNzQ2hlY2tlciBhZGRyZXNzQ2hlY2tlcikgeworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5ID0gdG9ycmVudHNSZXBvc2l0b3J5OworICAgIG15QWRkcmVzc0NoZWNrZXIgPSBhZGRyZXNzQ2hlY2tlcjsKKyAgfQorCisgIC8qKgorICAgKiBQcm9jZXNzIHRoZSBhbm5vdW5jZSByZXF1ZXN0LgorICAgKiDlpITnkIbor7fmsYIKKyAgICogPHA+CisgICAqIDxwPgorICAgKiBUaGlzIG1ldGhvZCBhdHRlbXBzIHRvIHJlYWQgYW5kIHBhcnNlIHRoZSBpbmNvbWluZyBhbm5vdW5jZSByZXF1ZXN0IGludG8KKyAgICogYW4gYW5ub3VuY2UgcmVxdWVzdCBtZXNzYWdlLCB0aGVuIGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIGFubm91bmNlCisgICAqIHJlc3BvbnNlIG1lc3NhZ2UgYW5kIHNlbmRzIGl0IGJhY2sgdG8gdGhlIGNsaWVudC4KKyAgICogPC9wPgorICAgKi8KKyAgLy/kvKDlhaXmlbDmja51cmk9cmVxdWVzdC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwg5piv5Y+R5Ye66K+35rGC55qE5a6i5oi356uv5Zyw5Z2A5YyF5ZCr6aG65L6/5Lyg5YWl55qE5Y+C5pWw77yM56ys5LqM5Liq5Y+C5pWw5piv5Li75py65Zyw5Z2ACisgIC8v6K+l5Ye95pWw55qE55uu55qE5piv5aSE55CG56eN5a2Q5paH5Lu255qE6K+35rGC77yI5L6L5aaC77yM55So5oi35LiK5Lyg5oiW5LiL6L2956eN5a2Q5paH5Lu25pe25Y+R6YCB55qE5YWs5ZGK6K+35rGC77yJCisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nIGhvc3RBZGRyZXNzLCBSZXF1ZXN0SGFuZGxlciByZXF1ZXN0SGFuZGxlcikKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGhlYWRlcnMuCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgcXVlcnkgcGFyYW1ldGVycyBpbnRvIGFuIGFubm91bmNlIHJlcXVlc3QgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIFdlIG5lZWQgdG8gcmVseSBvbiBvdXIgb3duIHF1ZXJ5IHBhcnNpbmcgZnVuY3Rpb24gYmVjYXVzZQorICAgICAqIFNpbXBsZUhUVFAncyBRdWVyeSBtYXAgd2lsbCBjb250YWluIFVURi04IGRlY29kZWQgcGFyYW1ldGVycywgd2hpY2gKKyAgICAgKiBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgdGhlIGJ5dGUtZW5jb2RlZCBzdHJpbmdzIHdlIGV4cGVjdC4KKyAgICAgKi8KKyAgICBIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZSBhbm5vdW5jZVJlcXVlc3Q7IC8v5YyF5ZCr5ZCE56eN5bel5YW35pON5L2cCisgICAgdHJ5IHsKKyAgICAgIGFubm91bmNlUmVxdWVzdCA9IHRoaXMucGFyc2VRdWVyeSh1cmksIGhvc3RBZGRyZXNzKTsKKyAgICB9IGNhdGNoIChNZXNzYWdlVmFsaWRhdGlvbkV4Y2VwdGlvbiBtdmUpIHsKKyAgICAgIExvZ2dlclV0aWxzLndhcm5BbmREZWJ1Z0RldGFpbHMobG9nZ2VyLCAiVW5hYmxlIHRvIHBhcnNlIHJlcXVlc3QgbWVzc2FnZS4gUmVxdWVzdCB1cmwgaXMge30iLCB1cmksIG12ZSk7CisgICAgICBzZXJ2ZUVycm9yKFN0YXR1cy5CQURfUkVRVUVTVCwgbXZlLmdldE1lc3NhZ2UoKSwgcmVxdWVzdEhhbmRsZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50ID0gYW5ub3VuY2VSZXF1ZXN0LmdldEV2ZW50KCk7Ly/ojrflj5blvZPliY3nirbmgIHvvIzmr5TlpoLlrozmiJDmiJbogIXlvIDlp4vvvIzlgZzmraIKKworICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICBldmVudCA9IEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50Lk5PTkU7CisgICAgfQorICAgIFRyYWNrZWRUb3JyZW50IHRvcnJlbnQgPSBteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50KGFubm91bmNlUmVxdWVzdC5nZXRIZXhJbmZvSGFzaCgpKTsKKworICAgIC8vIFRoZSByZXF1ZXN0ZWQgdG9ycmVudCBtdXN0IGJlIGFubm91bmNlZCBieSB0aGUgdHJhY2tlciBpZiBhbmQgb25seSBpZiBteUFjY2VwdEZvcmVpZ25Ub3JyZW50cyBpcyBmYWxzZQorICAgIGlmICghbXlBY2NlcHRGb3JlaWduVG9ycmVudHMgJiYgdG9ycmVudCA9PSBudWxsKSB7CisgICAgICBsb2dnZXIud2FybigiUmVxdWVzdGVkIHRvcnJlbnQgaGFzaCB3YXM6IHt9IiwgYW5ub3VuY2VSZXF1ZXN0LmdldEhleEluZm9IYXNoKCkpOworICAgICAgc2VydmVFcnJvcihTdGF0dXMuQkFEX1JFUVVFU1QsIEVycm9yTWVzc2FnZS5GYWlsdXJlUmVhc29uLlVOS05PV05fVE9SUkVOVCwgcmVxdWVzdEhhbmRsZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gaXNTZWVkZXIgPSAoZXZlbnQgPT0gQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuQ09NUExFVEVEKQorICAgICAgICAgICAgfHwgKGFubm91bmNlUmVxdWVzdC5nZXRMZWZ0KCkgPT0gMCk7Ly/liKTmlq3mmK/lgZrkuK3ov5jmmK/kuIvovb0KKworICAgIGlmIChteUFkZHJlc3NDaGVja2VyLmlzQmFkQWRkcmVzcyhhbm5vdW5jZVJlcXVlc3QuZ2V0SXAoKSkpIHsvL+m7keWQjeWNleeUqOaItworICAgICAgaWYgKHRvcnJlbnQgPT0gbnVsbCkgeworICAgICAgICB3cml0ZUVtcHR5UmVzcG9uc2UoYW5ub3VuY2VSZXF1ZXN0LCByZXF1ZXN0SGFuZGxlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUFubm91bmNlUmVzcG9uc2UodG9ycmVudCwgbnVsbCwgaXNTZWVkZXIsIHJlcXVlc3RIYW5kbGVyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmaW5hbCBQZWVyIHBlZXIgPSBuZXcgUGVlcihhbm5vdW5jZVJlcXVlc3QuZ2V0SXAoKSwgYW5ub3VuY2VSZXF1ZXN0LmdldFBvcnQoKSk7CisKKyAgICB0cnkgeworICAgICAgdG9ycmVudCA9IG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50QW5kVXBkYXRlKGFubm91bmNlUmVxdWVzdC5nZXRIZXhJbmZvSGFzaCgpLAorICAgICAgICAgICAgICBuZXcgVHJhY2tlZFRvcnJlbnQoYW5ub3VuY2VSZXF1ZXN0LmdldEluZm9IYXNoKCkpLAorICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGFubm91bmNlUmVxdWVzdC5nZXRQZWVySWQoKSksCisgICAgICAgICAgICAgIGFubm91bmNlUmVxdWVzdC5nZXRIZXhQZWVySWQoKSwKKyAgICAgICAgICAgICAgYW5ub3VuY2VSZXF1ZXN0LmdldElwKCksCisgICAgICAgICAgICAgIGFubm91bmNlUmVxdWVzdC5nZXRQb3J0KCksCisgICAgICAgICAgICAgIGFubm91bmNlUmVxdWVzdC5nZXRVcGxvYWRlZCgpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0RG93bmxvYWRlZCgpLAorICAgICAgICAgICAgICBhbm5vdW5jZVJlcXVlc3QuZ2V0TGVmdCgpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICBMb2dnZXJVdGlscy53YXJuQW5kRGVidWdEZXRhaWxzKGxvZ2dlciwgIlVuYWJsZSB0byB1cGRhdGUgcGVlciB0b3JyZW50LiBSZXF1ZXN0IHVybCBpcyB7fSIsIHVyaSwgaWFlKTsKKyAgICAgIHNlcnZlRXJyb3IoU3RhdHVzLkJBRF9SRVFVRVNULCBFcnJvck1lc3NhZ2UuRmFpbHVyZVJlYXNvbi5JTlZBTElEX0VWRU5ULCByZXF1ZXN0SGFuZGxlcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3JhZnQgYW5kIG91dHB1dCB0aGUgYW5zd2VyCisgICAgd3JpdGVBbm5vdW5jZVJlc3BvbnNlKHRvcnJlbnQsIHBlZXIsIGlzU2VlZGVyLCByZXF1ZXN0SGFuZGxlcik7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVFbXB0eVJlc3BvbnNlKEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIGFubm91bmNlUmVxdWVzdCwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIGFubm91bmNlUmVzcG9uc2U7CisgICAgdHJ5IHsKKyAgICAgIGFubm91bmNlUmVzcG9uc2UgPSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuY3JhZnQoCisgICAgICAgICAgICAgIG15QW5ub3VuY2VJbnRlcnZhbCwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFBlZXI+ZW1wdHlMaXN0KCksCisgICAgICAgICAgICAgIGFubm91bmNlUmVxdWVzdC5nZXRIZXhJbmZvSGFzaCgpKTsKKyAgICAgIHJlcXVlc3RIYW5kbGVyLnNlcnZlUmVzcG9uc2UoU3RhdHVzLk9LLmdldENvZGUoKSwgU3RhdHVzLk9LLmdldERlc2NyaXB0aW9uKCksIGFubm91bmNlUmVzcG9uc2UuZ2V0RGF0YSgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgc2VydmVFcnJvcihTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSwgcmVxdWVzdEhhbmRsZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFubm91bmNlSW50ZXJ2YWwoaW50IGFubm91bmNlSW50ZXJ2YWwpIHsKKyAgICBteUFubm91bmNlSW50ZXJ2YWwgPSBhbm5vdW5jZUludGVydmFsOworICB9CisKKyAgcHVibGljIGludCBnZXRBbm5vdW5jZUludGVydmFsKCkgeworICAgIHJldHVybiBteUFubm91bmNlSW50ZXJ2YWw7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVBbm5vdW5jZVJlc3BvbnNlKFRyYWNrZWRUb3JyZW50IHRvcnJlbnQsIFBlZXIgcGVlciwgYm9vbGVhbiBpc1NlZWRlciwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIGFubm91bmNlUmVzcG9uc2U7CisgICAgdHJ5IHsKKyAgICAgIGFubm91bmNlUmVzcG9uc2UgPSBIVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2UuY3JhZnQoCisgICAgICAgICAgICAgIGlzU2VlZGVyID8gU0VFREVSX0FOTk9VTkNFX0lOVEVSVkFMIDogbXlBbm5vdW5jZUludGVydmFsLAorICAgICAgICAgICAgICB0b3JyZW50LnNlZWRlcnMoKSwKKyAgICAgICAgICAgICAgdG9ycmVudC5sZWVjaGVycygpLAorICAgICAgICAgICAgICBpc1NlZWRlciA/IENvbGxlY3Rpb25zLjxQZWVyPmVtcHR5TGlzdCgpIDogdG9ycmVudC5nZXRTb21lUGVlcnMocGVlciksCisgICAgICAgICAgICAgIHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSk7CisgICAgICByZXF1ZXN0SGFuZGxlci5zZXJ2ZVJlc3BvbnNlKFN0YXR1cy5PSy5nZXRDb2RlKCksIFN0YXR1cy5PSy5nZXREZXNjcmlwdGlvbigpLCBhbm5vdW5jZVJlc3BvbnNlLmdldERhdGEoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHNlcnZlRXJyb3IoU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgZS5nZXRNZXNzYWdlKCksIHJlcXVlc3RIYW5kbGVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdXNpbmcgb3VyIGRlZmluZWQgQllURV9FTkNPRElORy4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiBCZWNhdXNlIHdlJ3JlIGV4cGVjdGluZyBieXRlLWVuY29kZWQgc3RyaW5ncyBhcyBxdWVyeSBwYXJhbWV0ZXJzLCB3ZQorICAgKiBjYW4ndCByZWx5IG9uIFNpbXBsZUhUVFAncyBRdWVyeVBhcnNlciB3aGljaCB1c2VzIHRoZSB3cm9uZyBlbmNvZGluZyBmb3IKKyAgICogdGhlIGpvYiBhbmQgcmV0dXJucyB1cyB1bnBhcnNhYmxlIGJ5dGUgZGF0YS4gV2UgdGh1cyBoYXZlIHRvIGltcGxlbWVudAorICAgKiBvdXIgb3duIGxpdHRsZSBwYXJzaW5nIG1ldGhvZCB0aGF0IHVzZXMgQllURV9FTkNPRElORyB0byBkZWNvZGUKKyAgICogcGFyYW1ldGVycyBmcm9tIHRoZSBVUkkuCisgICAqIDwvcD4KKyAgICogPHA+CisgICAqIDxwPgorICAgKiA8Yj5Ob3RlOjwvYj4gYXJyYXkgcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZC4gSWYgYSBrZXkgaXMgcHJlc2VudAorICAgKiBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgVVJJLCB0aGUgbGF0ZXN0IHZhbHVlIHByZXZhaWxzLiBXZSBkb24ndCByZWFsbHkKKyAgICogbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGFzIHRoaXMgbmV2ZXIgaGFwcGVucyBpbiB0aGUKKyAgICogVHJhY2tlciBIVFRQIHByb3RvY29sLgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSB1cmkKKyAgICogQHBhcmFtIGhvc3RBZGRyZXNzCisgICAqIEByZXR1cm4gVGhlIHtAbGluayBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlfSByZXByZXNlbnRpbmcgdGhlIGNsaWVudCdzCisgICAqIGFubm91bmNlIHJlcXVlc3QuCisgICAqLworICAvLyDmoLnmja7lrqLmiLfnq6/kvKDmnaV1cmnvvIzop6PmnpDmlbDmja7vvIznlJ/miJDkuIDkuKpIVFRQQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZeWvueixoQorICBwcml2YXRlIEhUVFBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlIHBhcnNlUXVlcnkoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nIGhvc3RBZGRyZXNzKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWVzc2FnZVZhbGlkYXRpb25FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEJFVmFsdWU+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQkVWYWx1ZT4oKTsgLy/lrqLmiLfnq6/kvKDmnaXnmoTlj4LmlbAKKworICAgIHRyeSB7CisvLwkJCVN0cmluZyB1cmkgPSByZXF1ZXN0LmdldEFkZHJlc3MoKS50b1N0cmluZygpOworICAgICAgZm9yIChTdHJpbmcgcGFpciA6IHVyaS5zcGxpdCgiWz9dIilbMV0uc3BsaXQoIiYiKSkgeworICAgICAgICBTdHJpbmdbXSBrZXl2YWwgPSBwYWlyLnNwbGl0KCJbPV0iLCAyKTsKKyAgICAgICAgaWYgKGtleXZhbC5sZW5ndGggPT0gMSkgeworICAgICAgICAgIHRoaXMucmVjb3JkUGFyYW0ocGFyYW1zLCBrZXl2YWxbMF0sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMucmVjb3JkUGFyYW0ocGFyYW1zLCBrZXl2YWxbMF0sIGtleXZhbFsxXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgdGhlIHBlZXIgSVAsIGZhbGxiYWNraW5nIG9uIHRoZSByZXF1ZXN0J3Mgc291cmNlCisgICAgLy8gYWRkcmVzcyBpZiB0aGUgcGVlciBkaWRuJ3QgcHJvdmlkZSBpdC4KKyAgICBpZiAocGFyYW1zLmdldCgiaXAiKSA9PSBudWxsKSB7CisgICAgICBwYXJhbXMucHV0KCJpcCIsIG5ldyBCRVZhbHVlKAorICAgICAgICAgICAgICBob3N0QWRkcmVzcywKKyAgICAgICAgICAgICAgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9CisKKyAgICByZXR1cm4gSFRUUEFubm91bmNlUmVxdWVzdE1lc3NhZ2UucGFyc2UobmV3IEJFVmFsdWUocGFyYW1zKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVjb3JkUGFyYW0oTWFwPFN0cmluZywgQkVWYWx1ZT4gcGFyYW1zLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgdmFsdWUgPSBVUkxEZWNvZGVyLmRlY29kZSh2YWx1ZSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpOworCisgICAgICBmb3IgKFN0cmluZyBmIDogTlVNRVJJQ19SRVFVRVNUX0ZJRUxEUykgeworICAgICAgICBpZiAoZi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgIHBhcmFtcy5wdXQoa2V5LCBuZXcgQkVWYWx1ZShMb25nLnZhbHVlT2YodmFsdWUpKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHBhcmFtcy5wdXQoa2V5LCBuZXcgQkVWYWx1ZSh2YWx1ZSwgQ29uc3RhbnRzLkJZVEVfRU5DT0RJTkcpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworICAgICAgLy8gSWdub3JlLCBhY3QgbGlrZSBwYXJhbWV0ZXIgd2FzIG5vdCB0aGVyZQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIHtAbGluayBIVFRQVHJhY2tlckVycm9yTWVzc2FnZX0gdG8gdGhlIHJlc3BvbnNlIHdpdGggdGhlIGdpdmVuCisgICAqIEhUVFAgc3RhdHVzIGNvZGUuCisgICAqCisgICAqIEBwYXJhbSBzdGF0dXMgVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLgorICAgKiBAcGFyYW0gZXJyb3IgIFRoZSBlcnJvciByZXBvcnRlZCBieSB0aGUgdHJhY2tlci4KKyAgICovCisgIHByaXZhdGUgdm9pZCBzZXJ2ZUVycm9yKFN0YXR1cyBzdGF0dXMsIEhUVFBUcmFja2VyRXJyb3JNZXNzYWdlIGVycm9yLCBSZXF1ZXN0SGFuZGxlciByZXF1ZXN0SGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXF1ZXN0SGFuZGxlci5zZXJ2ZVJlc3BvbnNlKHN0YXR1cy5nZXRDb2RlKCksIHN0YXR1cy5nZXREZXNjcmlwdGlvbigpLCBlcnJvci5nZXREYXRhKCkpOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHJlc3BvbnNlIHdpdGggdGhlIGdpdmVuIEhUVFAgc3RhdHVzIGNvZGUuCisgICAqCisgICAqIEBwYXJhbSBzdGF0dXMgVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLgorICAgKiBAcGFyYW0gZXJyb3IgIFRoZSBlcnJvciBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZSB0cmFja2VyLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHNlcnZlRXJyb3IoU3RhdHVzIHN0YXR1cywgU3RyaW5nIGVycm9yLCBSZXF1ZXN0SGFuZGxlciByZXF1ZXN0SGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLnNlcnZlRXJyb3Ioc3RhdHVzLCBIVFRQVHJhY2tlckVycm9yTWVzc2FnZS5jcmFmdChlcnJvciksIHJlcXVlc3RIYW5kbGVyKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIHRyYWNrZXIgZmFpbHVyZSByZWFzb24gY29kZSB0byB0aGUgcmVzcG9uc2Ugd2l0aCB0aGUgZ2l2ZW4gSFRUUAorICAgKiBzdGF0dXMgY29kZS4KKyAgICoKKyAgICogQHBhcmFtIHN0YXR1cyBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uCisgICAqIEBwYXJhbSByZWFzb24gVGhlIGZhaWx1cmUgcmVhc29uIHJlcG9ydGVkIGJ5IHRoZSB0cmFja2VyLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHNlcnZlRXJyb3IoU3RhdHVzIHN0YXR1cywgRXJyb3JNZXNzYWdlLkZhaWx1cmVSZWFzb24gcmVhc29uLCBSZXF1ZXN0SGFuZGxlciByZXF1ZXN0SGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzLnNlcnZlRXJyb3Ioc3RhdHVzLCByZWFzb24uZ2V0TWVzc2FnZSgpLCByZXF1ZXN0SGFuZGxlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRGb3JlaWduVG9ycmVudHMoYm9vbGVhbiBhY2NlcHRGb3JlaWduVG9ycmVudHMpIHsKKyAgICBteUFjY2VwdEZvcmVpZ25Ub3JyZW50cyA9IGFjY2VwdEZvcmVpZ25Ub3JyZW50czsKKyAgfQorCisgIHB1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdEhhbmRsZXIgeworICAgIC8vIOi/lOWbnmh0dHDlk43lupQKKyAgICB2b2lkIHNlcnZlUmVzcG9uc2UoaW50IGNvZGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQnl0ZUJ1ZmZlciByZXNwb25zZURhdGEpOworICB9Cit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclNlcnZpY2VDb250YWluZXIuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy9tYWluL2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9UcmFja2VyU2VydmljZUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2VjY2EKLS0tIC9kZXYvbnVsbAorKysgYi90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvbWFpbi9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVHJhY2tlclNlcnZpY2VDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuY29tbW9uLkxvZ2dlclV0aWxzOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5Ub3JyZW50TG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuUmVxdWVzdDsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuUmVzcG9uc2U7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLmNvcmUuQ29udGFpbmVyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHM7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbDsKKworLyoqCisgKiBAYXV0aG9yIFNlcmdleS5QYWsKKyAqIERhdGU6IDgvMTIvMTMKKyAqIFRpbWU6IDg6MjUgUE0KKyAqLworCisvLyBodHRw6K+35rGC5aSE55CG5ZmoCitwdWJsaWMgY2xhc3MgVHJhY2tlclNlcnZpY2VDb250YWluZXIgaW1wbGVtZW50cyBDb250YWluZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgIFRvcnJlbnRMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmFja2VyU2VydmljZUNvbnRhaW5lci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBUcmFja2VyUmVxdWVzdFByb2Nlc3NvciBteVJlcXVlc3RQcm9jZXNzb3I7CisgIHByaXZhdGUgZmluYWwgTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3IgbXlNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvcjsKKworICBwdWJsaWMgVHJhY2tlclNlcnZpY2VDb250YWluZXIoZmluYWwgVHJhY2tlclJlcXVlc3RQcm9jZXNzb3IgcmVxdWVzdFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yIG11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yKSB7CisgICAgbXlSZXF1ZXN0UHJvY2Vzc29yID0gcmVxdWVzdFByb2Nlc3NvcjsKKyAgICBteU11bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yID0gbXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogSGFuZGxlIHRoZSBpbmNvbWluZyByZXF1ZXN0IG9uIHRoZSB0cmFja2VyIHNlcnZpY2UuCisgICAqIDxwLz4KKyAgICogPHA+CisgICAqIFRoaXMgbWFrZXMgc3VyZSB0aGUgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZSB0cmFja2VyJ3MgYW5ub3VuY2UgVVJMLCBhbmQKKyAgICogZGVsZWdhdGVzIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0IHRvIHRoZSA8ZW0+cHJvY2VzcygpPC9lbT4gbWV0aG9kIGFmdGVyCisgICAqIHByZXBhcmluZyB0aGUgcmVzcG9uc2Ugb2JqZWN0LgorICAgKiA8L3A+CisgICAqCisgICAqIEBwYXJhbSByZXF1ZXN0ICBUaGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0LgorICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdC4KKyAgICovCisKKyAgLy8g5aSE55CG5Y2V5Liq55qEaHR0cOivt+axgiDmiJbmmK/lpJrkuKror7fmsYIKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGhhbmRsZShSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgLy8gUmVqZWN0IG5vbi1hbm5vdW5jZSByZXF1ZXN0cworICAgIGlmICghVHJhY2tlci5BTk5PVU5DRV9VUkwuZXF1YWxzKHJlcXVlc3QuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpKSB7CisgICAgICByZXNwb25zZS5zZXRDb2RlKDQwNCk7CisgICAgICByZXNwb25zZS5zZXRUZXh0KCJOb3QgRm91bmQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPdXRwdXRTdHJlYW0gYm9keSA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGJvZHkgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgcmVzcG9uc2Uuc2V0KCJDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbiIpOworICAgICAgcmVzcG9uc2Uuc2V0KCJTZXJ2ZXIiLCAiIik7CisgICAgICByZXNwb25zZS5zZXREYXRlKCJEYXRlIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgICBpZiAoIkdFVCIuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0LmdldE1ldGhvZCgpKSkgey8v5Y2V54us6K+35rGCCisKKyAgICAgICAgbXlSZXF1ZXN0UHJvY2Vzc29yLnByb2Nlc3MocmVxdWVzdC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSwgcmVxdWVzdC5nZXRDbGllbnRBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2UpKTsKKyAgICAgIH0gZWxzZSB7Ly/lpJror7fmsYLlpITnkIYKKyAgICAgICAgbXlNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3Nvci5wcm9jZXNzKHJlcXVlc3QuZ2V0Q29udGVudCgpLCByZXF1ZXN0LmdldEFkZHJlc3MoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q2xpZW50QWRkcmVzcygpLmdldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpLCBnZXRSZXF1ZXN0SGFuZGxlcihyZXNwb25zZSkpOworICAgICAgfQorICAgICAgYm9keS5mbHVzaCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgbG9nZ2VyLmluZm8oIkVycm9yIHdoaWxlIHdyaXRpbmcgcmVzcG9uc2U6IHt9ISIsIGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICBMb2dnZXJVdGlscy5lcnJvckFuZERlYnVnRGV0YWlscyhsb2dnZXIsICJlcnJvciBpbiBwcm9jZXNzaW5nIHJlcXVlc3Qge30iLCByZXF1ZXN0LCB0KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYm9keSk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIFRyYWNrZXJSZXF1ZXN0UHJvY2Vzc29yLlJlcXVlc3RIYW5kbGVyIGdldFJlcXVlc3RIYW5kbGVyKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgcmV0dXJuIG5ldyBUcmFja2VyUmVxdWVzdFByb2Nlc3Nvci5SZXF1ZXN0SGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc2VydmVSZXNwb25zZShpbnQgY29kZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBCeXRlQnVmZmVyIHJlc3BvbnNlRGF0YSkgeworICAgICAgICByZXNwb25zZS5zZXRDb2RlKGNvZGUpOworICAgICAgICByZXNwb25zZS5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25zZURhdGEucmV3aW5kKCk7CisgICAgICAgICAgZmluYWwgV3JpdGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsID0gQ2hhbm5lbHMubmV3Q2hhbm5lbChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgY2hhbm5lbC53cml0ZShyZXNwb25zZURhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRGb3JlaWduVG9ycmVudHMoYm9vbGVhbiBhY2NlcHRGb3JlaWduVG9ycmVudHMpIHsKKyAgICBteVJlcXVlc3RQcm9jZXNzb3Iuc2V0QWNjZXB0Rm9yZWlnblRvcnJlbnRzKGFjY2VwdEZvcmVpZ25Ub3JyZW50cyk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRBbm5vdW5jZUludGVydmFsKGludCBhbm5vdW5jZUludGVydmFsKSB7CisgICAgbXlSZXF1ZXN0UHJvY2Vzc29yLnNldEFubm91bmNlSW50ZXJ2YWwoYW5ub3VuY2VJbnRlcnZhbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9NdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvclRlc3QuamF2YSBiL3R0b3JyZW50LW1hc3Rlci90dG9ycmVudC10cmFja2VyL3NyYy90ZXN0L2phdmEvY29tL3R1cm4vdHRvcnJlbnQvdHJhY2tlci9NdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL011bHRpQW5ub3VuY2VSZXF1ZXN0UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIGNvbS50dXJuLnR0b3JyZW50LnRyYWNrZXI7CisKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5UZW1wRmlsZXM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuVXRpbHM7CitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuYmNvZGVjLkJEZWNvZGVyOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmJjb2RlYy5CRVZhbHVlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5UcmFja2VyTWVzc2FnZTsKK2ltcG9ydCBjb20udHVybi50dG9ycmVudC5jb21tb24ucHJvdG9jb2wuaHR0cC5IVFRQQW5ub3VuY2VSZXNwb25zZU1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworQFRlc3QKK3B1YmxpYyBjbGFzcyBNdWx0aUFubm91bmNlUmVxdWVzdFByb2Nlc3NvclRlc3QgeworCisgIHByaXZhdGUgVHJhY2tlciB0cmFja2VyOworICBwcml2YXRlIFRlbXBGaWxlcyB0ZW1wRmlsZXM7CisKKworICBwdWJsaWMgTXVsdGlBbm5vdW5jZVJlcXVlc3RQcm9jZXNzb3JUZXN0KCkgeworICAgIGlmIChMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLmdldEFsbEFwcGVuZGVycygpLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgcmV0dXJuOworICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShuZXcgQ29uc29sZUFwcGVuZGVyKG5ldyBQYXR0ZXJuTGF5b3V0KCJbJWR7TU1kZCBISDptbTpzcyxTU1N9XSAlNnAgLSAlMjAuMjBjIC0gJW0gJW4iKSkpOworICAgIExvZ2dlci5nZXRSb290TG9nZ2VyKCkuc2V0TGV2ZWwoVXRpbHMuZ2V0TG9nTGV2ZWwoKSk7CisgIH0KKworICBAQmVmb3JlTWV0aG9kCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVtcEZpbGVzID0gbmV3IFRlbXBGaWxlcygpOworICAgIHN0YXJ0VHJhY2tlcigpOworICB9CisKKyAgcHVibGljIHZvaWQgcHJvY2Vzc0NvcnJlY3RUZXN0KCkgdGhyb3dzIFRyYWNrZXJNZXNzYWdlLk1lc3NhZ2VWYWxpZGF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6Njk2OS9hbm5vdW5jZSIpOworCisgICAgZmluYWwgU3RyaW5nIHVybFRlbXBsYXRlID0gdXJsLnRvU3RyaW5nKCkgKworICAgICAgICAgICAgIj9pbmZvX2hhc2g9e2hhc2h9IiArCisgICAgICAgICAgICAiJnBlZXJfaWQ9QUJDREVGR0hJSktMTU5PUFFSU1QiICsKKyAgICAgICAgICAgICImaXA9e2lwfSIgKworICAgICAgICAgICAgIiZwb3J0PXtwb3J0fSIgKworICAgICAgICAgICAgIiZkb3dubG9hZGVkPTEyMzQiICsKKyAgICAgICAgICAgICImbGVmdD0wIiArCisgICAgICAgICAgICAiJmV2ZW50PXN0YXJ0ZWQiOworCisgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICByZXF1ZXN0U3RyaW5nLmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICAgIHJlcXVlc3RTdHJpbmcuYXBwZW5kKGdldFVybEZyb21UZW1wbGF0ZSh1cmxUZW1wbGF0ZSwgIjEiICsgaSwgIjEyNy4wLjAuMSIsIDY4ODEpKTsKKyAgICB9CisgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Iik7CisgICAgY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKKyAgICBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHJlcXVlc3RTdHJpbmcudG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGLTgiKSk7CisKKyAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgIGZpbmFsIEJFVmFsdWUgYmRlY29kZSA9IEJEZWNvZGVyLmJkZWNvZGUoaW5wdXRTdHJlYW0pOworCisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZXIuZ2V0VHJhY2tlZFRvcnJlbnRzKCkuc2l6ZSgpLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMoYmRlY29kZS5nZXRMaXN0KCkuc2l6ZSgpLCA1KTsKKworICAgIGZvciAoQkVWYWx1ZSBiZVZhbHVlIDogYmRlY29kZS5nZXRMaXN0KCkpIHsKKworICAgICAgZmluYWwgSFRUUEFubm91bmNlUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlTWVzc2FnZSA9IEhUVFBBbm5vdW5jZVJlc3BvbnNlTWVzc2FnZS5wYXJzZShiZVZhbHVlKTsKKyAgICAgIGFzc2VydFRydWUocmVzcG9uc2VNZXNzYWdlLmdldFBlZXJzKCkuaXNFbXB0eSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygxLCByZXNwb25zZU1lc3NhZ2UuZ2V0Q29tcGxldGUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2VNZXNzYWdlLmdldEluY29tcGxldGUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXJsRnJvbVRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZSwgU3RyaW5nIGhhc2gsIFN0cmluZyBpcCwgaW50IHBvcnQpIHsKKyAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgie2hhc2h9IiwgaGFzaCkucmVwbGFjZSgie2lwfSIsIGlwKS5yZXBsYWNlKCJ7cG9ydH0iLCBTdHJpbmcudmFsdWVPZihwb3J0KSk7CisgIH0KKworCisgIHByaXZhdGUgdm9pZCBzdGFydFRyYWNrZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMudHJhY2tlciA9IG5ldyBUcmFja2VyKDY5NjkpOworICAgIHRyYWNrZXIuc2V0QW5ub3VuY2VJbnRlcnZhbCg1KTsKKyAgICB0cmFja2VyLnNldFBlZXJDb2xsZWN0b3JFeHBpcmVUaW1lb3V0KDEwKTsKKyAgICB0aGlzLnRyYWNrZXIuc3RhcnQodHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc3RvcFRyYWNrZXIoKSB7CisgICAgdGhpcy50cmFja2VyLnN0b3AoKTsKKyAgfQorCisgIEBBZnRlck1ldGhvZAorICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHN0b3BUcmFja2VyKCk7CisgICAgdGVtcEZpbGVzLmNsZWFudXAoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90dG9ycmVudC1tYXN0ZXIvdHRvcnJlbnQtdHJhY2tlci9zcmMvdGVzdC9qYXZhL2NvbS90dXJuL3R0b3JyZW50L3RyYWNrZXIvVG9ycmVudHNSZXBvc2l0b3J5VGVzdC5qYXZhIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RvcnJlbnRzUmVwb3NpdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjViODQyCi0tLSAvZGV2L251bGwKKysrIGIvdHRvcnJlbnQtbWFzdGVyL3R0b3JyZW50LXRyYWNrZXIvc3JjL3Rlc3QvamF2YS9jb20vdHVybi90dG9ycmVudC90cmFja2VyL1RvcnJlbnRzUmVwb3NpdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorcGFja2FnZSBjb20udHVybi50dG9ycmVudC50cmFja2VyOworCitpbXBvcnQgY29tLnR1cm4udHRvcnJlbnQuTW9ja1RpbWVTZXJ2aWNlOworaW1wb3J0IGNvbS50dXJuLnR0b3JyZW50LmNvbW1vbi5wcm90b2NvbC5Bbm5vdW5jZVJlcXVlc3RNZXNzYWdlOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOworCitAVGVzdAorcHVibGljIGNsYXNzIFRvcnJlbnRzUmVwb3NpdG9yeVRlc3QgeworCisgIHByaXZhdGUgVG9ycmVudHNSZXBvc2l0b3J5IG15VG9ycmVudHNSZXBvc2l0b3J5OworCisgIEBCZWZvcmVNZXRob2QKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeSA9IG5ldyBUb3JyZW50c1JlcG9zaXRvcnkoMTApOworICB9CisKKyAgQEFmdGVyTWV0aG9kCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0VG9ycmVudHNTdG9yZWRJblJlcG9zaXRvcnkoKSB7CisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAwKTsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0b3JyZW50ID0gbmV3IFRyYWNrZWRUb3JyZW50KG5ldyBieXRlW117MSwgMiwgM30pOworCisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkucHV0SWZBYnNlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCB0b3JyZW50KTsKKyAgICBhc3NlcnRUcnVlKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKSA9PSB0b3JyZW50KTsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0b3JyZW50Q29weSA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDIsIDN9KTsKKworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50KHRvcnJlbnRDb3B5LmdldEhleEluZm9IYXNoKCksIHRvcnJlbnRDb3B5KTsKKyAgICBhc3NlcnRUcnVlKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnQodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpKSA9PSB0b3JyZW50KTsKKyAgICBhc3NlcnRFcXVhbHMobXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS5zaXplKCksIDEpOworCisgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgc2Vjb25kVG9ycmVudCA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezMsIDIsIDF9KTsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudChzZWNvbmRUb3JyZW50LmdldEhleEluZm9IYXNoKCksIHNlY29uZFRvcnJlbnQpOworICAgIGFzc2VydEVxdWFscyhteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnNpemUoKSwgMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHV0SWZBYnNlbnRBbmRVcGRhdGUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIHVwZGF0ZUludm9rZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgIFRyYWNrZWRUb3JyZW50IHRvcnJlbnQgPSBuZXcgVHJhY2tlZFRvcnJlbnQobmV3IGJ5dGVbXXsxLCAyLCAzfSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgVHJhY2tlZFBlZXIgdXBkYXRlKEFubm91bmNlUmVxdWVzdE1lc3NhZ2UuUmVxdWVzdEV2ZW50IGV2ZW50LCBCeXRlQnVmZmVyIHBlZXJJZCwgU3RyaW5nIGhleFBlZXJJZCwgU3RyaW5nIGlwLCBpbnQgcG9ydCwgbG9uZyB1cGxvYWRlZCwgbG9uZyBkb3dubG9hZGVkLCBsb25nIGxlZnQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdXBkYXRlSW52b2tlZC5zZXQodHJ1ZSk7CisgICAgICAgIHJldHVybiBzdXBlci51cGRhdGUoZXZlbnQsIHBlZXJJZCwgaGV4UGVlcklkLCBpcCwgcG9ydCwgdXBsb2FkZWQsIGRvd25sb2FkZWQsIGxlZnQpOworICAgICAgfQorICAgIH07CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkucHV0SWZBYnNlbnRBbmRVcGRhdGUodG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCB0b3JyZW50LAorICAgICAgICAgICAgQW5ub3VuY2VSZXF1ZXN0TWVzc2FnZS5SZXF1ZXN0RXZlbnQuU1RBUlRFRCwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KSwgIjAiLAorICAgICAgICAgICAgIjEyNy4wLjAuMSIsIDY4ODEsIDUsIDEwLCAxMik7CisgICAgYXNzZXJ0VHJ1ZSh1cGRhdGVJbnZva2VkLmdldCgpKTsKKyAgICBhc3NlcnRFcXVhbHModG9ycmVudC5nZXRQZWVycygpLnNpemUoKSwgMSk7CisgICAgZmluYWwgVHJhY2tlZFBlZXIgdHJhY2tlZFBlZXIgPSB0b3JyZW50LmdldFBlZXJzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldElwKCksICIxMjcuMC4wLjEiKTsKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0UG9ydCgpLCA2ODgxKTsKKyAgICBhc3NlcnRFcXVhbHModHJhY2tlZFBlZXIuZ2V0TGVmdCgpLCAxMik7CisgICAgYXNzZXJ0RXF1YWxzKHRyYWNrZWRQZWVyLmdldERvd25sb2FkZWQoKSwgMTApOworICAgIGFzc2VydEVxdWFscyh0cmFja2VkUGVlci5nZXRVcGxvYWRlZCgpLCA1KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0Q2xlYW51cERvbnRMb2NrQWxsVG9ycmVudHNBbmRTdG9yYWdlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCisgICAgZmluYWwgU2VtYXBob3JlIGNsZWFuRmluaXNoTG9jayA9IG5ldyBTZW1hcGhvcmUoMCk7CisgICAgZmluYWwgU2VtYXBob3JlIGNsZWFuU3RhcnRMb2NrID0gbmV3IFNlbWFwaG9yZSgwKTsKKyAgICBmaW5hbCBUcmFja2VkVG9ycmVudCB0b3JyZW50ID0gbmV3IFRyYWNrZWRUb3JyZW50KG5ldyBieXRlW117MSwgMiwgM30pIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgY29sbGVjdFVuZnJlc2hQZWVycyhpbnQgZXhwaXJlVGltZW91dFNlYykgeworICAgICAgICBjbGVhblN0YXJ0TG9jay5yZWxlYXNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKCFjbGVhbkZpbmlzaExvY2sudHJ5QWNxdWlyZSgxLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgZmFpbCgiY2FuIG5vdCBhY3F1aXJlIHNlbWFwaG9yZSIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgIGZhaWwoImNhbiBub3QgZmluaXNoIGNsZWFudXAiLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5wdXRJZkFic2VudCh0b3JyZW50LmdldEhleEluZm9IYXNoKCksIHRvcnJlbnQpOworICAgIHRvcnJlbnQuYWRkUGVlcihuZXcgVHJhY2tlZFBlZXIodG9ycmVudCwgIjEyNy4wLjAuMSIsIDY4ODEsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTApKSk7CisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAxKTsKKworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKworICAgIHRyeSB7CisgICAgICBmaW5hbCBGdXR1cmU8SW50ZWdlcj4gY2xlYW51cEZ1dHVyZSA9IGV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPEludGVnZXI+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LmNsZWFudXAoMSk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKCFjbGVhblN0YXJ0TG9jay50cnlBY3F1aXJlKDEsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgZmFpbCgiY2Fubm90IGFjcXVpcmUgc2VtYXBob3JlIik7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFpbCgiZG9uJ3QgcmVjZWl2ZWQgdGhhdCBjbGVhbnVwIGlzIHN0YXJ0ZWQiLCBlKTsKKyAgICAgIH0KKworICAgICAgZmluYWwgVHJhY2tlZFRvcnJlbnQgc2Vjb25kVG9ycmVudCA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezMsIDEsIDF9KTsKKworICAgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkucHV0SWZBYnNlbnRBbmRVcGRhdGUoc2Vjb25kVG9ycmVudC5nZXRIZXhJbmZvSGFzaCgpLCBzZWNvbmRUb3JyZW50LAorICAgICAgICAgICAgICBBbm5vdW5jZVJlcXVlc3RNZXNzYWdlLlJlcXVlc3RFdmVudC5TVEFSVEVELCBCeXRlQnVmZmVyLmFsbG9jYXRlKDUpLCAiMCIsCisgICAgICAgICAgICAgICIxMjcuMC4wLjEiLCA2ODgxLCAwLCAwLCAxKTsKKworICAgICAgY2xlYW5GaW5pc2hMb2NrLnJlbGVhc2UoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsZWFudXBGdXR1cmUuZ2V0KDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBmYWlsKCJjbGVhbnVwIHdhcyBpbnRlcnJ1cHRlZCIsIGUpOworICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZmFpbCgiY2xlYW51cCB3YXMgZmFpbGVkIHdpdGggZXhlY3V0aW9uIGV4Y2VwdGlvbiIsIGUpOworICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGZhaWwoImNhbm5vdCBnZXQgcmVzdWx0IGZyb20gZnV0dXJlIiwgZSk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaGF0VG9ycmVudHNDYW5SZW1vdmVkRnJvbVN0b3JhZ2UoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgVHJhY2tlZFRvcnJlbnQgdG9ycmVudCA9IG5ldyBUcmFja2VkVG9ycmVudChuZXcgYnl0ZVtdezEsIDIsIDN9KTsKKworICAgIE1vY2tUaW1lU2VydmljZSB0aW1lU2VydmljZSA9IG5ldyBNb2NrVGltZVNlcnZpY2UoKTsKKyAgICB0aW1lU2VydmljZS5zZXRUaW1lKDEwMDAwKTsKKyAgICBmaW5hbCBUcmFja2VkUGVlciBwZWVyID0gbmV3IFRyYWNrZWRQZWVyKHRvcnJlbnQsICIxMjcuMC4wLjEiLCA2ODgxLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDUpLCB0aW1lU2VydmljZSk7CisgICAgdG9ycmVudC5hZGRQZWVyKHBlZXIpOworCisgICAgdGltZVNlcnZpY2Uuc2V0VGltZSgxNTAwMCk7CisgICAgZmluYWwgVHJhY2tlZFBlZXIgc2Vjb25kUGVlciA9IG5ldyBUcmFja2VkUGVlcih0b3JyZW50LCAiMTI3LjAuMC4xIiwgNjg4MiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg1KSwgdGltZVNlcnZpY2UpOworICAgIHRvcnJlbnQuYWRkUGVlcihzZWNvbmRQZWVyKTsKKworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LnB1dElmQWJzZW50KHRvcnJlbnQuZ2V0SGV4SW5mb0hhc2goKSwgdG9ycmVudCk7CisKKyAgICBhc3NlcnRFcXVhbHMobXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS5zaXplKCksIDEpOworICAgIGFzc2VydEVxdWFscyh0b3JyZW50LmdldFBlZXJzKCkuc2l6ZSgpLCAyKTsKKworICAgIHRpbWVTZXJ2aWNlLnNldFRpbWUoMTcwMDApOworICAgIG15VG9ycmVudHNSZXBvc2l0b3J5LmNsZWFudXAoMTApOworCisgICAgYXNzZXJ0RXF1YWxzKG15VG9ycmVudHNSZXBvc2l0b3J5LmdldFRvcnJlbnRzKCkuc2l6ZSgpLCAxKTsKKyAgICBhc3NlcnRFcXVhbHModG9ycmVudC5nZXRQZWVycygpLnNpemUoKSwgMik7CisKKyAgICB0aW1lU2VydmljZS5zZXRUaW1lKDIzMDAwKTsKKyAgICBteVRvcnJlbnRzUmVwb3NpdG9yeS5jbGVhbnVwKDEwKTsKKworICAgIGFzc2VydEVxdWFscyhteVRvcnJlbnRzUmVwb3NpdG9yeS5nZXRUb3JyZW50cygpLnNpemUoKSwgMSk7CisgICAgYXNzZXJ0RXF1YWxzKHRvcnJlbnQuZ2V0UGVlcnMoKS5zaXplKCksIDEpOworCisgICAgdGltZVNlcnZpY2Uuc2V0VGltZSg0MDAwMCk7CisgICAgbXlUb3JyZW50c1JlcG9zaXRvcnkuY2xlYW51cCgxMCk7CisKKyAgICBhc3NlcnRFcXVhbHMobXlUb3JyZW50c1JlcG9zaXRvcnkuZ2V0VG9ycmVudHMoKS5zaXplKCksIDApOworICAgIGFzc2VydEVxdWFscyh0b3JyZW50LmdldFBlZXJzKCkuc2l6ZSgpLCAwKTsKKworICB9Cit9Cg==