ZGlmZiAtLWdpdCBhL2J2YWwtdGNrL3BvbS54bWwgYi9idmFsLXRjay9wb20ueG1sCmluZGV4IGEzN2E0NzQuLjYwNTEzZmUgMTAwNjQ0Ci0tLSBhL2J2YWwtdGNrL3BvbS54bWwKKysrIGIvYnZhbC10Y2svcG9tLnhtbApAQCAtNjIsNDEgKzYyLDQ4IEBACiAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CiAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPC9wbHVnaW5zPgogICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgCTxwbHVnaW5zPgotICAgICAgICAJCTwhLS1UaGlzIHBsdWdpbidzIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCB0byBzdG9yZSBFY2xpcHNlIG0yZSBzZXR0aW5ncyBvbmx5LiBJdCBoYXMgbm8gaW5mbHVlbmNlIG9uIHRoZSBNYXZlbiBidWlsZCBpdHNlbGYuLS0+Ci0gICAgICAgIAkJPHBsdWdpbj4KLSAgICAgICAgCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgotICAgICAgICAJCQk8YXJ0aWZhY3RJZD5saWZlY3ljbGUtbWFwcGluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgCQkJPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgIAkJCTxjb25maWd1cmF0aW9uPgotICAgICAgICAJCQkJPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KLSAgICAgICAgCQkJCQk8cGx1Z2luRXhlY3V0aW9ucz4KLSAgICAgICAgCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbj4KLSAgICAgICAgCQkJCQkJCTxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+Ci0gICAgICAgIAkJCQkJCQkJPGdyb3VwSWQ+Ci0gICAgICAgIAkJCQkJCQkJCW9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucwotICAgICAgICAJCQkJCQkJCTwvZ3JvdXBJZD4KLSAgICAgICAgCQkJCQkJCQk8YXJ0aWZhY3RJZD4KLSAgICAgICAgCQkJCQkJCQkJbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4KLSAgICAgICAgCQkJCQkJCQk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIAkJCQkJCQkJPHZlcnNpb25SYW5nZT4KLSAgICAgICAgCQkJCQkJCQkJWzIuMSwpCi0gICAgICAgIAkJCQkJCQkJPC92ZXJzaW9uUmFuZ2U+Ci0gICAgICAgIAkJCQkJCQkJPGdvYWxzPgotICAgICAgICAJCQkJCQkJCQk8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAJCQkJCQkJCTwvZ29hbHM+Ci0gICAgICAgIAkJCQkJCQk8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KLSAgICAgICAgCQkJCQkJCTxhY3Rpb24+Ci0gICAgICAgIAkJCQkJCQkJPGlnbm9yZSAvPgotICAgICAgICAJCQkJCQkJPC9hY3Rpb24+Ci0gICAgICAgIAkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uPgotICAgICAgICAJCQkJCTwvcGx1Z2luRXhlY3V0aW9ucz4KLSAgICAgICAgCQkJCTwvbGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgotICAgICAgICAJCQk8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIAkJPC9wbHVnaW4+Ci0gICAgICAgIAk8L3BsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3Mgb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLi0tPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm0yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyLjEsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyc2lvblJhbmdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ25vcmUgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgogICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CiAgICAgPC9idWlsZD4KIApkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggOGRhYmFmOC4uOTE0ZGJmMCAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0zODUsNDEgKzM4NSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgogICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLXBsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxlbmNvZGluZz4ke3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmd9PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFscGFyYW0+JHtqYXZhZG9jLmFkZGl0aW9uYWxwYXJhbX08L2FkZGl0aW9uYWxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhZ2dyZWdhdGU+dHJ1ZTwvYWdncmVnYXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1YnBhY2thZ2VzPm9yZy5hcGFjaGU8L3N1YnBhY2thZ2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJvc2U+ZmFsc2U8L3ZlcmJvc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4bWVtb3J5PjUxMm08L21heG1lbW9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGk8L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNi9kb2NzL2FwaTwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlua3M+CiAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhZG9jPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFscGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2phdmFkb2MuYWRkaXRpb25hbHBhcmFtfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FkZGl0aW9uYWxwYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFnZ3JlZ2F0ZT50cnVlPC9hZ2dyZWdhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWJwYWNrYWdlcz5vcmcuYXBhY2hlPC9zdWJwYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJvc2U+ZmFsc2U8L3ZlcmJvc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhtZW1vcnk+NTEybTwvbWF4bWVtb3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlua3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGk8L2xpbms+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS82L2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4tLT4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgpAQCAtNTIwLDEyICs1MDEsMTUgQEAKICAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8IS0tIGF2b2lkIDIuMi4yIGR1ZSB0byBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01SRUxFQVNFLTc0MiAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHVzZVJlbGVhc2VQcm9maWxlPmZhbHNlPC91c2VSZWxlYXNlUHJvZmlsZT4KICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz5kZXBsb3kgc2l0ZSBzaXRlLWRlcGxveTwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPi1QYXBhY2hlLXJlbGVhc2U8L2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICAgICAgICAgIDxhdXRvVmVyc2lvblN1Ym1vZHVsZXM+dHJ1ZTwvYXV0b1ZlcnNpb25TdWJtb2R1bGVzPgogICAgICAgICAgICAgICAgICAgICAgICAgPHByZXBhcmF0aW9uR29hbHM+Y2xlYW4gaW5zdGFsbDwvcHJlcGFyYXRpb25Hb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0YWdOYW1lRm9ybWF0PkB7cHJvamVjdC52ZXJzaW9ufTwvdGFnTmFtZUZvcm1hdD4KICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICAgICAgICAgIDxwbHVnaW4+CmRpZmYgLS1naXQgYS90cnVuay9DSEFOR0VTLnR4dCBiL3RydW5rL0NIQU5HRVMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE0NGQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL0NIQU5HRVMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLUFwYWNoZSBCVmFsIChpbmN1YmF0aW5nKSAtIENIQU5HRVMudHh0Ci1MaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSAyLjAgLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRlbnQKLT09PT09PT0KLSAgICogT3ZlcnZpZXcKLSAgICogRGlzY2xhaW1lcgotICAgKiBQcmVyZXF1aXNpdGVzCi0gICAqIERvY3VtZW50YXRpb24KLSAgICogR2V0dGluZyBJbnZvbHZlZAotICAgKiBSZWxlYXNlIE5vdGVzCi0KLQotT3ZlcnZpZXcKLT09PT09PT09Ci1UaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEpTUiAzMDMgKEJlYW4gVmFsaWRhdGlvbiksIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLUphdmEgQVBJIGZvciBKYXZhYmVhbiB2YWxpZGF0aW9uIGluIEphdmEgRUUgYW5kIEphdmEgU0UuCi1UaGUgdGVjaG5pY2FsIG9iamVjdGl2ZSBpcyB0byBwcm92aWRlIGEgY2xhc3MgbGV2ZWwgY29uc3RyYWludCBkZWNsYXJhdGlvbiBhbmQKLXZhbGlkYXRpb24gZmFjaWxpdHkgZm9yIHRoZSBKYXZhIGFwcGxpY2F0aW9uIGRldmVsb3BlciwgYXMgd2VsbCBhcyBhIGNvbnN0cmFpbnQKLW1ldGFkYXRhIHJlcG9zaXRvcnkgYW5kIHF1ZXJ5IEFQSS4KLQotVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb2YgYWdpbWF0ZWMgR21iSCwKLXdoaWNoIHdhcyBjb250cmlidXRlZCB0byB0aGUgQVNGIHVuZGVyIGEgc29mdHdhcmUgZ3JhbnQuCi0KLQotRGlzY2xhaW1lcgotPT09PT09PT09PQotQXBhY2hlIEJWYWwgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCBUaGUgQXBhY2hlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uIChBU0YpLCBzcG9uc29yZWQgYnkgdGhlIEFwYWNoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkCi1vZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgdW50aWwgYSBmdXJ0aGVyIHJldmlldyBpbmRpY2F0ZXMgdGhhdCB0aGUKLWluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgYW5kIGRlY2lzaW9uIG1ha2luZyBwcm9jZXNzIGhhdmUgc3RhYmlsaXplZCBpbiBhCi1tYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLiBXaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcwotbm90IG5lY2Vzc2FyaWx5IGEgcmVmbGVjdGlvbiBvZiB0aGUgY29tcGxldGVuZXNzIG9yIHN0YWJpbGl0eSBvZiB0aGUgY29kZSwgaXQKLWRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHRoZSBBU0YuCi0KLQotUHJlcmVxdWlzaXRlcwotPT09PT09PT09PT09PQotWW91IG5lZWQgYSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIEphdmEgU0UgNSBvciBsYXRlci4KLQotCi1Eb2N1bWVudGF0aW9uCi09PT09PT09PT09PT09Ci1QbGVhc2UgcmVmZXIgdG8gdGhlIHByb2plY3QgcGFnZSBhdDoKLSAgICBodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvYnZhbC8KLQotCi1HZXR0aW5nIEludm9sdmVkCi09PT09PT09PT09PT09PT09Ci1UaGUgQXBhY2hlIEJWYWwgcHJvamVjdCBpcyBiZWluZyBidWlsdCBieSB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5Ci1mb3IgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSAtIHdlIHdlbGNvbWUgeW91ciBpbnB1dCBhbmQgY29udHJpYnV0aW9ucyEKLQotV2hhdCBhcmUgd2UgbG9va2luZyBmb3I/Ci0gICogU291cmNlIGNvZGUgYW5kIGZpeGVzIGNvbnRyaWJ1dGlvbnMKLSAgKiBEb2N1bWVudGF0aW9uIGFzc2lzdGFuY2UKLSAgKiBQcm9qZWN0IGFuZCBmZWF0dXJlIHN1Z2dlc3Rpb25zCi0gICogSW50ZWdyYXRpb24gYW5kIHRlc3Rpbmcgd2l0aCBvdGhlciBwcm9qZWN0cwotICAqIERldGFpbGVkIGFuZCBjb25zdHJ1Y3RpdmUgZmVlZGJhY2sKLSAgKiBBcnRpY2xlcyBhbmQgd2hpdGVwYXBlcnMKLQotSG93IGRvIEkgQ29udHJpYnV0ZT8KLSAgKiBUbyBkaXNjdXNzIEJWYWwgdG9waWNzLCBjaGVjayBvdXQgdGhlIG1haWxpbmcgbGlzdHMuCi0gICogQnVncyBhbmQgb3RoZXIgaXNzdWVzIGNhbiBiZSBwb3N0ZWQgb24gdGhlIHByb2plY3QgSklSQS4KLQotCi1SZWxlYXNlIE5vdGVzIC0gQlZhbCAtIFZlcnNpb24gMC40Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUJ1ZwotLS0tCi0gICAgKiBbQlZBTC01NF0gLSBIYW5kbGUgSmF2YSBzZWN1cml0eSBwb2xpY2llcyBhbmQgbWFuYWdlcnMKLSAgICAqIFtCVkFMLTYzXSAtIHVzZSBqYXZhLnV0aWwuU2VydmljZUxvYWRlciBpbiBEZWZhdWx0VmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIjZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpCi0gICAgKiBbQlZBTC04OV0gLSBBcHBsaWNhdGlvbiBzcGVjaWZpYyBjb25zdHJhaW50cyBhbmQgYXJ0aWZhY3RzIG5vdCB2aXNpYmxlIGJ5IHByb3ZpZGVyIGluIE9TR0ktYmFzZWQgYXBwIHNlcnZlcgotICAgICogW0JWQUwtOTBdIC0gSW5jb25zaXN0ZW50IGZyYWN0aW9uIGhhbmRsaW5nIG9mIEBEaWdpdHMgd2hlbiB0YXJnZXQgaXMgYSBCaWdEZWNpbWFsCi0gICAgKiBbQlZBTC05MV0gLSBTZWN1cml0eSBob2xlIGluIG9yZy5hcGFjaGUuYnZhbC51dGlsLk1ldGhvZEFjY2Vzcy5nZXQoKQotICAgICogW0JWQUwtOTJdIC0gU2VjdXJpdHkgaG9sZXMgaW4gb3JnLmFwYWNoZS5idmFsLnV0aWwuUHJpdmlsZWdlZEFjdGlvbnMKLSAgICAqIFtCVkFMLTk0XSAtIE1pc3NpbmcgU1ZOIEVPTCBwcm9wZXJ0aWVzCi0gICAgKiBbQlZBTC05NV0gLSBCZWFudmFsaWRhdGlvbiB3aXRoIEdlbmVyaWMtRGF0YVR5cGVzCi0gICAgKiBbQlZBTC05Nl0gLSBVc2UgY29ycmVjdCBlbmNvZGluZyBmb3IgbG9jYWxpemF0aW9uIG1lc3NhZ2VzCi0gICAgKiBbQlZBTC05N10gLSBNb3JlIHRoYW4gb25lIE1FVEEtSU5GL3ZhbGlkYXRpb24ueG1sIGluIHRvbWNhdCB3ZWJhcHAKLSAgICAqIFtCVkFMLTEwMF0gLSBKYXZhMiBTZWN1cml0eSBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFmdGVyIG1vdmluZyB0byB1c2UgY29tbW9uLWxhbmczCi0gICAgKiBbQlZBTC0xMDRdIC0gZ2VybWFuIHZhbGlkYXRpb24gbWVzc2FnZXMgcHJvcGVydGllcyBhcmUgYnJva2VuCi0KLUltcHJvdmVtZW50Ci0tLS0tLS0tLS0tLQotICAgICogW0JWQUwtNjhdIC0gVXNlIEZpbmRCdWdzIHRvIHJlZHVjZSBjb2RpbmcgZXJyb3JzCi0KLVRhc2sKLS0tLS0KLSAgICAqIFtCVkFMLTk5XSAtIHVwZ3JhZGUgdG8gYXBhY2hlIHBhcmVudCBwb20gMTAKLSAgICAqIFtCVkFMLTEwM10gLSBzd2l0Y2ggQlZhbCBmcm9tIHNsZjRqIHRvIGphdmEudXRpbC5sb2dnaW5nCi0KLQotUmVsZWFzZSBOb3RlcyBmb3IgMC4zLWluY3ViYXRpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUJ1ZwotLS0tCi0gICAgKiBbQlZBTC04NF0gLSBDTkZFWCBvcmcuc2xmNGouaW1wbC5TdGF0aWNMb2dnZXJCaW5kZXIgYnVpbGRpbmcgeHN0cmVhbSBhbmQgZ3VpY2UKLSAgICAqIFtCVkFMLTg2XSAtIE1pc3NpbmcgRGVjaW1hbE1heC9EZWNpbWFsTWluIGNvbnN0cmFpbnQgbWVzc2FnZXMgaW4gVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKLSAgICAqIFtCVkFMLTg3XSAtIEphdmEgMiBzZWN1cml0eSB2aW9sYXRpb25zIGluIENsYXNzVmFsaWRhdG9yLnZhbGlkYXRlCi0gICAgKiBbQlZBTC04OF0gLSBDYXNjYWRlZCB2YWxpZGF0aW9uIGFkZHMgYSBjb25zdHJhaW50IHZpb2xhdGlvbiBmb3IgdmFsaWQgY2hpbGQgcHJvcGVydHkKLQotSW1wcm92ZW1lbnQKLS0tLS0tLS0tLS0tCi0gICAgKiBbQlZBTC02MF0gLSBVc2UgU0xGNEogQVBJIGZvciBsb2dnaW5nCi0gICAgKiBbQlZBTC04NV0gLSBidmFsLWNvcmUgaGFzIG5vIGRlcGVuZGVuY3kgb24gc2xmNGotamNsKgotCi0KLVJlbGVhc2UgTm90ZXMgZm9yIDAuMi1pbmN1YmF0aW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1CdWcKLS0tLQotICAgICogW0JWQUwtNDddIC0gQ29ycmVjdGx5IGZvbGxvdyBHcm91cFNlcXVlbmNlIGRlZmluaXRpb25zIHdoZW4gdmFsaWRhdGluZwotICAgICogW0JWQUwtNzBdIC0gUmVtb3ZlIEBPdmVycmlkZSBhbm5vdGF0aW9ucyBmcm9tIG1ldGhvZHMgaW1wbGVtZW50aW5nIGludGVyZmFjZXMKLSAgICAqIFtCVkFMLTcxXSAtIENvbXBpbGUgZXJyb3JzIHdpdGggSmF2YSBTRSA1Ci0gICAgKiBbQlZBTC03Ml0gLSBOUEUgd2hlbiBkb2luZyBtZXRob2R2YWxpZGF0aW9uCi0gICAgKiBbQlZBTC03N10gLSBSZWNlbnQgY2hhbmdlcyBtYWRlIHRoZSBidmFsLXhzdHJlYW0gbW9kdWxlIHJlcXVpcmVkLCBpbnN0ZWFkIG9mIG9wdGlvbmFsCi0KLUltcHJvdmVtZW50Ci0tLS0tLS0tLS0tLQotICAgICogW0JWQUwtNTldIC0gV3JpdGUgb3IgcmV1c2UgYW4gc2NtLXBsdWdpbiBtb2pvIHRvIGNhcHR1cmUgdGhlIHN2biByZXZpc2lvbgotICAgICogW0JWQUwtNjldIC0gbWFrZSBkZXBlbmRlbmN5IHRvIGNvbS50aG91Z2h0d29ya3MueHN0cmVhbSBvZiBidmFsLWNvcmUgb3B0aW9uYWwgb3Igb2Jzb2xldGUKLSAgICAqIFtCVkFMLTczXSAtIEFsdGVybmF0aXZlIHdheSBvZiBhZGRyZXNzaW5nIGNvZGUgcmV1c2UgaXNzdWUgYmV0d2VlbiB0aGUgdmFsaWRhdG9ycwotICAgICogW0JWQUwtNzRdIC0gUmVtb3ZlIHJlZHVuZGFudCBtZXRob2QgY2FsbCBmcm9tIENsYXNzVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydHkoKQotICAgICogW0JWQUwtNzVdIC0gamF2YWRvY3MsIGNvbXBpbGVyIChnZW5lcmljcykgd2FybmluZ3MsIGV0Yy4KLSAgICAqIFtCVkFMLTc2XSAtIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3IgaW4gQVBJOiAgQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lci5nZXRDb25zdGFpbnRWaW9sYXRpb25zKCkKLSAgICAqIFtCVkFMLTc4XSAtIEF2b2lkIHVuc2FmZSBjYXN0aW5nIGFuZCBvYmplY3Qgc3dhcHBpbmcgd2hlbiBwcm9jZXNzaW5nIEBSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiBjb21wb3NlZCBjb25zdHJhaW50cwotICAgICogW0JWQUwtNzldIC0gZW1haWwgdmFsaWRhdGlvbiBjYW4gZWFzaWx5IHdvcmsgZm9yIGFueSBDaGFyU2VxdWVuY2UgcmF0aGVyIHRoYW4gU3RyaW5nIG9ubHkKLQotCi1SZWxlYXNlIE5vdGVzIGZvciAwLjEtaW5jdWJhdGluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU3ViLXRhc2sKLS0tLS0tLS0tCi0gICAgKiBbQlZBTC0zXSAtIE1vdmUgYWxsIGNvcHlyaWdodHMgdG8gTk9USUNFIGZpbGVzCi0gICAgKiBbQlZBTC00XSAtIFJlbmFtZSBqYXZhIHBhY2thZ2VzCi0gICAgKiBbQlZBTC01XSAtIFVwZGF0ZSBidWlsZHMgZm9yIGluY3ViYXRvcgotICAgICogW0JWQUwtN10gLSBTZXR1cCBpbml0aWFsIHN0cnVjdHVyZS9uYXZpZ2F0aW9uL2NvbnRlbnQgaW4gdGhlIHdpa2kKLSAgICAqIFtCVkFMLThdIC0gU2V0dXAgY29uZmx1ZW5jZSBhdXRvZXhwb3J0IHRlbXBsYXRlCi0gICAgKiBbQlZBTC05XSAtIFNldHVwIHJzeW5jIGNyb24gam9iIHRvIGNvcHkgYXV0b2V4cG9ydCBjb250ZW50IG92ZXIgdG8gd3d3IHN0YWdpbmcgYXJlYQotCi1CdWcKLS0tLQotICAgICogW0JWQUwtMTFdIC0gQWZ0ZXIgbW92ZWQgamF2YSBwYWNrYWdlcyB0ZXN0cyBkb24ndCB3b3JrCi0gICAgKiBbQlZBTC0xM10gLSBDb25zdHJhaW50VmlvbGF0aW9uSW1wbCBtdXN0IGJlIFNlcmlhbHppYWJsZSBhY2NvcmRpbmcgdG8gSlNSMzAzIHNwZWMKLSAgICAqIFtCVkFMLTE1XSAtIEBNaW4gYW5kIEBNYXggZmFpbCB3aXRoIHZlcnkgaGlnaCB2YWx1ZXMgb2YgbG9uZwotICAgICogW0JWQUwtMTddIC0gUGF0aEltcGwga2VlcHMgYSBudWxsLW5hbWVkIGZpcnN0IG5vZGUgb24gdW5pbmRleGVkIHByb3BlcnR5IHBhdGhzCi0gICAgKiBbQlZBTC0xOF0gLSBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBzdWJzdGl0dXRlcyB1bmV4aXN0YW50IHZhcmlhYmxlcyB3aXRoIHRoZSB3aG9sZSBtZXNzYWdlCi0gICAgKiBbQlZBTC0xOV0gLSBTZXZlcmFsIGNoYW5nZXMgdG8gcGFzcyAxMiBtb3JlIHRlc3RzCi0gICAgKiBbQlZBTC0yMF0gLSBXaGVuIGJ1aWxkaW5nIGEgTWV0YUJlYW4sIHRoZSBmdWxsIHRyZWUgb2Ygc3ViY2xhc3Nlcy9pbnRlcmZhY2VzIG11c3QgYmUgY29uc2lkZXJlZAotICAgICogW0JWQUwtMjFdIC0gQ29uc3RyYWludFZpb2xhdGlvbnMgc2V0IHNob3VsZCBub3QgaGF2ZSBkdXBsaWNhdGVzIGFuZCBzaG91bGQgc3RvcmUgRWxlbWVudFR5cGUgYW5kIHVzZSBpdCBpbiBlcXVhbHMoKQotICAgICogW0JWQUwtMjJdIC0gSW5jb3JyZWN0IG91dHB1dCBvciBJT0JFeGNlcHRpb24gd2hlbiBpbnRlcnBvbGF0aW5nIG1lc3NhZ2VzIHdoZW4gYW5ub3RhdGlvbiB2YWx1ZXMgaGF2ZSAkIG9yIFwKLSAgICAqIFtCVkFMLTIzXSAtIENpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sgcHJvZHVjZXMgZmFsc2UgcG9zaXRpdmVzCi0gICAgKiBbQlZBTC0yNF0gLSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biB3aGVuIGNhbGxpbmcgVmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoKSB3aXRoIGEgbnVsbCBjbGFzcwotICAgICogW0JWQUwtMjZdIC0gSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhY2Nlc2luZyBhbm5vdGF0aW9uIHZhbHVlcwotICAgICogW0JWQUwtMjddIC0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gd2hlbiBjYWxsaW5nIEJlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkobnVsbCkKLSAgICAqIFtCVkFMLTI4XSAtIFByb3BlcnR5IHBhdGggZm9yIG5vZGVzIGluc2lkZSBpdGVyYWJsZXMgdGhhdCBkbyBub3QgaW1wbGVtZW50IExpc3Qgc2hvdWxkIG5vdCBjb250YWluIHRoZSBpbmRleAotICAgICogW0JWQUwtMjldIC0gRGVmZXIgbm9kZSBjcmVhdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBvZiBDb25zdHJhaW50VmlvbGF0aW9uQnVpbGRlciBBUEkKLSAgICAqIFtCVkFMLTMwXSAtIEdyb3VwcyBmcm9tIHRoZSBtYWluIGNvbnN0cmFpbnQgYW5ub3RhdGlvbiBtdXN0IGJlIGluaGVyaXRlZCBieSB0aGUgY29tcG9zaW5nIGFubm90YXRpb25zCi0gICAgKiBbQlZBTC0zMV0gLSBBIENvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gd2hlbiB0aGUgcmVzb2x2ZWQgdmFsaWRhdG9yIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGFubm90YXRpb24gdHlwZQotICAgICogW0JWQUwtMzJdIC0gQW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGNvbXBvc2l0ZWQgY29udHJhaW50cyBtdXN0IHJlZmxlY3QgaW5oZXJpdGVkIGdyb3VwcwotICAgICogW0JWQUwtMzNdIC0gUGF5bG9hZCB2YWx1ZSBtdXN0IGFsc28gYmUgaW5oZXJpdGVkIGluIGNvbXBvc2l0aW5nIGNvbnN0cmFpbnRzCi0gICAgKiBbQlZBTC0zNF0gLSBQYXJhbWV0ZXIgZm9yIEBQYXR0ZXJuIG1lc3NhZ2Ugc2hvdWxkIGJlIHtyZWdleHB9Ci0gICAgKiBbQlZBTC0zNV0gLSBJbXByb3ZlZCBzdXBwb3J0IG9mIEBPdmVycmlkZXNBdHRyaWJ1dGUKLSAgICAqIFtCVkFMLTM2XSAtIEltcHJvdmUgQFJlcG9ydEFzU2luZ2xlVmFsaWRhdGlvbiBpbXBsZW1lbnRhdGlvbgotICAgICogW0JWQUwtMzddIC0gRW5zdXJlIGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMgYXJlIHZhbGlkCi0gICAgKiBbQlZBTC0zOF0gLSBHcm91cHMgYW5kIHBheWxvYWQgdmFsdWVzIG11c3QgYmUgcGFydCBvZiB0aGUgQ29uc3RyYWludERlc2NyaXB0b3IgYXR0cmlidXRlcwotICAgICogW0JWQUwtMzldIC0gSW1wbGljaXQgZ3JvdXBzIHNob3VsZCBiZSBjb3JyZWN0bHkgc2V0IGluIGNvbnN0cmFpbnQgZGVzY3JpcHRvcnMKLSAgICAqIFtCVkFMLTQxXSAtIFBhY2thZ2UgYnZhbCBhcnRpZmFjdHMgYXMgYnVuZGxlcwotICAgICogW0JWQUwtNDJdIC0gU3RvcCBncm91cCBzZXF1ZW5jZSB2YWxpZGF0aW9uIHdoZW4gYXQgbGVhc3QgMSB2aW9sYXRpb24gaXMgYWxyZWFkeSByZXBvcnRlZAotICAgICogW0JWQUwtNDNdIC0gR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIG9uIGN5Y2xpYyBncm91cCBkZXRlY3Rpb24KLSAgICAqIFtCVkFMLTQ1XSAtIFZhbGlkYXRpb25FeGNlcHRpb24gbXVzdCBiZSB0aHJvd24gd2hlbiB2YWxpZGF0aW5nIGEgYmVhbiB3aXRoIGFuIGFubm90YXRlZCBtZXRob2Qgd2hpY2ggaXNuJ3QgYSB2YWxpZCBnZXR0ZXIKLSAgICAqIFtCVkFMLTQ4XSAtIGpVbml0IGZhaWx1cmUgZHVyaW5nIGJ1aWxkIG9uIFdpbmRvd3MgLSB0cnVuayByZXYgOTQ1ODAwCi0gICAgKiBbQlZBTC00OV0gLSBWYWxpZGF0aW9uRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIGluIGNhc2UgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgcmV0dXJucyBudWxsIGZvciBhIHZhbGlkIGdldEluc3RhbmNlIGNhbGwKLSAgICAqIFtCVkFMLTUwXSAtIEZpeCBUcmF2ZXJzYWJsZVJlc29sdmVyIHVzYWdlCi0gICAgKiBbQlZBTC01MV0gLSBTZXZlcmFsIGZpeGVzIGluIEVsZW1lbnREZXNjcmlwdG9yIGFuZCBzdWJpbnRlcmZhY2VzIGltcGxzCi0gICAgKiBbQlZBTC01M10gLSBTZXZlcmFsIGZpeGVzIGZvciBYTUwgbWV0YWRhdGEgcHJvY2Vzc2luZyBpbXBsCi0gICAgKiBbQlZBTC01NV0gLSBGaXggcmVtYWluaW5nIFRDSyB0ZXN0cwotICAgICogW0JWQUwtNThdIC0gQ2xlYW4gdXAgYnVpbGQgYmVmb3JlIHJlbGVhc2UKLSAgICAqIFtCVkFMLTYyXSAtIGFkZCBtaXNzaW5nIEFTTCBoZWFkZXJzCi0gICAgKiBbQlZBTC02NF0gLSBvcmcuYXBhY2hlLmJ2YWwuYnVuZGxlIG5lZWRzIGEgY3VzdG9tIE5PVElDRSBmaWxlCi0gICAgKiBbQlZBTC02NV0gLSBJbmN1YmF0b3IgcmVxdWlyZWQgRElTQ0xBSU1FUiBtaXNzaW5nIGZyb20gamFycwotICAgICogW0JWQUwtNjddIC0gUmVzb2x2ZSBOT1RJQ0UgZmlsZSBpc3N1ZXMgZm9uZCBkdXJpbmcgUkMyIHZvdGUKLQotSW1wcm92ZW1lbnQKLS0tLS0tLS0tLS0tCi0gICAgKiBbQlZBTC0xMl0gLSBDdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCB2YWxpZGF0aW9uIChhcHBlbmRpeCBDIG9mIEpTUi0zMDMpIGRvZXNuJ3Qgd29yayB3aXRoIHNvbWUgY29uc3RyYWludHMKLSAgICAqIFtCVkFMLTE2XSAtIE1hdmVuIHByb2plY3QgdG8gbGF1bmNoIFRDSyBzdWl0ZQotICAgICogW0JWQUwtNDRdIC0gTW92ZSBvcHRpb25hbCBKU09OIGNvZGUgb3V0IG9mIGJ2YWwtY29yZSB0byBhIGJ2YWwtanNvbiBtb2R1bGUKLSAgICAqIFtCVkFMLTQ2XSAtIENyZWF0ZSBwcm9qZWN0IHNvdXJjZSBhc3NlbWJseQotICAgICogW0JWQUwtNTJdIC0gVmFsaWRhdGlvblBhcnNlci5nZXRJbnB1dFN0cmVhbSgpIHNob3VsZCBjYWxsIGdldFJlc291cmNlQXNTdHJlYW0oKSBmb3IgVENLIHN1aXRlIHRvIHdvcmsKLSAgICAqIFtCVkFMLTU3XSAtIENyZWF0ZSBhIHNpbmdsZSBhcGFjaGUtYnZhbCBqYXIvYnVuZGxlCi0gICAgKiBbQlZBTC02Nl0gLSBNZXRob2QgdmFsaWRhdGlvbiBwYXJhbWV0ZXIgcHJvY2Vzc2luZyBwcm9ibGVtcwotCi1OZXcgRmVhdHVyZQotLS0tLS0tLS0tLS0KLSAgICAqIFtCVkFMLTQwXSAtIFByb3ZpZGUgYSB3YXkgdG8gZGlzcGxheSB0aGUgQlZhbCB2ZXJzaW9uIGJlaW5nIHVzZWQKLSAgICAqIFtCVkFMLTU2XSAtIG1ha2UgYnZhbCB3b3JrIHdpdGggZ2Vyb25pbW8gc3BlYyBvc2dpIHNlcnZpY2UgbG9jYXRvcgotCi1UYXNrCi0tLS0tCi0gICAgKiBbQlZBTC0yXSAtIEluaXRpYWwgY29kZWJhc2UgZG9uYXRpb24gdGFza3MKLSAgICAqIFtCVkFMLTZdIC0gU2V0dXAgcHJvamVjdCB3ZWJzaXRlCi0KLVRlc3QKLS0tLS0KLSAgICAqIFtCVkFMLTEwXSAtIFNldHVwIGNvbnRpbnVvdXMgYnVpbGRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL3RydW5rL0xJQ0VOU0UgYi90cnVuay9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvTk9USUNFIGIvdHJ1bmsvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGIyODhmLi4wMDAwMDAwCi0tLSBhL3RydW5rL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQotQXBhY2hlIEluY3ViYXRvciAtIEJWYWwgcHJvamVjdAotQ29weXJpZ2h0IDIwMTAtMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotVGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlKHMpIHdlcmUgYWZmaXhlZCB0byBwb3J0aW9ucyBvZiB0aGlzIGNvZGUKLXdpdGggd2hpY2ggdGhpcyBmaWxlIGlzIG5vdyBvciB3YXMgYXQgb25lIHRpbWUgZGlzdHJpYnV0ZWQuCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQWdpbWF0ZWMgR21iSC4KLUNvcHlyaWdodCAyMDA3LTIwMTAgQWdpbWF0ZWMgR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvUkVBRE1FLnR4dCBiL3RydW5rL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDc2ODkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLUFwYWNoZSBCVmFsIC0gUkVBRE1FLnR4dAotTGljZW5zZWQgdW5kZXIgQXBhY2hlIExpY2Vuc2UgMi4wIC0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BYm91dAotPT09PT0KLVRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgSlNSIDMwMyAoQmVhbiBWYWxpZGF0aW9uKSwgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZQotSmF2YSBBUEkgZm9yIEphdmFiZWFuIHZhbGlkYXRpb24gaW4gSmF2YSBFRSBhbmQgSmF2YSBTRS4KLVRoZSB0ZWNobmljYWwgb2JqZWN0aXZlIGlzIHRvIHByb3ZpZGUgYSBjbGFzcyBsZXZlbCBjb25zdHJhaW50IGRlY2xhcmF0aW9uIGFuZAotdmFsaWRhdGlvbiBmYWNpbGl0eSBmb3IgdGhlIEphdmEgYXBwbGljYXRpb24gZGV2ZWxvcGVyLCBhcyB3ZWxsIGFzIGEgY29uc3RyYWludAotbWV0YWRhdGEgcmVwb3NpdG9yeSBhbmQgcXVlcnkgQVBJLgotCi0KLVJlbGVhc2UgTm90ZXMKLT09PT09PT09PT09PT0KLVBsZWFzZSByZWZlciB0byB0aGUgaW5jbHVkZWQgQ0hBTkdFUy50eHQgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBuZXcgZmVhdHVyZXMKLWF2YWlsYWJsZSBhbmQgaXNzdWVzIHJlc29sdmVkIGluIHRoaXMgcmVsZWFzZS4KLQotCi1HZXR0aW5nIFN0YXJ0ZWQKLT09PT09PT09PT09PT09PQotUGxlYXNlIHZpc2l0IHRoZSBwcm9qZWN0IHdlYnNpdGUgZm9yIHRoZSBsYXRlc3QgaW5mb3JtYXRpb246Ci0gICAgaHR0cDovL2J2YWwuYXBhY2hlLm9yZy8KLQotQWxvbmcgd2l0aCB0aGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCBhcmNoaXZlOgotICAgIGh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYnZhbC1kZXYvCi0KLQotU3lzdGVtIFJlcXVpcmVtZW50cwotPT09PT09PT09PT09PT09PT09PQotWW91IG5lZWQgYSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIEphdmEgU0UgNSBvciBsYXRlci4KLU1vc3QgdGVzdGluZyBoYXMgYmVlbiBkb25lIHdpdGggSmF2YSBTRSA2IG9uIE1hYyBPUyBYLCBXaW5kb3dzIGFuZCBMaW51eC4KLQotCi1CdWlsZGluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRvIGJ1aWxkIGZyb20gc291cmNlIGNvZGU6Ci0gIC0gU291cmNlcyByZXF1aXJlIEphdmEgU0UgNSBvciBoaWdoZXIuIChUZXN0ZWQgd2l0aCBKREsgMS41LjBfMjIgYW5kIDEuNi4wXzIxKQotICAtIFRoZSBwcm9qZWN0IGlzIGJ1aWx0IHdpdGggQXBhY2hlIE1hdmVuIChzdWdnZXN0ZWQgaXMgYXQgbGVhc3QgMi4yLjEpLgotICAgIFlvdSBuZWVkIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsIE1hdmVuIGZyb206IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLwotICAtIEludm9rZSBtYXZlbiBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb3IgYSBtb2R1bGUgc3ViZGlyZWN0b3J5OgotICAgICAgbXZuIGluc3RhbGwKLQotQ2hlY2tvdXQgdGhlIEJ1aWxkaW5nIHNlY3Rpb24gb24gdGhlIHByb2plY3Qgd2ViIHNpdGUgZm9yIG1vcmUgZGV0YWlsczoKLSAgICBodHRwOi8vYnZhbC5hcGFjaGUub3JnLwotCi0KLVN1cHBvcnQKLT09PT09PT0KLUFueSBwcm9ibGVtcyB3aXRoIHRoaXMgcmVsZWFzZSBjYW4gYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIgbWFpbGluZyBsaXN0IG9yCi1vcGVuZWQgaW4gdGhlIEppcmEgaXNzdWUgdHJhY2tlci4KLQotICBNYWlsaW5nIGxpc3QgYXJjaGl2ZToKLSAgICBodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2J2YWwtdXNlci8KLQotICBVc2VyIG1haWxpbmcgbGlzdDoKLSAgICB1c2VyQGJ2YWwuYXBhY2hlLm9yZwotCi0gIFVzZXIgbWFpbGluZyBsaXN0IHN1YnNjcmlwdGlvbjoKLSAgICB1c2VyLXN1YnNjcmliZUBidmFsLmFwYWNoZS5vcmcKLQotICBKaXJhOgotICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQlZBTC8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnVuZGxlL3BvbS54bWwgYi90cnVuay9idW5kbGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YTU1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idW5kbGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0JTWF2ZW4gcmVsZWFzZSBwbHVnaW4gcmVxdWlyZXMgdGhlIHByb2plY3QgdGFnIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5idmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPCEtLSB1c2UgZnVsbHkgcXVhbGlmaWVkIG5hbWluZyBmb3IgT1NHaSBidW5kbGVzIC0tPgotICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuYnZhbC5idW5kbGU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJWYWwgOjogb3JnLmFwYWNoZS5idmFsLmJ1bmRsZTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBCVmFsIC0gQWdncmVnYXRlIE9TR2kgQnVuZGxlIChidmFsLWNvcmUgKyBidmFsLWpzcjMwMyk8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPCEtLSBKQVJzIHRvIGluY2x1ZGUgaW4gYWdncmVnYXRlIEpBUiB2aWEgbWF2ZW4tc2hhZGUtcGx1Z2luIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtanNyMzAzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT1NHaSBCdW5kbGUgTWV0YWRhdGEgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8TWFpbi1DbGFzcz5vcmcuYXBhY2hlLmJ2YWwudXRpbC5CVmFsVmVyc2lvbjwvTWFpbi1DbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1UaXRsZT5BcGFjaGUgQlZhbDwvSW1wbGVtZW50YXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tQnVpbGQ+JHtidWlsZE51bWJlcn08L0ltcGxlbWVudGF0aW9uLUJ1aWxkPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWNpZmljYXRpb24tVGl0bGU+SlNSLTMwMyBCZWFuIFZhbGlkYXRpb248L1NwZWNpZmljYXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1WZW5kb3I+U3VuIE1pY3Jvc3lzdGVtcywgSW5jLjwvU3BlY2lmaWNhdGlvbi1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1WZXJzaW9uPjEuMDwvU3BlY2lmaWNhdGlvbi1WZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1Eb2NVUkw+JHtwcm9qZWN0LnVybH08L0J1bmRsZS1Eb2NVUkw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RW1iZWQtRGVwZW5kZW5jeT4qO2lubGluZT10cnVlPC9FbWJlZC1EZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPFByaXZhdGUtUGFja2FnZSAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5hcGFjaGUuYnZhbC4qPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT5qYXZheC5wZXJzaXN0ZW5jZS4qO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuYnZhbC54bWwuKjtyZXNvbHV0aW9uOj1vcHRpb25hbCwqPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2Vyb25pbW8gc3BlYyBvc2dpIHNlcnZpY2VzIHN1cHBvcnQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U1BJLVByb3ZpZGVyPnRydWU8L1NQSS1Qcm92aWRlcj4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmZpbmRidWdzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD5mYWxzZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90cnVuay9idW5kbGUvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS52bSBiL3RydW5rL2J1bmRsZS9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkYWU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J1bmRsZS9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMKLSMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMjCi0jIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIwotIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIyB1bmRlciB0aGUgTGljZW5zZS4KLSMjCi0KLQotVGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlKHMpIHdlcmUgYWZmaXhlZCB0byBwb3J0aW9ucyBvZiB0aGlzIGNvZGUKLXdpdGggd2hpY2ggdGhpcyBmaWxlIGlzIG5vdyBvciB3YXMgYXQgb25lIHRpbWUgZGlzdHJpYnV0ZWQuCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgYWdpbWF0ZWMgR21iSC4KLUNvcHlyaWdodCAyMDA3LTIwMTAgQWdpbWF0ZWMgR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3BvbS54bWwgYi90cnVuay9idmFsLWNvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MWQ2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0JTWF2ZW4gcmVsZWFzZSBwbHVnaW4gcmVxdWlyZXMgdGhlIHByb2plY3QgdGFnIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5idmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+YnZhbC1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBCVmFsIDo6IGJ2YWwtY29yZTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkJWYWwgTWV0YWRhdGEgRW5naW5lPC9kZXNjcmlwdGlvbj4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtYmVhbnV0aWxzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1iZWFudXRpbHMtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgZ2V0IHRoZSBzdm4gcmV2aXNpb24gbnVtYmVyIGFuZCBwcm9qZWN0IHZlcnNpb24KLSAgICAgICAgICAgICAgICBhbmQgc2V0IGl0IGluIGEgcHJvcGVydGllcyBmaWxlIGZvciBsYXRlciByZXRyaWV2YWwKLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zZXQgc3VidmVyc2lvbiByZXZpc2lvbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPlZlcnNpb246ICR7cHJvamVjdC52ZXJzaW9ufTwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+UmV2aXNpb246ICR7YnVpbGROdW1iZXJ9PC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5EYXRlOiAke3RpbWVzdGFtcH08L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobyBmaWxlPSIke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS9NRVRBLUlORi9vcmcuYXBhY2hlLmJ2YWwucmV2aXNpb24ucHJvcGVydGllcyI+Ci0jIExpY2Vuc2VkIHVuZGVyIEFwYWNoZSBMaWNlbnNlIDIuMCAtIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotcHJvamVjdC5uYW1lPUFwYWNoZSBCVmFsCi1wcm9qZWN0LnZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259Ci1zdm4ucmV2aXNpb249JHtidWlsZE51bWJlcn0KLXN2bi5icmFuY2g9JHtzY21CcmFuY2h9Ci1idWlsZC50aW1lc3RhbXA9JHt0aW1lc3RhbXB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8IS0tIGNyZWF0ZSBtYWluQ2xhc3MgYXR0cmlidXRlIC0tPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0LWphcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmFwYWNoZS5idmFsLnV0aWwuQlZhbFZlcnNpb248L21haW5DbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1CdWlsZD4ke2J1aWxkTnVtYmVyfTwvSW1wbGVtZW50YXRpb24tQnVpbGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXRlc3RzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0LWphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAJPHBsdWdpbnM+Ci0gICAgICAgIAkJPCEtLVRoaXMgcGx1Z2luJ3MgY29uZmlndXJhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIEVjbGlwc2UgbTJlIHNldHRpbmdzIG9ubHkuIEl0IGhhcyBubyBpbmZsdWVuY2Ugb24gdGhlIE1hdmVuIGJ1aWxkIGl0c2VsZi4tLT4KLSAgICAgICAgCQk8cGx1Z2luPgotICAgICAgICAJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+Ci0gICAgICAgIAkJCTxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAJCQk8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgCQkJPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIAkJCQk8bGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgotICAgICAgICAJCQkJCTxwbHVnaW5FeGVjdXRpb25zPgotICAgICAgICAJCQkJCQk8cGx1Z2luRXhlY3V0aW9uPgotICAgICAgICAJCQkJCQkJPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KLSAgICAgICAgCQkJCQkJCQk8Z3JvdXBJZD4KLSAgICAgICAgCQkJCQkJCQkJb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zCi0gICAgICAgIAkJCQkJCQkJPC9ncm91cElkPgotICAgICAgICAJCQkJCQkJCTxhcnRpZmFjdElkPgotICAgICAgICAJCQkJCQkJCQltYXZlbi1hbnRydW4tcGx1Z2luCi0gICAgICAgIAkJCQkJCQkJPC9hcnRpZmFjdElkPgotICAgICAgICAJCQkJCQkJCTx2ZXJzaW9uUmFuZ2U+Ci0gICAgICAgIAkJCQkJCQkJCVsxLjMsKQotICAgICAgICAJCQkJCQkJCTwvdmVyc2lvblJhbmdlPgotICAgICAgICAJCQkJCQkJCTxnb2Fscz4KLSAgICAgICAgCQkJCQkJCQkJPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAJCQkJCQkJCTwvZ29hbHM+Ci0gICAgICAgIAkJCQkJCQk8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KLSAgICAgICAgCQkJCQkJCTxhY3Rpb24+Ci0gICAgICAgIAkJCQkJCQkJPGlnbm9yZSAvPgotICAgICAgICAJCQkJCQkJPC9hY3Rpb24+Ci0gICAgICAgIAkJCQkJCTwvcGx1Z2luRXhlY3V0aW9uPgotICAgICAgICAJCQkJCTwvcGx1Z2luRXhlY3V0aW9ucz4KLSAgICAgICAgCQkJCTwvbGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgotICAgICAgICAJCQk8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIAkJPC9wbHVnaW4+Ci0gICAgICAgIAk8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS52bSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBjMWVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMKLSMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMjCi0jIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIwotIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIyB1bmRlciB0aGUgTGljZW5zZS4KLSMjCi0KLVRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IG5vdGljZShzKSB3ZXJlIGFmZml4ZWQgdG8gcG9ydGlvbnMgb2YgdGhpcyBjb2RlCi13aXRoIHdoaWNoIHRoaXMgZmlsZSBpcyBub3cgb3Igd2FzIGF0IG9uZSB0aW1lIGRpc3RyaWJ1dGVkLgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IGFnaW1hdGVjIEdtYkguCi1Db3B5cmlnaHQgMjAwNy0yMDEwIEFnaW1hdGVjIEdtYkguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9CZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9CZWFuVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliODM3My4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvQmVhblZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuUHJvcGVydHlBY2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IENvbnRleHQgZHVyaW5nIHZhbGlkYXRpb24gdG8gaGVscCB0aGUge0BsaW5rIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9ufQotICogYW5kIHRoZSB7QGxpbmsgQmVhblZhbGlkYXRvcn0gZG8gdGhlaXIgam9icy4KLSAqIFVzZWQgdG8gYnVuZGxlIHtAbGluayBCZWFuVmFsaWRhdGlvbkNvbnRleHR9IGFuZCB7QGxpbmsgVmFsaWRhdGlvbkxpc3RlbmVyfQotICogdG9nZXRoZXIgPGJyLz4KLSAqIDxiPlRoaXMgY2xhc3MgaXMgTk9UIHRocmVhZC1zYWZlOiBhIG5ldyBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2gKLSAqIHZhbGlkYXRpb24KLSAqIHByb2Nlc3NpbmcgcGVyIHRocmVhZC48YnIvPjwvYj4KLSAqLwotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uQ29udGV4dDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPgotICAgICAgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dDxUPiB7Ci0gICAgLyoqIHJlcHJlc2VudCBhbiB1bmtub3duIHByb3BlcnR5VmFsdWUuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFVOS05PV04gPSBuZXcgT2JqZWN0KCkgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHByb3BlcnR5IHZhbHVlIjsKLSAgICAgICAgfTsKLSAgICB9OwotCi0gICAgLyoqIG1ldGFpbmZvIG9mIGN1cnJlbnQgb2JqZWN0LiAqLwotICAgIHByaXZhdGUgTWV0YUJlYW4gbWV0YUJlYW47Ci0gICAgLyoqIGN1cnJlbnQgb2JqZWN0LiAqLwotICAgIHByaXZhdGUgT2JqZWN0IGJlYW47Ci0gICAgLyoqIG1ldGFpbmZvIG9mIGN1cnJlbnQgcHJvcGVydHkuICovCi0gICAgcHJpdmF0ZSBNZXRhUHJvcGVydHkgbWV0YVByb3BlcnR5OwotICAgIC8qKgotICAgICAqIGNhY2hlZCB2YWx1ZSBvZiBjdXJyZW50IHByb3BlcnR5LgotICAgICAqIENhY2hlZCBiZWNhdXNlIG9mIHBvdGVudGlhbCByZWR1bmRhbnQgYWNjZXNzIGZvciBkaWZmZXJlbnQgVmFsaWRhdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBwcm9wZXJ0eVZhbHVlID0gVU5LTk9XTjsKLQotICAgIC8qKiBhY2Nlc3Mgc3RyYXRlZ3kgdXNlZCBmb3IgcHJldmlvdXMgYWNjZXNzICovCi0gICAgcHJpdmF0ZSBBY2Nlc3NTdHJhdGVneSBhY2Nlc3M7Ci0KLSAgICAvKiogc2V0IG9mIG9iamVjdHMgYWxyZWFkeSB2YWxpZGF0ZWQgdG8gYXZvaWQgZW5kbGVzcyBsb29wcy4gKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIgfSkKLSAgICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRlZE9iamVjdHM7Ci0KLSAgICAvKioKLSAgICAgKiB0cnVlIHdoZW4gdmFsdWUgaXMgZml4ZWQsIHNvIHRoYXQgaXQgd2lsbCBOT1QgYmUgZHluYW1pY2FsbHkKLSAgICAgKiBkZXRlcm1pbmVkIGZyb20gdGhlIGFubm90YXRlZCBlbGVtZW50IG9yIHRoZSBtZXRhUHJvcGVydHkuCi0gICAgICogPGI+PGJyPk5vdGU6IFdoZW4gdmFsdWUgaXMgVU5LTk9XTiwgaXQgd2lsbCBiZSBkZXRlcm1pbmVkIFRIRSBGSVJTVCBUSU1FCi0gICAgICogSVQgSVMgQUNDRVNTRUQuPC9iPgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmaXhlZDsKLQotICAgIC8qKiBsaXN0ZW5lciBub3RpZmllZCBvZiB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy4gKi8KLSAgICBwcml2YXRlIFQgbGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQmVhblZhbGlkYXRpb25Db250ZXh0IGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lcgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQotICAgIHB1YmxpYyBCZWFuVmFsaWRhdGlvbkNvbnRleHQoVCBsaXN0ZW5lcikgewotICAgICAgICB0aGlzKGxpc3RlbmVyLCBuZXcgSWRlbnRpdHlIYXNoTWFwKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBCZWFuVmFsaWRhdGlvbkNvbnRleHQgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogQHBhcmFtIHZhbGlkYXRlZE1hcAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQotICAgIHByb3RlY3RlZCBCZWFuVmFsaWRhdGlvbkNvbnRleHQoVCBsaXN0ZW5lciwgTWFwIHZhbGlkYXRlZE1hcCkgewotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIHRoaXMudmFsaWRhdGVkT2JqZWN0cyA9IHZhbGlkYXRlZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFQgZ2V0TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxpc3RlbmVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoVCBsaXN0ZW5lcikgewotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIEhlcmUsIHN0YXRlIGVxdWF0ZXMgdG8gYSBnaXZlbiBiZWFuIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0VmFsaWRhdGVkKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGVkT2JqZWN0cy5wdXQoZ2V0QmVhbigpLCBCb29sZWFuLlRSVUUpID09IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciBhIHBhcnRpY3VsYXIgb2JqZWN0IGhhcyBiZWVuIHZhbGlkYXRlZC4KLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBpbiB0aGlzIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgbWFwIG9mIHZhbGlkYXRlZCBvYmplY3RzIChpbnZva2Ugd2hlbiB5b3Ugd2FudCB0byAncmV1c2UnIHRoZQotICAgICAqIGNvbnRleHQgZm9yIGRpZmZlcmVudCB2YWxpZGF0aW9ucykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldFZhbGlkYXRlZCgpIHsKLSAgICAgICAgdmFsaWRhdGVkT2JqZWN0cy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBhQmVhbiwgTWV0YUJlYW4gYU1ldGFCZWFuKSB7Ci0gICAgICAgIGJlYW4gPSBhQmVhbjsKLSAgICAgICAgbWV0YUJlYW4gPSBhTWV0YUJlYW47Ci0gICAgICAgIG1ldGFQcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIHVua25vd25WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2FjaGVkIHZhbHVlIG9yIGFjY2VzcyBpdCBzb21laG93ICh2aWEgZmllbGQgb3IgbWV0aG9kKTxicj4KLSAgICAgKiA8Yj55b3Ugc2hvdWxkIHByZWZlciBnZXRQcm9wZXJ0eVZhbHVlKEFjY2Vzc1N0cmF0ZWd5KSBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kPC9iPgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYWNjZXNzZWQgYnkgcmVmbGVjdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gZXJyb3IgYWNjZXNzaW5nIGF0dHJpYnV0ZSAoY29uZmlnIGVycm9yLCByZWZsZWN0aW9uIHByb2JsZW0pCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgLSB3aGVuIG5vIHByb3BlcnR5IGlzIGN1cnJlbnRseSBzZXQgaW4gdGhlIGNvbnRleHQgKGFwcGxpY2F0aW9uIGxvZ2ljIGJ1ZykKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKSB7Ci0gICAgICAgIGlmIChhY2Nlc3MgPT0gbnVsbCkgeyAvLyB1bmRlZmluZWQgYWNjZXNzIHN0cmF0ZWd5Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZSgKLSAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUFjY2VzcyhiZWFuLmdldENsYXNzKCksIG1ldGFQcm9wZXJ0eS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlKGFjY2Vzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQ2FjaGVzIHJldHJpZXZlZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoQWNjZXNzU3RyYXRlZ3kgYWNjZXNzKQotICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlID09IFVOS05PV04gfHwgKHRoaXMuYWNjZXNzICE9IGFjY2VzcyAmJiAhZml4ZWQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gYWNjZXNzLmdldChiZWFuKTsKLSAgICAgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhY2Nlc3MgbWV0YVByb3BlcnR5Lm5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbCBvciB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbWV0YVByb3BlcnR5ID09IG51bGwgPyBudWxsIDogbWV0YVByb3BlcnR5LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUuCi0gICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSwgZml4ZWQuCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Rml4ZWRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHlWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHNldEZpeGVkKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUgaXMgImZpeGVkLiIKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCkgewotICAgICAgICByZXR1cm4gZml4ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG90ZW50aWFsbHkgZGVjbGFyZSB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSBhcyBiZWluZyAiZml4ZWQuIgotICAgICAqIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgY29udGV4dCB3aWxsIHJldXNlIGFueSBub3QtPGNvZGU+VU5LTk9XTjwvY29kZT4KLSAgICAgKiBwcm9wZXJ0eVZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHtAbGluayBBY2Nlc3NTdHJhdGVneX0gYnkgd2hpY2ggaXQgaXMgcmVxdWVzdGVkLgotICAgICAqIEBwYXJhbSBmaXhlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpeGVkKGJvb2xlYW4gZml4ZWQpIHsKLSAgICAgICAgdGhpcy5maXhlZCA9IGZpeGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgYSBtZXRhUHJvcGVydHkgb3Igbm90LAotICAgICAqIHRoaXMgcmV0dXJucyB0aGUgbWV0YVByb3BlcnR5IG9yIG90aGVyd2lzZSB0aGUgbWV0YUJlYW4uCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGhhdmUgYSBzaW1wbGUgd2F5IHRvIHJlcXVlc3QgZmVhdHVyZXMKLSAgICAgKiBpbiB0aGUgVmFsaWRhdGlvbiBmb3IgYm90aCBiZWFuLSBhbmQgcHJvcGVydHktbGV2ZWwgdmFsaWRhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNvbWV0aGluZyB0aGF0IGlzIGNhcGFibGUgdG8gZGVsaXZlciBmZWF0dXJlcwotICAgICAqLwotICAgIHB1YmxpYyBGZWF0dXJlc0NhcGFibGUgZ2V0TWV0YSgpIHsKLSAgICAgICAgcmV0dXJuIChtZXRhUHJvcGVydHkgPT0gbnVsbCkgPyBtZXRhQmVhbiA6IG1ldGFQcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEcm9wIGNhY2hlZCB2YWx1ZSwgbWFya2luZyB0aGUgaW50ZXJuYWwgY2FjaGVkVmFsdWUgYXMgPGNvZGU+VU5LTk9XTjwvY29kZT4uCi0gICAgICogVGhpcyBmb3JjZXMgdGhlIEJlYW5WYWxpZGF0aW9uQ29udGV4dCB0byByZWNvbXB1dGUgdGhlIHZhbHVlCi0gICAgICogdGhlIG5leHQgdGltZSBpdCBpcyBhY2Nlc3NlZC4KLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgaW5zaWRlIHRlc3RzIG9yIHdoZW4gdGhlIHByb3BlcnR5VmFsdWUgaGFzIGJlZW4KLSAgICAgKiBjaGFuZ2VkIGR1cmluZyB2YWxpZGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVua25vd25WYWx1ZSgpIHsKLSAgICAgICAgcHJvcGVydHlWYWx1ZSA9IFVOS05PV047Ci0gICAgICAgIGFjY2VzcyA9IG51bGw7Ci0gICAgICAgIGZpeGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbiBnZXRNZXRhQmVhbigpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YVByb3BlcnR5IGdldE1ldGFQcm9wZXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFQcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YUJlYW4oTWV0YUJlYW4gbWV0YUJlYW4pIHsKLSAgICAgICAgdGhpcy5tZXRhQmVhbiA9IG1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuKE9iamVjdCBiZWFuKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgICAgIHVua25vd25WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydHkoTWV0YVByb3BlcnR5IG1ldGFQcm9wZXJ0eSkgewotICAgICAgICB0aGlzLm1ldGFQcm9wZXJ0eSA9IG1ldGFQcm9wZXJ0eTsKLSAgICAgICAgdW5rbm93blZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQmVhblZhbGlkYXRpb25Db250ZXh0eyBiZWFuPSIgKyBiZWFuICsgIiwgbWV0YVByb3BlcnR5PSIgKyBtZXRhUHJvcGVydHkgKwotICAgICAgICAgICAgICAiLCBwcm9wZXJ0eVZhbHVlPSIgKyBwcm9wZXJ0eVZhbHVlICsgJ30nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlRG93bihNZXRhUHJvcGVydHkgcHJvcCwgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzKSB7Ci0gICAgICAgIHNldEJlYW4oZ2V0UHJvcGVydHlWYWx1ZShhY2Nlc3MpLCBwcm9wLmdldE1ldGFCZWFuKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IGJlYW4sIE1ldGFCZWFuIGFNZXRhQmVhbikgewotICAgICAgICBzZXRCZWFuKGJlYW4sIGFNZXRhQmVhbik7IC8vIHJlc2V0IGNvbnRleHQgc3RhdGUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGV4KEludGVnZXIgaW5kZXgpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzU3RyYXRlZ3kgZ2V0QWNjZXNzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvQmVhblZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL0JlYW5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1ZTY1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvQmVhblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlByb3BlcnR5QWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlZhbGlkYXRpb25IZWxwZXI7Ci0KLS8vIFRPRE86IGNlbnRyYWxpemUgdHJlYXRNYXBzTGlrZUJlYW5zCi0KLS8qKgotICogRGVzY3JpcHRpb246IFRvcC1MZXZlbCBBUEktY2xhc3MgdG8gdmFsaWRhdGUgb2JqZWN0cyBvciBvYmplY3QtdHJlZXMuIFlvdSBjYW4KLSAqIGludm9rZSwgZXh0ZW5kIG9yIHV0aWxpemUgdGhpcyBjbGFzcyBpZiB5b3UgbmVlZCBvdGhlciB3YXlzIHRvIGludGVncmF0ZQotICogdmFsaWRhdGlvbiBpbiB5b3VyIGFwcGxpY2F0aW9uLgotICogPHAvPgotICogVGhpcyBjbGFzcyBzdXBwb3J0cyBjeWNsaWMgb2JqZWN0IGdyYXBocyBieSBrZWVwaW5nIHRyYWNrIG9mIHZhbGlkYXRlZAotICogaW5zdGFuY2VzIGluIHRoZSB2YWxpZGF0aW9uIGNvbnRleHQuPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0b3I8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gewotICAgIHByaXZhdGUgZmluYWwgTWV0YUJlYW5GaW5kZXIgbWV0YUJlYW5GaW5kZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQmVhblZhbGlkYXRvciBpbnN0YW5jZS4gQ29udmVuaWVuY2UgY29uc3RydWN0b3IuIFVzZSB0aGUKLSAgICAgKiBnbG9iYWwgaW5zdGFuY2Ugb2YgTWV0YUJlYW5NYW5hZ2VyRmFjdG9yeS5nZXRGaW5kZXIoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRvcigpIHsKLSAgICAgICAgdGhpcyhNZXRhQmVhbk1hbmFnZXJGYWN0b3J5LmdldEZpbmRlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQmVhblZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0YUJlYW5GaW5kZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQmVhblZhbGlkYXRvcihNZXRhQmVhbkZpbmRlciBtZXRhQmVhbkZpbmRlcikgewotICAgICAgICB0aGlzLm1ldGFCZWFuRmluZGVyID0gbWV0YUJlYW5GaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiB2YWxpZGF0ZSBhIHJvb3Qgb2JqZWN0IHdpdGggYWxsIHJlbGF0ZWQgb2JqZWN0cyB3aXRoIGl0cwotICAgICAqIGRlZmF1bHQgbWV0YUJlYW4gZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEByZXR1cm4gcmVzdWx0cyAtIHZhbGlkYXRpb24gcmVzdWx0cyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBUIHZhbGlkYXRlKE9iamVjdCBiZWFuKSB7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0gZ2V0TWV0YUJlYW5GaW5kZXIoKS5maW5kRm9yQ2xhc3MoYmVhbi5nZXRDbGFzcygpKTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlKGJlYW4sIG1ldGFCZWFuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBBUEkuIHZhbGlkYXRlIGEgcm9vdCBvYmplY3Qgd2l0aCBhbGwgcmVsYXRlZCBvYmplY3RzCi0gICAgICogYWNjb3JkaW5nIHRvIHRoZSBtZXRhQmVhbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqICAgICAgICAgICAgLSBhIHNpbmdsZSBiZWFuIG9yIGEgY29sbGVjdGlvbiBvZiBiZWFucyAodGhhdCBzaGFyZSB0aGUgc2FtZQotICAgICAqICAgICAgICAgICAgbWV0YUJlYW4hKQotICAgICAqIEBwYXJhbSBtZXRhQmVhbgotICAgICAqIEByZXR1cm4gcmVzdWx0cyAtIHZhbGlkYXRpb24gcmVzdWx0cyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBUIHZhbGlkYXRlKE9iamVjdCBiZWFuLCBNZXRhQmVhbiBtZXRhQmVhbikgewotICAgICAgICBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnNldEJlYW4oYmVhbiwgbWV0YUJlYW4pOwotICAgICAgICBWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlQ29udGV4dChjb250ZXh0LCBuZXcgQmVhblZhbGlkYXRvckNhbGxiYWNrKGNvbnRleHQpLCB0cmVhdE1hcHNMaWtlQmVhbnMpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBtZXRob2QgcGFyYW1ldGVycyBiYXNlZCBvbiBAVmFsaWRhdGUgYW5ub3RhdGlvbnMuCi0gICAgICogUmVxdWlyZW1lbnRzOiBQYXJhbWV0ZXIsIHRoYXQgYXJlIHRvIGJlIHZhbGlkYXRlZCBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBWYWxpZGF0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiAgICAgICAgICAgIC0gYSBtZXRob2QKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgLSB0aGUgcGFyYW1ldGVycyBzdWl0YWJsZSB0byB0aGUgbWV0aG9kCi0gICAgICogQHJldHVybiBhIHZhbGlkYXRpb24gcmVzdWx0IG9yIG51bGwgd2hlbiB0aGVyZSB3YXMgbm90aGluZyB0byB2YWxpZGF0ZQotICAgICAqIEBzZWUgVmFsaWRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVCB2YWxpZGF0ZUNhbGwoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycykgewotICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAvLyBzaG9ydGN1dCAoZm9yIHBlcmZvcm1hbmNlISkKLSAgICAgICAgICAgIEFubm90YXRpb25bXVtdIGFubm90YXRpb25zID0gbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vIDogYW5ub3RhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm8gaW5zdGFuY2VvZiBWYWxpZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVybWluZU1ldGFCZWFuKChWYWxpZGF0ZSkgYW5ubywgcGFyYW1ldGVyc1tpXSwgY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlQ29udGV4dChjb250ZXh0LCBuZXcgQmVhblZhbGlkYXRvckNhbGxiYWNrKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdE1hcHNMaWtlQmVhbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBuZXh0IHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQgIT0gbnVsbCA/IGNvbnRleHQuZ2V0TGlzdGVuZXIoKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBtZXRhYmVhbiBmb3IgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFZMPgotICAgICAqIEBwYXJhbSB2YWxpZGF0ZQotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHZhbGlkYXRpb24gc2hvdWxkIGhhcHBlbiwgZmFsc2UgdG8gc2tpcCBpdAotICAgICAqLwotICAgIHByb3RlY3RlZCA8VkwgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IGJvb2xlYW4gZGV0ZXJtaW5lTWV0YUJlYW4oVmFsaWRhdGUgdmFsaWRhdGUsIE9iamVjdCBwYXJhbWV0ZXIsCi0gICAgICAgIFZhbGlkYXRpb25Db250ZXh0PFZMPiBjb250ZXh0KSB7Ci0gICAgICAgIGlmICh2YWxpZGF0ZS52YWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBDbGFzczw/PiBiZWFuQ2xhc3M7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgeyAvLyBkbyBub3QgdmFsaWRhdGUgZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3Rpb24KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8+IGNvbGwgPSAoKENvbGxlY3Rpb248Pz4pIHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbGwuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYmVhbkNsYXNzID0gY29sbC5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpOyAvLyBnZXQgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdAotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICBiZWFuQ2xhc3MgPSBwYXJhbWV0ZXIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJlYW5DbGFzcyA9IHBhcmFtZXRlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dC5zZXRCZWFuKHBhcmFtZXRlciwgZ2V0TWV0YUJlYW5GaW5kZXIoKS5maW5kRm9yQ2xhc3MoYmVhbkNsYXNzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldEJlYW4ocGFyYW1ldGVyLCBnZXRNZXRhQmVhbkZpbmRlcigpLmZpbmRGb3JJZCh2YWxpZGF0ZS52YWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZmFjdG9yeSBtZXRob2QgLSBvdmVyd3JpdGUgaW4gc3ViY2xhc3NlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gVmFsaWRhdGlvbkxpc3RlbmVyIG9mIHRoZSBwcm9wZXIgdHlwZQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBUIGNyZWF0ZVJlc3VsdHMoKSB7Ci0gICAgICAgIHJldHVybiAoVCkgbmV3IFZhbGlkYXRpb25SZXN1bHRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZmFjdG9yeSBtZXRob2QgLSBvdmVyd3JpdGUgaW4gc3ViY2xhc3NlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gVmFsaWRhdGlvbkNvbnRleHQgcGFyYW1ldGVyaXplZCB3aXRoIG91ciBsaXN0ZW5lciB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRpb25Db250ZXh0PFQ+IGNyZWF0ZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmVhblZhbGlkYXRpb25Db250ZXh0PFQ+KGNyZWF0ZVJlc3VsdHMoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgQVBJLiB2YWxpZGF0ZSBhIHNpbmdsZSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqICAgICAgICAgICAgLSB0aGUgcm9vdCBvYmplY3QKLSAgICAgKiBAcGFyYW0gbWV0YVByb3BlcnR5Ci0gICAgICogICAgICAgICAgICAtIG1ldGFkYXRhIGZvciB0aGUgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHZhbGlkYXRpb24gcmVzdWx0cwotICAgICAqLwotICAgIHB1YmxpYyBUIHZhbGlkYXRlUHJvcGVydHkoT2JqZWN0IGJlYW4sIE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHkpIHsKLSAgICAgICAgVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC5zZXRCZWFuKGJlYW4pOwotICAgICAgICBjb250ZXh0LnNldE1ldGFQcm9wZXJ0eShtZXRhUHJvcGVydHkpOwotICAgICAgICBWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlUHJvcGVydHkoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfSBpbnRlcm5hbCB2YWxpZGF0ZSBhIGJlYW4gKD1ub3QgYSBjb2xsZWN0aW9uIG9mIGJlYW5zKSBhbmQKLSAgICAgKiBpdHMgcmVsYXRlZCBiZWFucwotICAgICAqLwotICAgIHByb3RlY3RlZCA8VkwgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVCZWFuTmV0KFZhbGlkYXRpb25Db250ZXh0PFZMPiBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmNvbGxlY3RWYWxpZGF0ZWQoKSkgewotICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlci52YWxpZGF0ZUJlYW4oY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IgKE1ldGFQcm9wZXJ0eSBwcm9wIDogY29udGV4dC5nZXRNZXRhQmVhbigpLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlUmVsYXRlZEJlYW4oY29udGV4dCwgcHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSBhIHByb3BlcnR5IG9mIGEgZ3JhcGguCi0gICAgICogCi0gICAgICogQHBhcmFtIDxWTD4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIDxWTCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZVJlbGF0ZWRCZWFuKFZhbGlkYXRpb25Db250ZXh0PFZMPiBjb250ZXh0LCBNZXRhUHJvcGVydHkgcHJvcCkgewotICAgICAgICBBY2Nlc3NTdHJhdGVneVtdIGFjY2VzcyA9IHByb3AuZ2V0RmVhdHVyZShGZWF0dXJlcy5Qcm9wZXJ0eS5SRUZfQ0FTQ0FERSk7Ci0gICAgICAgIGlmIChhY2Nlc3MgPT0gbnVsbCAmJiBwcm9wLmdldE1ldGFCZWFuKCkgIT0gbnVsbCkgeyAvLyBzaW5nbGUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VzcyBzdHJhdGVneQotICAgICAgICAgICAgLy8gc2F2ZSBvbGQgdmFsdWVzIGZyb20gY29udGV4dAotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGJlYW4gPSBjb250ZXh0LmdldEJlYW4oKTsKLSAgICAgICAgICAgIGZpbmFsIE1ldGFCZWFuIG1iZWFuID0gY29udGV4dC5nZXRNZXRhQmVhbigpOwotICAgICAgICAgICAgLy8gbW9kaWZ5IGNvbnRleHQgc3RhdGUgZm9yIHJlbGF0aW9uc2hpcC10YXJnZXQgYmVhbgotICAgICAgICAgICAgY29udGV4dC5tb3ZlRG93bihwcm9wLCBuZXcgUHJvcGVydHlBY2Nlc3MoYmVhbi5nZXRDbGFzcygpLCBwcm9wLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlci52YWxpZGF0ZUNvbnRleHQoY29udGV4dCwgbmV3IEJlYW5WYWxpZGF0b3JDYWxsYmFjayhjb250ZXh0KSwgdHJlYXRNYXBzTGlrZUJlYW5zKTsKLSAgICAgICAgICAgIC8vIHJlc3RvcmUgb2xkIHZhbHVlcyBpbiBjb250ZXh0Ci0gICAgICAgICAgICBjb250ZXh0Lm1vdmVVcChiZWFuLCBtYmVhbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzICE9IG51bGwpIHsgLy8gZGlmZmVyZW50IGFjY2Vzc2VzIHRvIHJlbGF0aW9uCi0gICAgICAgICAgICAvLyBzYXZlIG9sZCB2YWx1ZXMgZnJvbSBjb250ZXh0Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgYmVhbiA9IGNvbnRleHQuZ2V0QmVhbigpOwotICAgICAgICAgICAgZmluYWwgTWV0YUJlYW4gbWJlYW4gPSBjb250ZXh0LmdldE1ldGFCZWFuKCk7Ci0gICAgICAgICAgICBmb3IgKEFjY2Vzc1N0cmF0ZWd5IGVhY2ggOiBhY2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAvLyBtb2RpZnkgY29udGV4dCBzdGF0ZSBmb3IgcmVsYXRpb25zaGlwLXRhcmdldCBiZWFuCi0gICAgICAgICAgICAgICAgY29udGV4dC5tb3ZlRG93bihwcm9wLCBlYWNoKTsKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlQ29udGV4dChjb250ZXh0LCBuZXcgQmVhblZhbGlkYXRvckNhbGxiYWNrKGNvbnRleHQpLCB0cmVhdE1hcHNMaWtlQmVhbnMpOwotICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgb2xkIHZhbHVlcyBpbiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgY29udGV4dC5tb3ZlVXAoYmVhbiwgbWJlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyZWF0TWFwc0xpa2VCZWFucyA9IGZhbHNlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmVhdE1hcHNMaWtlQmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiB0cmVhdE1hcHNMaWtlQmVhbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJlYXRNYXBzTGlrZUJlYW5zKGJvb2xlYW4gdHJlYXRNYXBzTGlrZUJlYW5zKSB7Ci0gICAgICAgIHRoaXMudHJlYXRNYXBzTGlrZUJlYW5zID0gdHJlYXRNYXBzTGlrZUJlYW5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWV0YWJlYW4gZmluZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZhbGlkYXRvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgTWV0YUJlYW5GaW5kZXIKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbk1hbmFnZXJGYWN0b3J5I2dldEZpbmRlcigpCi0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuRmluZGVyIGdldE1ldGFCZWFuRmluZGVyKCkgewotICAgICAgICByZXR1cm4gbWV0YUJlYW5GaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGF0Y2hlcyBhIGNhbGwgZnJvbSB7QGxpbmsgI3ZhbGlkYXRlKCl9IHRvCi0gICAgICoge0BsaW5rIEJlYW5WYWxpZGF0b3IjdmFsaWRhdGVCZWFuTmV0KFZhbGlkYXRpb25Db250ZXh0KX0gd2l0aCB0aGUgY3VycmVudAotICAgICAqIGNvbnRleHQgc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQmVhblZhbGlkYXRvckNhbGxiYWNrIGltcGxlbWVudHMgVmFsaWRhdGlvbkhlbHBlci5WYWxpZGF0ZUNhbGxiYWNrIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25Db250ZXh0PD8+IGNvbnRleHQ7Ci0KLSAgICAgICAgcHVibGljIEJlYW5WYWxpZGF0b3JDYWxsYmFjayhWYWxpZGF0aW9uQ29udGV4dDw/PiBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUJlYW5OZXQoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL0R5bmFtaWNNZXRhQmVhbi5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL0R5bmFtaWNNZXRhQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWUyMmRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9EeW5hbWljTWV0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotLy8gVE9ETzogUmVkdWNlIHZpc2liaWxpdHkKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogRHluYW1pYyB7QGxpbmsgTWV0YUJlYW59IHN1YmNsYXNzLjxici8+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEeW5hbWljTWV0YUJlYW4gZXh0ZW5kcyBNZXRhQmVhbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1ldGFCZWFuRmluZGVyIGZpbmRlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEeW5hbWljTWV0YUJlYW4gaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGZpbmRlcgotICAgICAqLwotICAgIHB1YmxpYyBEeW5hbWljTWV0YUJlYW4oTWV0YUJlYW5GaW5kZXIgZmluZGVyKSB7Ci0gICAgICAgIHRoaXMuZmluZGVyID0gZmluZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBkaWZmZXJlbnQgc3RyYXRlZ2llcyB3aXRoIGhpbnRzIHRvIGZpbmQgTWV0YUJlYW4gb2YgYXNzb2NpYXRlZCBvYmplY3QgY2FuCi0gICAgICogYmUgaW1wbGVtZW50ZWQgaGVyZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWV0YUJlYW4gcmVzb2x2ZU1ldGFCZWFuKE9iamVjdCBiZWFuKSB7Ci0gICAgICAgIHJldHVybiBiZWFuIGluc3RhbmNlb2YgQ2xhc3M8Pz4gPwotICAgICAgICAgICAgICAgIGZpbmRlci5maW5kRm9yQ2xhc3MoKENsYXNzPD8+KSBiZWFuKSA6IGZpbmRlci5maW5kRm9yQ2xhc3MoYmVhbi5nZXRDbGFzcygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvSW50cm9zcGVjdG9yTWV0YUJlYW5GYWN0b3J5LmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvSW50cm9zcGVjdG9yTWV0YUJlYW5GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzllNDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL0ludHJvc3BlY3Rvck1ldGFCZWFuRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eS4qOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB1c2UgaW5mb3JtYXRpb24gZnJvbSBqYXZhLmJlYW5zLkludHJvc3BlY3RvciBpbiBNZXRhQmVhbnMuIFRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgY2FuIGNvbnRhaW4gaW5mbyBhYm91dAotICogSElEREVOLCBQUkVGRVJSRUQsIFJFQURPTkxZIGFuZCBvdGhlciBmZWF0dXJlczxici8+Ci0gKiBOT1RFOiBUSElTIElTIEFOIE9QVElPTkFMIENMQVNTLCBUTyBFTkFCTEUgSVQsIFNFVCBGYWN0b3J5IFByb3BlcnR5IGFwYWNoZS5idmFsLmVuYWJsZS1pbnRyb3NwZWN0b3I9InRydWUiCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRyb3NwZWN0b3JNZXRhQmVhbkZhY3RvcnkgaW1wbGVtZW50cyBNZXRhQmVhbkZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTWV0YUJlYW4oTWV0YUJlYW4gbWV0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZXRhLmdldEJlYW5DbGFzcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gaGFuZGxlIG9ubHksIHdoZW4gbG9jYWwgY2xhc3MgZXhpc3RzCi0gICAgICAgIH0KLSAgICAgICAgQmVhbkluZm8gaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhtZXRhLmdldEJlYW5DbGFzcygpKTsKLSAgICAgICAgaWYgKG1ldGEuZ2V0TmFtZSgpID09IG51bGwgJiYgaW5mby5nZXRCZWFuRGVzY3JpcHRvcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGEuc2V0TmFtZShpbmZvLmdldEJlYW5EZXNjcmlwdG9yKCkuZ2V0TmFtZSgpKTsgLy8gKGRpc3BsYXk/KW5hbWUgPSBzaW1wbGUgY2xhc3MgbmFtZSEKLSAgICAgICAgfQotICAgICAgICBmb3IgKFByb3BlcnR5RGVzY3JpcHRvciBwZCA6IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpKSB7Ci0gICAgICAgICAgICBpZiAoIShwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IgfHwgcGQuZ2V0TmFtZSgpLmVxdWFscygiY2xhc3MiKSkpIHsKLSAgICAgICAgICAgICAgICBNZXRhUHJvcGVydHkgbWV0YVByb3AgPSBidWlsZE1ldGFQcm9wZXJ0eShwZCwgbWV0YS5nZXRQcm9wZXJ0eShwZC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBtZXRhLnB1dFByb3BlcnR5KHBkLmdldE5hbWUoKSwgbWV0YVByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEge0BsaW5rIE1ldGFQcm9wZXJ0eX0gZnJvbSB0aGUgc3BlY2lmaWVkIHtAbGluayBQcm9wZXJ0eURlc2NyaXB0b3J9LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwZAotICAgICAqIEByZXR1cm4gTWV0YVByb3BlcnR5Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgTWV0YVByb3BlcnR5IGJ1aWxkTWV0YVByb3BlcnR5KFByb3BlcnR5RGVzY3JpcHRvciBwZCkgewotICAgICAgICByZXR1cm4gYnVpbGRNZXRhUHJvcGVydHkocGQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHtAbGluayBNZXRhUHJvcGVydHl9IGZyb20gdGhlIHNwZWNpZmllZCB7QGxpbmsgUHJvcGVydHlEZXNjcmlwdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGQKLSAgICAgKiBAcGFyYW0gZXhpc3RpbmcKLSAgICAgKiBAcmV0dXJuIE1ldGFQcm9wZXJ0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRhUHJvcGVydHkgYnVpbGRNZXRhUHJvcGVydHkoUHJvcGVydHlEZXNjcmlwdG9yIHBkLCBNZXRhUHJvcGVydHkgZXhpc3RpbmcpIHsKLSAgICAgICAgTWV0YVByb3BlcnR5IG1ldGEgPSBuZXcgTWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIG1ldGEuc2V0TmFtZShwZC5nZXROYW1lKCkpOwotICAgICAgICBtZXRhLnNldFR5cGUoZGV0ZXJtaW5lR2VuZXJpY1Byb3BlcnR5VHlwZShwZCkpOwotICAgICAgICBpZiAocGQuaXNIaWRkZW4oKSkgewotICAgICAgICAgICAgbWV0YS5wdXRGZWF0dXJlKEhJRERFTiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGQuaXNQcmVmZXJyZWQoKSkgewotICAgICAgICAgICAgbWV0YS5wdXRGZWF0dXJlKFBSRUZFUlJFRCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGQuaXNDb25zdHJhaW5lZCgpKSB7Ci0gICAgICAgICAgICBtZXRhLnB1dEZlYXR1cmUoUkVBRE9OTFksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHBkLmF0dHJpYnV0ZU5hbWVzKCk7Ci0gICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwZC5nZXRWYWx1ZShrZXkpOwotICAgICAgICAgICAgbWV0YS5wdXRGZWF0dXJlKGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZSBkZXRlcm1pbmVHZW5lcmljUHJvcGVydHlUeXBlKFByb3BlcnR5RGVzY3JpcHRvciBwZCkgewotICAgICAgICBNZXRob2QgbSA9IHBkLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG0uZ2V0R2VuZXJpY1JldHVyblR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBtID0gcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwZC5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvTWV0YUJlYW5CdWlsZGVyLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvTWV0YUJlYW5CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWIwZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGludGVybmFsIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGNvbnN0cnVjdCBtZXRhYmVhbnMgd2l0aAotICogZmFjdG9yaWVzPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFCZWFuQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gIExvZ2dlci5nZXRMb2dnZXIoTWV0YUJlYW5CdWlsZGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvKioKLSAgICAgKiBoZXJlIHlvdSBjYW4gaW5zdGFsbCBkaWZmZXJlbnQga2luZHMgb2YgZmFjdG9yaWVzIHRvIGNyZWF0ZSBNZXRhQmVhbnMKLSAgICAgKiBmcm9tCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRhQmVhbkZhY3RvcnlbXSBmYWN0b3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0YUJlYW5CdWlsZGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbkJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMobmV3IE1ldGFCZWFuRmFjdG9yeVtdIHsgbmV3IEludHJvc3BlY3Rvck1ldGFCZWFuRmFjdG9yeSgpIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRhQmVhbkJ1aWxkZXIgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcmllcwotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbkJ1aWxkZXIoTWV0YUJlYW5GYWN0b3J5W10gZmFjdG9yaWVzKSB7Ci0gICAgICAgIHNldEZhY3RvcmllcyhmYWN0b3JpZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uZmlndXJlZCBzZXQgb2Yge0BsaW5rIE1ldGFCZWFuRmFjdG9yeX0gb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRhQmVhbkZhY3Rvcnl9IGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuRmFjdG9yeVtdIGdldEZhY3RvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuY2xvbmUoZmFjdG9yaWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFycmF5IG9mIHtAbGluayBNZXRhQmVhbkZhY3Rvcnl9IGluc3RhbmNlcyB3aXRoIHdoaWNoIHRvIGVucmljaAotICAgICAqIHtAbGluayBNZXRhQmVhbn1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3JpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3JpZXMoTWV0YUJlYW5GYWN0b3J5W10gZmFjdG9yaWVzKSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yaWVzID0gQXJyYXlVdGlscy5jbG9uZShmYWN0b3JpZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEge0BsaW5rIE1ldGFCZWFufSBmb3IgYSBnaXZlbiBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVhbkluZm9JZAotICAgICAqIEByZXR1cm4gTWV0YUJlYW4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHVuYWJsZSB0byBidWlsZAotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbiBidWlsZEZvcklkKFN0cmluZyBiZWFuSW5mb0lkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWV0YUJlYW4gIiArIGJlYW5JbmZvSWQgKyAiIG5vdCBmb3VuZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGJlYW5zIGZvciBhbGwga25vd24gaWRzLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgYW4gZW1wdHkKLSAgICAgKiBtYXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBNYXAgb2YgU3RyaW5nIDogTWV0YUJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWV0YUJlYW4+IGJ1aWxkQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGFCZWFuPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIG5hbWVkIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIENsYXNzIGZvdW5kIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZmluZExvY2FsQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzVXRpbHMuZ2V0Q2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCWxvZy5sb2coTGV2ZWwuRklORSwgU3RyaW5nLmZvcm1hdCgiQ2xhc3Mgbm90IGZvdW5kOiAlcyIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgTWV0YUJlYW4gZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBNZXRhQmVhbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuIGJ1aWxkRm9yQ2xhc3MoQ2xhc3M8Pz4gY2xhenopIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRhQmVhbiBtZXRhID0gbmV3IE1ldGFCZWFuKCk7Ci0gICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7IC8vIGxvY2FsIGNsYXNzIGhlcmU/Ci0gICAgICAgICAgICBtZXRhLnNldEJlYW5DbGFzcyhjbGF6eik7Ci0gICAgICAgICAgICBtZXRhLnNldElkKGNsYXp6LmdldE5hbWUoKSk7IC8vIGRlZmF1bHQgaWQgPSBmdWxsIGNsYXNzIG5hbWUhCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChNZXRhQmVhbkZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykgewotICAgICAgICAgICAgZmFjdG9yeS5idWlsZE1ldGFCZWFuKG1ldGEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRhOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuQ2FjaGUuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9NZXRhQmVhbkNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NWJjMGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGEgY2FjaGUgdG8gaG9sZCBtZXRhYmVhbnMgYnkgaWQgYW5kIGJ5IGNsYXNzLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhQmVhbkNhY2hlIGltcGxlbWVudHMgTWV0YUJlYW5GaW5kZXIsIFNlcmlhbGl6YWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBDYWNoZSBrZXllZCBieSBpZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBjYWNoZUJ5SWQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNZXRhQmVhbj4oKTsKLSAgICAvKioKLSAgICAgKiBDYWNoZSBrZXllZCBieSBjbGFzcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29uY3VycmVudE1hcDxDbGFzczw/PiwgTWV0YUJlYW4+IGNhY2hlQnlDbGFzcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzczw/PiwgTWV0YUJlYW4+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0YUJlYW5DYWNoZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW5DYWNoZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0YUJlYW5DYWNoZSBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gYmVhbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW5DYWNoZShNYXA8U3RyaW5nLCBNZXRhQmVhbj4gYmVhbnMpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBmb3IgKE1ldGFCZWFuIGJlYW4gOiBiZWFucy52YWx1ZXMoKSkgewotICAgICAgICAgICAgY2FjaGUoYmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGNhY2hlQnlJZC5jbGVhcigpOwotICAgICAgICBjYWNoZUJ5Q2xhc3MuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuIGZpbmRGb3JJZChTdHJpbmcgYmVhbkluZm9JZCkgewotICAgICAgICByZXR1cm4gY2FjaGVCeUlkLmdldChiZWFuSW5mb0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuIGZpbmRGb3JDbGFzcyhDbGFzczw/PiBjbGF6eikgewotICAgICAgICByZXR1cm4gY2FjaGVCeUNsYXNzLmdldChjbGF6eik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFsbCBjYWNoZWQgTWV0YUJlYW5zIGJ5IGlkLgotICAgICAqIEByZXR1cm4gbGl2ZSBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWV0YUJlYW4+IGZpbmRBbGwoKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZUJ5SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FjaGUgdGhlIHNwZWNpZmllZCBNZXRhQmVhbi4KLSAgICAgKiBAcGFyYW0gYmVhbkluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYWNoZShNZXRhQmVhbiBiZWFuSW5mbykgewotICAgICAgICBjYWNoZUJ5SWQucHV0KGJlYW5JbmZvLmdldElkKCksIGJlYW5JbmZvKTsKLSAgICAgICAgaWYgKGJlYW5JbmZvLmdldEJlYW5DbGFzcygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBiZWFuSW5mby5nZXRJZCgpLmVxdWFscyhiZWFuSW5mby5nZXRCZWFuQ2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBjYWNoZUJ5Q2xhc3MucHV0SWZBYnNlbnQoYmVhbkluZm8uZ2V0QmVhbkNsYXNzKCksIGJlYW5JbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHNpbmdsZSBNZXRhQmVhbiBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKiBAcGFyYW0gYmVhbkluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tQ2FjaGUoTWV0YUJlYW4gYmVhbkluZm8pIHsKLSAgICAgICAgY2FjaGVCeUlkLnJlbW92ZShiZWFuSW5mby5nZXRJZCgpKTsKLSAgICAgICAgaWYgKGJlYW5JbmZvLmdldEJlYW5DbGFzcygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBiZWFuSW5mby5nZXRJZCgpLmVxdWFscyhiZWFuSW5mby5nZXRCZWFuQ2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBjYWNoZUJ5Q2xhc3MucmVtb3ZlKGJlYW5JbmZvLmdldEJlYW5DbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuRmFjdG9yeS5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEwNmQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9NZXRhQmVhbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogaW50ZXJmYWNlIGZvciBhYnN0cmFjdGlvbiBob3cgdG8gaW5pdGlhbGl6ZSBhIE1ldGFCZWFuCi0gKiB3aXRoIGluZm9ybWF0aW9uIGZyb20gc29tZXdoZXJlPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhQmVhbkZhY3RvcnkgewotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCB7QGxpbmsgTWV0YUJlYW59LgotICAgICAqIEBwYXJhbSBtZXRhQmVhbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgdm9pZCBidWlsZE1ldGFCZWFuKE1ldGFCZWFuIG1ldGFCZWFuKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuRmluZGVyLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvTWV0YUJlYW5GaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhYTk3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvTWV0YUJlYW5GaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbnRlcmZhY2UgdG8gZmluZCBCZWFuSW5mb3MgPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhQmVhbkZpbmRlciB7Ci0gICAgLyoqCi0gICAgICogRmluZCBhIE1ldGFCZWFuIHdpdGggYSBjZXJ0YWluIGlkLgotICAgICAqIEBwYXJhbSBiZWFuSW5mb0lkIC0gc3ltYm9saWMgdW5pcXVlIG5hbWUgb2YgTWV0YSBJbmZvCi0gICAgICogQHJldHVybiBCZWFuSW5mbwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gd2hlbiBNZXRhQmVhbiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBNZXRhQmVhbiBmaW5kRm9ySWQoU3RyaW5nIGJlYW5JbmZvSWQpOwotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgTWV0YUJlYW4gZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0gICAgICogQHBhcmFtIGNsYXp6IC0gYmVhbiBjbGFzcwotICAgICAqIEByZXR1cm4gQmVhbkluZm8gKG5ldmVyIG51bGwpCi0gICAgICovCi0gICAgTWV0YUJlYW4gZmluZEZvckNsYXNzKENsYXNzPD8+IGNsYXp6KTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuTWFuYWdlci5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ3OTdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9NZXRhQmVhbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFQcm9wZXJ0eTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMuUHJvcGVydHkuKjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGVyZmFjZSB0byBmaW5kLCByZWdpc3RlciBhbmQKLSAqIGNyZWF0ZSBNZXRhQmVhbnMuIEluIG1vc3Qgc2l0dWF0aW9ucyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzCi0gKiBzdWZmaWNpZW50IGFuZCB5b3UgY2FuIGdldCB0aGlzIGluc3RhbmNlIGZyb20gdGhlCi0gKiB7QGxpbmsgTWV0YUJlYW5NYW5hZ2VyRmFjdG9yeX0uIDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhQmVhbk1hbmFnZXIgaW1wbGVtZW50cyBNZXRhQmVhbkZpbmRlciB7Ci0KLSAgICAvKiogTWV0YUJlYW4gY2FjaGUgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWV0YUJlYW5DYWNoZSBjYWNoZSA9IG5ldyBNZXRhQmVhbkNhY2hlKCk7Ci0gICAgLyoqIE1ldGFCZWFuIGJ1aWxkZXIgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWV0YUJlYW5CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgLyoqIENvbXBsZXRlIGZsYWcgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IE1ldGFCZWFuTWFuYWdlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW5NYW5hZ2VyKCkgewotICAgICAgICBidWlsZGVyID0gbmV3IE1ldGFCZWFuQnVpbGRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRhQmVhbk1hbmFnZXIgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1aWxkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW5NYW5hZ2VyKE1ldGFCZWFuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBidWlsZGVyIHVzZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgTWV0YUJlYW5CdWlsZGVyfQotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbkJ1aWxkZXIgZ2V0QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjYWNoZSB1c2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0BsaW5rIE1ldGFCZWFuQ2FjaGV9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuQ2FjaGUgZ2V0Q2FjaGUoKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuIGZpbmRGb3JJZChTdHJpbmcgYmVhbkluZm9JZCkgewotICAgICAgICBNZXRhQmVhbiBiZWFuSW5mbyA9IGNhY2hlLmZpbmRGb3JJZChiZWFuSW5mb0lkKTsKLSAgICAgICAgaWYgKGJlYW5JbmZvICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYmVhbkluZm87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWFuSW5mbyA9IGJ1aWxkZXIuYnVpbGRGb3JJZChiZWFuSW5mb0lkKTsKLSAgICAgICAgICAgIGNhY2hlLmNhY2hlKGJlYW5JbmZvKTsKLSAgICAgICAgICAgIGNvbXB1dGVSZWxhdGlvbnNoaXBzKGJlYW5JbmZvKTsKLSAgICAgICAgICAgIHJldHVybiBiZWFuSW5mbzsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOyAvLyBkbyBub3Qgd3JhcCBydW50aW1lIGV4Y2VwdGlvbnMKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVycm9yIGNyZWF0aW5nIGJlYW5JbmZvIHdpdGggaWQ6ICIgKyBiZWFuSW5mb0lkLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW4gZmluZEZvckNsYXNzKENsYXNzPD8+IGNsYXp6KSB7Ci0gICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIE1ldGFCZWFuIGJlYW5JbmZvID0gY2FjaGUuZmluZEZvckNsYXNzKGNsYXp6KTsKLSAgICAgICAgaWYgKGJlYW5JbmZvICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gYmVhbkluZm87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiZWFuSW5mbyA9IGJ1aWxkZXIuYnVpbGRGb3JDbGFzcyhjbGF6eik7Ci0gICAgICAgICAgICBjYWNoZS5jYWNoZShiZWFuSW5mbyk7Ci0gICAgICAgICAgICBjb21wdXRlUmVsYXRpb25zaGlwcyhiZWFuSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gYmVhbkluZm87Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsgLy8gZG8gbm90IHdyYXAgcnVudGltZSBleGNlcHRpb25zCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBiZWFuSW5mbyBmb3IgIiArIGNsYXp6LCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGUgYWxsIGtub3duIHJlbGF0aW9uc2hpcHMgZm9yIDxjb2RlPmJlYW5JbmZvPC9jb2RlPi4gbXVzdCBiZSBjYWxsZWQKLSAgICAgKiBBRlRFUiBjYWNoZS5jYWNoZSgpIHRvIGF2b2lkIGVuZGxlc3MgbG9vcAotICAgICAqIAotICAgICAqIEBwYXJhbSBiZWFuSW5mbwotICAgICAqICAgICAgICAgICAgLSB0aGUgYmVhbiBmb3Igd2hpY2ggdG8gY29tcHV0ZSByZWxhdGlvbnNoaXBzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlbGF0aW9uc2hpcHMoTWV0YUJlYW4gYmVhbkluZm8pIHsKLSAgICAgICAgZm9yIChNZXRhUHJvcGVydHkgcHJvcCA6IGJlYW5JbmZvLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGJlYW5SZWYgPSAoU3RyaW5nKSBwcm9wLmdldEZlYXR1cmUoUkVGX0JFQU5fSUQpOwotICAgICAgICAgICAgY29tcHV0ZVJlbGF0ZWRNZXRhQmVhbihwcm9wLCBiZWFuUmVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXB1dGUgYSBzaW5nbGUgcmVsYXRlZCB7QGxpbmsgTWV0YUJlYW59LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICogQHBhcmFtIGJlYW5SZWYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVsYXRlZE1ldGFCZWFuKE1ldGFQcm9wZXJ0eSBwcm9wLCBTdHJpbmcgYmVhblJlZikgewotICAgICAgICBDbGFzczw/PiBiZWFuVHlwZSA9IHByb3AuZ2V0RmVhdHVyZShSRUZfQkVBTl9UWVBFKTsKLSAgICAgICAgaWYgKGJlYW5UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3Auc2V0TWV0YUJlYW4oZmluZEZvckNsYXNzKGJlYW5UeXBlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcC5nZXRGZWF0dXJlKFJFRl9DQVNDQURFKSAhPSBudWxsKSB7IC8vIGR5bmFtaWMgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uOgotICAgICAgICAgICAgcHJvcC5zZXRNZXRhQmVhbihuZXcgRHluYW1pY01ldGFCZWFuKHRoaXMpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuTWFuYWdlckZhY3RvcnkuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9NZXRhQmVhbk1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2Q4ZGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL01ldGFCZWFuTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogQVBJIGNsYXNzIHRvIGhvbGQgYSBzaW5nbGV0b24gb2YgYSB7QGxpbmsgTWV0YUJlYW5NYW5hZ2VyfQotICogdGhhdCBpbXBsZW1lbnRzIHRoZSBmaW5kZXIgYW5kIHJlZ2lzdHJ5IGludGVyZmFjZXMgZm9yIE1ldGFCZWFuczxici8+Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW4KLSAqIEBzZWUgTWV0YUJlYW5NYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhQmVhbk1hbmFnZXJGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRhQmVhbk1hbmFnZXIgbWFuYWdlciA9IG5ldyBNZXRhQmVhbk1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIGdsb2JhbCBtZXRhIGJlYW4gZmluZGVyLgotICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0YUJlYW5GaW5kZXIgZ2V0RmluZGVyKCkgewotICAgICAgICByZXR1cm4gbWFuYWdlcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHNldCBnbG9iYWwgbWV0YSBiZWFuIG1hbmFnZXIsIHRoYXQgaXMgcmVzcG9uc2libGUKLSAgICAgKiBmb3IgZmluZGluZywgY2FjaGluZywgeG1sIHJlZ2lzdHJ5IGFuZCBlbnJpY2htZW50IGFsZ29yaXRobS4KLSAgICAgKiBAcGFyYW0gZmluZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1hbmFnZXIoTWV0YUJlYW5NYW5hZ2VyIGZpbmRlcikgewotICAgICAgICBtYW5hZ2VyID0gZmluZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9WYWxpZGF0ZS5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL1ZhbGlkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTEwNmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL1ZhbGlkYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLio7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBBbm5vdGF0ZSBhbiBlbGVtZW50IChwYXJhbWV0ZXIpIHRvIGJlIHZhbGlkYXRlZC4KLSAqIDxicj4KLSAqLwotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQ09OU1RSVUNUT1IsIFBBUkFNRVRFUn0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBWYWxpZGF0ZSB7Ci0gICAgLyoqCi0gICAgICogKG9wdGlvbmFsKSB0aGUgTWV0YUJlYW4uaWQgdG8gdXNlCi0gICAgICovCi0gICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIHRvIFN1cHBvcnQgZ3JvdXBzIG9uIEBWYWxpZChhdGUpIGluIG1ldGhvZC9yZXR1cm4gdmFsaWRhdGlvbgotICAgICAqLwotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9WYWxpZGF0aW9uUmVzdWx0cy5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL1ZhbGlkYXRpb25SZXN1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDc5ZjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL1ZhbGlkYXRpb25SZXN1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25MaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRzIGEgY29udGFpbnMgdG8gaG9sZCBhbmQgdHJhbnNwb3J0IHZhbGlkYXRpb24gcmVzdWx0czxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzdWx0cyBpbXBsZW1lbnRzIFZhbGlkYXRpb25MaXN0ZW5lciwgU2VyaWFsaXphYmxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxFcnJvcj4+IGVycm9yc0J5UmVhc29uOwotICAgIHByaXZhdGUgTWFwPE9iamVjdCwgTWFwPFN0cmluZywgTGlzdDxFcnJvcj4+PiBlcnJvcnNCeU93bmVyOwotCi0KLSAgICAvKioKLSAgICAgKiBBUEkgdG8gYWRkIGFuIGVycm9yIHRvIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgIC0gRmVhdHVyZXMgZnJvbSB7QGxpbmsgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzLlByb3BlcnR5fQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvciBjdXN0b20gcmVhc29uIG9mIHZhbGlkYXRpb24gZXJyb3IKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgLSBjb250ZXh0IGluZm9ybWF0aW9uIChiZWFuLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCAuLi4pCi0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIGFkZEVycm9yKFN0cmluZyByZWFzb24sIFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQpIHsKLSAgICAgICAgRXJyb3IgZXJyb3IgPSBjcmVhdGVFcnJvcihyZWFzb24sIGNvbnRleHQuZ2V0QmVhbigpLCBjb250ZXh0LmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgYWRkRXJyb3IoZXJyb3IsIGNvbnRleHQpOwotICAgIH0KLQotCi0gICAgIC8qKgotICAgICAqIEFQSSB0byBhZGQgYW4gZXJyb3IgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvciAgICAgICAtIGhvbGRpbmcgdGhlIGRlc2NyaXB0aW9uIG9mIHJlYXNvbiBhbmQgb2JqZWN0IHRvIGRlc2NyaWJlCi0gICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbGlkYXRpb24gZXJyb3IKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgLSBudWxsIG9yIHRoZSBjb250ZXh0IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyA8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCBhZGRFcnJvcihFcnJvciBlcnJvciwgVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBpZiAoZXJyb3JzQnlSZWFzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFRvUmVhc29uQnVja2V0KGVycm9yKTsKLSAgICAgICAgYWRkVG9Pd25lckJ1Y2tldChlcnJvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2xkIEFQSSB0byBhZGQgYW4gZXJyb3IgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0cyB3aGVuIG5vIGNvbnRleHQgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAtIEZlYXR1cmVzIGZyb20ge0BsaW5rIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eX0gb3IgY3VzdG9tIHZhbGlkYXRpb24gcmVhc29uCi0gICAgICogQHBhcmFtIGJlYW4gICAgICAgICAtIChvcHRpb25hbCkgb3duZXIgYmVhbiBvciBudWxsCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIChvcHRpb25hbCkgcHJvcGVydHlOYW1lIHdoZXJlIHZhbGlhdGlvbiBlcnJvciBvY2N1cnJlZCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIHJlYXNvbiwgT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgYWRkRXJyb3IoY3JlYXRlRXJyb3IocmVhc29uLCBiZWFuLCBwcm9wZXJ0eU5hbWUpLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXJyb3Igb2JqZWN0LgotICAgICAqIEBwYXJhbSByZWFzb24KLSAgICAgKiBAcGFyYW0gb3duZXIKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogQHJldHVybiBuZXcge0BsaW5rIEVycm9yfQotICAgICAqLwotICAgIHByb3RlY3RlZCBFcnJvciBjcmVhdGVFcnJvcihTdHJpbmcgcmVhc29uLCBPYmplY3Qgb3duZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihyZWFzb24sIG93bmVyLCBwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGluaXRpYWxpemUgdGhlIGVycm9yLWJ1Y2tldHMgbm93IHdoZW4gbmVlZGVkIGFuZAotICAgICAqIG5vdCBvbiBpbnN0YW5jZSBjcmVhdGlvbiB0byBzYXZlIG1lbW9yeSBnYXJiYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIGVycm9yc0J5UmVhc29uID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMaXN0PEVycm9yPj4oKTsKLSAgICAgICAgZXJyb3JzQnlPd25lciA9IG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCwgTWFwPFN0cmluZywgTGlzdDxFcnJvcj4+PigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBFcnJvciB0byB0aGUgc2V0IG9mIEVycm9ycyBzaGFyZWQgYnkgYSBwYXJ0aWN1bGFyICJyZWFzb24uIgotICAgICAqIEBwYXJhbSBlcnJvcgotICAgICAqIEBzZWUge0BsaW5rIEVycm9yI2dldFJlYXNvbigpfQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvUmVhc29uQnVja2V0KEVycm9yIGVycm9yKSB7Ci0gICAgICAgIGlmIChlcnJvci5nZXRSZWFzb24oKSA9PSBudWxsKSByZXR1cm47Ci0KLSAgICAgICAgTGlzdDxFcnJvcj4gZXJyb3JzID0gZXJyb3JzQnlSZWFzb24uZ2V0KGVycm9yLmdldFJlYXNvbigpKTsKLSAgICAgICAgaWYgKGVycm9ycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PEVycm9yPigpOwotICAgICAgICAgICAgZXJyb3JzQnlSZWFzb24ucHV0KGVycm9yLmdldFJlYXNvbigpLCBlcnJvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGVycm9ycy5hZGQoZXJyb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBFcnJvciB0byB0aGUgcHJvcGVydHkta2V5ZWQgbWFwIG9mIEVycm9ycyBtYWludGFpbmVkIGZvciB0aGlzIEVycm9yJ3Mgb3duZXIuCi0gICAgICogQHBhcmFtIGVycm9yCi0gICAgICogQHNlZSB7QGxpbmsgRXJyb3IjZ2V0T3duZXIoKX0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb093bmVyQnVja2V0KEVycm9yIGVycm9yKSB7Ci0gICAgICAgIGlmIChlcnJvci5nZXRPd25lcigpID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PEVycm9yPj4gZXJyb3JzID0gZXJyb3JzQnlPd25lci5nZXQoZXJyb3IuZ2V0T3duZXIoKSk7Ci0gICAgICAgIGlmIChlcnJvcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEVycm9yPj4oKTsKLSAgICAgICAgICAgIGVycm9yc0J5T3duZXIucHV0KGVycm9yLmdldE93bmVyKCksIGVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxFcnJvcj4gbGlzdCA9IGVycm9ycy5nZXQoZXJyb3IuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxFcnJvcj4oKTsKLSAgICAgICAgICAgIGVycm9ycy5wdXQoZXJyb3IuZ2V0UHJvcGVydHlOYW1lKCksIGxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKGVycm9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1hcCBvZiBFcnJvcnMgYnkgcmVhc29uOyAKLSAgICAgKiBrZXkgPSByZWFzb24sIHZhbHVlID0gbGlzdCBvZiBlcnJvcnMgZm9yIHRoaXMgcmVhc29uCi0gICAgICogQHJldHVybiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxFcnJvcj4+IGdldEVycm9yc0J5UmVhc29uKCkgewotICAgICAgICBpZiAoZXJyb3JzQnlSZWFzb24gPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICAgIHJldHVybiBlcnJvcnNCeVJlYXNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1hcCBvZiBFcnJvcnMgYnkgb3duZXI7Ci0gICAgICoga2V5ID0gb3duZXIsIHZhbHVlID0gbWFwIHdpdGg6PGJyPgotICAgICAqICZuYnNwOyZuYnNwOyBrZXkgPSBwcm9wZXJ0eU5hbWUsIHZhbHVlID0gbGlzdCBvZiBlcnJvcnMgZm9yIHRoaXMgb3duZXIucHJvcGVydHlOYW1lCi0gICAgICogQHJldHVybiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPE9iamVjdCwgTWFwPFN0cmluZywgTGlzdDxFcnJvcj4+PiBnZXRFcnJvcnNCeU93bmVyKCkgewotICAgICAgICBpZiAoZXJyb3JzQnlPd25lciA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgcmV0dXJuIGVycm9yc0J5T3duZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGVzZSByZXN1bHRzIGFyZSBlbXB0eS9lcnJvci1mcmVlLgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlIGFyZSBOTyBlcnJvcnMgaW4gdGhpcyB2YWxpZGF0aW9uIHJlc3VsdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGlmIChlcnJvcnNCeVJlYXNvbiA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgIChlcnJvcnNCeVJlYXNvbi5pc0VtcHR5KCkgJiYgZXJyb3JzQnlPd25lci5pc0VtcHR5KCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChMaXN0PEVycm9yPiBsaXN0IDogZXJyb3JzQnlSZWFzb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE1hcDxTdHJpbmcsIExpc3Q8RXJyb3I+PiBtYXAgOiBlcnJvcnNCeU93bmVyLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8RXJyb3I+IGxpc3QgOiBtYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGVyZSBpcyBhbiBFcnJvciBrZXllZCB0byBhIHNwZWNpZmllZCByZWFzb24gZGVzY3JpcHRpb24uCi0gICAgICogQHBhcmFtIHJlYXNvbgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBzZWUge0BsaW5rIEVycm9yI2dldFJlYXNvbigpfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yRm9yUmVhc29uKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgaWYgKGVycm9yc0J5UmVhc29uID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgTGlzdDxFcnJvcj4gZXJyb3JzID0gZXJyb3JzQnlSZWFzb24uZ2V0KHJlYXNvbik7Ci0gICAgICAgIHJldHVybiBlcnJvcnMgIT0gbnVsbCAmJiAhZXJyb3JzLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIDxjb2RlPmJlYW48L2NvZGU+IGhhcyBhbnkgZXJyb3JzIGtleWVkIHRvIHByb3BlcnR5IDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4uCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gbWF5IGJlIG51bGw6IGFueSBwcm9wZXJ0eSBpcyBjaGVja2VkCi0gICAgICogICAgICAgICAgICAgICAgICAgICBPUiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoZXJyb3JzQnlPd25lciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8RXJyb3I+PiBlcnJvcnMgPSBlcnJvcnNCeU93bmVyLmdldChiZWFuKTsKLSAgICAgICAgaWYgKGVycm9ycyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxFcnJvcj4gbGlzdCA9IGVycm9ycy5nZXQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChMaXN0PEVycm9yPiBsaXN0IDogZXJyb3JzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFsaXN0LmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWYWxpZGF0aW9uUmVzdWx0c3siICsgZXJyb3JzQnlPd25lciArICJ9IjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvRHluYVR5cGUuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9EeW5hVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg5ODYyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9EeW5hVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogaW1wbGVtZW50YXRpb24gb2YgYSBkeW5hbWljIHR5cGUuIGNhbiBiZSB1c2VkIGluc2lkZSBhCi0gKiBNZXRhUHJvcGVydHkgZm9yIGluc3RhbmNlLWJhc2VkIHR5cGVzIDxici8+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRHluYVR5cGUgZXh0ZW5kcyBUeXBlIHsKLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoZSB0eXBlIGluZGlyZWN0aW9uLgotICAgICAqIEByZXR1cm4gVHlwZQotICAgICAqLwotICAgIFR5cGUgZ2V0UmF3VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0R5bmFUeXBlRW51bS5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0R5bmFUeXBlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTIwODA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9EeW5hVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogKCJhcnRpZmljaWFsIiBlbnVtIHdpdGggY3VzdG9tIHZhbHVlcykuPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIER5bmFUeXBlRW51bSBpbXBsZW1lbnRzIER5bmFUeXBlIHsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGVudW1DbGFzczsKLSAgICBwcml2YXRlIFZhbHVlW10gZW51bUNvbnN0YW50czsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEeW5hVHlwZUVudW0gaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGVudW1DbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBEeW5hVHlwZUVudW0oQ2xhc3M8Pz4gZW51bUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuZW51bUNsYXNzID0gZW51bUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEeW5hVHlwZUVudW0gaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGVudW1DbGFzcwotICAgICAqIEBwYXJhbSBuYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBEeW5hVHlwZUVudW0oQ2xhc3M8Pz4gZW51bUNsYXNzLCBTdHJpbmcuLi4gbmFtZXMpIHsKLSAgICAgICAgdGhpcyhlbnVtQ2xhc3MpOwotICAgICAgICBzZXRFbnVtTmFtZXMobmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW51bWVyYXRpb24gdmFsdWUgbmFtZXMuCi0gICAgICogQHBhcmFtIG5hbWVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW51bU5hbWVzKFN0cmluZ1tdIG5hbWVzKSB7Ci0gICAgICAgIGVudW1Db25zdGFudHMgPSBuZXcgVmFsdWVbbmFtZXMubGVuZ3RoXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBlYWNoIDogbmFtZXMpIHsKLSAgICAgICAgICAgIGVudW1Db25zdGFudHNbaSsrXSA9IG5ldyBWYWx1ZShlYWNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZW51bSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudW1DbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRSYXdUeXBlKCkgewotICAgICAgICByZXR1cm4gZW51bUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIHJlZmVycmVkIGNsYXNzIGlzLCBpbiBmYWN0LCBhbiBlbnVtIGNsYXNzLgotICAgICAqIHVzZWQgYnkgZnJlZW1hcmtlci10ZW1wbGF0ZSAiYmVhbi1pbmZvcy1qc29uLmZ0bCIKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VudW0oKSB7Ci0gICAgICAgIHJldHVybiBlbnVtQ2xhc3MuaXNFbnVtKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBlbXVsYXRlZCBjb25zdGFudHMuCi0gICAgICogdXNlZCBieSBmcmVlbWFya2VyLXRlbXBsYXRlICJiZWFuLWluZm9zLWpzb24uZnRsIgotICAgICAqIEByZXR1cm4gVmFsdWVbXQotICAgICAqLwotICAgIHB1YmxpYyBWYWx1ZVtdIGdldEVudW1Db25zdGFudHMoKSB7Ci0gICAgICAgIHJldHVybiBBcnJheVV0aWxzLmNsb25lKGVudW1Db25zdGFudHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIHdyYXBwZWQgY2xhc3MgaXMgYXNzaWduYWJsZSBmcm9tIDxjb2RlPmNsczwvY29kZT4uCi0gICAgICogQHBhcmFtIGNscwotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oQ2xhc3M8Pz4gY2xzKSB7Ci0gICAgICAgIHJldHVybiBlbnVtQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgYSBzaW5nbGUgImVudW0iIGluc3RhbmNlICg9IHRoZSB2YWx1ZSkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWx1ZSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYSBuZXcgVmFsdWUgaW5zdGFuY2UuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBWYWx1ZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB1c2VkIGJ5IGZyZWVtYXJrZXItdGVtcGxhdGUgImJlYW4taW5mb3MtanNvbi5mdGwiCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb25zdGFudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9GZWF0dXJlcy5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0ZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjJlZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0ZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBrZXkgb2YgY29tbW9uIGZlYXR1cmUga2V5cyB1c2VkIGJ5IHN0YW5kYXJkIHZhbGlkYXRvcnMgZXRjLgotICogVGhpcyBET0VTIE5PVCBNRUFOIHRoYXQgdGhlIGxpc3Qgb2YgcHJvcGVydHktIG9yIGJlYW4tZmVhdHVyZXMgaXMgY2xvc2VkLiBZb3UgY2FuCi0gKiBwdXQgYW55dGhpbmcgaW50byB0aGUgbWV0YWJlYW4gYXMgYSBmZWF0dXJlIGFuZCB1c2UgaXQgaW4geW91ciBjdXN0b20gdmFsaWRhdG9ycwotICogYW5kIG90aGVyIGNsYXNzZXMgdGhhdCBhY2Nlc3MgeW91ciBtZXRhYmVhbnMuPGJyLz4KLSAqCi0gKiBAc2VlIEZlYXR1cmVzQ2FwYWJsZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVzIHsKLSAgICAvKiogRmVhdHVyZXMgb2Yge0BsaW5rIE1ldGFCZWFufSAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQmVhbiB7Ci0gICAgICAgIC8qKiBJTkZPOiBTdHJpbmcsIG5hbWUgb2YgdGhlIFByb3BlcnR5LCB0aGF0IGlzIHRoZSBQcmltYXJ5IEtleSAqLwotICAgICAgICBTdHJpbmcgTUFJTl9LRVkgPSAibWFpbktleSI7Ci0gICAgICAgIC8qKiBJTkZPOiBjYXRlZ29yeS9kb21haW4gdG8gd2hpY2ggdGhlIG1ldGFCZWFuIGJlbG9uZ3MgdG8gKi8KLSAgICAgICAgU3RyaW5nIERPTUFJTiA9ICJkb21haW4iOwotCi0gICAgICAgIC8vICAgICAgICBTdHJpbmcgRElTUExBWV9OQU1FID0gImRpc3BsYXlOYW1lIjsKLSAgICAgICAgU3RyaW5nIFVOSVFVRV9LRVkgPSAidW5pcXVlS2V5IjsKLSAgICB9Ci0KLSAgICAvKiogRmVhdHVyZXMgb2Yge0BsaW5rIE1ldGFQcm9wZXJ0eX0gKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IHsKLSAgICAgICAgLyoqIElORk86IHBvc3NpYmxlIEVudW0gdmFsdWVzICovCi0gICAgICAgIFN0cmluZyBFTlVNID0gImVudW0iOwotICAgICAgICAvKiogSU5GTzogQm9vbGVhbiwgVFJVRSBpZiBQcm9wZXJ0eSBpcyBhIFVuaXF1ZSBLZXkgKi8KLSAgICAgICAgU3RyaW5nIFVOSVFVRV9LRVkgPSAidW5pcXVlS2V5IjsKLSAgICAgICAgLyoqIFZBTElEQVRJT046IEJvb2xlYW4sIG1hbmRhdG9yeSBmaWVsZD8gKi8KLSAgICAgICAgU3RyaW5nIE1BTkRBVE9SWSA9ICJtYW5kYXRvcnkiOwotICAgICAgICAvKiogVkFMSURBVElPTjogSW50ZWdlciwgbWF4LiBudW1iZXIgb2YgY2hhcnMvZGlnaXRzIC8gbWF4LiBjYXJkaW5hbGl0eSBvZiBhIHRvLW1hbnkgcmVsYXRpb25zaGlwICovCi0gICAgICAgIFN0cmluZyBNQVhfTEVOR1RIID0gIm1heExlbiI7Ci0gICAgICAgIC8qKiBWQUxJREFUSU9OOiBDb21wYXJhYmxlIChlLmcuIGEgc3ViY2xhc3Mgb2YgTnVtYmVyKSwgbWF4IHZhbHVlICovCi0gICAgICAgIFN0cmluZyBNQVhfVkFMVUUgPSAibWF4VmFsdWUiOwotICAgICAgICAvKiogVkFMSURBVElPTjogSW50ZWdlciwgbWluLiBudW1iZXIgb2YgY2hhcnMvZGlnaXRzIC8gbWluLiBjYXJkaW5hbGl0eSBvZiBhIHRvLW1hbnkgcmVsYXRpb25zaGlwICovCi0gICAgICAgIFN0cmluZyBNSU5fTEVOR1RIID0gIm1pbkxlbiI7Ci0gICAgICAgIC8qKiBWQUxJREFUSU9OOiBDb21wYXJhYmxlIChlLmcuIGEgc3ViY2xhc3Mgb2YgTnVtYmVyKSwgbWluIHZhbHVlICovCi0gICAgICAgIFN0cmluZyBNSU5fVkFMVUUgPSAibWluVmFsdWUiOwotICAgICAgICAvKiogSU5GTzogU3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICBTdHJpbmcgREVGQVVMVF9WQUxVRSA9ICJkZWZWYWx1ZSI7Ci0gICAgICAgIC8qKiBTRUNVUklUWSwgSU5GTzogQm9vbGVhbiwgaXMgdmFsdWUgb3IgcmVsYXRpb25zaGlwIHVubW9kaWZpYWJsZSAqLwotICAgICAgICBTdHJpbmcgUkVBRE9OTFkgPSAicmVhZG9ubHkiOwotICAgICAgICAvKioKLSAgICAgICAgICogU0VDVVJJVFksIElORk86IEJvb2xlYW4sIEZpZWxkIGFjY2Vzc2libGU/Ci0gICAgICAgICAqIElmIGZhbHNlLCB0aGUgZmllbGQgbXVzdCBub3QgYmUgZGlzcGxheWVkLCBxdWVyaWVkLCBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIERFTklFRCA9ICJkZW5pZWQiOwotICAgICAgICAvKiogVkFMSURBVElPTjogU3RyaW5nLCByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiBpbnB1dCBkYXRhICovCi0gICAgICAgIFN0cmluZyBSRUdfRVhQID0gInJlZ0V4cCI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBWQUxJREFUSU9OOiBTdHJpbmcsIENvbnN0cmFpbnQgZm9yIHRpbWUtaW5mb3JtYXRpb24gb2YgYSBEYXRlLWZpZWxkOgotICAgICAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5idmFsLnhtbC5YTUxNZXRhVmFsdWUjVElNRUxBR19QYXN0fQotICAgICAgICAgKiBvcgotICAgICAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5idmFsLnhtbC5YTUxNZXRhVmFsdWUjVElNRUxBR19GdXR1cmV9Ci0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgVElNRV9MQUcgPSAidGltZUxhZyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElORk86IEJvb2xlYW4sIEZpZWxkIHZpc2libGU/Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IjaXNIaWRkZW4oKQotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIEhJRERFTiA9ICJoaWRkZW4iOwotICAgICAgICAvKioKLSAgICAgICAgICogSU5GTzogQm9vbGVhbgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yI2lzUHJlZmVycmVkKCkKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBQUkVGRVJSRUQgPSAicHJlZmVycmVkIjsKLQotICAgICAgICAvKiogSU5GTzogcmVsYXRpb25zaGlwJ3MgdGFyZ2V0IG1ldGFCZWFuLmlkICogKi8KLSAgICAgICAgU3RyaW5nIFJFRl9CRUFOX0lEID0gInJlZkJlYW5JZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElORk86IENsYXNzPGJyPgotICAgICAgICAgKiBSZWxhdGlvbnNoaXAncyB0YXJnZXQgbWV0YUJlYW4uYmVhbkNsYXNzLgotICAgICAgICAgKiBJbiBjYXNlIG9mIHRvLW1hbnkgcmVsYXRpb25zaGlwcywgdGhpcyBmZWF0dXJlCi0gICAgICAgICAqIGhvbGQgdGhlIEJlYW4tdHlwZSBub3QgdGhlIENvbGxlY3Rpb24tdHlwZS4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBSRUZfQkVBTl9UWVBFID0gInJlZkJlYW5UeXBlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSU5GTzogQWNjZXNzU3RyYXRlZ3lbXTxicj4KLSAgICAgICAgICogYW4gYXJyYXkgb2YgYWNjZXNzU3RyYXRlZ2llcwotICAgICAgICAgKiBob3cgdmFsaWRhdGlvbiBzaG91bGQgY2FzY2FkZSBpbnRvIHJlbGF0aW9uc2hpcCB0YXJnZXQgYmVhbnM8YnI+Ci0gICAgICAgICAqIG51bGwgd2hlbiB2YWxpZGF0aW9uIHNob3VsZCBOT1QgY2FzY2FkZSBpbnRvIHJlbGF0aW9uc2hpcCB0YXJnZXQKLSAgICAgICAgICogYmVhbnM8YnI+Ci0gICAgICAgICAqIDxwLz4KLSAgICAgICAgICogRGVmYXVsdDoge1Byb3BlcnR5QWNjZXNzKG1ldGFQcm9wZXJ0eS5uYW1lKX0sCi0gICAgICAgICAqIHdoZW4gTWV0YVByb3BlcnR5Lm1ldGFCZWFuIGlzICE9IG51bGwKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBSRUZfQ0FTQ0FERSA9ICJyZWZDYXNjYWRlIjsKLQotICAgICAgICAvKiogSU5GTzogYW4gYXJyYXkgd2l0aCB0aGUgc3RyaW5nIG5hbWVzIG9mIGN1c3RvbSBqYXZhIHNjcmlwdCB2YWxpZGF0aW9uIGZ1bmN0aW9ucyAqLwotICAgICAgICBARGVwcmVjYXRlZCAvLyBUT0RPIFJTdCAtIEkgc3VnZ2VzdCB0byByZW1vdmUgdGhpcyBhbmQgYWxsIHJlbGF0ZWQgY29kZQotICAgICAgICBTdHJpbmcgSkFWQVNDUklQVF9WQUxJREFUSU9OX0ZVTkNUSU9OUyA9ICJqc0Z1bmN0aW9ucyI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0ZlYXR1cmVzQ2FwYWJsZS5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0ZlYXR1cmVzQ2FwYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDk1ZGMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9GZWF0dXJlc0NhcGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBhYnN0cmFjdCBzdXBlcmNsYXNzIG9mIG1ldGEgb2JqZWN0cyB0aGF0IHN1cHBvcnQgYSBtYXAgb2YKLSAqIGZlYXR1cmVzLjxici8+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlc0NhcGFibGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MDQ1MTEwMjQyOTA0ODE0MjE4TDsKLQotICAgIHByaXZhdGUgQ29uY3VycmVudE1hcDxTdHJpbmcsIE9iamVjdD4gZmVhdHVyZXMgPSBjcmVhdGVGZWF0dXJlc01hcCgpOwotCi0gICAgLyoqIGtleSA9IHZhbGlkYXRpb24gaWQsIHZhbHVlID0gdGhlIHZhbGlkYXRpb24gKi8KLSAgICBwcml2YXRlIFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucyA9IG5ldyBWYWxpZGF0aW9uWzBdOwotCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGxvY2tpbmc7Ci0gICAgcHJpdmF0ZSBSZWVudHJhbnRMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBGZWF0dXJlc0NhcGFibGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEZlYXR1cmVzQ2FwYWJsZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIChsaXZlKSBtYXAgb2YgZmVhdHVyZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBNYXA8U3RyaW5nLCBPYmplY3Q+Ci0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0RmVhdHVyZXMoKSB7Ci0gICAgICAgIHJldHVybiBmZWF0dXJlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0byBvcHRpbWl6ZSByZWFkIG9wZXJhdGlvbnMgYnkgYWNjZXNzaW5nIHRoZSBmZWF0dXJlcyBtYXAgaW4KLSAgICAgKiBhbiB1bnN5bmNocm9uaXplZCBtYW5uZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvcHRpbWl6ZVJlYWQoYm9vbGVhbiBmYXN0KSB7Ci0gICAgICAgIGxvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5sb2NraW5nID0gIWZhc3Q7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzcGVjaWZpZWQgZmVhdHVyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIGtleQotICAgICAqIEByZXR1cm4gVAotICAgICAqLwotICAgIHB1YmxpYyA8VD4gVCBnZXRGZWF0dXJlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldEZlYXR1cmUoa2V5LCAoVCkgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzcGVjaWZpZWQgZmVhdHVyZSwgcmV0dXJuaW5nIDxjb2RlPmRlZmF1bHRWYWx1ZTwvY29kZT4gaWYKLSAgICAgKiB1bmRlY2xhcmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotICAgICAqIEByZXR1cm4gVAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8VD4gVCBnZXRGZWF0dXJlKFN0cmluZyBrZXksIFQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVsZWFzZSA9IGFjcXVpcmVMb2NrSWZOZWVkZWQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBmZWF0dXJlcy5jb250YWluc0tleShrZXkpID8gKFQpIGZlYXR1cmVzLmdldChrZXkpIDogZGVmYXVsdFZhbHVlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKLSAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhIHBhcnRpY3VsYXIgZmVhdHVyZSB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyA8VD4gdm9pZCBwdXRGZWF0dXJlKFN0cmluZyBrZXksIFQgdmFsdWUpIHsKLSAgICAgICAgYm9vbGVhbiByZWxlYXNlID0gYWNxdWlyZUxvY2tJZk5lZWRlZCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmVhdHVyZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKLSAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZGVlcCBjb3B5IChjb3B5IHJlY2VpdmVyIGFuZCBjb3B5IHByb3BlcnRpZXMpLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcmV0dXJuIG5ldyBUIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRmVhdHVyZXNDYXBhYmxlPiBUIGNvcHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIGZpbmFsIFQgc2VsZiA9IChUKSBjbG9uZSgpOwotICAgICAgICAgICAgY29weUludG8oc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZjsKLSAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGNsb25lKCkgIiArIHRoaXMsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGlzIHtAbGluayBGZWF0dXJlc0NhcGFibGV9IGludG8gYW5vdGhlciB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfQotICAgICAqIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgRmVhdHVyZXNDYXBhYmxlPiB2b2lkIGNvcHlJbnRvKFQgdGFyZ2V0KSB7Ci0gICAgICAgIHRhcmdldC5mZWF0dXJlcyA9IHRhcmdldC5jcmVhdGVGZWF0dXJlc01hcCgpOwotICAgICAgICB0YXJnZXQuZmVhdHVyZXMucHV0QWxsKGZlYXR1cmVzKTsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhcmdldC52YWxpZGF0aW9ucyA9IHZhbGlkYXRpb25zLmNsb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW55IHZhbGlkYXRpb25zIHNldCBmb3IgdGhpcyB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZhbGlkYXRpb24gYXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbltdIGdldFZhbGlkYXRpb25zKCkgewotICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5jbG9uZSh2YWxpZGF0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWxpZGF0aW9ucyBmb3IgdGhpcyB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9ucyhWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9ucyA9IEFycmF5VXRpbHMuY2xvbmUodmFsaWRhdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHZhbGlkYXRpb24gdG8gdGhpcyB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbihWYWxpZGF0aW9uIHZhbGlkYXRpb24pIHsKLSAgICAgICAgdmFsaWRhdGlvbnMgPSBBcnJheVV0aWxzLmFkZCh2YWxpZGF0aW9ucywgdmFsaWRhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBlcXVpdmFsZW50IHZhbGlkYXRpb24gYW1vbmcgdGhvc2UgY29uZmlndXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYVZhbGlkYXRpb24KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZGF0aW9uKFZhbGlkYXRpb24gYVZhbGlkYXRpb24pIHsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoVmFsaWRhdGlvbiB2YWxpZGF0aW9uIDogdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVxdWFscyhhVmFsaWRhdGlvbikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZlYXR1cmVzIG1hcCBmb3IgdGhpcyB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfSBvYmplY3QuCi0gICAgICogQHJldHVybiBDb25jdXJyZW50TWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBPYmplY3Q+IGNyZWF0ZUZlYXR1cmVzTWFwKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhY3F1aXJlTG9ja0lmTmVlZGVkKCkgewotICAgICAgICBpZiAobG9ja2luZykgewotICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBkb3VibGUgcmVhZAotICAgICAgICAgICAgaWYgKGxvY2tpbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL01ldGFCZWFuLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvTWV0YUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjZTU5OC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvTWV0YUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IHRoZSBtZXRhIGRlc2NyaXB0aW9uIG9mIGEgYmVhbiBvciBjbGFzcy4gdGhlIGNsYXNzL2JlYW4gaXRzZWxmIGNhbiBoYXZlIGEgbWFwIG9mIGZlYXR1cmVzIGFuZCBhbiBhcnJheQotICogb2YgbWV0YXByb3BlcnRpZXMuPGJyLz4KLSAqIAotICogQHNlZSBNZXRhUHJvcGVydHkKLSAqLwotcHVibGljIGNsYXNzIE1ldGFCZWFuIGV4dGVuZHMgRmVhdHVyZXNDYXBhYmxlIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBGZWF0dXJlcy5CZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbXBhcmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBzb3J0ZWQgcHJvcGVydGllcyBhcnJheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eU5hbWVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxPYmplY3Q+IHsKLSAgICAgICAgLyoqIFN0YXRpYyBpbnN0YW5jZSAqLwotICAgICAgICBzdGF0aWMgZmluYWwgUHJvcGVydHlOYW1lQ29tcGFyYXRvciBJTlNUQU5DRSA9IG5ldyBQcm9wZXJ0eU5hbWVDb21wYXJhdG9yKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWUobzEpLmNvbXBhcmVUbyhnZXROYW1lKG8yKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXROYW1lKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbyBpbnN0YW5jZW9mIE1ldGFQcm9wZXJ0eSA/ICgoTWV0YVByb3BlcnR5KSBvKS5nZXROYW1lKCkgOiBTdHJpbmcudmFsdWVPZihvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBDbGFzczw/PiBiZWFuQ2xhc3M7Ci0gICAgcHJpdmF0ZSBNZXRhUHJvcGVydHlbXSBwcm9wZXJ0aWVzID0gbmV3IE1ldGFQcm9wZXJ0eVswXTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBiZWFuQ2xhc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiBDbGFzczw/PgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRCZWFuQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiZWFuQ2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqICAgICAgICAgICAgdGhlIENsYXNzPD8+IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5DbGFzcyhDbGFzczw/PiBiZWFuQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gTWV0YVByb3BlcnR5W10KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YVByb3BlcnR5W10gZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuY2xvbmUocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgTWV0YVByb3BlcnR5W10gdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNZXRhUHJvcGVydHlbXSBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IEFycmF5VXRpbHMuY2xvbmUocHJvcGVydGllcyk7Ci0gICAgICAgIEFycmF5cy5zb3J0KHRoaXMucHJvcGVydGllcywgUHJvcGVydHlOYW1lQ29tcGFyYXRvci5JTlNUQU5DRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzcGVjaWZpZWQge0BsaW5rIE1ldGFQcm9wZXJ0eX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIE1ldGFQcm9wZXJ0eSBmb3VuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBNZXRhUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZmluYWwgTWV0YVByb3BlcnR5W10gcHJvcHMgPSBwcm9wZXJ0aWVzOwotICAgICAgICBpbnQgcG9zID0gQXJyYXlzLmJpbmFyeVNlYXJjaChwcm9wcywgbmFtZSwgUHJvcGVydHlOYW1lQ29tcGFyYXRvci5JTlNUQU5DRSk7Ci0gICAgICAgIHJldHVybiBwb3MgPCAwID8gbnVsbCA6IHByb3BzW3Bvc107Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciBhbnkga25vd24gcHJvcGVydHkgaXMgYSByZWxhdGlvbnNoaXAuCi0gICAgICogCi0gICAgICogQHNlZSBNZXRhUHJvcGVydHkjaXNSZWxhdGlvbnNoaXAoKQotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvcGVydGllcyBpcyBhIHJlbGF0aW9uc2hpcAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIGZvciAoTWV0YVByb3BlcnR5IHAgOiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBpZiAocC5pc1JlbGF0aW9uc2hpcCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBrbm93biBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYmlkaXJlY3Rpb25hbCAtIHNldCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBNZXRhUHJvcGVydHkgYW5kIGl0cyBwYXJlbnRNZXRhQmVhbgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHByb3BlcnR5Ci0gICAgICogICAgICAgICAgICBpZiA8Y29kZT5udWxsPC9jb2RlPiwgcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE1ldGFQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHkuc2V0UGFyZW50TWV0YUJlYW4odGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IGtleSA9IHByb3BlcnR5ID09IG51bGwgPyBuYW1lIDogcHJvcGVydHk7Ci0gICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IGZvciBjb25zaXN0ZW5jeQotICAgICAgICBNZXRhUHJvcGVydHlbXSBwcm9wcyA9IHByb3BlcnRpZXM7Ci0gICAgICAgIGludCBwb3MgPSBBcnJheXMuYmluYXJ5U2VhcmNoKHByb3BzLCBrZXksIFByb3BlcnR5TmFtZUNvbXBhcmF0b3IuSU5TVEFOQ0UpOwotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBudWxsIHByb3BlcnR5IGZvciB1bmtub3duIG5hbWUgPT0gTk9PUAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzID0gQXJyYXlVdGlscy5hZGQocHJvcHMsIDAgLSBwb3MgLSAxLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BzID0gQXJyYXlVdGlscy5yZW1vdmUocHJvcHMsIHBvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3BzW3Bvc10gPSBwcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJNZXRhQmVhbnsiICsgImlkPSciICsgaWQgKyAnXCcnICsgIiwgbmFtZT0nIiArIG5hbWUgKyAnXCcnICsgIiwgYmVhbkNsYXNzPSIgKyBiZWFuQ2xhc3MgKyAnfSc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIEZlYXR1cmVzQ2FwYWJsZT4gdm9pZCBjb3B5SW50byhUIHRhcmdldCkgewotICAgICAgICBzdXBlci5jb3B5SW50byh0YXJnZXQpOwotICAgICAgICBmaW5hbCBNZXRhQmVhbiBjb3B5ID0gKE1ldGFCZWFuKSB0YXJnZXQ7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvcHkucHJvcGVydGllcyA9IHByb3BlcnRpZXMuY2xvbmUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3B5LnByb3BlcnRpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBjb3B5LnByb3BlcnRpZXNbaV0gPSBjb3B5LnByb3BlcnRpZXNbaV0uY29weSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyB7QGxpbmsgTWV0YUJlYW59IGlzIGNvbXBhdGlibGUgd2l0aCA8Y29kZT5iZWFuPC9jb2RlPiwgcmV0dXJuIDxjb2RlPnRoaXM8L2NvZGU+LCBlbHNlIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBDb21wYXRpYmlsaXR5IGlzIHNhdGlzZmllZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+PGNvZGU+YmVhbjwvY29kZT4gaXMgbnVsbDwvbGk+Ci0gICAgICogPGxpPjxjb2RlPmJlYW48L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIG91ciA8Y29kZT5iZWFuQ2xhc3M8L2NvZGU+PC9saT4KLSAgICAgKiA8bGk+PGNvZGU+YmVhbjwvY29kZT4gPGVtPmlzPC9lbT4gb3VyIDxjb2RlPmJlYW5DbGFzczwvY29kZT4gaXRzZWxmPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEByZXR1cm4gPGNvZGU+dGhpczwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW4gcmVzb2x2ZU1ldGFCZWFuKE9iamVjdCBiZWFuKSB7Ci0gICAgICAgIHJldHVybiBiZWFuID09IG51bGwgfHwgYmVhbiA9PSBiZWFuQ2xhc3MgfHwgYmVhbkNsYXNzLmlzSW5zdGFuY2UoYmVhbikgPyB0aGlzIDogbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9NZXRhUHJvcGVydHkuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9NZXRhUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZGYzOC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvTWV0YVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5yZWZsZWN0LlR5cGVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdGhlIG1ldGEgZGVzY3JpcHRpb24gb2YgYSBwcm9wZXJ0eSBvZiBhIGJlYW4uIEl0IHN1cHBvcnRzIGEgbWFwCi0gKiBvZiBmZWF0dXJlcyBhbmQgbXVsdGlwbGUgdmFsaWRhdGlvbnMuPGJyLz4KLSAqCi0gKiBAc2VlIFZhbGlkYXRpb24KLSAqIEBzZWUgTWV0YUJlYW4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFQcm9wZXJ0eSBleHRlbmRzIEZlYXR1cmVzQ2FwYWJsZQotICAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIEZlYXR1cmVzLlByb3BlcnR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIFR5cGUgdHlwZTsKLSAgICBwcml2YXRlIE1ldGFCZWFuIG1ldGFCZWFuOwotICAgIHByaXZhdGUgTWV0YUJlYW4gcGFyZW50TWV0YUJlYW47Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0YVByb3BlcnR5IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZXRhUHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXRhYmVhbiBvZiB0aGUgdGFyZ2V0IGJlYW4gKG1haW5seSBmb3IgcmVsYXRpb25zaGlwcykuCi0gICAgICogQHJldHVybiBNZXRhQmVhbiAobWF5IGJlIG51bGwpLgotICAgICAqLwotICAgIHB1YmxpYyBNZXRhQmVhbiBnZXRNZXRhQmVhbigpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgTWV0YUJlYW4gb2YgdGhpcyB7QGxpbmsgTWV0YVByb3BlcnR5fS4KLSAgICAgKiBAcGFyYW0gbWV0YUJlYW4gdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YUJlYW4oTWV0YUJlYW4gbWV0YUJlYW4pIHsKLSAgICAgICAgdGhpcy5tZXRhQmVhbiA9IG1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWV0YWJlYW4gdGhhdCBvd25zIHRoaXMgcHJvcGVydHkgKHNldCBieSBNZXRhQmVhbi5wdXRQcm9wZXJ0eSgpKQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW4gZ2V0UGFyZW50TWV0YUJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRNZXRhQmVhbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1ldGFiZWFuIHRoYXQgb3ducyB0aGlzIHByb3BlcnR5ICh1c3VhbGx5IGNhbGxlZCBieSBNZXRhQmVhbi5wdXRQcm9wZXJ0eSgpKQotICAgICAqIEBwYXJhbSBwYXJlbnRNZXRhQmVhbgotICAgICAqLwotICAgIHZvaWQgc2V0UGFyZW50TWV0YUJlYW4oTWV0YUJlYW4gcGFyZW50TWV0YUJlYW4pIHsKLSAgICAgICAgdGhpcy5wYXJlbnRNZXRhQmVhbiA9IHBhcmVudE1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBjb25zaWRlcmVkIGEgcmVsYXRpb25zaGlwLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaGFzIGEgTWV0YUJlYW4gb2YgaXRzIG93bgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwKCkgewotICAgICAgICByZXR1cm4gbWV0YUJlYW4gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgdG8gYSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIENsYXNzLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBjYW5ub3QgYmUgZGV0ZXJtaW5lZAotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlQ2xhc3MoKSB7Ci0gICAgICAgIFR5cGUgdGFyZ2V0VHlwZSA9IHR5cGUgaW5zdGFuY2VvZiBEeW5hVHlwZSA/ICgoRHluYVR5cGUpIHR5cGUpCi0gICAgICAgICAgICAgICAgLmdldFJhd1R5cGUoKSA6IHR5cGU7Ci0gICAgICAgIGlmICh0YXJnZXRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFR5cGUgYXNzaWduaW5nVHlwZSA9IGdldFBhcmVudE1ldGFCZWFuKCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IGdldFBhcmVudE1ldGFCZWFuKCkuZ2V0QmVhbkNsYXNzKCk7Ci0gICAgICAgIHJldHVybiBUeXBlVXRpbHMuZ2V0UmF3VHlwZSh0YXJnZXRUeXBlLCBhc3NpZ25pbmdUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgbWFuZGF0b3J5LgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPk1BTkRBVE9SWTwvY29kZT4gZmVhdHVyZSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICogQHNlZSB7QGxpbmsgRmVhdHVyZXMuUHJvcGVydHkjTUFOREFUT1JZfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWFuZGF0b3J5KCkgewotICAgICAgICByZXR1cm4gZ2V0RmVhdHVyZShNQU5EQVRPUlksIEJvb2xlYW4uRkFMU0UpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGlzIHByb3BlcnR5IGFzIGJlaW5nIG1hbmRhdG9yeSAob3Igbm90KS4KLSAgICAgKiBAcGFyYW0gbWFuZGF0b3J5Ci0gICAgICogQHNlZSB7QGxpbmsgRmVhdHVyZXMuUHJvcGVydHkjTUFOREFUT1JZfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hbmRhdG9yeShib29sZWFuIG1hbmRhdG9yeSkgewotICAgICAgICBwdXRGZWF0dXJlKE1BTkRBVE9SWSwgQm9vbGVhbi52YWx1ZU9mKG1hbmRhdG9yeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBqYXZhc2NyaXB0IHZhbGlkYXRpb25zIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICogQHJldHVybiBTdHJpbmdbXQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQgLy8gcmVtb3ZlIHRoaXMgbWV0aG9kPwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhU2NyaXB0VmFsaWRhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGZWF0dXJlKEpBVkFTQ1JJUFRfVkFMSURBVElPTl9GVU5DVElPTlMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5LgotICAgICAqIEBwYXJhbSBuYW1lIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGFQcm9wZXJ0eSBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoTWV0YVByb3BlcnR5KSBzdXBlci5jbG9uZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIk1ldGFQcm9wZXJ0eXsiICsgIm5hbWU9JyIgKyBuYW1lICsgJ1wnJyArICIsIHR5cGU9IiArIHR5cGUgKyAnfSc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvVmFsaWRhdGlvbi5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL1ZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZTczMS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHZhbGlkYXRpb24gPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uIHsKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgc2luZ2xlIHZhbGlkYXRpb24gcm91dGluZS4KLSAgICAgKiBWYWxpZGF0ZSB0aGUgb2JqZWN0IG9yIHByb3BlcnR5IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBWYWxpZGF0aW9uQ29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IC0gdG8gYWNjZXNzIHRoZSBwcm9wZXJ0eSwgdmFsdWUsIGNvbnN0cmFpbnRzCi0gICAgICovCi0gICAgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGUoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9WYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDA0NDRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9WYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbnRlcmZhY2Ugb2YgdGhlIGNvbnRleHQgdGhhdCBob2xkcyBhbGwgc3RhdGUgaW5mb3JtYXRpb24KLSAqIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBPYmplY3R9Ci0gICAgICovCi0gICAgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgYnkgdXNpbmcgdGhlIGdpdmVuIGFjY2VzcyBzdHJhdGVneS4KLSAgICAgKiBAcGFyYW0gYWNjZXNzCi0gICAgICogQHJldHVybiB7QGxpbmsgT2JqZWN0fQotICAgICAqLwotICAgIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKEFjY2Vzc1N0cmF0ZWd5IGFjY2Vzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHJldHVybiB7QGxpbmsgU3RyaW5nfQotICAgICAqLwotICAgIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIFZhbGlkYXRpb25MaXN0ZW5lcn0uCi0gICAgICogQHJldHVybiBUCi0gICAgICovCi0gICAgVCBnZXRMaXN0ZW5lcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBiZWFuLgotICAgICAqIEByZXR1cm4ge0BsaW5rIE9iamVjdH0KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0QmVhbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtb2RlbCBtZXRhLWJlYW4uCi0gICAgICogQHJldHVybiB7QGxpbmsgTWV0YUJlYW59Ci0gICAgICovCi0gICAgTWV0YUJlYW4gZ2V0TWV0YUJlYW4oKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbW9kZWwgbWV0YS1iZWFuLgotICAgICAqIEBwYXJhbSBtZXRhQmVhbgotICAgICAqLwotICAgIHZvaWQgc2V0TWV0YUJlYW4oTWV0YUJlYW4gbWV0YUJlYW4pOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtb2RlbCBtZXRhLXByb3BlcnR5LgotICAgICAqIEByZXR1cm4ge0BsaW5rIE1ldGFQcm9wZXJ0eX0KLSAgICAgKi8KLSAgICBNZXRhUHJvcGVydHkgZ2V0TWV0YVByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJlYW4uCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKi8KLSAgICB2b2lkIHNldEJlYW4oT2JqZWN0IGJlYW4pOwotCi0gICAgLyoqCi0gICAgICogQXZvaWQgcmVjdXJzaW9uIGJ5IHJlY29yZGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIGNvbnRleHQgYXMgaGF2aW5nIGJlZW4gdmFsaWRhdGVkLgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgc3RhdGUgaGFkIG5vdCBhbHJlYWR5IGJlZW4gcmVjb3JkZWQKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbGxlY3RWYWxpZGF0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY3VycmVudCBiZWFuL21ldGFiZWFuLgotICAgICAqIEBwYXJhbSBhQmVhbgotICAgICAqIEBwYXJhbSBhTWV0YUJlYW4KLSAgICAgKi8KLSAgICB2b2lkIHNldEJlYW4oT2JqZWN0IGFCZWFuLCBNZXRhQmVhbiBhTWV0YUJlYW4pOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjdXJyZW50IG1ldGEtcHJvcGVydHkuCi0gICAgICogQHBhcmFtIG1ldGFQcm9wZXJ0eQotICAgICAqLwotICAgIHZvaWQgc2V0TWV0YVByb3BlcnR5KE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHkpOwotCi0gICAgLyoqCi0gICAgICogU3RlcCBkZWVwZXIgaW50byBhc3NvY2lhdGlvbiBhdCAncHJvcCcgCi0gICAgICogQHBhcmFtIHByb3AKLSAgICAgKiBAcGFyYW0gYWNjZXNzCi0gICAgICovCi0gICAgdm9pZCBtb3ZlRG93bihNZXRhUHJvcGVydHkgcHJvcCwgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzKTsKLQotICAgIC8qKgotICAgICAqIFN0ZXAgb3V0IGZyb20gYSB2YWxpZGF0aW9uIG9mIGFzc29jaWF0ZWQgb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEBwYXJhbSBtZXRhQmVhbgotICAgICAqLwotICAgIHZvaWQgbW92ZVVwKE9iamVjdCBiZWFuLCBNZXRhQmVhbiBtZXRhQmVhbik7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluZGV4IG9mIHRoZSBvYmplY3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbnRvIHRoZSBjb250ZXh0LgotICAgICAqIHVzZWQgdG8gY3JlYXRlIHRoZSBwcm9wZXJ0eVBhdGggd2l0aCBbaW5kZXhdIGluZm9ybWF0aW9uIGZvciBjb2xsZWN0aW9ucy4KLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKi8KLSAgICB2b2lkIHNldEN1cnJlbnRJbmRleChJbnRlZ2VyIGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIHNldCB0aGUga2V5IG9mIHRoZSBvYmplY3QgaW4gYSBtYXAgY3VycmVudGx5IHZhbGlkYXRlZCBpbnRvIHRoZSBjb250ZXh0LgotICAgICAqIHVzZWQgdG8gY3JlYXRlIHRoZSBwcm9wZXJ0eVBhdGggd2l0aCBba2V5XSBpbmZvcm1hdGlvbiBmb3IgbWFwcy4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgdm9pZCBzZXRDdXJyZW50S2V5KE9iamVjdCBrZXkpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGFjY2VzcyBzdHJhdGVneS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBBY2Nlc3NTdHJhdGVneX0KLSAgICAgKi8KLSAgICBBY2Nlc3NTdHJhdGVneSBnZXRBY2Nlc3MoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9WYWxpZGF0aW9uTGlzdGVuZXIuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9tb2RlbC9WYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0MWRlYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvVmFsaWRhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBUaGUgaW50ZXJmYWNlIHRvIGNvbGxlY3QgZXJyb3JzIGZvdW5kIGR1cmluZyB2YWxpZGF0aW9uPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uTGlzdGVuZXIgewotICAgIC8qKgotICAgICAqIFNpbXBsZSBBUEkgdG8gYWRkIGFuIGVycm9yIHJlYXNvbiBkdXJpbmcgdmFsaWRhdGlvbi4KLSAgICAgKiBFcnJvciBub3RpZmljYXRpb24gYWRkZWQgZnJvbSBhIHtAbGluayBWYWxpZGF0aW9ufSB3aXRoIGNvbnRleHQgaW5mb3JtYXRpb24KLSAgICAgKiB0YWtlbiBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgVmFsaWRhdGlvbkNvbnRleHR9LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiAgYSBjb25zdGFudCBkZXNjcmliaW5nIHRoZSByZWFzb24uIFRoaXMgaXMgbm9ybWFsbHkgdGhlIGtleSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBmZWF0dXJlIHRoYXQgd2FzIHZpb2xhdGVkIGluIHRoZSBvYmplY3QgJ293bmVyJyBmb3IgcHJvcGVydHkgJ3Byb3BlcnR5TmFtZScKLSAgICAgKiBAcGFyYW0gY29udGV4dCAtIGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgYmVhbiA9ICAgICAgICAgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvciAob3duZXIpCi0gICAgICogICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gdGhlIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLSAgICAgKi8KLSAgICA8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCBhZGRFcnJvcihTdHJpbmcgcmVhc29uLCBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0KTsKLQotICAgIC8qKiBBbHRlcm5hdGl2ZSBtZXRob2QgdG8gYWRkIGEgZnVsbHkgaW5pdGlhbGl6ZWQge0BsaW5rIFZhbGlkYXRpb25MaXN0ZW5lci5FcnJvcn0gb2JqZWN0LiAqLwotICAgIDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIGFkZEVycm9yKEVycm9yIGVycm9yLCBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEFuIG9iamVjdCBob2xkaW5nIGEgc2luZ2xlIHZhbGlkYXRpb24gY29uc3RyYWludCB2aW9sYXRpb24KLSAgICAgKiBmb3VuZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRXJyb3IgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICAvKiogUmVhc29uICovCi0gICAgICAgIGZpbmFsIFN0cmluZyByZWFzb247Ci0gICAgICAgIC8qKiBPd25lciAqLwotICAgICAgICBmaW5hbCBPYmplY3Qgb3duZXI7Ci0gICAgICAgIC8qKiBQcm9wZXJ0eSBuYW1lKi8KLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IEVycm9yIGluc3RhbmNlLgotICAgICAgICAgKiBAcGFyYW0gYVJlYXNvbgotICAgICAgICAgKiBAcGFyYW0gYU93bmVyCi0gICAgICAgICAqIEBwYXJhbSBhUHJvcGVydHlOYW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXJyb3IoU3RyaW5nIGFSZWFzb24sIE9iamVjdCBhT3duZXIsIFN0cmluZyBhUHJvcGVydHlOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnJlYXNvbiA9IGFSZWFzb247Ci0gICAgICAgICAgICB0aGlzLm93bmVyID0gYU93bmVyOwotICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBhUHJvcGVydHlOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcmVhc29uLgotICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhc29uOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgb3duZXIuCi0gICAgICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG93bmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcHJvcGVydHlOYW1lLgotICAgICAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkVycm9yeyIgKyAicmVhc29uPSciICsgcmVhc29uICsgJ1wnJyArICIsIHByb3BlcnR5TmFtZT0nIiArCi0gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgKyAnXCcnICsgJ30nOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL0VNYWlsVmFsaWRhdGlvblV0aWxzLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvRU1haWxWYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2ZGEwMi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvRU1haWxWYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBob2xkcyB0aGUgcmVnZXhwIHRvIHZhbGlkYXRlIGFuIGVtYWlsIGFkZHJlc3M8YnI+Ci0gKiBVc2VyOiByb21hbi5zdHVtbTxicj4KLSAqIERhdGU6IDE3LjA2LjIwMTA8YnI+Ci0gKiBUaW1lOiAxMDo0MDo1OTxicj4KLSAqLwotcHVibGljIGNsYXNzIEVNYWlsVmFsaWRhdGlvblV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVRPTSA9ICJbXlxceDAwLVxceDFGXlxcKF5cXCleXFw8XlxcPl5cXEBeXFwsXlxcO15cXDpeXFxcXF5cXFwiXlxcLl5cXFteXFxdXlxcc10iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBET01BSU4gPSAiKCIgKyBBVE9NICsgIisoXFwuIiArIEFUT00gKyAiKykqIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSVBfRE9NQUlOID0gIlxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXF0iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gREVGQVVMVF9FTUFJTF9QQVRURVJOOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgREVGQVVMVF9FTUFJTF9QQVRURVJOID0KLSAgICAgICAgICAgIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoIl4iICsgQVRPTSArICIrKFxcLiIgKyBBVE9NICsgIispKkAiICsgRE9NQUlOICsgInwiICsgSVBfRE9NQUlOICsgIikkIiwKLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRvIGNoZWNrCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsaWRhdGlvbiBwYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWQodmFsdWUsIERFRkFVTFRfRU1BSUxfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciBhIHBhcnRpY3VsYXIgdmFsdWUgbWF0Y2hlcyBhIGdpdmVuIHBhdHRlcm4gcGVyCi0gICAgICoge0BsaW5rIE1hdGNoZXIjbWF0Y2hlcygpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcGFyYW0gYVBhdHRlcm4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnZhbHVlPC9jb2RlPiB3YXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICogICAgICAgICBtYXRjaGluZyA8Y29kZT5hUGF0dGVybjwvY29kZT4KLSAgICAgKi8KLSAgICAvLyBUT0RPIGl0IHdvdWxkIHNlZW0gdG8gbWFrZSBzZW5zZSB0byBtb3ZlIG9yIHJlZHVjZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzCi0gICAgLy8gbWV0aG9kIGFzIGl0IGlzIG1vcmUgZ2VuZXJhbCB0aGFuIGVtYWlsLgotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCB2YWx1ZSwgUGF0dGVybiBhUGF0dGVybikgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBzZXEgPSAoQ2hhclNlcXVlbmNlKSB2YWx1ZTsKLSAgICAgICAgaWYgKHNlcS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIE1hdGNoZXIgbSA9IGFQYXR0ZXJuLm1hdGNoZXIoc2VxKTsKLSAgICAgICAgcmV0dXJuIG0ubWF0Y2hlcygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvQWNjZXNzU3RyYXRlZ3kuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL0FjY2Vzc1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTdlYmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvQWNjZXNzU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogYWJzdHJhY3QgY2xhc3MgdG8gZW5jYXBzdWxhdGUgZGlmZmVyZW50IHN0cmF0ZWdpZXMKLSAqIHRvIGdldCB0aGUgdmFsdWUgb2YgYSBQcm9wZXJ0eS4gIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgc3VjaCB0aGF0Ci0gKiBzdWJjbGFzc2VzIGFyZSBpbnRlbmRlZCB0byBrbm93IGludGVybmFsbHkgdG8gd2hpY2ggcHJvcGVydHkgdGhleSByZWZlciwKLSAqIHdpdGggb25seSB0aGUgcGFydGljdWxhciB0YXJnZXQgaW5zdGFuY2UgYmVpbmcgZXh0ZXJuYWxseSByZXF1aXJlZAotICogdG8gY2FsY3VsYXRlIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiAgT25lIGludGVudCBvZiB0aGlzIGRlc2lnbiBpcwotICogdGhhdCB0aGUgbm90aW9uIG9mIHRoZSB2ZXJ5IGRlZmluaXRpb24gb2YgYSBwcm9wZXJ0eSBpcyBhYnN0cmFjdGVkCi0gKiBhbG9uZyB3aXRoIHRoZSBtZWNoYW5pc20gZm9yIGFjY2Vzc2luZyB0aGF0IHByb3BlcnR5Ljxici8+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY2Nlc3NTdHJhdGVneSB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2Ugb2YgYW4gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChPYmplY3QgaW5zdGFuY2UpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBKYXZhIHByb2dyYW0ge0BsaW5rIEVsZW1lbnRUeXBlfSB1c2VkIGJ5IHRoaXMge0BsaW5rIEFjY2Vzc1N0cmF0ZWd5fQotICAgICAqIHRvIGRldGVybWluZSBwcm9wZXJ0eSB2YWx1ZXMuCi0gICAgICogQHJldHVybiBFbGVtZW50VHlwZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBUeXBlIGdldEphdmFUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBuYW1lIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcHJvcGVydHkuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvQlZhbFZlcnNpb24uamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL0JWYWxWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzBhMzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvQlZhbFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIEJWYWwuCi0gKiBJdCB1c2VzIEFudCdzIGZpbHRlciB0b2tlbnMgdG8gY29udmVydCB0aGUgdGVtcGxhdGUgaW50byBhIGphdmEKLSAqIGZpbGUgd2l0aCBjdXJyZW50IGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQlZhbFZlcnNpb24gewotCi0gICAgLyoqIFByb2plY3QgbmFtZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJBcGFjaGUgQlZhbCI7Ci0gICAgLyoqIFVuaXF1ZSBpZCBvZiB0aGUgY3VycmVudCBwcm9qZWN0L3ZlcnNpb24vcmV2aXNpb24gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0lEOwotICAgIC8qKiBWZXJzaW9uIG51bWJlciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fTlVNQkVSOwotICAgIC8qKiBNYWpvciByZWxlYXNlIG51bWJlciAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX1JFTEVBU0U7Ci0gICAgLyoqIE1pbm9yIHJlbGVhc2UgbnVtYmVyICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOT1JfUkVMRUFTRTsKLSAgICAvKiogUGF0Y2gvcG9pbnQgcmVsZWFzZSBudW1iZXIgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVRDSF9SRUxFQVNFOwotICAgIC8qKiBSZWxlYXNlIHN0YXR1cyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEVBU0VfU1RBVFVTOwotICAgIC8qKiBWZXJzaW9uIGNvbnRyb2wgcmV2aXNpb24gbnVtYmVyICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWSVNJT05fTlVNQkVSOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgUHJvcGVydGllcyByZXZpc2lvblByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gQlZhbFZlcnNpb24uY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbQotICAgICAgICAgICAgICAgICgiL01FVEEtSU5GL29yZy5hcGFjaGUuYnZhbC5yZXZpc2lvbi5wcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldmlzaW9uUHJvcHMubG9hZChpbik7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHZlcnMgPSByZXZpc2lvblByb3BzLmdldFByb3BlcnR5KCJwcm9qZWN0LnZlcnNpb24iKTsKLSAgICAgICAgaWYgKHZlcnMgPT0gbnVsbCB8fCAiIi5lcXVhbHModmVycy50cmltKCkpKQotICAgICAgICAgICAgdmVycyA9ICIwLjAuMCI7Ci0gICAgICAgIFZFUlNJT05fTlVNQkVSID0gdmVyczsKLQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihWRVJTSU9OX05VTUJFUiwgIi4tIik7Ci0gICAgICAgIGludCBtYWpvciwgbWlub3IsIHBhdGNoOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFqb3IgPSB0b2suaGFzTW9yZVRva2VucygpID8gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkpIDogMDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1ham9yID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtaW5vciA9IHRvay5oYXNNb3JlVG9rZW5zKCkgPyBJbnRlZ2VyLnBhcnNlSW50KHRvay5uZXh0VG9rZW4oKSkgOiAwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbWlub3IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhdGNoID0gdG9rLmhhc01vcmVUb2tlbnMoKSA/IEludGVnZXIucGFyc2VJbnQodG9rLm5leHRUb2tlbigpKSA6IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwYXRjaCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmV2aXNpb24gPSByZXZpc2lvblByb3BzLmdldFByb3BlcnR5KCJzdm4ucmV2aXNpb24iKTsKLSAgICAgICAgaWYgKHJldmlzaW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHJldmlzaW9uLnRyaW0oKSkpIHsKLSAgICAgICAgICAgIHJldmlzaW9uID0gInVua25vd24iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZXZpc2lvbiwgIjoiKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHJUb2sgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzdHJUb2sgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RyVG9rICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV2aXNpb24gPSBzdHJUb2s7Ci0gICAgICAgIH0KLQotICAgICAgICBNQUpPUl9SRUxFQVNFID0gbWFqb3I7Ci0gICAgICAgIE1JTk9SX1JFTEVBU0UgPSBtaW5vcjsKLSAgICAgICAgUEFUQ0hfUkVMRUFTRSA9IHBhdGNoOwotICAgICAgICBSRUxFQVNFX1NUQVRVUyA9IHRvay5oYXNNb3JlVG9rZW5zKCkgPyB0b2submV4dFRva2VuKCIhIikgOiAiIjsKLSAgICAgICAgUkVWSVNJT05fTlVNQkVSID0gcmV2aXNpb247Ci0gICAgICAgIFBST0pFQ1RfSUQgPSBQUk9KRUNUX05BTUUgKyAiICIgKyBWRVJTSU9OX05VTUJFUiArICItciIgKyBSRVZJU0lPTl9OVU1CRVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9qZWN0IHZlcnNpb24gbnVtYmVyLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZFUlNJT05fTlVNQkVSOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmVyc2lvbiBjb250cm9sIHJldmlzaW9uIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJldmlzaW9uKCkgewotICAgICAgICByZXR1cm4gUkVWSVNJT05fTlVNQkVSOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvamVjdCBuYW1lLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFBST0pFQ1RfTkFNRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZ1bGx5LXF1YWxpZmllZCBwcm9qZWN0IGlkLgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0gICAgICAgIHJldHVybiBQUk9KRUNUX0lEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW4gbWV0aG9kIG9mIHRoaXMgY2xhc3MgdGhhdCBwcmludHMgdGhlIHtAbGluayAjdG9TdHJpbmcoKX0gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4uCi0gICAgICogQHBhcmFtIGFyZ3MgaWdub3JlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgQlZhbFZlcnNpb24oKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcig4MCAqIDQwKTsKLSAgICAgICAgYXBwZW5kQmFubmVyKGJ1Zik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7Ci0KLSAgICAgICAgYXBwZW5kUHJvcGVydHkoIm9zLm5hbWUiLCBidWYpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgYXBwZW5kUHJvcGVydHkoIm9zLnZlcnNpb24iLCBidWYpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgYXBwZW5kUHJvcGVydHkoIm9zLmFyY2giLCBidWYpLmFwcGVuZCgiXG5cbiIpOwotCi0gICAgICAgIGFwcGVuZFByb3BlcnR5KCJqYXZhLnZlcnNpb24iLCBidWYpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgYXBwZW5kUHJvcGVydHkoImphdmEudmVuZG9yIiwgYnVmKS5hcHBlbmQoIlxuXG4iKTsKLQotICAgICAgICBidWYuYXBwZW5kKCJqYXZhLmNsYXNzLnBhdGg6XG4iKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgICBQcml2aWxlZ2VkQWN0aW9ucy5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiXHQiKS5hcHBlbmQodG9rLm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKLQotICAgICAgICBhcHBlbmRQcm9wZXJ0eSgidXNlci5kaXIiLCBidWYpLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRCYW5uZXIoU3RyaW5nQnVpbGRlciBidWYpIHsKLSAgICAgICAgYnVmLmFwcGVuZCgiUHJvamVjdCIpLmFwcGVuZCgiOiAiKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiVmVyc2lvbiIpLmFwcGVuZCgiOiAiKS5hcHBlbmQoZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiUmV2aXNpb24iKS5hcHBlbmQoIjogIikuYXBwZW5kKGdldFJldmlzaW9uKCkpOwotICAgICAgICBidWYuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBhcHBlbmRQcm9wZXJ0eShTdHJpbmcgcHJvcCwgU3RyaW5nQnVpbGRlciBidWYpIHsKLSAgICAgICAgcmV0dXJuIGJ1Zi5hcHBlbmQocHJvcCkuYXBwZW5kKCI6ICIpLmFwcGVuZCgKLSAgICAgICAgICAgIFByaXZpbGVnZWRBY3Rpb25zLmdldFByb3BlcnR5KHByb3ApKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9GaWVsZEFjY2Vzcy5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvRmllbGRBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiYzMxZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9GaWVsZEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBkaXJlY3QgZmllbGQgYWNjZXNzIHN0cmF0ZWd5Ljxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZEFjY2VzcyBleHRlbmRzIEFjY2Vzc1N0cmF0ZWd5IHsKLQotICAgIHByaXZhdGUgZmluYWwgRmllbGQgZmllbGQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgRmllbGRBY2Nlc3MgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkQWNjZXNzKGZpbmFsIEZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKLSAgICAgICAgaWYgKCFmaWVsZC5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcnVuKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgT2JqZWN0IGluc3RhbmNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0KGluc3RhbmNlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLkZJRUxEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZSBnZXRKYXZhVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkLmdldEdlbmVyaWNUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZmllbGQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgRmllbGRBY2Nlc3MgdGhhdCA9IChGaWVsZEFjY2VzcykgbzsKLQotICAgICAgICByZXR1cm4gZmllbGQuZXF1YWxzKHRoYXQuZmllbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZmllbGQuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBydW4oUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9JbmRleGVkQWNjZXNzLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9JbmRleGVkQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWMyNWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvSW5kZXhlZEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMucmVmbGVjdC5UeXBlVXRpbHM7Ci0KLS8qKgotICoge0BsaW5rIEFjY2Vzc1N0cmF0ZWd5fSB0byBnZXQgYW4gaW5kZXhlZCBtZW1iZXIgb2YgYW4ge0BsaW5rIEl0ZXJhYmxlfSBvcgotICogYXJyYXkgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhlZEFjY2VzcyBleHRlbmRzIEFjY2Vzc1N0cmF0ZWd5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlVmFyaWFibGU8Pz4gSVRFUkFCTEVfVFlQRSA9IEl0ZXJhYmxlLmNsYXNzLmdldFR5cGVQYXJhbWV0ZXJzKClbMF07Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEphdmEgZWxlbWVudCB0eXBlIG9mIGEgcGFydGljdWxhciBjb250YWluZXIgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyVHlwZQotICAgICAqIEByZXR1cm4gVHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5jb250YWluZXJUeXBlPC9jb2RlPiBpcyBub3QKLSAgICAgKiAgICAgICAgIHNvbWUgdHlwZSBvZiB7QGxpbmsgSXRlcmFibGV9IG9yIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlIGdldEphdmFFbGVtZW50VHlwZShUeXBlIGNvbnRhaW5lclR5cGUpIHsKLSAgICAgICAgaWYgKFR5cGVVdGlscy5pc0FycmF5VHlwZShjb250YWluZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFR5cGVVdGlscy5nZXRBcnJheUNvbXBvbmVudFR5cGUoY29udGFpbmVyVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFR5cGVVdGlscy5pc0Fzc2lnbmFibGUoY29udGFpbmVyVHlwZSwgSXRlcmFibGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICBNYXA8VHlwZVZhcmlhYmxlPD8+LCBUeXBlPiB0eXBlQXJndW1lbnRzID0gVHlwZVV0aWxzLmdldFR5cGVBcmd1bWVudHMoY29udGFpbmVyVHlwZSwgSXRlcmFibGUuY2xhc3MpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGVBcmd1bWVudHMuY29udGFpbnNLZXkoSVRFUkFCTEVfVFlQRSkgPyB0eXBlQXJndW1lbnRzLmdldChJVEVSQUJMRV9UWVBFKSA6IE9iamVjdC5jbGFzczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFR5cGUgY29udGFpbmVyVHlwZTsKLSAgICBwcml2YXRlIEludGVnZXIgaW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgSW5kZXhlZEFjY2Vzc1N0cmF0ZWd5IGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250YWluZXJUeXBlCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICovCi0gICAgcHVibGljIEluZGV4ZWRBY2Nlc3MoVHlwZSBjb250YWluZXJUeXBlLCBJbnRlZ2VyIGluZGV4KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29udGFpbmVyVHlwZSA9IGNvbnRhaW5lclR5cGU7Ci0gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChpbmRleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCByZWFkIG51bGwgaW5kZXgiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCAmJiBpbnN0YW5jZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgaWYgKEFycmF5LmdldExlbmd0aChpbnN0YW5jZSkgLSBpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZ2V0KGluc3RhbmNlLCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICBMaXN0PD8+IGxpc3QgPSAoTGlzdDw/PikgaW5zdGFuY2U7Ci0gICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgLSBpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgSXRlcmFibGU8Pz4pIHsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiAoSXRlcmFibGU8Pz4pIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsraSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FVEhPRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhRWxlbWVudFR5cGUoY29udGFpbmVyVHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSIsIGluZGV4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL0tleWVkQWNjZXNzLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9LZXllZEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDUwNTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL0tleWVkQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5yZWZsZWN0LlR5cGVVdGlsczsKLQotLyoqCi0gKiB7QGxpbmsgQWNjZXNzU3RyYXRlZ3l9IHRvIGdldCBhIGtleWVkIHZhbHVlIGZyb20gYSB7QGxpbmsgTWFwfS4gQ29udGFpbnMKLSAqIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiBhIHN0cmluZyBrZXkgaXMgdXNlZCBhZ2FpbnN0IGEgY29udGFpbmVyIHR5cGUgd2hvc2Uga2V5Ci0gKiBwYXJhbWV0ZXIgaXMgbm90IGFzc2lnbmFibGUgZnJvbSB7QGxpbmsgU3RyaW5nfTogYWdhaW5zdCBhIG1hcCB3aG9zZSBrZXkgdHlwZQotICogaXMgYW4gZW51bSBjbGFzcywgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhIG5hbWVkIGVudW0gY29uc3RhbnQ7IG90aGVyIGtleQotICogdHlwZXMgd2lsbCBiZSBjb21wYXJlZCB2aWEge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfS4KLSAqLwotcHVibGljIGNsYXNzIEtleWVkQWNjZXNzIGV4dGVuZHMgQWNjZXNzU3RyYXRlZ3kgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVWYXJpYWJsZTw/PltdIE1BUF9UWVBFVkFSUyA9IE1hcC5jbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBKYXZhIGVsZW1lbnQgdHlwZSBvZiBhIHBhcnRpY3VsYXIgY29udGFpbmVyIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRhaW5lclR5cGUKLSAgICAgKiBAcmV0dXJuIFR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+Y29udGFpbmVyVHlwZTwvY29kZT4gaXMgbm90Ci0gICAgICogICAgICAgICBzb21lIGtpbmQgb2Yge0BsaW5rIE1hcH0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0SmF2YUVsZW1lbnRUeXBlKFR5cGUgY29udGFpbmVyVHlwZSkgewotICAgICAgICBpZiAoVHlwZVV0aWxzLmlzQXNzaWduYWJsZShjb250YWluZXJUeXBlLCBNYXAuY2xhc3MpKSB7Ci0gICAgICAgICAgICBNYXA8VHlwZVZhcmlhYmxlPD8+LCBUeXBlPiB0eXBlQXJndW1lbnRzID0gVHlwZVV0aWxzLmdldFR5cGVBcmd1bWVudHMoY29udGFpbmVyVHlwZSwgTWFwLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybiB0eXBlQXJndW1lbnRzLmNvbnRhaW5zS2V5KE1BUF9UWVBFVkFSU1sxXSkgPyB0eXBlQXJndW1lbnRzLmdldChNQVBfVFlQRVZBUlNbMV0pIDogT2JqZWN0LmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZSBjb250YWluZXJUeXBlOwotICAgIHByaXZhdGUgT2JqZWN0IGtleTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBLZXllZEFjY2VzcyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGFpbmVyVHlwZQotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgS2V5ZWRBY2Nlc3MoVHlwZSBjb250YWluZXJUeXBlLCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29udGFpbmVyVHlwZSA9IGNvbnRhaW5lclR5cGU7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3QgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgTWFwPD8sID8+KSB7Ci0gICAgICAgICAgICBNYXA8PywgPz4gbWFwID0gKE1hcDw/LCA/PikgaW5zdGFuY2U7Ci0gICAgICAgICAgICBNYXA8VHlwZVZhcmlhYmxlPD8+LCBUeXBlPiB0eXBlQXJndW1lbnRzID0gVHlwZVV0aWxzLmdldFR5cGVBcmd1bWVudHMoY29udGFpbmVyVHlwZSwgTWFwLmNsYXNzKTsKLSAgICAgICAgICAgIFR5cGUga2V5VHlwZSA9IHR5cGVBcmd1bWVudHMuZ2V0KE1BUF9UWVBFVkFSU1swXSk7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5VHlwZSA9PSBudWxsIHx8IFR5cGVVdGlscy5pc0luc3RhbmNlKGtleSwga2V5VHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykga2V5OwotICAgICAgICAgICAgICAgIENsYXNzPD8+IHJhd0tleVR5cGUgPSBUeXBlVXRpbHMuZ2V0UmF3VHlwZShrZXlUeXBlLCBjb250YWluZXJUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAocmF3S2V5VHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQgPSBtYXAuZ2V0KEVudW0udmFsdWVPZigoQ2xhc3M8PyBleHRlbmRzIEVudW0+KSByYXdLZXlUeXBlLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sID8+IGUgOiBtYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoZS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FVEhPRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0gICAgICAgIFR5cGUgcmVzdWx0ID0gZ2V0SmF2YUVsZW1lbnRUeXBlKGNvbnRhaW5lclR5cGUpOwotICAgICAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyBPYmplY3QuY2xhc3MgOiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVzXSIsIGtleSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9NZXRob2RBY2Nlc3MuamF2YSBiL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL01ldGhvZEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTgzZmJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL01ldGhvZEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC51dGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBpbnZva2UgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCAoZ2V0dGVyKTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBY2Nlc3MgZXh0ZW5kcyBBY2Nlc3NTdHJhdGVneSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRob2RBY2Nlc3MgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RBY2Nlc3MoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0aGlzKGdldFByb3BlcnR5TmFtZShtZXRob2QpLCBtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRob2RBY2Nlc3MgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQWNjZXNzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICBpZiAoIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcnVuKCBuZXcgUHJpdmlsZWdlZEFjdGlvbjxWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYmVhbiBwcm9wZXJ0aWVzIGdldHRlciBieSBhcHBseWluZyB0aGUgSmF2YUJlYW4gbmFtaW5nIGNvbnZlbnRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHJldHVybiBUaGUgYmVhbiBtZXRob2QgbmFtZSB3aXRoIHRoZSAiaXMiIG9yICJnZXQiIHByZWZpeCBzdHJpcHBlZCBvZmYsIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogICAgICAgICB0aGUgbWV0aG9kIG5hbWUgaWQgbm90IGFjY29yZGluZyB0byB0aGUgSmF2YUJlYW5zIHN0YW5kYXJkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZShNZXRob2QgbWVtYmVyKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZW1iZXIuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtZXRob2ROYW1lLnN1YnN0cmluZygyKSk7Ci0gICAgICAgIH0gLyogZWxzZSBpZiAoIG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiaGFzIikpIHsKLQkJCQluYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZSggbWV0aG9kTmFtZS5zdWJzdHJpbmcoIDMgKSApOwotCQkJfSAqLwotICAgICAgICAvLyBzZXR0ZXIgYW5ub3RhdGlvbiBpcyBOT1Qgc3VwcG9ydGVkIGluIHRoZSBzcGVjCi0gICAgICAgIC8qICBlbHNlIGlmIChtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgIHByb3BOYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtZXRob2QuZ2V0TmFtZSgpLnN1YnN0cmluZygzKSk7Ci0gICAgICAgfSAqLwotICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShtZXRob2ROYW1lLnN1YnN0cmluZygzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIG5vcm1hbGx5IHRoZSBwcm9wZXJ0eU5hbWUgb2YgdGhlIGdldHRlciBtZXRob2QsIGUuZy48YnI+Ci0gICAgICogbWV0aG9kOiBnZXROYW1lKCkgLT4gcHJvcGVydHlOYW1lOiBuYW1lPGJyPgotICAgICAqIG1ldGhvZDogaXNWYWxpZCgpIC0+IHByb3BlcnR5TmFtZTogdmFsaWQ8YnI+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIE9iamVjdCBpbnN0YW5jZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoaW5zdGFuY2UpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5NRVRIT0Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBUeXBlIGdldEphdmFUeXBlKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWV0aG9kQWNjZXNzIHRoYXQgPSAoTWV0aG9kQWNjZXNzKSBvOwotCi0gICAgICAgIHJldHVybiBtZXRob2QuZXF1YWxzKHRoYXQubWV0aG9kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJ1bihQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbikgewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL1ByaXZpbGVnZWRBY3Rpb25zLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9Qcml2aWxlZ2VkQWN0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMwOTM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC91dGlsL1ByaXZpbGVnZWRBY3Rpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB1dGlsaXR5IG1ldGhvZHMgdG8gcGVyZm9ybSBhY3Rpb25zIHdpdGggQWNjZXNzQ29udHJvbGxlciBvciB3aXRob3V0LiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgUHJpdmlsZWdlZEFjdGlvbnMgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0aFNlcGFyYXRvciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAibGluZS5zZXBhcmF0b3IiIHN5c3RlbSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBSZXF1aXJlcyBzZWN1cml0eSBwb2xpY3k6IAotICAgICAqICAgJ3Blcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAicmVhZCI7JwotICAgICAqLwotICAgIEBEZXByZWNhdGVkIC8vIHVudXNlZCBtZXRob2QgLSB3aWxsIHJlbW92ZSBpbiBmdXR1cmUgcmVsZWFzZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldExpbmVTZXBhcmF0b3IoKSB7Ci0gICAgICAgIGlmIChsaW5lU2VwYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmVTZXBhcmF0b3IgPQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZz4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaW5lU2VwYXJhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICJwYXRoLnNlcGFyYXRvciIgc3lzdGVtIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIFJlcXVpcmVzIHNlY3VyaXR5IHBvbGljeToKLSAgICAgKiAgICdwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gInJlYWQiOycKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZCAvLyB1bnVzZWQgbWV0aG9kIC0gd2lsbCByZW1vdmUgaW4gZnV0dXJlIHJlbGVhc2UKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQYXRoU2VwYXJhdG9yKCkgewotICAgICAgICBpZiAocGF0aFNlcGFyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXRoU2VwYXJhdG9yID0KLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aFNlcGFyYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFjdGlvbiB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCkgaWYgc2VjdXJpdHkgaWYgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gLSB0aGUgYWN0aW9uIHRvIHJ1bgotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGFjdGlvbgotICAgICAqLwotICAgIC8vIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGp1c3QgYW55b25lOyBkbyBub3QgaW5jcmVhc2UgYWNjZXNzCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcnVuKFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhY3Rpb24gd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgpIGlmIHNlY3VyaXR5IGlmIGVuYWJsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIC0gdGhlIGFjdGlvbiB0byBydW4KLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBhY3Rpb24KLSAgICAgKi8KLSAgICAvLyBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBqdXN0IGFueW9uZTsgZG8gbm90IGluY3JlYXNlIGFjY2VzcwotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJ1bihmaW5hbCBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFQ+IGFjdGlvbikgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgpIGFjdGlvbiBmb3IgQ2xhc3NVdGlsLmdldENsYXNzKCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJ1bihuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxDbGFzczw/Pj4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzVXRpbHMuZ2V0Q2xhc3MoY2xhc3NMb2FkZXIsIGNsYXNzTmFtZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIFByaXZpbGVnZWRBY3Rpb24gb2JqZWN0IGZvciBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgpLmludm9rZSgpLgotICAgICAqIAotICAgICAqIFJlcXVpcmVzIHNlY3VyaXR5IHBvbGljeQotICAgICAqICAncGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7JwotICAgICAqICAncGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOycKLSAgICAgKiAgIAotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvblZhbHVlKGZpbmFsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgZmluYWwgU3RyaW5nIG5hbWUpCi0gICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcnVuKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICBNZXRob2QgdmFsdWVNZXRob2Q7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVNZXRob2QgPSBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2QobmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVNZXRob2QgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZU1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZU1ldGhvZC5pbnZva2UoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgUHJpdmlsZWdlQWN0aW9uIG9iamVjdCBmb3IgY2xhenouZ2V0Q2xhc3Nsb2FkZXIoKS4KLSAgICAgKiAKLSAgICAgKiBSZXF1aXJlcyBzZWN1cml0eSBwb2xpY3k6Ci0gICAgICogICAncGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIjsnCi0gICAgICogICAKLSAgICAgKiBAcmV0dXJuIENsYXNzbG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihmaW5hbCBDbGFzczw/PiBjbGF6eikgewotICAgICAgICByZXR1cm4gcnVuKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgIGlmIChjbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBQcml2aWxlZ2VBY3Rpb24gb2JqZWN0IGZvciBTeXN0ZW0uZ2V0UHJvcGVydHkoKS4KLSAgICAgKiAKLSAgICAgKiBSZXF1aXJlcyBzZWN1cml0eSBwb2xpY3k6Ci0gICAgICogICAncGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJyZWFkIjsnCi0gICAgICogICAKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBydW4obmV3IFByaXZpbGVnZWRBY3Rpb248U3RyaW5nPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9Qcm9wZXJ0eUFjY2Vzcy5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvUHJvcGVydHlBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5MjM1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9Qcm9wZXJ0eUFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Qcm9wZXJ0eVV0aWxzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBVbmRlZmluZWQgZHluYW1pYyBzdHJhdGVneSAoRklFTEQgb3IgTUVUSE9EIGFjY2VzcykgVXNlcyBQcm9wZXJ0eVV0aWxzIG9yIHRyaWVzIHRvIGRldGVybWluZSBmaWVsZCB0bwotICogYWNjZXNzIHRoZSB2YWx1ZTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFjY2VzcyBleHRlbmRzIEFjY2Vzc1N0cmF0ZWd5IHsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGJlYW5DbGFzczsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0gICAgcHJpdmF0ZSBGaWVsZCByZW1lbWJlckZpZWxkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFByb3BlcnR5QWNjZXNzIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlBY2Nlc3MoQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBjbGF6ejsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbWVtYmVyRmllbGQgIT0gbnVsbCA/IEVsZW1lbnRUeXBlLkZJRUxEIDogRWxlbWVudFR5cGUuTUVUSE9EOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRQdWJsaWNQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBNYXA8PywgPz4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1hcDw/LCA/PikgYmVhbikuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgfSBlbHNlIHsgLy8gc3VwcG9ydHMgRHluYUJlYW4gYW5kIHN0YW5kYXJkIE9iamVjdHMKLSAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0eVV0aWxzLmdldFNpbXBsZVByb3BlcnR5KGJlYW4sIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG5hbWVkIHByb3BlcnR5IGZyb20gPGNvZGU+YmVhbjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogQHJldHVybiBPYmplY3QgZm91bmQKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUFjY2VzcyhiZWFuLmdldENsYXNzKCksIHByb3BlcnR5TmFtZSkuZ2V0KGJlYW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlByb3BlcnR5eyIgKyBiZWFuQ2xhc3MuZ2V0TmFtZSgpICsgJy4nICsgcHJvcGVydHlOYW1lICsgJ30nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZSBnZXRKYXZhVHlwZSgpIHsKLSAgICAgICAgVHlwZSByZXN1bHQgPSBnZXRUeXBlSW5uZXIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gT2JqZWN0LmNsYXNzIDogcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyB7QGxpbmsgUHJvcGVydHlBY2Nlc3N9IHJlZmVyZW5jZXMgYSBrbm93biBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0tub3duKCkgewotICAgICAgICByZXR1cm4gZ2V0VHlwZUlubmVyKCkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIG91dCB3aGF0LCBpZiBhbnksIHR5cGUgY2FuIGJlIGNhbGN1bGF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0eXBlIGZvdW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBUeXBlIGdldFR5cGVJbm5lcigpIHsKLSAgICAgICAgaWYgKHJlbWVtYmVyRmllbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlbWVtYmVyRmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZCA9IGdldFByb3BlcnR5UmVhZE1ldGhvZChwcm9wZXJ0eU5hbWUsIGJlYW5DbGFzcyk7Ci0gICAgICAgIGlmIChyZWFkTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkTWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRmllbGQgZmxkID0gZ2V0RmllbGQocHJvcGVydHlOYW1lLCBiZWFuQ2xhc3MpOwotICAgICAgICBpZiAoZmxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlRmllbGQoZmxkKTsKLSAgICAgICAgICAgIHJldHVybiByZW1lbWJlckZpZWxkLmdldEdlbmVyaWNUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldFByb3BlcnR5UmVhZE1ldGhvZChTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzczw/PiBiZWFuQ2xhc3MpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgZWFjaCA6IFByb3BlcnR5VXRpbHMuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhiZWFuQ2xhc3MpKSB7Ci0gICAgICAgICAgICBpZiAoZWFjaC5nZXROYW1lKCkuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWFjaC5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0RmllbGQoU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3M8Pz4gYmVhbkNsYXNzKSB7Ci0gICAgICAgIHRyeSB7IC8vIHRyeSBwdWJsaWMgZmllbGQKLSAgICAgICAgICAgIHJldHVybiBiZWFuQ2xhc3MuZ2V0RmllbGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAvLyBzZWFyY2ggZm9yIHByaXZhdGUvcHJvdGVjdGVkIGZpZWxkIHVwIHRoZSBoaWVyYXJjaHkKLSAgICAgICAgICAgIENsYXNzPD8+IHRoZUNsYXNzID0gYmVhbkNsYXNzOwotICAgICAgICAgICAgd2hpbGUgKHRoZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4MykgewotICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gdGhlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGJlYW4pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChyZW1lbWJlckZpZWxkICE9IG51bGwpIHsgLy8gY2FjaGUgZmllbGQgb2YgcHJldmlvdXMgYWNjZXNzCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWVtYmVyRmllbGQuZ2V0KGJlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsgLy8gdHJ5IHB1YmxpYyBtZXRob2QKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHVibGljUHJvcGVydHkoYmVhbiwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKGJlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCBhY2Nlc3MgIiArIHByb3BlcnR5TmFtZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRGaWVsZFZhbHVlKE9iamVjdCBiZWFuKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkIGZpZWxkID0gZ2V0RmllbGQocHJvcGVydHlOYW1lLCBiZWFuQ2xhc3MpOwotICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGVGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVtZW1iZXJGaWVsZC5nZXQoYmVhbik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2Fubm90IGFjY2VzcyBmaWVsZCAiICsgcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVGaWVsZChGaWVsZCBmaWVsZCkgewotICAgICAgICBpZiAoIWZpZWxkLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucmVtZW1iZXJGaWVsZCA9IGZpZWxkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gbykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFByb3BlcnR5QWNjZXNzIHRoYXQgPSAoUHJvcGVydHlBY2Nlc3MpIG87Ci0KLSAgICAgICAgcmV0dXJuIGJlYW5DbGFzcy5lcXVhbHModGhhdC5iZWFuQ2xhc3MpICYmIHByb3BlcnR5TmFtZS5lcXVhbHModGhhdC5wcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSBiZWFuQ2xhc3MuaGFzaENvZGUoKTsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBwcm9wZXJ0eU5hbWUuaGFzaENvZGUoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9WYWxpZGF0aW9uSGVscGVyLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvdXRpbC9WYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Njc3YzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3V0aWwvVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5EeW5hbWljTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBTdGF0ZWxlc3MgaGVscGVyIG1ldGhvZHMgdXNlZCBieSB0aGUgdmFsaWRhdG9ycy4KLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGNhbGwtYmFjayBvYmplY3QgcGFzc2VkIHRvCi0gICAgICoge0BsaW5rIFZhbGlkYXRpb25IZWxwZXIjdmFsaWRhdGVDb250ZXh0KFZhbGlkYXRpb25Db250ZXh0LCBWYWxpZGF0ZUNhbGxiYWNrLCBib29sZWFuKX0KLSAgICAgKiAuIEl0cyB7QGxpbmsgI3ZhbGlkYXRlKCl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhY2NvcmRpbmdseSBmb3IgZXZlcnkKLSAgICAgKiBkaXNwYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUNhbGxiYWNrIHsKLSAgICAgICAgdm9pZCB2YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIGEgY29tcGxleCAnYmVhbicgd2l0aCByZWxhdGVkIGJlYW5zIGFjY29yZGluZyB0bwotICAgICAqIHZhbGlkYXRpb24gcnVsZXMgaW4gJ21ldGFCZWFuJwotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICAtIHRoZSBjb250ZXh0IGlzIGluaXRpYWxpemVkIHdpdGg6IDxicj4KLSAgICAgKiAgICAgICAgICAgICZuYnNwOyZuYnNwO2JlYW4gLSB0aGUgcm9vdCBvYmplY3Qgc3RhcnQgdmFsaWRhdGlvbiBhdAotICAgICAqICAgICAgICAgICAgb3IgYSBjb2xsZWN0aW9uIG9mIHJvb3Qgb2JqZWN0cyA8YnI+Ci0gICAgICogICAgICAgICAgICAmbmJzcDsmbmJzcDttZXRhQmVhbiAtIHRoZSBtZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgcm9vdAotICAgICAqICAgICAgICAgICAgb2JqZWN0KHMpCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gY29udGV4dC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgdmFsaWRhdGVDb250ZXh0KFZhbGlkYXRpb25Db250ZXh0PD8+IGNvbnRleHQsIFZhbGlkYXRlQ2FsbGJhY2sgcywgYm9vbGVhbiB0cmVhdE1hcHNMaWtlQmVhbnMpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0QmVhbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghdHJlYXRNYXBzTGlrZUJlYW5zICYmIGNvbnRleHQuZ2V0QmVhbigpIGluc3RhbmNlb2YgTWFwPD8sID8+KSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVNYXBJbkNvbnRleHQoY29udGV4dCwgcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZ2V0QmVhbigpIGluc3RhbmNlb2YgSXRlcmFibGU8Pz4pIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhYmxlSW5Db250ZXh0KGNvbnRleHQsIHMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmdldEJlYW4oKSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVBcnJheUluQ29udGV4dChjb250ZXh0LCBzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRvIE9uZSBCZWFuIChvciBNYXAgbGlrZSBCZWFuKQotICAgICAgICAgICAgICAgIHZhbGlkYXRlQmVhbkluQ29udGV4dChjb250ZXh0LCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBhIHNpbmdsZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIDxWTD4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gY29udGV4dCwgaXRzIGN1cnJlbnQgYmVhbiBtdXN0IGJlIGEgc2luZ2xlCi0gICAgICogICAgICAgICAgICBvYmplY3QuCi0gICAgICogQHBhcmFtIHMKLSAgICAgKi8KLSAgICBzdGF0aWMgcHJvdGVjdGVkIDxWTCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZUJlYW5JbkNvbnRleHQoVmFsaWRhdGlvbkNvbnRleHQ8Vkw+IGNvbnRleHQsIFZhbGlkYXRlQ2FsbGJhY2sgcykgewotICAgICAgICBpZiAoZ2V0RHluYW1pY01ldGFCZWFuKGNvbnRleHQpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0TWV0YUJlYW4oZ2V0RHluYW1pY01ldGFCZWFuKGNvbnRleHQpLnJlc29sdmVNZXRhQmVhbihjb250ZXh0LmdldEJlYW4oKSkpOwotICAgICAgICB9Ci0gICAgICAgIHMudmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJdGVyYXRlcyB0aGUgdmFsdWVzIG9mIGFuIGFycmF5LCBzZXR0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgKiBhcHByb3ByaWF0ZWx5IGFuZCB2YWxpZGF0aW5nIGVhY2ggdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIDxWTD4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gY29udGV4dCwgaXRzIGN1cnJlbnQgYmVhbiBtdXN0IGJlIGFuIGFycmF5LgotICAgICAqLwotICAgIHN0YXRpYyBwcm90ZWN0ZWQgPFZMIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIHZhbGlkYXRlQXJyYXlJbkNvbnRleHQoVmFsaWRhdGlvbkNvbnRleHQ8Vkw+IGNvbnRleHQsIFZhbGlkYXRlQ2FsbGJhY2sgcykgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBEeW5hbWljTWV0YUJlYW4gZHluID0gZ2V0RHluYW1pY01ldGFCZWFuKGNvbnRleHQpOwotICAgICAgICBPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSkgY29udGV4dC5nZXRCZWFuKCk7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0gY29udGV4dC5nZXRNZXRhQmVhbigpOwotICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRJbmRleChudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVhY2ggOiBhcnJheSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEluZGV4KGluZGV4KyspOwotICAgICAgICAgICAgICAgIGlmIChlYWNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE51bGwgdmFsdWVzIGFyZSBub3QgdmFsaWRhdGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkeW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEJlYW4oZWFjaCwgZHluLnJlc29sdmVNZXRhQmVhbihlYWNoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRCZWFuKGVhY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjb250ZXh0Lm1vdmVVcChhcnJheSwgbWV0YUJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZXMgdGhlIHZhbHVlcyBvZiBhbiB7QGxpbmsgSXRlcmFibGV9IG9iamVjdCwgc2V0dGluZyB0aGUgY3VycmVudAotICAgICAqIGNvbnRleHQgYXBwcm9wcmlhdGVseSBhbmQgdmFsaWRhdGluZyBlYWNoIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8Vkw+Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGNvbnRleHQsIGl0cyBjdXJyZW50IGJlYW4gbXVzdCBpbXBsZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBJdGVyYWJsZX0uCi0gICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCA8VkwgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVJdGVyYWJsZUluQ29udGV4dChWYWxpZGF0aW9uQ29udGV4dDxWTD4gY29udGV4dCwgVmFsaWRhdGVDYWxsYmFjayBzKSB7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBwb3NpdGlvbmFsID0gY29udGV4dC5nZXRCZWFuKCkgaW5zdGFuY2VvZiBMaXN0PD8+OwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IChJdGVyYWJsZTw/PikgY29udGV4dC5nZXRCZWFuKCk7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0gY29udGV4dC5nZXRNZXRhQmVhbigpOwotICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRJbmRleChudWxsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8ganNyMzAzIHNwZWM6IEVhY2ggb2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciBpcyB2YWxpZGF0ZWQuCi0gICAgICAgICAgICBmaW5hbCBEeW5hbWljTWV0YUJlYW4gZHluID0gZ2V0RHluYW1pY01ldGFCZWFuKGNvbnRleHQpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgZWFjaCA6IGl0ZXJhYmxlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50SW5kZXgoaW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlYWNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE51bGwgdmFsdWVzIGFyZSBub3QgdmFsaWRhdGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkeW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEJlYW4oZWFjaCwgZHluLnJlc29sdmVNZXRhQmVhbihlYWNoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRCZWFuKGVhY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjb250ZXh0Lm1vdmVVcChpdGVyYWJsZSwgbWV0YUJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZXMgdGhlIHZhbHVlcyBvZiBhIHtAbGluayBNYXB9LCBzZXR0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKLSAgICAgKiBhcHByb3ByaWF0ZWx5IGFuZCB2YWxpZGF0aW5nIGVhY2ggdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIDxWTD4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gY29udGV4dCwgaXRzIGN1cnJlbnQgYmVhbiBtdXN0IGltcGxlbWVudAotICAgICAqICAgICAgICAgICAge0BsaW5rIE1hcH0uCi0gICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCA8VkwgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVNYXBJbkNvbnRleHQoVmFsaWRhdGlvbkNvbnRleHQ8Vkw+IGNvbnRleHQsIFZhbGlkYXRlQ2FsbGJhY2sgcykgewotICAgICAgICAvLyBqc3IzMDMgc3BlYzogRm9yIE1hcCwgdGhlIHZhbHVlIG9mIGVhY2ggTWFwLkVudHJ5IGlzIHZhbGlkYXRlZCAoa2V5Ci0gICAgICAgIC8vIGlzIG5vdCB2YWxpZGF0ZWQpLgotICAgICAgICBNYXA8PywgPz4gY3VycmVudEJlYW4gPSAoTWFwPD8sID8+KSBjb250ZXh0LmdldEJlYW4oKTsKLSAgICAgICAgTWV0YUJlYW4gbWV0YUJlYW4gPSBjb250ZXh0LmdldE1ldGFCZWFuKCk7Ci0gICAgICAgIGZpbmFsIER5bmFtaWNNZXRhQmVhbiBkeW4gPSBnZXREeW5hbWljTWV0YUJlYW4oY29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEtleShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sID8+IGVudHJ5IDogY3VycmVudEJlYW4uZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEtleShlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGR5biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QmVhbih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRCZWFuKHZhbHVlLCBkeW4ucmVzb2x2ZU1ldGFCZWFuKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbnRleHQubW92ZVVwKGN1cnJlbnRCZWFuLCBtZXRhQmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gPFZMPgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICBUaGUgY3VycmVudCB2YWxpZGF0aW9uIGNvbnRleHQuCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgRHluYW1pY01ldGFCZWFufSBpbiBjb250ZXh0LCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbWV0YSBiZWFuIGlzIG5vdCBkeW5hbWljLgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIDxWTCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gRHluYW1pY01ldGFCZWFuIGdldER5bmFtaWNNZXRhQmVhbihWYWxpZGF0aW9uQ29udGV4dDxWTD4gY29udGV4dCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNZXRhQmVhbigpIGluc3RhbmNlb2YgRHluYW1pY01ldGFCZWFuID8gKER5bmFtaWNNZXRhQmVhbikgY29udGV4dC5nZXRNZXRhQmVhbigpIDogbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGJlYW4gb25seSwgbm8gcmVsYXRlZCBiZWFucyB3aWxsIGJlIHZhbGlkYXRlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIDxWTCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZUJlYW4oVmFsaWRhdGlvbkNvbnRleHQ8Vkw+IGNvbnRleHQpIHsKLSAgICAgICAgLy8gZXhlY3V0ZSBhbGwgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbnMKLSAgICAgICAgZm9yIChNZXRhUHJvcGVydHkgcHJvcCA6IGNvbnRleHQuZ2V0TWV0YUJlYW4oKS5nZXRQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0TWV0YVByb3BlcnR5KHByb3ApOwotICAgICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGV4ZWN1dGUgYWxsIGJlYW4gbGV2ZWwgdmFsaWRhdGlvbnMKLSAgICAgICAgY29udGV4dC5zZXRNZXRhUHJvcGVydHkobnVsbCk7Ci0gICAgICAgIGZvciAoVmFsaWRhdGlvbiB2YWxpZGF0aW9uIDogY29udGV4dC5nZXRNZXRhQmVhbigpLmdldFZhbGlkYXRpb25zKCkpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIHByb3BlcnR5IG9ubHkuIFBlcmZvcm1zIGFsbCB2YWxpZGF0aW9ucwotICAgICAqIGZvciB0aGlzIHByb3BlcnR5LgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgPFZMIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIHZhbGlkYXRlUHJvcGVydHkoVmFsaWRhdGlvbkNvbnRleHQ8Vkw+IGNvbnRleHQpIHsKLSAgICAgICAgZm9yIChWYWxpZGF0aW9uIHZhbGlkYXRpb24gOiBjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpLmdldFZhbGlkYXRpb25zKCkpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvVmFsaWRhdGlvblJlc3VsdHNUZXN0LmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvVmFsaWRhdGlvblJlc3VsdHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmY5ZGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL1ZhbGlkYXRpb25SZXN1bHRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFQcm9wZXJ0eTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uUmVzdWx0cyBUZXN0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzdWx0c1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0aW9uUmVzdWx0cyByZXN1bHRzOwotCi0gICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHRzVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICByZXN1bHRzID0gbmV3IFZhbGlkYXRpb25SZXN1bHRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblJlc3VsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgICAgIEJlYW5WYWxpZGF0aW9uQ29udGV4dDxWYWxpZGF0aW9uUmVzdWx0cz4gY3R4ID0gbmV3IEJlYW5WYWxpZGF0aW9uQ29udGV4dDxWYWxpZGF0aW9uUmVzdWx0cz4ocmVzdWx0cyk7Ci0gICAgICAgIGN0eC5zZXRCZWFuKHRoaXMpOwotICAgICAgICBjdHguc2V0TWV0YVByb3BlcnR5KG5ldyBNZXRhUHJvcGVydHkoKSk7Ci0gICAgICAgIGN0eC5nZXRNZXRhUHJvcGVydHkoKS5zZXROYW1lKCJwcm9wIik7Ci0gICAgICAgIHJlc3VsdHMuYWRkRXJyb3IoInRlc3QiLCBjdHgpOwotICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0cy5oYXNFcnJvckZvclJlYXNvbigidGVzdCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmhhc0Vycm9yKHRoaXMsICJwcm9wIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdHMuaGFzRXJyb3IodGhpcywgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHRzLmhhc0Vycm9yKHRoaXMsICJwcm9wMiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRpb25SZXN1bHRzVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL0V4YW1wbGVFbnVtLmphdmEgYi90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvRXhhbXBsZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmODdhOS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvRXhhbXBsZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5tb2RlbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyPgotICogVXNlcjogcm9tYW4uc3R1bW08YnI+Ci0gKiBEYXRlOiAxNy4wNi4yMDEwPGJyPgotICogVGltZTogMTg6MDA6MTI8YnI+Ci0gKi8KLXB1YmxpYyBlbnVtIEV4YW1wbGVFbnVtIHsKLSAgICBWQUxVRTEsIFZBTFVFMiwgVkFMVUUzCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvTWV0YVByb3BlcnR5VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL21vZGVsL01ldGFQcm9wZXJ0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNjI2YS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvbW9kZWwvTWV0YVByb3BlcnR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogTWV0YVByb3BlcnR5IFRlc3Rlci4KLSAqCi0gKiBAYXV0aG9yIDxBdXRob3JzIG5hbWU+Ci0gKiBAc2luY2UgPHByZT4wMi8xMi8yMDA5PC9wcmU+Ci0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGFQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIE1ldGFQcm9wZXJ0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFQcm9wZXJ0eSBwcm9wID0gbmV3IE1ldGFQcm9wZXJ0eSgpOwotICAgICAgICBwcm9wLnNldFR5cGUoU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgcHJvcC5nZXRUeXBlQ2xhc3MoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIHByb3AuZ2V0VHlwZSgpKTsKLSAgICAgICAgcHJvcC5zZXRUeXBlKG5ldyBEeW5hVHlwZUVudW0oRXhhbXBsZUVudW0uY2xhc3MsIEV4YW1wbGVFbnVtLlZBTFVFMS5uYW1lKCksCi0gICAgICAgICAgICAgIEV4YW1wbGVFbnVtLlZBTFVFMy5uYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEV4YW1wbGVFbnVtLmNsYXNzLCBwcm9wLmdldFR5cGVDbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsICgoRHluYVR5cGVFbnVtKXByb3AuZ2V0VHlwZSgpKS5nZXRFbnVtQ29uc3RhbnRzKCkubGVuZ3RoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTWV0YVByb3BlcnR5VGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1jb3JlL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai54bWwgYi90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0YmI2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWNvcmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhRE9DVFlQRSBsb2c0ajpjb25maWd1cmF0aW9uIFNZU1RFTSAibG9nNGouZHRkIj4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIExvZzRqIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPGxvZzRqOmNvbmZpZ3VyYXRpb24geG1sbnM6bG9nNGo9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovIiBkZWJ1Zz0iZmFsc2UiPgotCi0gIDxhcHBlbmRlciBuYW1lPSJDT05TT0xFIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiPgotICAgIDxwYXJhbSBuYW1lPSJUaHJlc2hvbGQiIHZhbHVlPSJERUJVRyIvPgotICAgIDxsYXlvdXQgY2xhc3M9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCI+Ci0gICAgICA8cGFyYW0gbmFtZT0iQ29udmVyc2lvblBhdHRlcm4iIHZhbHVlPSIlZCAlLTVwICVjIC0gJW0lbiIvPgotICAgIDwvbGF5b3V0PgotICA8L2FwcGVuZGVyPgotCi0gIDxyb290PgotICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDT05TT0xFIi8+Ci0gIDwvcm9vdD4KLQotPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvcG9tLnhtbCBiL3RydW5rL2J2YWwtZXh0cmFzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjY5NWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0JTWF2ZW4gcmVsZWFzZSBwbHVnaW4gcmVxdWlyZXMgdGhlIHByb2plY3QgdGFnIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5idmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+YnZhbC1leHRyYXM8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEJWYWwgOjogYnZhbC1leHRyYXMgKG9wdGlvbmFsKTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkJWYWwgLSBub24tSlNSMzAzIHJvdXRpbmVzIGFuZCBjb25zdHJhaW50czwvZGVzY3JpcHRpb24+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuYnZhbC5idW5kbGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIGRlZmF1bHQgcHJvZmlsZSB1c2luZyBnZXJvbmltby12YWxpZGF0aW9uXzEuMF9zcGVjLmphcgotICAgICAgICAgICAgYWN0aXZlIHdoZW4gcHJvcGVydHkgInJpIiBpcyBub3QgcHJlc2VudC4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlcm9uaW1vPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IXJpPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby12YWxpZGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFsbG93IHVzZXJzIHRvIGNob29zZSBhbiBBUEkgcHJvdmlkZXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgb3B0aW9uYWwgcHJvZmlsZSB1c2luZyBqYXZheC52YWxpZGF0aW9uL3ZhbGlkYXRpb24tYXBpLmphcgotICAgICAgICAgICAgZnJvbSBSSSBtYW51YWxseSBhY3RpdmUgd2hlbiBwcm9wZXJ0eSAiLVByaSIgaXMgcHJvdmlkZWQuCi0gICAgICAgIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5yaTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnJpPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC52YWxpZGF0aW9uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhbGxvdyB1c2VycyB0byBjaG9vc2UgYW4gQVBJIHByb3ZpZGVyIC0tPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPmluc3RhbGw8L2RlZmF1bHRHb2FsPgotCi0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0FCQU51bWJlci5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQUJBTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDg2OTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQUJBTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIGRpcmVjdG9yeTxici8+Ci0gKi8KLUBEb2N1bWVudGVkCi1AQ29uc3RyYWludCggdmFsaWRhdGVkQnkgPSBBQkFOdW1iZXJWYWxpZGF0b3IuY2xhc3MgKQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIEFCQU51bWJlciB7Ci0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIntvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQuQUJBTnVtYmVyLm1lc3NhZ2V9IjsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9BQkFOdW1iZXJWYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0FCQU51bWJlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVkODU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0FCQU51bWJlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdDsKLQotLyoqCi0gKiBNb2R1bHVzIDEwIDxiPkFCQSBOdW1iZXI8L2I+IChvciA8Yj5Sb3V0aW5nIFRyYW5zaXQgTnVtYmVyPC9iPiAoUlROKSkgQ2hlY2sgRGlnaXQKLSAqIGNhbGN1bGF0aW9uL3ZhbGlkYXRpb24uCi0gKiA8cD4KLSAqIEFCQSBOdW1iZXJzIChvciBSb3V0aW5nIFRyYW5zaXQgTnVtYmVycykgYXJlIGEgbmluZSBkaWdpdCBudW1lcmljIGNvZGUgdXNlZAotICogdG8gaWRlbnRpZnkgQW1lcmljYW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBmb3IgdGhpbmdzIHN1Y2ggYXMgY2hlY2tzIG9yIGRlcG9zaXRzCi0gKiAoQUJBIHN0YW5kcyBmb3IgdGhlIEFtZXJpY2FuIEJhbmtlcnMgQXNzb2NpYXRpb24pLgotICogPHA+Ci0gKiBDaGVjayBkaWdpdCBjYWxjdWxhdGlvbiBpcyBiYXNlZCBvbiA8aT5tb2R1bHVzIDEwPC9pPiB3aXRoIGRpZ2l0cyBiZWluZyB3ZWlnaHRlZAotICogYmFzZWQgb24gdGhlaXIgcG9zaXRpb24gKGZyb20gcmlnaHQgdG8gbGVmdCkgYXMgZm9sbG93czoKLSAqIDx1bD4KLSAqICAgICA8bGk+RGlnaXRzIDEsIDQgYW5kICYgNyBhcmUgd2VpZ2h0ZWQgMQotICogICAgIDxsaT5EaWdpdHMgMiwgNSBhbmQgJiA4IGFyZSB3ZWlnaHRlZCA3Ci0gKiAgICAgPGxpPkRpZ2l0cyAzLCA2IGFuZCAmIDkgYXJlIHdlaWdodGVkIDMKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZQotICogIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm91dGluZ190cmFuc2l0X251bWJlciI+V2lraXBlZGlhIC0KLSAqICBSb3V0aW5nIHRyYW5zaXQgbnVtYmVyPC9hPi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFCQU51bWJlclZhbGlkYXRvcgotICAgIGV4dGVuZHMgTW9kdWx1c1ZhbGlkYXRvcjxBQkFOdW1iZXI+IHsKLQotICAgIC8qKiB3ZWlnaHRpbmcgZ2l2ZW4gdG8gZGlnaXRzIGRlcGVuZGluZyBvbiB0aGVpciByaWdodCBwb3NpdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFBPU0lUSU9OX1dFSUdIVCA9IG5ldyBpbnRbXSB7MywgMSwgN307Ci0KLSAgICBwdWJsaWMgQUJBTnVtYmVyVmFsaWRhdG9yKCkgewotICAgICAgICBzdXBlcigxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgPGk+d2VpZ2h0ZWQ8L2k+IHZhbHVlIG9mIGEgY2hhcmFjdGVyIGluIHRoZQotICAgICAqIGNvZGUgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogQUJBIFJvdXRpbmcgbnVtYmVycyBhcmUgd2VpZ2h0ZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6Ci0gICAgICogPHByZT48Y29kZT4KLSAgICAgKiAgICAgbGVmdCBwb3NpdGlvbjogMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOQotICAgICAqICAgICAgICAgICAgd2VpZ2h0OiAzICA3ICAxICAzICA3ICAxICAzICA3ICAxCi0gICAgICogPC9jb2RlPjwvcHJlPgotICAgICAqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgd2VpZ2h0ZWRWYWx1ZSggaW50IGNoYXJWYWx1ZSwgaW50IGxlZnRQb3MsIGludCByaWdodFBvcyApCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHdlaWdodCA9IFBPU0lUSU9OX1dFSUdIVFtyaWdodFBvcyAlIDNdOwotICAgICAgICByZXR1cm4gKGNoYXJWYWx1ZSAqIHdlaWdodCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9DVVNJUC5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQ1VTSVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwYjdkMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9DVVNJUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLQotLyoqCi0gKiA8cD4KLSAqIC0tCi0gKiBUT0RPIC0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgYmVhbl92YWxpZGF0aW9uIHNwZWMgYW5kIG1pZ2h0IGRpc2FwcGVhcgotICogYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0gKiAtLQotICogPC9wPgotICogRGVzY3JpcHRpb246IGFubm90YXRpb24gdG8gdmFsaWRhdGUgYSBqYXZhLmlvLkZpbGUgaXMgYSBkaXJlY3Rvcnk8YnIvPgotICovCi1ARG9jdW1lbnRlZAotQENvbnN0cmFpbnQoIHZhbGlkYXRlZEJ5ID0gQ1VTSVBWYWxpZGF0b3IuY2xhc3MgKQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIENVU0lQIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdC5DVVNJUC5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQ1VTSVBWYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0NVU0lQVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZThjMjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQ1VTSVBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3Rlci5nZXROdW1lcmljVmFsdWU7Ci0KLS8qKgotICogTW9kdWx1cyAxMCA8Yj5DVVNJUDwvYj4gKE5vcnRoIEFtZXJpY2FuIFNlY3VyaXRpZXMpCi0gKiBDaGVjayBEaWdpdCBjYWxjdWxhdGlvbi92YWxpZGF0aW9uLgotICogPHA+Ci0gKiBDVVNJUCBOdW1iZXJzIGFyZSA5IGNoYXJhY3RlciBhbHBoYW51bWVyaWMgY29kZXMgdXNlZAotICogdG8gaWRlbnRpZnkgTm9ydGggQW1lcmljYW4gU2VjdXJpdGllcy4KLSAqIDxwPgotICogQ2hlY2sgZGlnaXQgY2FsY3VsYXRpb24gdXNlcyB0aGUgPGk+TW9kdWx1cyAxMCBEb3VibGUgQWRkIERvdWJsZTwvaT4gdGVjaG5pcXVlCi0gKiB3aXRoIGV2ZXJ5IHNlY29uZCBkaWdpdCBiZWluZyB3ZWlnaHRlZCBieSAyLiBBbHBoYWJldGljIGNoYXJhY3RlcnMgYXJlCi0gKiBjb252ZXJ0ZWQgdG8gbnVtYmVycyBieSB0aGVpciBwb3NpdGlvbiBpbiB0aGUgYWxwaGFiZXQgc3RhcnRpbmcgd2l0aCBBIGJlaW5nIDEwLgotICogV2VpZ2h0ZWQgbnVtYmVycyBncmVhdGVyIHRoYW4gdGVuIGFyZSB0cmVhdGVkIGFzIHR3byBzZXBhcmF0ZSBudW1iZXJzLgotICogPHA+Ci0gKgotICogPHA+Ci0gKiBTZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DVVNJUCI+V2lraXBlZGlhIC0gQ1VTSVA8L2E+Ci0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ1VTSVBWYWxpZGF0b3IKLSAgICBleHRlbmRzIE1vZHVsdXNWYWxpZGF0b3I8Q1VTSVA+IHsKLQotICAgIC8qKiB3ZWlnaHRpbmcgZ2l2ZW4gdG8gZGlnaXRzIGRlcGVuZGluZyBvbiB0aGVpciByaWdodCBwb3NpdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFBPU0lUSU9OX1dFSUdIVCA9IG5ldyBpbnRbXSB7MiwgMX07Ci0KLSAgICBwdWJsaWMgQ1VTSVBWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGVzIHRoZSA8aT53ZWlnaHRlZDwvaT4gdmFsdWUgb2YgYSBjaGFyYWN0ZXIgaW4gdGhlCi0gICAgICogY29kZSBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBBQkEgUm91dGluZyBudW1iZXJzIGFyZSB3ZWlnaHRlZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoKLSAgICAgKiA8cHJlPjxjb2RlPgotICAgICAqICAgICBsZWZ0IHBvc2l0aW9uOiAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5Ci0gICAgICogICAgICAgICAgICB3ZWlnaHQ6IDMgIDcgIDEgIDMgIDcgIDEgIDMgIDcgIDEKLSAgICAgKiA8L2NvZGU+PC9wcmU+Ci0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCB3ZWlnaHRlZFZhbHVlKCBpbnQgY2hhclZhbHVlLCBpbnQgbGVmdFBvcywgaW50IHJpZ2h0UG9zICkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgd2VpZ2h0ID0gUE9TSVRJT05fV0VJR0hUW3JpZ2h0UG9zICUgMl07Ci0gICAgICAgIGludCB3ZWlnaHRlZFZhbHVlID0gKGNoYXJWYWx1ZSAqIHdlaWdodCk7Ci0gICAgICAgIHJldHVybiBzdW1EaWdpdHMod2VpZ2h0ZWRWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgdG9JbnQoY2hhciBjaGFyYWN0ZXIsIGludCBsZWZ0UG9zLCBpbnQgcmlnaHRQb3MpIHsKLSAgICAgICAgaW50IGNoYXJWYWx1ZSA9IGdldE51bWVyaWNWYWx1ZShjaGFyYWN0ZXIpOwotICAgICAgICBpZiAoY2hhclZhbHVlIDwgMCB8fCBjaGFyVmFsdWUgPiAzNSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBDaGFyYWN0ZXJbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlZnRQb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSA9ICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhclZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhclZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvRUFOMTMuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0VBTjEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MmFmOGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvRUFOMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IEVBTjEzVmFsaWRhdG9yLmNsYXNzICkKLUBUYXJnZXQoIHsgRklFTEQsIEFOTk9UQVRJT05fVFlQRSwgUEFSQU1FVEVSIH0gKQotQFJldGVudGlvbiggUlVOVElNRSApCi1wdWJsaWMgQGludGVyZmFjZSBFQU4xMyB7Ci0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIntvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQuRUFOMTMubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0VBTjEzVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9FQU4xM1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjcwMzk0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0VBTjEzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi0vKioKLSAqIE1vZHVsdXMgMTAgPGI+RUFOLTEzPC9iPiAvIDxiPlVQQzwvYj4gLyA8Yj5JU0JOLTEzPC9iPiBDaGVjayBEaWdpdAotICogY2FsY3VsYXRpb24vdmFsaWRhdGlvbi4KLSAqIDxwPgotICogQ2hlY2sgZGlnaXQgY2FsY3VsYXRpb24gaXMgYmFzZWQgb24gPGk+bW9kdWx1cyAxMDwvaT4gd2l0aCBkaWdpdHMgaW4KLSAqIGFuIDxpPm9kZDwvaT4gcG9zaXRpb24gKGZyb20gcmlnaHQgdG8gbGVmdCkgYmVpbmcgd2VpZ2h0ZWQgMSBhbmQgPGk+ZXZlbjwvaT4KLSAqIHBvc2l0aW9uIGRpZ2l0cyBiZWluZyB3ZWlnaHRlZCAzLgotICogPHA+Ci0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWU6Ci0gKiA8dWw+Ci0gKiAgIDxsaT5FQU4tMTMgLSBzZWUKLSAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXVyb3BlYW5fQXJ0aWNsZV9OdW1iZXIiPldpa2lwZWRpYSAtCi0gKiAgICAgICBFdXJvcGVhbiBBcnRpY2xlIE51bWJlcjwvYT4uPC9saT4KLSAqICAgPGxpPlVQQyAtIHNlZQotICogICAgICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxfUHJvZHVjdF9Db2RlIj5XaWtpcGVkaWEgLQotICogICAgICAgVW5pdmVyc2FsIFByb2R1Y3QgQ29kZTwvYT4uPC9saT4KLSAqICAgPGxpPklTQk4tMTMgLSBzZWUKLSAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNCTiI+V2lraXBlZGlhIC0gSW50ZXJuYXRpb25hbAotICogICAgICAgU3RhbmRhcmQgQm9vayBOdW1iZXIgKElTQk4pPC9hPi48L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVBTjEzVmFsaWRhdG9yCi0gICAgZXh0ZW5kcyBNb2R1bHVzVmFsaWRhdG9yPEVBTjEzPiB7Ci0KLSAgICAvKiogd2VpZ2h0aW5nIGdpdmVuIHRvIGRpZ2l0cyBkZXBlbmRpbmcgb24gdGhlaXIgcmlnaHQgcG9zaXRpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBQT1NJVElPTl9XRUlHSFQgPSBuZXcgaW50W10gezMsIDF9OwotCi0gICAgcHVibGljIEVBTjEzVmFsaWRhdG9yKCkgewotICAgICAgICBzdXBlcigxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Q2FsY3VsYXRlcyB0aGUgPGk+d2VpZ2h0ZWQ8L2k+IHZhbHVlIG9mIGEgY2hhcmFjdGVyIGluIHRoZQotICAgICAqIGNvZGUgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uPC9wPgotICAgICAqCi0gICAgICogPHA+Rm9yIEVBTi0xMyAoZnJvbSByaWdodCB0byBsZWZ0KSA8Yj5vZGQ8L2I+IGRpZ2l0cyBhcmUgd2VpZ2h0ZWQKLSAgICAgKiB3aXRoIGEgZmFjdG9yIG9mIDxiPm9uZTwvYj4gYW5kIDxiPmV2ZW48L2I+IGRpZ2l0cyB3aXRoIGEgZmFjdG9yCi0gICAgICogb2YgPGI+dGhyZWU8L2I+LjwvcD4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IHdlaWdodGVkVmFsdWUoIGludCBjaGFyVmFsdWUsIGludCBsZWZ0UG9zLCBpbnQgcmlnaHRQb3MgKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCB3ZWlnaHQgPSBQT1NJVElPTl9XRUlHSFRbcmlnaHRQb3MgJSAyXTsKLSAgICAgICAgcmV0dXJuIChjaGFyVmFsdWUgKiB3ZWlnaHQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvSUJBTi5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvSUJBTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmYzM2M4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lCQU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IElCQU5WYWxpZGF0b3IuY2xhc3MgKQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIElCQU4gewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0LklCQU4ubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lCQU5WYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lCQU5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2NWNlMS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9JQkFOVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci0KLS8qKgotICogPGI+SUJBTjwvYj4gKEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlcikgQ2hlY2sgRGlnaXQgY2FsY3VsYXRpb24vdmFsaWRhdGlvbi4KLSAqIDxwPgotICogVGhpcyByb3VudGluZSBpcyBiYXNlZCBvbiB0aGUgSVNPIDcwNjQgTW9kIDk3LDEwIGNoZWNrIGRpZ2l0IGNhbHVjbGF0aW9uIHJvdXRpbmUuCi0gKiA8cD4KLSAqIFRoZSB0d28gY2hlY2sgZGlnaXQgY2hhcmFjdGVycyBpbiBhIElCQU4gbnVtYmVyIGFyZSB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBjaGFyYWN0ZXJzCi0gKiBpbiB0aGUgY29kZS4gRm9yIDxpPmNoZWNrIGRpZ2l0PC9pPiBjYWxjdWxhdGlvbi92YWxpZGF0aW9uIHRoZSBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgYXJlIG1vdmVkCi0gKiB0byB0aGUgZW5kIG9mIHRoZSBjb2RlLgotICogIFNvIDxjb2RlPkNDRERubm5ubm5uPC9jb2RlPiBiZWNvbWVzIDxjb2RlPm5ubm5ubm5DQ0REPC9jb2RlPiAod2hlcmUKLSAqICA8Y29kZT5DQzwvY29kZT4gaXMgdGhlIGNvdW50cnkgY29kZSBhbmQgPGNvZGU+REQ8L2NvZGU+IGlzIHRoZSBjaGVjayBkaWdpdCkuIEZvcgotICogIGNoZWNrIGRpZ2l0IGNhbGN1YWx0aW9uIHRoZSBjaGVjayBkaWdpdCB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHplcm8gKGkuZS4KLSAqICA8Y29kZT5DQzAwbm5ubm5ubjwvY29kZT4gaW4gdGhpcyBleGFtcGxlLgotICogPHA+Ci0gKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUKLSAqICA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVybmF0aW9uYWxfQmFua19BY2NvdW50X051bWJlciI+V2lraXBlZGlhIC0KLSAqICBJQkFOIG51bWJlcjwvYT4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJQkFOVmFsaWRhdG9yCi0gICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPElCQU4sIFN0cmluZz4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVggPSA5OTk5OTk5OTk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1PRFVMVVMgPSA5NzsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBjb2RlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb2RlLmxlbmd0aCgpIDwgNSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlZm9ybWF0dGVkQ29kZSA9IGNvZGUuc3Vic3RyaW5nKDQpICsgY29kZS5zdWJzdHJpbmcoMCwgNCk7Ci0gICAgICAgIGxvbmcgdG90YWwgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZm9ybWF0dGVkQ29kZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgY2hhclZhbHVlID0gZ2V0TnVtZXJpY1ZhbHVlKHJlZm9ybWF0dGVkQ29kZS5jaGFyQXQoaSkpOwotICAgICAgICAgICAgaWYgKGNoYXJWYWx1ZSA8IDAgfHwgY2hhclZhbHVlID4gMzUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b3RhbCA9IChjaGFyVmFsdWUgPiA5ID8gdG90YWwgKiAxMDAgOiB0b3RhbCAqIDEwKSArIGNoYXJWYWx1ZTsKLSAgICAgICAgICAgIGlmICh0b3RhbCA+IE1BWCkgewotICAgICAgICAgICAgICAgIHRvdGFsID0gKHRvdGFsICUgTU9EVUxVUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKHRvdGFsICUgTU9EVUxVUykgPT0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSggSUJBTiBpYmFuICkgewotICAgICAgICAvLyBub3QgbmVlZGVkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9JU0JOMTAuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lTQk4xMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFhYjcwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lTQk4xMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLQotLyoqCi0gKiA8cD4KLSAqIC0tCi0gKiBUT0RPIC0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgYmVhbl92YWxpZGF0aW9uIHNwZWMgYW5kIG1pZ2h0IGRpc2FwcGVhcgotICogYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0gKiAtLQotICogPC9wPgotICogRGVzY3JpcHRpb246IGFubm90YXRpb24gdG8gdmFsaWRhdGUgYSBqYXZhLmlvLkZpbGUgaXMgYSBkaXJlY3Rvcnk8YnIvPgotICovCi1ARG9jdW1lbnRlZAotQENvbnN0cmFpbnQoIHZhbGlkYXRlZEJ5ID0gSVNCTjEwVmFsaWRhdG9yLmNsYXNzICkKLUBUYXJnZXQoIHsgRklFTEQsIEFOTk9UQVRJT05fVFlQRSwgUEFSQU1FVEVSIH0gKQotQFJldGVudGlvbiggUlVOVElNRSApCi1wdWJsaWMgQGludGVyZmFjZSBJU0JOMTAgewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0LklTQk4xMC5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvSVNCTjEwVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9JU0JOMTBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyYzEzMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9JU0JOMTBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLS8qKgotICogTW9kdWx1cyAxMSA8Yj5JU0JOLTEwPC9iPiBDaGVjayBEaWdpdCBjYWxjdWxhdGlvbi92YWxpZGF0aW9uLgotICogPHA+Ci0gKiBJU0JOLTEwIE51bWJlcnMgYXJlIGEgbnVtZXJpYyBjb2RlIGV4Y2VwdCBmb3IgdGhlIGxhc3QgKGNoZWNrKSBkaWdpdAotICogd2hpY2ggY2FuIGhhdmUgYSB2YWx1ZSBvZiAiWCIuCi0gKiA8cD4KLSAqIENoZWNrIGRpZ2l0IGNhbGN1bGF0aW9uIGlzIGJhc2VkIG9uIDxpPm1vZHVsdXMgMTE8L2k+IHdpdGggZGlnaXRzIGJlaW5nIHdlaWdodGVkCi0gKiBiYXNlZCBieSB0aGVpciBwb3NpdGlvbiwgZnJvbSByaWdodCB0byBsZWZ0ICB3aXRoIHRoZSBmaXJzdCBkaWdpdCBiZWluZyB3ZWlnaHRlZAotICogMSwgdGhlIHNlY29uZCAyIGFuZCBzbyBvbi4gSWYgdGhlIGNoZWNrIGRpZ2l0IGlzIGNhbGN1bGF0ZWQgYXMgIjEwIiBpdCBpcyBjb252ZXJ0ZWQKLSAqIHRvICJYIi4KLSAqIDxwPgotICogPGI+Ti5CLjwvYj4gRnJvbSAxc3QgSmFudWFyeSAyMDA3IHRoZSBib29rIGluZHVzdHJ5IHdpbGwgc3RhcnQgdG8gdXNlIGEgbmV3IDEzIGRpZ2l0Ci0gKiBJU0JOIG51bWJlciAocmF0aGVyIHRoYW4gdGhpcyAxMCBkaWdpdCBJU0JOIG51bWJlcikgd2hpY2ggdXNlcyB0aGUgRUFOLTEzIC8gVVBDCi0gKiAoc2VlIHtAbGluayBFQU4xM0NoZWNrRGlnaXR9KSBzdGFuZGFyZC4KLSAqIDxwPgotICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlOgotICogPHVsPgotICogICA8bGk+PGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU0JOIj5XaWtpcGVkaWEgLSBJbnRlcm5hdGlvbmFsCi0gKiAgICAgICBTdGFuZGFyZCBCb29rIE51bWJlciAoSVNCTik8L2E+LjwvbGk+Ci0gKiAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlzYm4ub3JnL3N0YW5kYXJkcy9ob21lL2lzYm4vdHJhbnNpdGlvbi5hc3AiPklTQk4tMTMKLSAqICAgICAgIFRyYW5zaXRpb24gZGV0YWlsczwvYT4uPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJU0JOMTBWYWxpZGF0b3IKLSAgICBleHRlbmRzIE1vZHVsdXNWYWxpZGF0b3I8SVNCTjEwPiB7Ci0KLSAgICBwdWJsaWMgSVNCTjEwVmFsaWRhdG9yKCkgewotICAgICAgICBzdXBlcigxMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgPGk+d2VpZ2h0ZWQ8L2k+IHZhbHVlIG9mIGEgY2hhcmN0ZXIgaW4gdGhlCi0gICAgICogY29kZSBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIDxwPkZvciBJU0JOLTEwIChmcm9tIHJpZ2h0IHRvIGxlZnQpIGRpZ2l0cyBhcmUgd2VpZ2h0ZWQKLSAgICAgKiBieSB0aGVpciBwb3NpdGlvbi48L3A+Ci0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCB3ZWlnaHRlZFZhbHVlKCBpbnQgY2hhclZhbHVlLCBpbnQgbGVmdFBvcywgaW50IHJpZ2h0UG9zICkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKGNoYXJWYWx1ZSAqIHJpZ2h0UG9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5Db252ZXJ0IGEgY2hhcmFjdGVyIGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIHRvIGFuCi0gICAgICogaW50ZWdlciB2YWx1ZS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5DaGFyYWN0ZXIgJ1gnIGNoZWNrIGRpZ2l0IGNvbnZlcnRlZCB0byAxMC48L3A+Ci0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB0b0ludChjaGFyIGNoYXJhY3RlciwgaW50IGxlZnRQb3MsIGludCByaWdodFBvcykgewotICAgICAgICBpZiAocmlnaHRQb3MgPT0gMSAmJiBjaGFyYWN0ZXIgPT0gJ1gnKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvSW50KGNoYXJhY3RlciwgbGVmdFBvcywgcmlnaHRQb3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvTHVobi5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvTHVobi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JlNmNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0x1aG4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IEx1aG5WYWxpZGF0b3IuY2xhc3MgKQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIEx1aG4gewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0Lkx1aG4ubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0x1aG5WYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0x1aG5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwZmUzYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9MdWhuVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi0vKioKLSAqIE1vZHVsdXMgMTAgPGI+THVobjwvYj4gQ2hlY2sgRGlnaXQgY2FsY3VsYXRpb24vdmFsaWRhdGlvbi4KLSAqIDxwPgotICogTHVobiBjaGVjayBkaWdpdHMgYXJlIHVzZWQsIGZvciBleGFtcGxlLCBieToKLSAqIDx1bD4KLSAqICAgIDxsaT48YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NyZWRpdF9jYXJkIj5DcmVkaXQgQ2FyZCBOdW1iZXJzPC9hPjwvbGk+Ci0gKiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JTUVJIj5JTUVJIE51bWJlcnM8L2E+IC0gSW50ZXJuYXRpb25hbAotICogICAgICAgIE1vYmlsZSBFcXVpcG1lbnQgSWRlbnRpdHkgTnVtYmVyczwvbGk+Ci0gKiA8L3VsPgotICogQ2hlY2sgZGlnaXQgY2FsY3VsYXRpb24gaXMgYmFzZWQgb24gPGk+bW9kdWx1cyAxMDwvaT4gd2l0aCBkaWdpdHMgaW4KLSAqIGFuIDxpPm9kZDwvaT4gcG9zaXRpb24gKGZyb20gcmlnaHQgdG8gbGVmdCkgYmVpbmcgd2VpZ2h0ZWQgMSBhbmQgPGk+ZXZlbjwvaT4KLSAqIHBvc2l0aW9uIGRpZ2l0cyBiZWluZyB3ZWlnaHRlZCAyICh3ZWlnaHRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDkgaGF2ZSA5IHN1YnRyYWN0ZWQpLgotICogPHA+Ci0gKiBTZWUgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MdWhuX2FsZ29yaXRobSI+V2lraXBlZGlhPC9hPgotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEx1aG5WYWxpZGF0b3IKLSAgICBleHRlbmRzIE1vZHVsdXNWYWxpZGF0b3I8THVobj4gewotCi0gICAgLyoqIHdlaWdodGluZyBnaXZlbiB0byBkaWdpdHMgZGVwZW5kaW5nIG9uIHRoZWlyIHJpZ2h0IHBvc2l0aW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gUE9TSVRJT05fV0VJR0hUID0gbmV3IGludFtdIHsyLCAxfTsKLQotICAgIHB1YmxpYyBMdWhuVmFsaWRhdG9yKCkgewotICAgICAgICBzdXBlcigxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Q2FsY3VsYXRlcyB0aGUgPGk+d2VpZ2h0ZWQ8L2k+IHZhbHVlIG9mIGEgY2hhcmN0ZXIgaW4gdGhlCi0gICAgICogY29kZSBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Gb3IgTHVobiAoZnJvbSByaWdodCB0byBsZWZ0KSA8Yj5vZGQ8L2I+IGRpZ2l0cyBhcmUgd2VpZ2h0ZWQKLSAgICAgKiB3aXRoIGEgZmFjdG9yIG9mIDxiPm9uZTwvYj4gYW5kIDxiPmV2ZW48L2I+IGRpZ2l0cyB3aXRoIGEgZmFjdG9yCi0gICAgICogb2YgPGI+dHdvPC9iPi4gV2VpZ2h0ZWQgdmFsdWVzID4gOSwgaGF2ZSA5IHN1YnRyYWN0ZWQ8L3A+Ci0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCB3ZWlnaHRlZFZhbHVlKCBpbnQgY2hhclZhbHVlLCBpbnQgbGVmdFBvcywgaW50IHJpZ2h0UG9zICkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgd2VpZ2h0ID0gUE9TSVRJT05fV0VJR0hUW3JpZ2h0UG9zICUgMl07Ci0gICAgICAgIGludCB3ZWlnaHRlZFZhbHVlID0gKGNoYXJWYWx1ZSAqIHdlaWdodCk7Ci0gICAgICAgIHJldHVybiAod2VpZ2h0ZWRWYWx1ZSA+IDkgPyAod2VpZ2h0ZWRWYWx1ZSAtIDkpIDogd2VpZ2h0ZWRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9Nb2R1bHVzVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9Nb2R1bHVzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjcyNDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvTW9kdWx1c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3Rlci5nZXROdW1lcmljVmFsdWU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIuaXNEaWdpdDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLQotLyoqCi0gKiBBYnN0cmFjdCA8Yj5Nb2R1bHVzPC9iPiBDaGVjayBkaWdpdCBjYWxjdWxhdGlvbi92YWxpZGF0aW9uLgotICogPHA+Ci0gKiBQcm92aWRlcyBhIDxpPmJhc2U8L2k+IGNsYXNzIGZvciBidWlsZGluZyA8aT5tb2R1bHVzPC9pPiBDaGVjawotICogRGlnaXQgcm91dGluZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBoYW5kbGVzIDxpPm51bWVyaWM8L2k+IGNvZGVzLCBzdWNoIGFzCi0gKiA8Yj5FQU4tMTM8L2I+LiBGb3IgPGk+YWxwaGFudW1lcmljPC9pPiBjb2RlcyBzdWNoIGFzIDxiPkVBTi0xMjg8L2I+IHlvdQotICogd2lsbCBuZWVkIHRvIGltcGxlbWVudC9vdmVycmlkZSB0aGUgPGNvZGU+dG9JbnQoKTwvY29kZT4gYW5kCi0gKiA8Y29kZT50b0NoYXIoKTwvY29kZT4gbWV0aG9kcy4KLSAqCi0gKiBAcGFyYW0gPEE+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIE1vZHVsdXNWYWxpZGF0b3I8QSBleHRlbmRzIEFubm90YXRpb24+Ci0gICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPEEsIFN0cmluZz4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbW9kdWx1czsKLQotICAgIHB1YmxpYyBNb2R1bHVzVmFsaWRhdG9yKGludCBtb2R1bHVzKSB7Ci0gICAgICAgIHRoaXMubW9kdWx1cyA9IG1vZHVsdXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoQSBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIC8vIG5vdCBuZWVkZWQgQVRNCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIGNvZGUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCB0b3RhbCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29kZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgbHRoID0gY29kZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBsZWZ0UG9zICA9IGkgKyAxOwotICAgICAgICAgICAgaW50IHJpZ2h0UG9zID0gbHRoIC0gaTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IGNoYXJWYWx1ZSA9IHRvSW50KGNvZGUuY2hhckF0KGkpLCBsZWZ0UG9zLCByaWdodFBvcyk7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gd2VpZ2h0ZWRWYWx1ZShjaGFyVmFsdWUsIGxlZnRQb3MsIHJpZ2h0UG9zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3RhbCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh0b3RhbCAlIG1vZHVsdXMpID09IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgPGk+d2VpZ2h0ZWQ8L2k+IHZhbHVlIG9mIGEgY2hhcmFjdGVyIGluIHRoZQotICAgICAqIGNvZGUgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogU29tZSBtb2R1bHVzIHJvdXRpbmVzIHdlaWdodCB0aGUgdmFsdWUgb2YgYSBjaGFyYWN0ZXIKLSAgICAgKiBkZXBlbmRpbmcgb24gaXRzIHBvc2l0aW9uIGluIHRoZSBjb2RlIChlLmcuIElTQk4tMTApLCB3aGlsZQotICAgICAqIG90aGVycyB1c2UgZGlmZmVyZW50IHdlaWdodGluZyBmYWN0b3JzIGZvciBvZGQvZXZlbiBwb3NpdGlvbnMKLSAgICAgKiAoZS5nLiBFQU4gb3IgTHVobikuIEltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgbWVjaGFuaXNtCi0gICAgICogcmVxdWlyZWQgYnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFyVmFsdWUgVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIGNoYXJhY3RlcgotICAgICAqIEBwYXJhbSBsZWZ0UG9zIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSBjb2RlLCBjb3VudGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKLSAgICAgKiBAcGFyYW0gcmlnaHRQb3MgVGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGNvZGUsIGNvdW50aW5nIGZyb20gcmlnaHQgdG8gbGVmdAotICAgICAqIEByZXR1cm4gVGhlIHdlaWdodGVkIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHdlaWdodGVkVmFsdWUoaW50IGNoYXJWYWx1ZSwgaW50IGxlZnRQb3MsIGludCByaWdodFBvcykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBjaGFyYWN0ZXIgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24gdG8gYW4gaW50ZWdlciB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5Ob3RlOjwvYj4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IGhhbmRsZXJzIG51bWVyaWMgdmFsdWVzCi0gICAgICogRm9yIG5vbi1udW1lcmljIGNoYXJhY3RlcnMsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLSAgICAgKiBjaGFyYWN0ZXItLT5pbnRlZ2VyIGNvbnZlcnNpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBjaGFyYWN0ZXIgdG8gY29udmVydAotICAgICAqIEBwYXJhbSBsZWZ0UG9zIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGluIHRoZSBjb2RlLCBjb3VudGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKLSAgICAgKiBAcGFyYW0gcmlnaHRQb3MgVGhlIHBvc2l0aW9ub2YgdGhlIGNoYXJhY3RlciBpbiB0aGUgY29kZSwgY291bnRpbmcgZnJvbSByaWdodCB0byBsZWZ0Ci0gICAgICogQHJldHVybiBUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCB0b0ludChjaGFyIGNoYXJhY3RlciwgaW50IGxlZnRQb3MsIGludCByaWdodFBvcykgewotICAgICAgICBpZiAoaXNEaWdpdChjaGFyYWN0ZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TnVtZXJpY1ZhbHVlKGNoYXJhY3Rlcik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBDaGFyYWN0ZXJbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVmdFBvcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gPSAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0b2dldGhlciB0aGUgaW5kaXZpZHVhbCBkaWdpdHMgaW4gYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBudW1iZXIgd2hvc2UgZGlnaXRzIGFyZSB0byBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gVGhlIHN1bSBvZiB0aGUgZGlnaXRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgc3VtRGlnaXRzKGludCBudW1iZXIpIHsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgaW50IHRvZG8gPSBudW1iZXI7Ci0gICAgICAgIHdoaWxlICh0b2RvID4gMCkgewotICAgICAgICAgICAgdG90YWwgKz0gdG9kbyAlIDEwOwotICAgICAgICAgICAgdG9kbyAgPSB0b2RvIC8gMTA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvU2Vkb2wuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1NlZG9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTBjYjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvU2Vkb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IFNlZG9sVmFsaWRhdG9yLmNsYXNzICkKLUBUYXJnZXQoIHsgRklFTEQsIEFOTk9UQVRJT05fVFlQRSwgUEFSQU1FVEVSIH0gKQotQFJldGVudGlvbiggUlVOVElNRSApCi1wdWJsaWMgQGludGVyZmFjZSBTZWRvbCB7Ci0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIntvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQuU2Vkb2wubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1NlZG9sVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9TZWRvbFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDc2MDg0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1NlZG9sVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlOwotCi0vKioKLSAqIE1vZHVsdXMgMTAgPGI+U0VET0w8L2I+IChVSyBTZWN1cml0aWVzKSBDaGVjayBEaWdpdCBjYWxjdWxhdGlvbi92YWxpZGF0aW9uLgotICogPHA+Ci0gKiBTRURPTCBOdW1iZXJzIGFyZSA3IGNoYXJhY3RlciBhbHBoYW51bWVyaWMgY29kZXMgdXNlZAotICogdG8gaWRlbnRpZnkgVUsgU2VjdXJpdGllcyAoU0VET0wgc3RhbmRzIGZvciBTdG9jayBFeGNoYW5nZSBEYWlseSBPZmZpY2lhbCBMaXN0KS4KLSAqIDxwPgotICogQ2hlY2sgZGlnaXQgY2FsY3VsYXRpb24gaXMgYmFzZWQgb24gPGk+bW9kdWx1cyAxMDwvaT4gd2l0aCBkaWdpdHMgYmVpbmcgd2VpZ2h0ZWQKLSAqIGJhc2VkIG9uIHRoZWlyIHBvc2l0aW9uLCBmcm9tIGxlZnQgdG8gcmlnaHQsIGFzIGZvbGxvd3M6Ci0gKiA8cD4KLSAqIDxwcmU+PGNvZGU+Ci0gKiAgICAgIHBvc2l0aW9uOiAgMSAgMiAgMyAgNCAgNSAgNiAgNwotICogICAgIHdlaWdodGluZzogIDEgIDMgIDEgIDcgIDMgIDkgIDEKLSAqIDwvY29kZT48L3ByZT4KLSAqIDxwPgotICogU2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU0VET0wiPldpa2lwZWRpYSAtIFNFRE9MPC9hPgotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlZG9sVmFsaWRhdG9yCi0gICAgZXh0ZW5kcyBNb2R1bHVzVmFsaWRhdG9yPFNlZG9sPiB7Ci0KLSAgICAvKiogd2VpZ2h0aW5nIGdpdmVuIHRvIGRpZ2l0cyBkZXBlbmRpbmcgb24gdGhlaXIgcmlnaHQgcG9zaXRpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBQT1NJVElPTl9XRUlHSFQgPSBuZXcgaW50W10gezEsIDMsIDEsIDcsIDMsIDksIDF9OwotCi0gICAgcHVibGljIFNlZG9sVmFsaWRhdG9yKCkgewotICAgICAgICBzdXBlcigxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgd2VpZ2h0ZWRWYWx1ZSggaW50IGNoYXJWYWx1ZSwgaW50IGxlZnRQb3MsIGludCByaWdodFBvcyApCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChjaGFyVmFsdWUgKiBQT1NJVElPTl9XRUlHSFRbbGVmdFBvcyAtIDFdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCB0b0ludCggY2hhciBjaGFyYWN0ZXIsIGludCBsZWZ0UG9zLCBpbnQgcmlnaHRQb3MgKSB7Ci0gICAgICAgIGludCBjaGFyVmFsdWUgPSBnZXROdW1lcmljVmFsdWUoY2hhcmFjdGVyKTsKLSAgICAgICAgaWYgKGNoYXJWYWx1ZSA8IDAgfHwgY2hhclZhbHVlID4gMzUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgQ2hhcmFjdGVyWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsZWZ0UG9zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gPSAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNoYXJWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYXJWYWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1ZlcmhvZWZmLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9WZXJob2VmZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRmNzU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1ZlcmhvZWZmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIGRpcmVjdG9yeTxici8+Ci0gKi8KLUBEb2N1bWVudGVkCi1AQ29uc3RyYWludCggdmFsaWRhdGVkQnkgPSBWZXJob2VmZlZhbGlkYXRvci5jbGFzcyApCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgVmVyaG9lZmYgewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0LlZlcmhvZWZmLm1lc3NhZ2V9IjsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9WZXJob2VmZlZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvVmVyaG9lZmZWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhOTU5NC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9WZXJob2VmZlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0vKioKLSAqIDxiPlZlcmhvZWZmPC9iPiAoRGloZWRyYWwpIENoZWNrIERpZ2l0IGNhbGN1bGF0aW9uL3ZhbGlkYXRpb24uCi0gKiA8cD4KLSAqIENoZWNrIGRpZ2l0IGNhbGN1bGF0aW9uIGZvciBudW1lcmljIGNvZGVzIHVzaW5nIGEKLSAqIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGloZWRyYWxfZ3JvdXAiPkRpaGVkcmFsIEdyb3VwPC9hPgotICogb2Ygb3JkZXIgMTAuCi0gKiA8cD4KLSAqIFNlZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZlcmhvZWZmX2FsZ29yaXRobSI+V2lraXBlZGlhCi0gKiAgLSBWZXJob2VmZiBhbGdvcml0aG08L2E+IGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWZXJob2VmZlZhbGlkYXRvcgotICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxWZXJob2VmZiwgU3RyaW5nPiB7Ci0KLSAgICAvKiogRCAtIG11bHRpcGxpY2F0aW9uIHRhYmxlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBEX1RBQkxFID0gbmV3IGludFtdW10gewotICAgICAgICB7MCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOX0sCi0gICAgICAgIHsxLCAgMiwgIDMsICA0LCAgMCwgIDYsICA3LCAgOCwgIDksICA1fSwKLSAgICAgICAgezIsICAzLCAgNCwgIDAsICAxLCAgNywgIDgsICA5LCAgNSwgIDZ9LAotICAgICAgICB7MywgIDQsICAwLCAgMSwgIDIsICA4LCAgOSwgIDUsICA2LCAgN30sCi0gICAgICAgIHs0LCAgMCwgIDEsICAyLCAgMywgIDksICA1LCAgNiwgIDcsICA4fSwKLSAgICAgICAgezUsICA5LCAgOCwgIDcsICA2LCAgMCwgIDQsICAzLCAgMiwgIDF9LAotICAgICAgICB7NiwgIDUsICA5LCAgOCwgIDcsICAxLCAgMCwgIDQsICAzLCAgMn0sCi0gICAgICAgIHs3LCAgNiwgIDUsICA5LCAgOCwgIDIsICAxLCAgMCwgIDQsICAzfSwKLSAgICAgICAgezgsICA3LCAgNiwgIDUsICA5LCAgMywgIDIsICAxLCAgMCwgIDR9LAotICAgICAgICB7OSwgIDgsICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgMH19OwotCi0gICAgLyoqIFAgLSBwZXJtdXRhdGlvbiB0YWJsZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gUF9UQUJMRSA9IG5ldyBpbnRbXVtdIHsKLSAgICAgICAgezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDl9LAotICAgICAgICB7MSwgIDUsICA3LCAgNiwgIDIsICA4LCAgMywgIDAsICA5LCAgNH0sCi0gICAgICAgIHs1LCAgOCwgIDAsICAzLCAgNywgIDksICA2LCAgMSwgIDQsICAyfSwKLSAgICAgICAgezgsICA5LCAgMSwgIDYsICAwLCAgNCwgIDMsICA1LCAgMiwgIDd9LAotICAgICAgICB7OSwgIDQsICA1LCAgMywgIDEsICAyLCAgNiwgIDgsICA3LCAgMH0sCi0gICAgICAgIHs0LCAgMiwgIDgsICA2LCAgNSwgIDcsICAzLCAgOSwgIDAsICAxfSwKLSAgICAgICAgezIsICA3LCAgOSwgIDMsICA4LCAgMCwgIDYsICA0LCAgMSwgIDV9LAotICAgICAgICB7NywgIDAsICA0LCAgNiwgIDksICAxLCAgMywgIDIsICA1LCAgOH19OwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIGNvZGUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNoZWNrc3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGludCBpZHggPSBjb2RlLmxlbmd0aCgpIC0gKGkgKyAxKTsKLSAgICAgICAgICAgIGludCBudW0gPSBnZXROdW1lcmljVmFsdWUoY29kZS5jaGFyQXQoaWR4KSk7Ci0gICAgICAgICAgICBpZiAobnVtIDwgMCB8fCBudW0gPiA5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tzdW0gPSBEX1RBQkxFW2NoZWNrc3VtXVtQX1RBQkxFW2kgJSA4XVtudW1dXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hlY2tzdW0gPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWZXJob2VmZiBpYmFuKSB7Ci0gICAgICAgIC8vIG5vdCBuZWVkZWQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L3BhY2thZ2UtaW5mby5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWIyZWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIHBhY2thZ2UgY29udGFpbnMgPGk+Q2hlY2sgRGlnaXQ8L2k+IHZhbGlkYXRpb24gcm91dGluZXMuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvQW1lcmljYW5FeHByZXNzLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY3JlZGl0Y2FyZC9BbWVyaWNhbkV4cHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzNDBkMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY3JlZGl0Y2FyZC9BbWVyaWNhbkV4cHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNyZWRpdGNhcmQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0Lkx1aG47Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBMdWhuCi1AUGF0dGVybihyZWdleHA9Il4oM1s0N11cXGR7MTN9KSQiKQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnk9e30pCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgQW1lcmljYW5FeHByZXNzIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY3JlZGl0Y2FyZC5BbWVyaWNhbkV4cHJlc3MubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL0RpbmVycy5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvRGluZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjFkZTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvRGluZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdC5MdWhuOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIGRpcmVjdG9yeTxici8+Ci0gKi8KLUBEb2N1bWVudGVkCi1ATHVobgotQFBhdHRlcm4ocmVnZXhwPSJeKDMwWzAtNV1cXGR7MTF9fDMwOTVcXGR7MTB9fDM2XFxkezEyfXwzWzgtOV1cXGR7MTJ9KSQiKQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnk9e30pCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgRGluZXJzIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY3JlZGl0Y2FyZC5EaW5lcnMubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL0Rpc2NvdmVyLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY3JlZGl0Y2FyZC9EaXNjb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmMzY2E5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL0Rpc2NvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdC5MdWhuOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIGRpcmVjdG9yeTxici8+Ci0gKi8KLUBEb2N1bWVudGVkCi1ATHVobgotQFBhdHRlcm4ocmVnZXhwPSJeKCg2MDExXFxkezEyfSl8KDY0WzQtOV1cXGR7MTN9KXwoNjVcXGR7MTR9KSkkIikKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5PXt9KQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIERpc2NvdmVyIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY3JlZGl0Y2FyZC5EaXNjb3Zlci5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvTWFzdGVyY2FyZC5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvTWFzdGVyY2FyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNhNjI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL01hc3RlcmNhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNyZWRpdGNhcmQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0Lkx1aG47Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBMdWhuCi1AUGF0dGVybihyZWdleHA9Il4oNVsxLTVdXFxkezE0fSkkIikKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5PXt9KQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIE1hc3RlcmNhcmQgewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkLk1hc3RlcmNhcmQubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL1Zpc2EuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL1Zpc2EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlMjIzZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY3JlZGl0Y2FyZC9WaXNhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuY2hlY2tkaWdpdC5MdWhuOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIGRpcmVjdG9yeTxici8+Ci0gKi8KLUBEb2N1bWVudGVkCi1ATHVobgotQFBhdHRlcm4ocmVnZXhwPSJeKDQpKFxcZHsxMn18XFxkezE1fSkkIikKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5PXt9KQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIFZpc2EgewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkLlZpc2EubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jcmVkaXRjYXJkL3BhY2thZ2UtaW5mby5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTBkOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NyZWRpdGNhcmQvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIHBhY2thZ2UgY29udGFpbnMgPGk+Q3JlZGl0IENhcmQ8L2k+IHZhbGlkYXRpb24gcm91dGluZXMuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jcmVkaXRjYXJkOwpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvRGlyZWN0b3J5LmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9EaXJlY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhYmNiMi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9EaXJlY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmZpbGU7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiA8cD4KLSAqIC0tCi0gKiBUT0RPIC0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgYmVhbl92YWxpZGF0aW9uIHNwZWMgYW5kIG1pZ2h0IGRpc2FwcGVhcgotICogYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0gKiAtLQotICogPC9wPgotICogRGVzY3JpcHRpb246IGFubm90YXRpb24gdG8gdmFsaWRhdGUgYSBqYXZhLmlvLkZpbGUgaXMgYSBkaXJlY3Rvcnk8YnIvPgotICovCi1ARG9jdW1lbnRlZAotQENvbnN0cmFpbnQoIHZhbGlkYXRlZEJ5ID0gRGlyZWN0b3J5VmFsaWRhdG9yLmNsYXNzICkKLUBUYXJnZXQoIHsgRklFTEQsIEFOTk9UQVRJT05fVFlQRSwgUEFSQU1FVEVSIH0gKQotQFJldGVudGlvbiggUlVOVElNRSApCi1wdWJsaWMgQGludGVyZmFjZSBEaXJlY3RvcnkgewotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5maWxlLkRpcmVjdG9yeS5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYjhlZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9EaXJlY3RvcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8RGlyZWN0b3J5LCBGaWxlPiB7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChGaWxlIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5leGlzdHMoKSAmJiB2YWx1ZS5pc0RpcmVjdG9yeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKERpcmVjdG9yeSBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgKGFzIGxvbmcgYXMgRGlyZWN0b3J5IGhhcyBubyBwcm9wZXJ0aWVzKQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvTm90RGlyZWN0b3J5LmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9Ob3REaXJlY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3ZGVmZi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9Ob3REaXJlY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmZpbGU7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiA8cD4KLSAqIC0tCi0gKiBUT0RPIC0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgYmVhbl92YWxpZGF0aW9uIHNwZWMgYW5kIG1pZ2h0IGRpc2FwcGVhcgotICogYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0gKiAtLQotICogPC9wPgotICogRGVzY3JpcHRpb246IGFubm90YXRpb24gdG8gdmFsaWRhdGUgYSBqYXZhLmlvLkZpbGUgaXMgbm90IGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IERpcmVjdG9yeVZhbGlkYXRvci5jbGFzcyApCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgTm90RGlyZWN0b3J5IHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuZmlsZS5Ob3REaXJlY3RvcnkubWVzc2FnZX0iOwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9maWxlL05vdERpcmVjdG9yeVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvTm90RGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGZmOTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvTm90RGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3REaXJlY3RvcnlWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE5vdERpcmVjdG9yeSwgRmlsZT4gewotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoRmlsZSB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdmFsdWUuZXhpc3RzKCkgJiYgIXZhbHVlLmlzRGlyZWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTm90RGlyZWN0b3J5IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAoYXMgbG9uZyBhcyBEaXJlY3RvcnkgaGFzIG5vIHByb3BlcnRpZXMpCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9TeW1saW5rLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9TeW1saW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNmY4Y2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvU3ltbGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMuZmlsZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLio7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi0vKioKLSAqIDxwPgotICogLS0KLSAqIFRPRE8gLSBUaGlzIGNsYXNzIGlzIE5PVCBwYXJ0IG9mIHRoZSBiZWFuX3ZhbGlkYXRpb24gc3BlYyBhbmQgbWlnaHQgZGlzYXBwZWFyCi0gKiBhcyBzb29uIGFzIGEgZmluYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBjb250YWlucyBhIHNpbWlsYXIgZnVuY3Rpb25hbGl0eS4KLSAqIC0tCi0gKiA8L3A+Ci0gKiBEZXNjcmlwdGlvbjogYW5ub3RhdGlvbiB0byB2YWxpZGF0ZSBhIGphdmEuaW8uRmlsZSBpcyBhIHN5bWJvbGljIGxpbms8YnIvPgotICovCi1ARG9jdW1lbnRlZAotQENvbnN0cmFpbnQoIHZhbGlkYXRlZEJ5ID0gU3ltbGlua1ZhbGlkYXRvci5jbGFzcyApCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgU3ltbGluayB7Ci0KLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIntvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmZpbGUuU3ltbGluay5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvU3ltbGlua1ZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2ZpbGUvU3ltbGlua1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE2YjJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9maWxlL1N5bWxpbmtWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5maWxlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgU3ltbGlua1ZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8U3ltbGluaywgRmlsZT4gewotCi0gICAgLyoqCi0gICAgICogVGhlIFdpbmRvd3Mgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFdJTkRPV1NfU0VQQVJBVE9SID0gJ1xcJzsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKEZpbGUgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKCF2YWx1ZS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcm91dGluZSBraW5kbHkgYm9ycm93ZWQgZnJvbSBBcGFjaGUgQ29tbW9ucy1JTwotCi0gICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gV0lORE9XU19TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGVJbkNhbm9uaWNhbERpciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodmFsdWUuZ2V0UGFyZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbGVJbkNhbm9uaWNhbERpciA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGaWxlIGNhbm9uaWNhbERpciA9IHZhbHVlLmdldFBhcmVudEZpbGUoKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0gICAgICAgICAgICAgICAgZmlsZUluQ2Fub25pY2FsRGlyID0gbmV3IEZpbGUoY2Fub25pY2FsRGlyLCB2YWx1ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKCFmaWxlSW5DYW5vbmljYWxEaXIuZ2V0Q2Fub25pY2FsRmlsZSgpLmVxdWFscyhmaWxlSW5DYW5vbmljYWxEaXIuZ2V0QWJzb2x1dGVGaWxlKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETzogaXMgaXQgdHJ1ZT8KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN5bWxpbmsgcGFyYW1ldGVycykgewotICAgICAgICAvLyBkbyBub3RoaW5nIChhcyBsb25nIGFzIFN5bWxpbmsgaGFzIG5vIHByb3BlcnRpZXMpCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvZmlsZS9wYWNrYWdlLWluZm8uamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9maWxlL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc3YWIwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9maWxlL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoge0BsaW5rIGphdmEuaW8uRmlsZX0gY29uc3RyYWludHMgdmFsaWRhdG9ycy4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmZpbGU7CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0RvbWFpbi5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL25ldC9Eb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmM2ViYS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0RvbWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGEgamF2YS5pby5GaWxlIGlzIGEgZGlyZWN0b3J5PGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KCB2YWxpZGF0ZWRCeSA9IERvbWFpblZhbGlkYXRvci5jbGFzcyApCi1AVGFyZ2V0KCB7IEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUiB9ICkKLUBSZXRlbnRpb24oIFJVTlRJTUUgKQotcHVibGljIEBpbnRlcmZhY2UgRG9tYWluIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0LkRvbWFpbi5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotICAgIGJvb2xlYW4gYWxsb3dMb2NhbCgpIGRlZmF1bHQgZmFsc2U7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvRG9tYWluVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0RvbWFpblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmIzZWY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvRG9tYWluVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0OwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLQotLyoqCi0gKiA8cD48Yj5Eb21haW4gbmFtZTwvYj4gdmFsaWRhdGlvbiByb3V0aW5lcy48L3A+Ci0gKgotICogPHA+Ci0gKiBUaGlzIHZhbGlkYXRvciBwcm92aWRlcyBtZXRob2RzIGZvciB2YWxpZGF0aW5nIEludGVybmV0IGRvbWFpbiBuYW1lcwotICogYW5kIHRvcC1sZXZlbCBkb21haW5zLgotICogPC9wPgotICoKLSAqIDxwPkRvbWFpbiBuYW1lcyBhcmUgZXZhbHVhdGVkIGFjY29yZGluZwotICogdG8gdGhlIHN0YW5kYXJkcyA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMDM0LnR4dCI+UkZDMTAzNDwvYT4sCi0gKiBzZWN0aW9uIDMsIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMTIzLnR4dCI+UkZDMTEyMzwvYT4sCi0gKiBzZWN0aW9uIDIuMS4gTm8gYWNjb21vZGF0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgc3BlY2lhbGl6ZWQgbmVlZHMgb2YKLSAqIG90aGVyIGFwcGxpY2F0aW9uczsgaWYgdGhlIGRvbWFpbiBuYW1lIGhhcyBiZWVuIFVSTC1lbmNvZGVkLCBmb3IgZXhhbXBsZSwKLSAqIHZhbGlkYXRpb24gd2lsbCBmYWlsIGV2ZW4gdGhvdWdoIHRoZSBlcXVpdmFsZW50IHBsYWludGV4dCB2ZXJzaW9uIG9mIHRoZQotICogc2FtZSBuYW1lIHdvdWxkIGhhdmUgcGFzc2VkLgotICogPC9wPgotICoKLSAqIDxwPgotICogVmFsaWRhdGlvbiBpcyBhbHNvIHByb3ZpZGVkIGZvciB0b3AtbGV2ZWwgZG9tYWlucyAoVExEcykgYXMgZGVmaW5lZCBhbmQKLSAqIG1haW50YWluZWQgYnkgdGhlIEludGVybmV0IEFzc2lnbmVkIE51bWJlcnMgQXV0aG9yaXR5IChJQU5BKToKLSAqIDwvcD4KLSAqCi0gKiAgIDx1bD4KLSAqICAgICA8bGk+e0BsaW5rICNpc1ZhbGlkSW5mcmFzdHJ1Y3R1cmVUbGR9IC0gdmFsaWRhdGVzIGluZnJhc3RydWN0dXJlIFRMRHMKLSAqICAgICAgICAgKDxjb2RlPi5hcnBhPC9jb2RlPiwgZXRjLik8L2xpPgotICogICAgIDxsaT57QGxpbmsgI2lzVmFsaWRHZW5lcmljVGxkfSAtIHZhbGlkYXRlcyBnZW5lcmljIFRMRHMKLSAqICAgICAgICAgKDxjb2RlPi5jb20sIC5vcmc8L2NvZGU+LCBldGMuKTwvbGk+Ci0gKiAgICAgPGxpPntAbGluayAjaXNWYWxpZENvdW50cnlDb2RlVGxkfSAtIHZhbGlkYXRlcyBjb3VudHJ5IGNvZGUgVExEcwotICogICAgICAgICAoPGNvZGU+LnVzLCAudWssIC5jbjwvY29kZT4sIGV0Yy4pPC9saT4KLSAqICAgPC91bD4KLSAqCi0gKiA8cD4KLSAqICg8Yj5OT1RFPC9iPjogVGhpcyBjbGFzcyBkb2VzIG5vdCBwcm92aWRlIElQIGFkZHJlc3MgbG9va3VwIGZvciBkb21haW4gbmFtZXMgb3IKLSAqIG1ldGhvZHMgdG8gZW5zdXJlIHRoYXQgYSBnaXZlbiBkb21haW4gbmFtZSBtYXRjaGVzIGEgc3BlY2lmaWMgSVA7IHNlZQotICoge0BsaW5rIGphdmEubmV0LkluZXRBZGRyZXNzfSBmb3IgdGhhdCBmdW5jdGlvbmFsaXR5LikKLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIERvbWFpblZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8RG9tYWluLCBTdHJpbmc+IHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd0xvY2FsOwotCi0gICAgLy8gUmVndWxhciBleHByZXNzaW9uIHN0cmluZ3MgZm9yIGhvc3RuYW1lcyAoZGVyaXZlZCBmcm9tIFJGQzIzOTYgYW5kIFJGQyAxMTIzKQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRE9NQUlOX0xBQkVMID0gUGF0dGVybi5jb21waWxlKCJcXHB7QWxudW19KD8+W1xccHtBbG51bX0tXSpcXHB7QWxudW19KSoiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRE9NQUlOX05BTUVfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoIl4oPzoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIERPTUFJTl9MQUJFTC5wYXR0ZXJuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxcLikrKFxccHtBbHBoYX17Mix9KSQiKTsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBkb21haW4sIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gRE9NQUlOX05BTUVfUkVHRVgubWF0Y2hlcihkb21haW4pOwotICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIGRvbWFpbiA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICByZXR1cm4gaXNWYWxpZFRsZChkb21haW4pOwotICAgICAgICB9IGVsc2UgaWYgKGFsbG93TG9jYWwgJiYgRE9NQUlOX0xBQkVMLm1hdGNoZXIoZG9tYWluKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPlN0cmluZzwvY29kZT4gbWF0Y2hlcyBhbnkKLSAgICAgKiBJQU5BLWRlZmluZWQgdG9wLWxldmVsIGRvbWFpbi4gTGVhZGluZyBkb3RzIGFyZSBpZ25vcmVkIGlmIHByZXNlbnQuCi0gICAgICogVGhlIHNlYXJjaCBpcyBjYXNlLXNlbnNpdGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0bGQgdGhlIHBhcmFtZXRlciB0byBjaGVjayBmb3IgVExEIHN0YXR1cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgVExECi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZhbGlkVGxkKFN0cmluZyB0bGQpIHsKLSAgICAgICAgaWYgKGFsbG93TG9jYWwgJiYgaXNWYWxpZExvY2FsVGxkKHRsZCkpIHsKLSAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0bGQgPSBjaG9tcExlYWRpbmdEb3QodGxkKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gaXNWYWxpZEluZnJhc3RydWN0dXJlVGxkKHRsZCkKLSAgICAgICAgICAgICAgICB8fCBpc1ZhbGlkR2VuZXJpY1RsZCh0bGQpCi0gICAgICAgICAgICAgICAgfHwgaXNWYWxpZENvdW50cnlDb2RlVGxkKHRsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiBtYXRjaGVzIGFueQotICAgICAqIElBTkEtZGVmaW5lZCBpbmZyYXN0cnVjdHVyZSB0b3AtbGV2ZWwgZG9tYWluLiBMZWFkaW5nIGRvdHMgYXJlCi0gICAgICogaWdub3JlZCBpZiBwcmVzZW50LiBUaGUgc2VhcmNoIGlzIGNhc2Utc2Vuc2l0aXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIGlUbGQgdGhlIHBhcmFtZXRlciB0byBjaGVjayBmb3IgaW5mcmFzdHJ1Y3R1cmUgVExEIHN0YXR1cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGFuIGluZnJhc3RydWN0dXJlIFRMRAotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmZyYXN0cnVjdHVyZVRsZChTdHJpbmcgaVRsZCkgewotICAgICAgICByZXR1cm4gSU5GUkFTVFJVQ1RVUkVfVExEUy5jb250YWlucyhpVGxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5TdHJpbmc8L2NvZGU+IG1hdGNoZXMgYW55Ci0gICAgICogSUFOQS1kZWZpbmVkIGdlbmVyaWMgdG9wLWxldmVsIGRvbWFpbi4gTGVhZGluZyBkb3RzIGFyZSBpZ25vcmVkCi0gICAgICogaWYgcHJlc2VudC4gVGhlIHNlYXJjaCBpcyBjYXNlLXNlbnNpdGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBnVGxkIHRoZSBwYXJhbWV0ZXIgdG8gY2hlY2sgZm9yIGdlbmVyaWMgVExEIHN0YXR1cwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgZ2VuZXJpYyBUTEQKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkR2VuZXJpY1RsZChTdHJpbmcgZ1RsZCkgewotICAgICAgICByZXR1cm4gR0VORVJJQ19UTERTLmNvbnRhaW5zKGdUbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPlN0cmluZzwvY29kZT4gbWF0Y2hlcyBhbnkKLSAgICAgKiBJQU5BLWRlZmluZWQgY291bnRyeSBjb2RlIHRvcC1sZXZlbCBkb21haW4uIExlYWRpbmcgZG90cyBhcmUKLSAgICAgKiBpZ25vcmVkIGlmIHByZXNlbnQuIFRoZSBzZWFyY2ggaXMgY2FzZS1zZW5zaXRpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2NUbGQgdGhlIHBhcmFtZXRlciB0byBjaGVjayBmb3IgY291bnRyeSBjb2RlIFRMRCBzdGF0dXMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBhIGNvdW50cnkgY29kZSBUTEQKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ291bnRyeUNvZGVUbGQoU3RyaW5nIGNjVGxkKSB7Ci0gICAgICAgIHJldHVybiBDT1VOVFJZX0NPREVfVExEUy5jb250YWlucyhjY1RsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiBtYXRjaGVzIGFueQotICAgICAqIHdpZGVseSB1c2VkICJsb2NhbCIgZG9tYWlucyAobG9jYWxob3N0IG9yIGxvY2FsZG9tYWluKS4gTGVhZGluZyBkb3RzIGFyZQotICAgICAqIGlnbm9yZWQgaWYgcHJlc2VudC4gVGhlIHNlYXJjaCBpcyBjYXNlLXNlbnNpdGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpVGxkIHRoZSBwYXJhbWV0ZXIgdG8gY2hlY2sgZm9yIGxvY2FsIFRMRCBzdGF0dXMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlciBpcyBhbiBsb2NhbCBUTEQKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTG9jYWxUbGQoU3RyaW5nIGlUbGQpIHsKLSAgICAgICAgcmV0dXJuIExPQ0FMX1RMRFMuY29udGFpbnMoaVRsZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNob21wTGVhZGluZ0RvdChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLS0tIFRMRHMgZGVmaW5lZCBieSBJQU5BCi0gICAgLy8gLS0tLS0gQXV0aG9yaXRhdGl2ZSBhbmQgY29tcHJlaGVuc2l2ZSBsaXN0IGF0OgotICAgIC8vIC0tLS0tIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBJTkZSQVNUUlVDVFVSRV9UTERTID0gYXNMaXN0KAotICAgICAgICAiYXJwYSIsICAgICAgICAgICAgICAgLy8gaW50ZXJuZXQgaW5mcmFzdHJ1Y3R1cmUKLSAgICAgICAgInJvb3QiICAgICAgICAgICAgICAgIC8vIGRpYWdub3N0aWMgbWFya2VyIGZvciBub24tdHJ1bmNhdGVkIHJvb3Qgem9uZQotICAgICk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gR0VORVJJQ19UTERTID0gYXNMaXN0KAotICAgICAgICAiYWVybyIsICAgICAgICAgICAgICAgLy8gYWlyIHRyYW5zcG9ydCBpbmR1c3RyeQotICAgICAgICAiYXNpYSIsICAgICAgICAgICAgICAgLy8gUGFuLUFzaWEvQXNpYSBQYWNpZmljCi0gICAgICAgICJiaXoiLCAgICAgICAgICAgICAgICAvLyBidXNpbmVzc2VzCi0gICAgICAgICJjYXQiLCAgICAgICAgICAgICAgICAvLyBDYXRhbGFuIGxpbmd1aXN0aWMvY3VsdHVyYWwgY29tbXVuaXR5Ci0gICAgICAgICJjb20iLCAgICAgICAgICAgICAgICAvLyBjb21tZXJjaWFsIGVudGVycHJpc2VzCi0gICAgICAgICJjb29wIiwgICAgICAgICAgICAgICAvLyBjb29wZXJhdGl2ZSBhc3NvY2lhdGlvbnMKLSAgICAgICAgImluZm8iLCAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uYWwgc2l0ZXMKLSAgICAgICAgImpvYnMiLCAgICAgICAgICAgICAgIC8vIEh1bWFuIFJlc291cmNlIG1hbmFnZXJzCi0gICAgICAgICJtb2JpIiwgICAgICAgICAgICAgICAvLyBtb2JpbGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzCi0gICAgICAgICJtdXNldW0iLCAgICAgICAgICAgICAvLyBtdXNldW1zLCBzdXJwcmlzaW5nbHkgZW5vdWdoCi0gICAgICAgICJuYW1lIiwgICAgICAgICAgICAgICAvLyBpbmRpdmlkdWFscycgc2l0ZXMKLSAgICAgICAgIm5ldCIsICAgICAgICAgICAgICAgIC8vIGludGVybmV0IHN1cHBvcnQgaW5mcmFzdHJ1Y3R1cmUvYnVzaW5lc3MKLSAgICAgICAgIm9yZyIsICAgICAgICAgICAgICAgIC8vIG5vbmNvbW1lcmNpYWwgb3JnYW5pemF0aW9ucwotICAgICAgICAicHJvIiwgICAgICAgICAgICAgICAgLy8gY3JlZGVudGlhbGVkIHByb2Zlc3Npb25hbHMgYW5kIGVudGl0aWVzCi0gICAgICAgICJ0ZWwiLCAgICAgICAgICAgICAgICAvLyBjb250YWN0IGRhdGEgZm9yIGJ1c2luZXNzZXMgYW5kIGluZGl2aWR1YWxzCi0gICAgICAgICJ0cmF2ZWwiLCAgICAgICAgICAgICAvLyBlbnRpdGllcyBpbiB0aGUgdHJhdmVsIGluZHVzdHJ5Ci0gICAgICAgICJnb3YiLCAgICAgICAgICAgICAgICAvLyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQKLSAgICAgICAgImVkdSIsICAgICAgICAgICAgICAgIC8vIGFjY3JlZGl0ZWQgcG9zdHNlY29uZGFyeSBVUyBlZHVjYXRpb24gZW50aXRpZXMKLSAgICAgICAgIm1pbCIsICAgICAgICAgICAgICAgIC8vIFVuaXRlZCBTdGF0ZXMgTWlsaXRhcnkKLSAgICAgICAgImludCIgICAgICAgICAgICAgICAgIC8vIG9yZ2FuaXphdGlvbnMgZXN0YWJsaXNoZWQgYnkgaW50ZXJuYXRpb25hbCB0cmVhdHkKLSAgICApOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IENPVU5UUllfQ09ERV9UTERTID0gYXNMaXN0KAotICAgICAgICAiYWMiLCAgICAgICAgICAgICAgICAgLy8gQXNjZW5zaW9uIElzbGFuZAotICAgICAgICAiYWQiLCAgICAgICAgICAgICAgICAgLy8gQW5kb3JyYQotICAgICAgICAiYWUiLCAgICAgICAgICAgICAgICAgLy8gVW5pdGVkIEFyYWIgRW1pcmF0ZXMKLSAgICAgICAgImFmIiwgICAgICAgICAgICAgICAgIC8vIEFmZ2hhbmlzdGFuCi0gICAgICAgICJhZyIsICAgICAgICAgICAgICAgICAvLyBBbnRpZ3VhIGFuZCBCYXJidWRhCi0gICAgICAgICJhaSIsICAgICAgICAgICAgICAgICAvLyBBbmd1aWxsYQotICAgICAgICAiYWwiLCAgICAgICAgICAgICAgICAgLy8gQWxiYW5pYQotICAgICAgICAiYW0iLCAgICAgICAgICAgICAgICAgLy8gQXJtZW5pYQotICAgICAgICAiYW4iLCAgICAgICAgICAgICAgICAgLy8gTmV0aGVybGFuZHMgQW50aWxsZXMKLSAgICAgICAgImFvIiwgICAgICAgICAgICAgICAgIC8vIEFuZ29sYQotICAgICAgICAiYXEiLCAgICAgICAgICAgICAgICAgLy8gQW50YXJjdGljYQotICAgICAgICAiYXIiLCAgICAgICAgICAgICAgICAgLy8gQXJnZW50aW5hCi0gICAgICAgICJhcyIsICAgICAgICAgICAgICAgICAvLyBBbWVyaWNhbiBTYW1vYQotICAgICAgICAiYXQiLCAgICAgICAgICAgICAgICAgLy8gQXVzdHJpYQotICAgICAgICAiYXUiLCAgICAgICAgICAgICAgICAgLy8gQXVzdHJhbGlhIChpbmNsdWRlcyBBc2htb3JlIGFuZCBDYXJ0aWVyIElzbGFuZHMgYW5kIENvcmFsIFNlYSBJc2xhbmRzKQotICAgICAgICAiYXciLCAgICAgICAgICAgICAgICAgLy8gQXJ1YmEKLSAgICAgICAgImF4IiwgICAgICAgICAgICAgICAgIC8vIMOFbGFuZAotICAgICAgICAiYXoiLCAgICAgICAgICAgICAgICAgLy8gQXplcmJhaWphbgotICAgICAgICAiYmEiLCAgICAgICAgICAgICAgICAgLy8gQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYQotICAgICAgICAiYmIiLCAgICAgICAgICAgICAgICAgLy8gQmFyYmFkb3MKLSAgICAgICAgImJkIiwgICAgICAgICAgICAgICAgIC8vIEJhbmdsYWRlc2gKLSAgICAgICAgImJlIiwgICAgICAgICAgICAgICAgIC8vIEJlbGdpdW0KLSAgICAgICAgImJmIiwgICAgICAgICAgICAgICAgIC8vIEJ1cmtpbmEgRmFzbwotICAgICAgICAiYmciLCAgICAgICAgICAgICAgICAgLy8gQnVsZ2FyaWEKLSAgICAgICAgImJoIiwgICAgICAgICAgICAgICAgIC8vIEJhaHJhaW4KLSAgICAgICAgImJpIiwgICAgICAgICAgICAgICAgIC8vIEJ1cnVuZGkKLSAgICAgICAgImJqIiwgICAgICAgICAgICAgICAgIC8vIEJlbmluCi0gICAgICAgICJibSIsICAgICAgICAgICAgICAgICAvLyBCZXJtdWRhCi0gICAgICAgICJibiIsICAgICAgICAgICAgICAgICAvLyBCcnVuZWkgRGFydXNzYWxhbQotICAgICAgICAiYm8iLCAgICAgICAgICAgICAgICAgLy8gQm9saXZpYQotICAgICAgICAiYnIiLCAgICAgICAgICAgICAgICAgLy8gQnJhemlsCi0gICAgICAgICJicyIsICAgICAgICAgICAgICAgICAvLyBCYWhhbWFzCi0gICAgICAgICJidCIsICAgICAgICAgICAgICAgICAvLyBCaHV0YW4KLSAgICAgICAgImJ2IiwgICAgICAgICAgICAgICAgIC8vIEJvdXZldCBJc2xhbmQKLSAgICAgICAgImJ3IiwgICAgICAgICAgICAgICAgIC8vIEJvdHN3YW5hCi0gICAgICAgICJieSIsICAgICAgICAgICAgICAgICAvLyBCZWxhcnVzCi0gICAgICAgICJieiIsICAgICAgICAgICAgICAgICAvLyBCZWxpemUKLSAgICAgICAgImNhIiwgICAgICAgICAgICAgICAgIC8vIENhbmFkYQotICAgICAgICAiY2MiLCAgICAgICAgICAgICAgICAgLy8gQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMKLSAgICAgICAgImNkIiwgICAgICAgICAgICAgICAgIC8vIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvIChmb3JtZXJseSBaYWlyZSkKLSAgICAgICAgImNmIiwgICAgICAgICAgICAgICAgIC8vIENlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYwotICAgICAgICAiY2ciLCAgICAgICAgICAgICAgICAgLy8gUmVwdWJsaWMgb2YgdGhlIENvbmdvCi0gICAgICAgICJjaCIsICAgICAgICAgICAgICAgICAvLyBTd2l0emVybGFuZAotICAgICAgICAiY2kiLCAgICAgICAgICAgICAgICAgLy8gQ8O0dGUgZCdJdm9pcmUKLSAgICAgICAgImNrIiwgICAgICAgICAgICAgICAgIC8vIENvb2sgSXNsYW5kcwotICAgICAgICAiY2wiLCAgICAgICAgICAgICAgICAgLy8gQ2hpbGUKLSAgICAgICAgImNtIiwgICAgICAgICAgICAgICAgIC8vIENhbWVyb29uCi0gICAgICAgICJjbiIsICAgICAgICAgICAgICAgICAvLyBDaGluYSwgbWFpbmxhbmQKLSAgICAgICAgImNvIiwgICAgICAgICAgICAgICAgIC8vIENvbG9tYmlhCi0gICAgICAgICJjciIsICAgICAgICAgICAgICAgICAvLyBDb3N0YSBSaWNhCi0gICAgICAgICJjdSIsICAgICAgICAgICAgICAgICAvLyBDdWJhCi0gICAgICAgICJjdiIsICAgICAgICAgICAgICAgICAvLyBDYXBlIFZlcmRlCi0gICAgICAgICJjeCIsICAgICAgICAgICAgICAgICAvLyBDaHJpc3RtYXMgSXNsYW5kCi0gICAgICAgICJjeSIsICAgICAgICAgICAgICAgICAvLyBDeXBydXMKLSAgICAgICAgImN6IiwgICAgICAgICAgICAgICAgIC8vIEN6ZWNoIFJlcHVibGljCi0gICAgICAgICJkZSIsICAgICAgICAgICAgICAgICAvLyBHZXJtYW55Ci0gICAgICAgICJkaiIsICAgICAgICAgICAgICAgICAvLyBEamlib3V0aQotICAgICAgICAiZGsiLCAgICAgICAgICAgICAgICAgLy8gRGVubWFyawotICAgICAgICAiZG0iLCAgICAgICAgICAgICAgICAgLy8gRG9taW5pY2EKLSAgICAgICAgImRvIiwgICAgICAgICAgICAgICAgIC8vIERvbWluaWNhbiBSZXB1YmxpYwotICAgICAgICAiZHoiLCAgICAgICAgICAgICAgICAgLy8gQWxnZXJpYQotICAgICAgICAiZWMiLCAgICAgICAgICAgICAgICAgLy8gRWN1YWRvcgotICAgICAgICAiZWUiLCAgICAgICAgICAgICAgICAgLy8gRXN0b25pYQotICAgICAgICAiZWciLCAgICAgICAgICAgICAgICAgLy8gRWd5cHQKLSAgICAgICAgImVyIiwgICAgICAgICAgICAgICAgIC8vIEVyaXRyZWEKLSAgICAgICAgImVzIiwgICAgICAgICAgICAgICAgIC8vIFNwYWluCi0gICAgICAgICJldCIsICAgICAgICAgICAgICAgICAvLyBFdGhpb3BpYQotICAgICAgICAiZXUiLCAgICAgICAgICAgICAgICAgLy8gRXVyb3BlYW4gVW5pb24KLSAgICAgICAgImZpIiwgICAgICAgICAgICAgICAgIC8vIEZpbmxhbmQKLSAgICAgICAgImZqIiwgICAgICAgICAgICAgICAgIC8vIEZpamkKLSAgICAgICAgImZrIiwgICAgICAgICAgICAgICAgIC8vIEZhbGtsYW5kIElzbGFuZHMKLSAgICAgICAgImZtIiwgICAgICAgICAgICAgICAgIC8vIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYQotICAgICAgICAiZm8iLCAgICAgICAgICAgICAgICAgLy8gRmFyb2UgSXNsYW5kcwotICAgICAgICAiZnIiLCAgICAgICAgICAgICAgICAgLy8gRnJhbmNlCi0gICAgICAgICJnYSIsICAgICAgICAgICAgICAgICAvLyBHYWJvbgotICAgICAgICAiZ2IiLCAgICAgICAgICAgICAgICAgLy8gR3JlYXQgQnJpdGFpbiAoVW5pdGVkIEtpbmdkb20pCi0gICAgICAgICJnZCIsICAgICAgICAgICAgICAgICAvLyBHcmVuYWRhCi0gICAgICAgICJnZSIsICAgICAgICAgICAgICAgICAvLyBHZW9yZ2lhCi0gICAgICAgICJnZiIsICAgICAgICAgICAgICAgICAvLyBGcmVuY2ggR3VpYW5hCi0gICAgICAgICJnZyIsICAgICAgICAgICAgICAgICAvLyBHdWVybnNleQotICAgICAgICAiZ2giLCAgICAgICAgICAgICAgICAgLy8gR2hhbmEKLSAgICAgICAgImdpIiwgICAgICAgICAgICAgICAgIC8vIEdpYnJhbHRhcgotICAgICAgICAiZ2wiLCAgICAgICAgICAgICAgICAgLy8gR3JlZW5sYW5kCi0gICAgICAgICJnbSIsICAgICAgICAgICAgICAgICAvLyBUaGUgR2FtYmlhCi0gICAgICAgICJnbiIsICAgICAgICAgICAgICAgICAvLyBHdWluZWEKLSAgICAgICAgImdwIiwgICAgICAgICAgICAgICAgIC8vIEd1YWRlbG91cGUKLSAgICAgICAgImdxIiwgICAgICAgICAgICAgICAgIC8vIEVxdWF0b3JpYWwgR3VpbmVhCi0gICAgICAgICJnciIsICAgICAgICAgICAgICAgICAvLyBHcmVlY2UKLSAgICAgICAgImdzIiwgICAgICAgICAgICAgICAgIC8vIFNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzCi0gICAgICAgICJndCIsICAgICAgICAgICAgICAgICAvLyBHdWF0ZW1hbGEKLSAgICAgICAgImd1IiwgICAgICAgICAgICAgICAgIC8vIEd1YW0KLSAgICAgICAgImd3IiwgICAgICAgICAgICAgICAgIC8vIEd1aW5lYS1CaXNzYXUKLSAgICAgICAgImd5IiwgICAgICAgICAgICAgICAgIC8vIEd1eWFuYQotICAgICAgICAiaGsiLCAgICAgICAgICAgICAgICAgLy8gSG9uZyBLb25nCi0gICAgICAgICJobSIsICAgICAgICAgICAgICAgICAvLyBIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMKLSAgICAgICAgImhuIiwgICAgICAgICAgICAgICAgIC8vIEhvbmR1cmFzCi0gICAgICAgICJociIsICAgICAgICAgICAgICAgICAvLyBDcm9hdGlhIChIcnZhdHNrYSkKLSAgICAgICAgImh0IiwgICAgICAgICAgICAgICAgIC8vIEhhaXRpCi0gICAgICAgICJodSIsICAgICAgICAgICAgICAgICAvLyBIdW5nYXJ5Ci0gICAgICAgICJpZCIsICAgICAgICAgICAgICAgICAvLyBJbmRvbmVzaWEKLSAgICAgICAgImllIiwgICAgICAgICAgICAgICAgIC8vIElyZWxhbmQgKMOJaXJlKQotICAgICAgICAiaWwiLCAgICAgICAgICAgICAgICAgLy8gSXNyYWVsCi0gICAgICAgICJpbSIsICAgICAgICAgICAgICAgICAvLyBJc2xlIG9mIE1hbgotICAgICAgICAiaW4iLCAgICAgICAgICAgICAgICAgLy8gSW5kaWEKLSAgICAgICAgImlvIiwgICAgICAgICAgICAgICAgIC8vIEJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeQotICAgICAgICAiaXEiLCAgICAgICAgICAgICAgICAgLy8gSXJhcQotICAgICAgICAiaXIiLCAgICAgICAgICAgICAgICAgLy8gSXJhbgotICAgICAgICAiaXMiLCAgICAgICAgICAgICAgICAgLy8gSWNlbGFuZAotICAgICAgICAiaXQiLCAgICAgICAgICAgICAgICAgLy8gSXRhbHkKLSAgICAgICAgImplIiwgICAgICAgICAgICAgICAgIC8vIEplcnNleQotICAgICAgICAiam0iLCAgICAgICAgICAgICAgICAgLy8gSmFtYWljYQotICAgICAgICAiam8iLCAgICAgICAgICAgICAgICAgLy8gSm9yZGFuCi0gICAgICAgICJqcCIsICAgICAgICAgICAgICAgICAvLyBKYXBhbgotICAgICAgICAia2UiLCAgICAgICAgICAgICAgICAgLy8gS2VueWEKLSAgICAgICAgImtnIiwgICAgICAgICAgICAgICAgIC8vIEt5cmd5enN0YW4KLSAgICAgICAgImtoIiwgICAgICAgICAgICAgICAgIC8vIENhbWJvZGlhIChLaG1lcikKLSAgICAgICAgImtpIiwgICAgICAgICAgICAgICAgIC8vIEtpcmliYXRpCi0gICAgICAgICJrbSIsICAgICAgICAgICAgICAgICAvLyBDb21vcm9zCi0gICAgICAgICJrbiIsICAgICAgICAgICAgICAgICAvLyBTYWludCBLaXR0cyBhbmQgTmV2aXMKLSAgICAgICAgImtwIiwgICAgICAgICAgICAgICAgIC8vIE5vcnRoIEtvcmVhCi0gICAgICAgICJrciIsICAgICAgICAgICAgICAgICAvLyBTb3V0aCBLb3JlYQotICAgICAgICAia3ciLCAgICAgICAgICAgICAgICAgLy8gS3V3YWl0Ci0gICAgICAgICJreSIsICAgICAgICAgICAgICAgICAvLyBDYXltYW4gSXNsYW5kcwotICAgICAgICAia3oiLCAgICAgICAgICAgICAgICAgLy8gS2F6YWtoc3RhbgotICAgICAgICAibGEiLCAgICAgICAgICAgICAgICAgLy8gTGFvcyAoY3VycmVudGx5IGJlaW5nIG1hcmtldGVkIGFzIHRoZSBvZmZpY2lhbCBkb21haW4gZm9yIExvcyBBbmdlbGVzKQotICAgICAgICAibGIiLCAgICAgICAgICAgICAgICAgLy8gTGViYW5vbgotICAgICAgICAibGMiLCAgICAgICAgICAgICAgICAgLy8gU2FpbnQgTHVjaWEKLSAgICAgICAgImxpIiwgICAgICAgICAgICAgICAgIC8vIExpZWNodGVuc3RlaW4KLSAgICAgICAgImxrIiwgICAgICAgICAgICAgICAgIC8vIFNyaSBMYW5rYQotICAgICAgICAibHIiLCAgICAgICAgICAgICAgICAgLy8gTGliZXJpYQotICAgICAgICAibHMiLCAgICAgICAgICAgICAgICAgLy8gTGVzb3RobwotICAgICAgICAibHQiLCAgICAgICAgICAgICAgICAgLy8gTGl0aHVhbmlhCi0gICAgICAgICJsdSIsICAgICAgICAgICAgICAgICAvLyBMdXhlbWJvdXJnCi0gICAgICAgICJsdiIsICAgICAgICAgICAgICAgICAvLyBMYXR2aWEKLSAgICAgICAgImx5IiwgICAgICAgICAgICAgICAgIC8vIExpYnlhCi0gICAgICAgICJtYSIsICAgICAgICAgICAgICAgICAvLyBNb3JvY2NvCi0gICAgICAgICJtYyIsICAgICAgICAgICAgICAgICAvLyBNb25hY28KLSAgICAgICAgIm1kIiwgICAgICAgICAgICAgICAgIC8vIE1vbGRvdmEKLSAgICAgICAgIm1lIiwgICAgICAgICAgICAgICAgIC8vIE1vbnRlbmVncm8KLSAgICAgICAgIm1nIiwgICAgICAgICAgICAgICAgIC8vIE1hZGFnYXNjYXIKLSAgICAgICAgIm1oIiwgICAgICAgICAgICAgICAgIC8vIE1hcnNoYWxsIElzbGFuZHMKLSAgICAgICAgIm1rIiwgICAgICAgICAgICAgICAgIC8vIFJlcHVibGljIG9mIE1hY2Vkb25pYQotICAgICAgICAibWwiLCAgICAgICAgICAgICAgICAgLy8gTWFsaQotICAgICAgICAibW0iLCAgICAgICAgICAgICAgICAgLy8gTXlhbm1hcgotICAgICAgICAibW4iLCAgICAgICAgICAgICAgICAgLy8gTW9uZ29saWEKLSAgICAgICAgIm1vIiwgICAgICAgICAgICAgICAgIC8vIE1hY2F1Ci0gICAgICAgICJtcCIsICAgICAgICAgICAgICAgICAvLyBOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMKLSAgICAgICAgIm1xIiwgICAgICAgICAgICAgICAgIC8vIE1hcnRpbmlxdWUKLSAgICAgICAgIm1yIiwgICAgICAgICAgICAgICAgIC8vIE1hdXJpdGFuaWEKLSAgICAgICAgIm1zIiwgICAgICAgICAgICAgICAgIC8vIE1vbnRzZXJyYXQKLSAgICAgICAgIm10IiwgICAgICAgICAgICAgICAgIC8vIE1hbHRhCi0gICAgICAgICJtdSIsICAgICAgICAgICAgICAgICAvLyBNYXVyaXRpdXMKLSAgICAgICAgIm12IiwgICAgICAgICAgICAgICAgIC8vIE1hbGRpdmVzCi0gICAgICAgICJtdyIsICAgICAgICAgICAgICAgICAvLyBNYWxhd2kKLSAgICAgICAgIm14IiwgICAgICAgICAgICAgICAgIC8vIE1leGljbwotICAgICAgICAibXkiLCAgICAgICAgICAgICAgICAgLy8gTWFsYXlzaWEKLSAgICAgICAgIm16IiwgICAgICAgICAgICAgICAgIC8vIE1vemFtYmlxdWUKLSAgICAgICAgIm5hIiwgICAgICAgICAgICAgICAgIC8vIE5hbWliaWEKLSAgICAgICAgIm5jIiwgICAgICAgICAgICAgICAgIC8vIE5ldyBDYWxlZG9uaWEKLSAgICAgICAgIm5lIiwgICAgICAgICAgICAgICAgIC8vIE5pZ2VyCi0gICAgICAgICJuZiIsICAgICAgICAgICAgICAgICAvLyBOb3Jmb2xrIElzbGFuZAotICAgICAgICAibmciLCAgICAgICAgICAgICAgICAgLy8gTmlnZXJpYQotICAgICAgICAibmkiLCAgICAgICAgICAgICAgICAgLy8gTmljYXJhZ3VhCi0gICAgICAgICJubCIsICAgICAgICAgICAgICAgICAvLyBOZXRoZXJsYW5kcwotICAgICAgICAibm8iLCAgICAgICAgICAgICAgICAgLy8gTm9yd2F5Ci0gICAgICAgICJucCIsICAgICAgICAgICAgICAgICAvLyBOZXBhbAotICAgICAgICAibnIiLCAgICAgICAgICAgICAgICAgLy8gTmF1cnUKLSAgICAgICAgIm51IiwgICAgICAgICAgICAgICAgIC8vIE5pdWUKLSAgICAgICAgIm56IiwgICAgICAgICAgICAgICAgIC8vIE5ldyBaZWFsYW5kCi0gICAgICAgICJvbSIsICAgICAgICAgICAgICAgICAvLyBPbWFuCi0gICAgICAgICJwYSIsICAgICAgICAgICAgICAgICAvLyBQYW5hbWEKLSAgICAgICAgInBlIiwgICAgICAgICAgICAgICAgIC8vIFBlcnUKLSAgICAgICAgInBmIiwgICAgICAgICAgICAgICAgIC8vIEZyZW5jaCBQb2x5bmVzaWEgV2l0aCBDbGlwcGVydG9uIElzbGFuZAotICAgICAgICAicGciLCAgICAgICAgICAgICAgICAgLy8gUGFwdWEgTmV3IEd1aW5lYQotICAgICAgICAicGgiLCAgICAgICAgICAgICAgICAgLy8gUGhpbGlwcGluZXMKLSAgICAgICAgInBrIiwgICAgICAgICAgICAgICAgIC8vIFBha2lzdGFuCi0gICAgICAgICJwbCIsICAgICAgICAgICAgICAgICAvLyBQb2xhbmQKLSAgICAgICAgInBtIiwgICAgICAgICAgICAgICAgIC8vIFNhaW50LVBpZXJyZSBhbmQgTWlxdWVsb24KLSAgICAgICAgInBuIiwgICAgICAgICAgICAgICAgIC8vIFBpdGNhaXJuIElzbGFuZHMKLSAgICAgICAgInByIiwgICAgICAgICAgICAgICAgIC8vIFB1ZXJ0byBSaWNvCi0gICAgICAgICJwcyIsICAgICAgICAgICAgICAgICAvLyBQYWxlc3RpbmlhbiB0ZXJyaXRvcmllcyAoUEEtY29udHJvbGxlZCBXZXN0IEJhbmsgYW5kIEdhemEgU3RyaXApCi0gICAgICAgICJwdCIsICAgICAgICAgICAgICAgICAvLyBQb3J0dWdhbAotICAgICAgICAicHciLCAgICAgICAgICAgICAgICAgLy8gUGFsYXUKLSAgICAgICAgInB5IiwgICAgICAgICAgICAgICAgIC8vIFBhcmFndWF5Ci0gICAgICAgICJxYSIsICAgICAgICAgICAgICAgICAvLyBRYXRhcgotICAgICAgICAicmUiLCAgICAgICAgICAgICAgICAgLy8gUsOpdW5pb24KLSAgICAgICAgInJvIiwgICAgICAgICAgICAgICAgIC8vIFJvbWFuaWEKLSAgICAgICAgInJzIiwgICAgICAgICAgICAgICAgIC8vIFNlcmJpYQotICAgICAgICAicnUiLCAgICAgICAgICAgICAgICAgLy8gUnVzc2lhCi0gICAgICAgICJydyIsICAgICAgICAgICAgICAgICAvLyBSd2FuZGEKLSAgICAgICAgInNhIiwgICAgICAgICAgICAgICAgIC8vIFNhdWRpIEFyYWJpYQotICAgICAgICAic2IiLCAgICAgICAgICAgICAgICAgLy8gU29sb21vbiBJc2xhbmRzCi0gICAgICAgICJzYyIsICAgICAgICAgICAgICAgICAvLyBTZXljaGVsbGVzCi0gICAgICAgICJzZCIsICAgICAgICAgICAgICAgICAvLyBTdWRhbgotICAgICAgICAic2UiLCAgICAgICAgICAgICAgICAgLy8gU3dlZGVuCi0gICAgICAgICJzZyIsICAgICAgICAgICAgICAgICAvLyBTaW5nYXBvcmUKLSAgICAgICAgInNoIiwgICAgICAgICAgICAgICAgIC8vIFNhaW50IEhlbGVuYQotICAgICAgICAic2kiLCAgICAgICAgICAgICAgICAgLy8gU2xvdmVuaWEKLSAgICAgICAgInNqIiwgICAgICAgICAgICAgICAgIC8vIFN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4gSXNsYW5kcyBOb3QgaW4gdXNlIChOb3J3ZWdpYW4gZGVwZW5kZW5jaWVzOyBzZWUgLm5vKQotICAgICAgICAic2siLCAgICAgICAgICAgICAgICAgLy8gU2xvdmFraWEKLSAgICAgICAgInNsIiwgICAgICAgICAgICAgICAgIC8vIFNpZXJyYSBMZW9uZQotICAgICAgICAic20iLCAgICAgICAgICAgICAgICAgLy8gU2FuIE1hcmlubwotICAgICAgICAic24iLCAgICAgICAgICAgICAgICAgLy8gU2VuZWdhbAotICAgICAgICAic28iLCAgICAgICAgICAgICAgICAgLy8gU29tYWxpYQotICAgICAgICAic3IiLCAgICAgICAgICAgICAgICAgLy8gU3VyaW5hbWUKLSAgICAgICAgInN0IiwgICAgICAgICAgICAgICAgIC8vIFPDo28gVG9tw6kgYW5kIFByw61uY2lwZQotICAgICAgICAic3UiLCAgICAgICAgICAgICAgICAgLy8gU292aWV0IFVuaW9uIChkZXByZWNhdGVkKQotICAgICAgICAic3YiLCAgICAgICAgICAgICAgICAgLy8gRWwgU2FsdmFkb3IKLSAgICAgICAgInN5IiwgICAgICAgICAgICAgICAgIC8vIFN5cmlhCi0gICAgICAgICJzeiIsICAgICAgICAgICAgICAgICAvLyBTd2F6aWxhbmQKLSAgICAgICAgInRjIiwgICAgICAgICAgICAgICAgIC8vIFR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcwotICAgICAgICAidGQiLCAgICAgICAgICAgICAgICAgLy8gQ2hhZAotICAgICAgICAidGYiLCAgICAgICAgICAgICAgICAgLy8gRnJlbmNoIFNvdXRoZXJuIGFuZCBBbnRhcmN0aWMgTGFuZHMKLSAgICAgICAgInRnIiwgICAgICAgICAgICAgICAgIC8vIFRvZ28KLSAgICAgICAgInRoIiwgICAgICAgICAgICAgICAgIC8vIFRoYWlsYW5kCi0gICAgICAgICJ0aiIsICAgICAgICAgICAgICAgICAvLyBUYWppa2lzdGFuCi0gICAgICAgICJ0ayIsICAgICAgICAgICAgICAgICAvLyBUb2tlbGF1Ci0gICAgICAgICJ0bCIsICAgICAgICAgICAgICAgICAvLyBFYXN0IFRpbW9yIChkZXByZWNhdGVkIG9sZCBjb2RlKQotICAgICAgICAidG0iLCAgICAgICAgICAgICAgICAgLy8gVHVya21lbmlzdGFuCi0gICAgICAgICJ0biIsICAgICAgICAgICAgICAgICAvLyBUdW5pc2lhCi0gICAgICAgICJ0byIsICAgICAgICAgICAgICAgICAvLyBUb25nYQotICAgICAgICAidHAiLCAgICAgICAgICAgICAgICAgLy8gRWFzdCBUaW1vcgotICAgICAgICAidHIiLCAgICAgICAgICAgICAgICAgLy8gVHVya2V5Ci0gICAgICAgICJ0dCIsICAgICAgICAgICAgICAgICAvLyBUcmluaWRhZCBhbmQgVG9iYWdvCi0gICAgICAgICJ0diIsICAgICAgICAgICAgICAgICAvLyBUdXZhbHUKLSAgICAgICAgInR3IiwgICAgICAgICAgICAgICAgIC8vIFRhaXdhbiwgUmVwdWJsaWMgb2YgQ2hpbmEKLSAgICAgICAgInR6IiwgICAgICAgICAgICAgICAgIC8vIFRhbnphbmlhCi0gICAgICAgICJ1YSIsICAgICAgICAgICAgICAgICAvLyBVa3JhaW5lCi0gICAgICAgICJ1ZyIsICAgICAgICAgICAgICAgICAvLyBVZ2FuZGEKLSAgICAgICAgInVrIiwgICAgICAgICAgICAgICAgIC8vIFVuaXRlZCBLaW5nZG9tCi0gICAgICAgICJ1bSIsICAgICAgICAgICAgICAgICAvLyBVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMKLSAgICAgICAgInVzIiwgICAgICAgICAgICAgICAgIC8vIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQotICAgICAgICAidXkiLCAgICAgICAgICAgICAgICAgLy8gVXJ1Z3VheQotICAgICAgICAidXoiLCAgICAgICAgICAgICAgICAgLy8gVXpiZWtpc3RhbgotICAgICAgICAidmEiLCAgICAgICAgICAgICAgICAgLy8gVmF0aWNhbiBDaXR5IFN0YXRlCi0gICAgICAgICJ2YyIsICAgICAgICAgICAgICAgICAvLyBTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcwotICAgICAgICAidmUiLCAgICAgICAgICAgICAgICAgLy8gVmVuZXp1ZWxhCi0gICAgICAgICJ2ZyIsICAgICAgICAgICAgICAgICAvLyBCcml0aXNoIFZpcmdpbiBJc2xhbmRzCi0gICAgICAgICJ2aSIsICAgICAgICAgICAgICAgICAvLyBVLlMuIFZpcmdpbiBJc2xhbmRzCi0gICAgICAgICJ2biIsICAgICAgICAgICAgICAgICAvLyBWaWV0bmFtCi0gICAgICAgICJ2dSIsICAgICAgICAgICAgICAgICAvLyBWYW51YXR1Ci0gICAgICAgICJ3ZiIsICAgICAgICAgICAgICAgICAvLyBXYWxsaXMgYW5kIEZ1dHVuYQotICAgICAgICAid3MiLCAgICAgICAgICAgICAgICAgLy8gU2Ftb2EgKGZvcm1lcmx5IFdlc3Rlcm4gU2Ftb2EpCi0gICAgICAgICJ5ZSIsICAgICAgICAgICAgICAgICAvLyBZZW1lbgotICAgICAgICAieXQiLCAgICAgICAgICAgICAgICAgLy8gTWF5b3R0ZQotICAgICAgICAieXUiLCAgICAgICAgICAgICAgICAgLy8gU2VyYmlhIGFuZCBNb250ZW5lZ3JvIChvcmlnaW5hbGx5IFl1Z29zbGF2aWEpCi0gICAgICAgICJ6YSIsICAgICAgICAgICAgICAgICAvLyBTb3V0aCBBZnJpY2EKLSAgICAgICAgInptIiwgICAgICAgICAgICAgICAgIC8vIFphbWJpYQotICAgICAgICAienciICAgICAgICAgICAgICAgICAgLy8gWmltYmFid2UKLSAgICApOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IExPQ0FMX1RMRFMgPSBhc0xpc3QoCi0gICAgICAgImxvY2FsaG9zdCIsICAgICAgICAgICAvLyBSRkMyNjA2IGRlZmluZWQKLSAgICAgICAibG9jYWxkb21haW4iICAgICAgICAgIC8vIEFsc28gd2lkZWx5IHVzZWQgYXMgbG9jYWxob3N0LmxvY2FsZG9tYWluCi0gICApOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRG9tYWluIGRvbWFpbikgewotICAgICAgICBhbGxvd0xvY2FsID0gZG9tYWluLmFsbG93TG9jYWwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvSW5ldEFkZHJlc3MuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvSW5ldEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjM2JjMC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0luZXRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5uZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiA8cD4KLSAqIC0tCi0gKiBUT0RPIC0gVGhpcyBjbGFzcyBpcyBOT1QgcGFydCBvZiB0aGUgYmVhbl92YWxpZGF0aW9uIHNwZWMgYW5kIG1pZ2h0IGRpc2FwcGVhcgotICogYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMgYSBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCi0gKiAtLQotICogPC9wPgotICogRGVzY3JpcHRpb246IGFubm90YXRpb24gdG8gdmFsaWRhdGUgYSBqYXZhLmlvLkZpbGUgaXMgYSBkaXJlY3Rvcnk8YnIvPgotICovCi1ARG9jdW1lbnRlZAotQENvbnN0cmFpbnQoIHZhbGlkYXRlZEJ5ID0gSW5ldEFkZHJlc3NWYWxpZGF0b3IuY2xhc3MgKQotQFRhcmdldCggeyBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVIgfSApCi1AUmV0ZW50aW9uKCBSVU5USU1FICkKLXB1YmxpYyBAaW50ZXJmYWNlIEluZXRBZGRyZXNzIHsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0LkluZXRBZGRyZXNzLm1lc3NhZ2V9IjsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0luZXRBZGRyZXNzVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0luZXRBZGRyZXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODk2ZjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL25ldC9JbmV0QWRkcmVzc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0OwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLQotLyoqCi0gKiA8cD48Yj5JbmV0QWRkcmVzczwvYj4gdmFsaWRhdGlvbiBhbmQgY29udmVyc2lvbiByb3V0aW5lcyAoPGNvZGU+amF2YS5uZXQuSW5ldEFkZHJlc3M8L2NvZGU+KS48L3A+Ci0gKgotICogPHA+VGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIHZhbGlkYXRlIGEgY2FuZGlkYXRlIElQIGFkZHJlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmV0QWRkcmVzc1ZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8SW5ldEFkZHJlc3MsIFN0cmluZz4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBJUFY0X1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIl4oWzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoWzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoWzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoWzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKSQiKTsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoIUlQVjRfUEFUVEVSTi5tYXRjaGVyKHZhbHVlKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEluZXRBZGRyZXNzIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyAoYXMgbG9uZyBhcyBJbmV0QWRkcmVzcyBoYXMgbm8gcHJvcGVydGllcykKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvcGFja2FnZS1pbmZvLmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U3NTUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBuZXQgY29uc3RyYWludHMgdmFsaWRhdG9ycy4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLm5ldDsKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9wYWNrYWdlLWluZm8uamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmNDIzYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDb250YWlucyBjb25zdHJhaW50cyB0aGF0IGFyZSBOT1QgcGFydCBvZiB0aGUgQmVhbiBWYWxpZGF0aW9uIHNwZWNpZmljYXRpb24KLSAqIGFuZCBtaWdodCBkaXNhcHBlYXIgYXMgc29vbiBhcyBhIGZpbmFsIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gY29udGFpbnMKLSAqIHNpbWlsYXIgZnVuY3Rpb25hbGl0aWVzLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHM7CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9BQkFOdW1iZXJWYWxpZGF0b3JUZXN0LmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9BQkFOdW1iZXJWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDVlNjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvQUJBTnVtYmVyVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotCi0vKioKLSAqIEFCQSBOdW1iZXIgVmFsaWRhdG9yIFRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBQkFOdW1iZXJWYWxpZGF0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RDaGVja0RpZ2l0VGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29uc3RyYWludFZhbGlkYXRvcjw/IGV4dGVuZHMgQW5ub3RhdGlvbiwgU3RyaW5nPiBnZXRDb25zdHJhaW50KCkgewotICAgICAgICByZXR1cm4gbmV3IEFCQU51bWJlclZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiMTIzNDU2NzgwIiwKLSAgICAgICAgICAgICIxMjMxMjMxMjMiLAotICAgICAgICAgICAgIjAxMTAwMDAxNSIsCi0gICAgICAgICAgICAiMTExMDAwMDM4IiwKLSAgICAgICAgICAgICIyMzEzODExMTYiLAotICAgICAgICAgICAgIjEyMTE4MTk3NiIKLSAgICAgICAgfTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0Fic3RyYWN0Q2hlY2tEaWdpdFRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0Fic3RyYWN0Q2hlY2tEaWdpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNTE5OC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9BYnN0cmFjdENoZWNrRGlnaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hlY2tEaWdpdFRlc3QgewotCi0gICAgLyoqIENoZWNrIGRpZ2l0IHJvdXRpbmUgYmVpbmcgdGVzdGVkICovCi0gICAgcHJpdmF0ZSBpbnQgY2hlY2tEaWdpdEx0aDsKLQotICAgIC8qKiBDaGVjayBkaWdpdCByb3V0aW5lIGJlaW5nIHRlc3RlZCAqLwotICAgIHByaXZhdGUgQ29uc3RyYWludFZhbGlkYXRvcjw/IGV4dGVuZHMgQW5ub3RhdGlvbiwgU3RyaW5nPiByb3V0aW5lOwotCi0gICAgLyoqIEFycmF5IG9mIHZhbGlkIGNvZGUgdmFsdWVzICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB2YWxpZDsKLQotICAgIC8qKiBBcnJheSBvZiBpbnZhbGlkIGNvZGUgdmFsdWVzICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBpbnZhbGlkOwotCi0gICAgLyoqIGNvZGUgdmFsdWUgd2hpY2ggc3VtcyB0byB6ZXJvICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgemVyb1N1bTsKLQotICAgIC8qKiBQcmVmaXggZm9yIGVycm9yIG1lc3NhZ2VzICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWlzc2luZ01lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgaW50IGdldENoZWNrRGlnaXRMdGgoKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCBTdHJpbmc+IGdldENvbnN0cmFpbnQoKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZCgpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEludmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyIxMjM0NTY3OEEifTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFplcm9TdW0oKSB7Ci0gICAgICAgIHJldHVybiAiMDAwMDAwMDAwMCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaXNzaW5nTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuICJDb2RlIGlzIG1pc3NpbmciOwotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgY2hlY2tEaWdpdEx0aCA9IGdldENoZWNrRGlnaXRMdGgoKTsKLSAgICAgICAgcm91dGluZSA9IGdldENvbnN0cmFpbnQoKTsKLSAgICAgICAgdmFsaWQgPSBnZXRWYWxpZCgpOwotICAgICAgICBpbnZhbGlkID0gZ2V0SW52YWxpZCgpOwotICAgICAgICB6ZXJvU3VtID0gZ2V0WmVyb1N1bSgpOwotICAgICAgICBtaXNzaW5nTWVzc2FnZSA9IGdldE1pc3NpbmdNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVhciBEb3duIC0gY2xlYXJzIHJvdXRpbmUgYW5kIHZhbGlkIGNvZGVzLgotICAgICAqLwotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICB2YWxpZCA9IG51bGw7Ci0gICAgICAgIHJvdXRpbmUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgaXNWYWxpZCgpIGZvciB2YWxpZCB2YWx1ZXMuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFRydWUoKSB7Ci0gICAgICAgIC8vIHRlc3QgdmFsaWQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInZhbGlkWyIgKyBpICsiXTogIiArIHZhbGlkW2ldLCByb3V0aW5lLmlzVmFsaWQodmFsaWRbaV0sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgaXNWYWxpZCgpIGZvciBpbnZhbGlkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkRmFsc2UoKSB7Ci0gICAgICAgIC8vIHRlc3QgaW52YWxpZCBjb2RlIHZhbHVlcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJpbnZhbGlkWyIgKyBpICsiXTogIiArIGludmFsaWRbaV0sIHJvdXRpbmUuaXNWYWxpZChpbnZhbGlkW2ldLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0ZXN0IGludmFsaWQgY2hlY2sgZGlnaXQgdmFsdWVzCi0gICAgICAgIFN0cmluZ1tdIGludmFsaWRDaGVja0RpZ2l0cyA9IGNyZWF0ZUludmFsaWRDb2Rlcyh2YWxpZCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZENoZWNrRGlnaXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiaW52YWxpZCBjaGVjayBkaWdpdFsiICsgaSArIl06ICIgKyBpbnZhbGlkQ2hlY2tEaWdpdHNbaV0sIHJvdXRpbmUuaXNWYWxpZChpbnZhbGlkQ2hlY2tEaWdpdHNbaV0sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWlzc2luZyBjb2RlCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0NvZGUoKSB7Ci0gICAgICAgIC8vIGlzVmFsaWQoKSB6ZXJvIGxlbmd0aAotICAgICAgICBhc3NlcnRGYWxzZSgiaXNWYWxpZCgpIFplcm8gTGVuZ3RoIiwgcm91dGluZS5pc1ZhbGlkKCIiLCBudWxsKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB6ZXJvIHN1bQotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFplcm9TdW0oKSB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJpc1ZhbGlkKCkgWmVybyBTdW0iLCByb3V0aW5lLmlzVmFsaWQoemVyb1N1bSwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29kZXMgd2l0aCBpbnZhbGlkIGNoZWNrIGRpZ2l0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2RlcyBDb2RlcyB3aXRoIHZhbGlkIGNoZWNrIGRpZ2l0cwotICAgICAqIEByZXR1cm4gQ29kZXMgd2l0aCBpbnZhbGlkIGNoZWNrIGRpZ2l0cwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVJbnZhbGlkQ29kZXMoU3RyaW5nW10gY29kZXMpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvLyBjcmVhdGUgaW52YWxpZCBjaGVjayBkaWdpdCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGNvZGUgPSByZW1vdmVDaGVja0RpZ2l0KGNvZGVzW2ldKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGVjayAgPSBjaGVja0RpZ2l0KGNvZGVzW2ldKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyID0gICIiICsgQ2hhcmFjdGVyLmZvckRpZ2l0KGosIDEwKTsKLSAgICAgICAgICAgICAgICBpZiAoIWN1cnIuZXF1YWxzKGNoZWNrKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChjb2RlICsgY3Vycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvZGUgd2l0aCB0aGUgQ2hlY2sgRGlnaXQgKGkuZS4gbGFzdCBjaGFyYWN0ZXIpIHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29kZSBUaGUgY29kZQotICAgICAqIEByZXR1cm4gVGhlIGNvZGUgd2l0aG91dCB0aGUgY2hlY2sgZGlnaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlbW92ZUNoZWNrRGlnaXQoU3RyaW5nIGNvZGUpIHsKLSAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCB8fCBjb2RlLmxlbmd0aCgpIDw9IGNoZWNrRGlnaXRMdGgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb2RlLnN1YnN0cmluZygwLCBjb2RlLmxlbmd0aCgpIC0gY2hlY2tEaWdpdEx0aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hlY2sgZGlnaXQgKGkuZS4gbGFzdCBjaGFyYWN0ZXIpIGZvciBhIGNvZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29kZSBUaGUgY29kZQotICAgICAqIEByZXR1cm4gVGhlIGNoZWNrIGRpZ2l0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjaGVja0RpZ2l0KFN0cmluZyBjb2RlKSB7Ci0gICAgICAgIGlmIChjb2RlID09IG51bGwgfHwgY29kZS5sZW5ndGgoKSA8PSBjaGVja0RpZ2l0THRoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHN0YXJ0ID0gY29kZS5sZW5ndGgoKSAtIGNoZWNrRGlnaXRMdGg7Ci0gICAgICAgIHJldHVybiBjb2RlLnN1YnN0cmluZyhzdGFydCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9DVVNJUFZhbGlkYXRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0NVU0lQVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTIyNjI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0NVU0lQVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotCi0vKioKLSAqIENVU0lQIENoZWNrIERpZ2l0IFRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDVVNJUFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENoZWNrRGlnaXRUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCBTdHJpbmc+IGdldENvbnN0cmFpbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1VTSVBWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIjAzNzgzMzEwMCIsCi0gICAgICAgICAgICAiOTMxMTQyMTAzIiwKLSAgICAgICAgICAgICI4Mzc2NDkxMjgiLAotICAgICAgICAgICAgIjM5MjY5MFFUMyIsCi0gICAgICAgICAgICAiNTk0OTE4MTA0IiwKLSAgICAgICAgICAgICI4Njc3MEcxMDEiLAotICAgICAgICAgICAgIlk4Mjk1TjEwOSIsCi0gICAgICAgICAgICAiRzg1NzJGMTAwIgotICAgICAgICB9OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRJbnZhbGlkKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiMDM3OCMzMTAwIn07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvRUFOMTNDaGVja0RpZ2l0VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvRUFOMTNDaGVja0RpZ2l0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg4NWZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0VBTjEzQ2hlY2tEaWdpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLQotLyoqCi0gKiBFQU4tMTMgQ2hlY2sgRGlnaXQgVGVzdC4KLSAqLwotcHVibGljIGNsYXNzIEVBTjEzQ2hlY2tEaWdpdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENoZWNrRGlnaXRUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCBTdHJpbmc+IGdldENvbnN0cmFpbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRUFOMTNWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIjk3ODAwNzIxMjk1MTkiLAotICAgICAgICAgICAgIjk3ODA3NjQ1NTgzMTMiLAotICAgICAgICAgICAgIjQwMjU1MTUzNzM0MzgiLAotICAgICAgICAgICAgIjAwOTU2NzM0MDAzMzIiCi0gICAgICAgIH07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9JQkFOQ2hlY2tEaWdpdFRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lCQU5DaGVja0RpZ2l0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmVkN2QyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lCQU5DaGVja0RpZ2l0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBJVkFOIENoZWNrIERpZ2l0IFRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBJQkFOQ2hlY2tEaWdpdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENoZWNrRGlnaXRUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tEaWdpdEx0aCgpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRWYWxpZGF0b3I8PyBleHRlbmRzIEFubm90YXRpb24sIFN0cmluZz4gZ2V0Q29uc3RyYWludCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJQkFOVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJBRDEyMDAwMTIwMzAyMDAzNTkxMDAxMDAiLAotICAgICAgICAgICAgIkFUNjExOTA0MzAwMjM0NTczMjAxIiwKLSAgICAgICAgICAgICJBVDYxMTkwNDMwMDIzNDU3MzIwMSIsCi0gICAgICAgICAgICAiQkU2ODUzOTAwNzU0NzAzNCIsCi0gICAgICAgICAgICAiQkU2MjUxMDAwNzU0NzA2MSIsCi0gICAgICAgICAgICAiQ1kxNzAwMjAwMTI4MDAwMDAwMTIwMDUyNzYwMCIsCi0gICAgICAgICAgICAiQ1o2NTA4MDAwMDAwMTkyMDAwMTQ1Mzk5IiwKLSAgICAgICAgICAgICJESzUwMDA0MDA0NDAxMTYyNDMiLAotICAgICAgICAgICAgIkVFMzgyMjAwMjIxMDIwMTQ1Njg1IiwKLSAgICAgICAgICAgICJGSTIxMTIzNDU2MDAwMDA3ODUiLAotICAgICAgICAgICAgIkZSMTQyMDA0MTAxMDA1MDUwMDAxM00wMjYwNiIsCi0gICAgICAgICAgICAiREU4OTM3MDQwMDQ0MDUzMjAxMzAwMCIsCi0gICAgICAgICAgICAiR0k3NU5XQkswMDAwMDAwMDcwOTk0NTMiLAotICAgICAgICAgICAgIkdSMTYwMTEwMTI1MDAwMDAwMDAxMjMwMDY5NSIsCi0gICAgICAgICAgICAiSFU0MjExNzczMDE2MTExMTEwMTgwMDAwMDAwMCIsCi0gICAgICAgICAgICAiSVMxNDAxNTkyNjAwNzY1NDU1MTA3MzAzMzkiLAotICAgICAgICAgICAgIklFMjlBSUJLOTMxMTUyMTIzNDU2NzgiLAotICAgICAgICAgICAgIklUNjBYMDU0MjgxMTEwMTAwMDAwMDEyMzQ1NiIsCi0gICAgICAgICAgICAiTFY4MEJBTkswMDAwNDM1MTk1MDAxIiwKLSAgICAgICAgICAgICJMVDEyMTAwMDAxMTEwMTAwMTAwMCIsCi0gICAgICAgICAgICAiTFUyODAwMTk0MDA2NDQ3NTAwMDAiLAotICAgICAgICAgICAgIk5MOTFBQk5BMDQxNzE2NDMwMCIsCi0gICAgICAgICAgICAiTk85Mzg2MDExMTE3OTQ3IiwKLSAgICAgICAgICAgICJQTDI3MTE0MDIwMDQwMDAwMzAwMjAxMzU1Mzg3IiwKLSAgICAgICAgICAgICJQVDUwMDAwMjAxMjMxMjM0NTY3ODkwMTU0IiwKLSAgICAgICAgICAgICJTSzMxMTIwMDAwMDAxOTg3NDI2Mzc1NDEiLAotICAgICAgICAgICAgIlNJNTYxOTEwMDAwMDAxMjM0MzgiLAotICAgICAgICAgICAgIkVTODAyMzEwMDAwMTE4MDAwMDAxMjM0NSIsCi0gICAgICAgICAgICAiU0UzNTUwMDAwMDAwMDU0OTEwMDAwMDAzIiwKLSAgICAgICAgICAgICJDSDM5MDA3MDAxMTUyMDE4NDkxNzMiLAotICAgICAgICAgICAgIkdCMjlOV0JLNjAxNjEzMzE5MjY4MTkiCi0gICAgICAgIH07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEludmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyI1MTAwMDcrNDcwNjFCRTYzIn07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRaZXJvU3VtKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pc3NpbmdNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gIkludmFsaWQgQ29kZSBsZW5ndGg9MCI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCB6ZXJvIHN1bQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBUZXN0Ci0gICAgQElnbm9yZQotICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvU3VtKCkgewotICAgICAgICAvLyBpZ25vcmUsIGRvbid0IHJ1biB0aGlzIHRlc3QKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gY3JlYXRlSW52YWxpZENvZGVzKCBTdHJpbmdbXSBjb2RlcyApIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvLyBjcmVhdGUgaW52YWxpZCBjaGVjayBkaWdpdCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGNvZGUgPSByZW1vdmVDaGVja0RpZ2l0KGNvZGVzW2ldKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGVjayAgPSBjaGVja0RpZ2l0KGNvZGVzW2ldKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTY7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyID0gIGogPiA5ID8gIiIgKyBqIDogIjAiICsgajsKLSAgICAgICAgICAgICAgICBpZiAoIWN1cnIuZXF1YWxzKGNoZWNrKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChjb2RlLnN1YnN0cmluZygwLCAyKSArIGN1cnIgKyBjb2RlLnN1YnN0cmluZyg0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb2RlIHdpdGggdGhlIENoZWNrIERpZ2l0IChpLmUuIGxhc3QgY2hhcmFjdGVyKSByZW1vdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvZGUgVGhlIGNvZGUKLSAgICAgKiBAcmV0dXJuIFRoZSBjb2RlIHdpdGhvdXQgdGhlIGNoZWNrIGRpZ2l0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZW1vdmVDaGVja0RpZ2l0KFN0cmluZyBjb2RlKSB7Ci0gICAgICAgIHJldHVybiBjb2RlLnN1YnN0cmluZygwLCAyKSArICIwMCIgKyBjb2RlLnN1YnN0cmluZyg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVjayBkaWdpdCAoaS5lLiBsYXN0IGNoYXJhY3RlcikgZm9yIGEgY29kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2RlIFRoZSBjb2RlCi0gICAgICogQHJldHVybiBUaGUgY2hlY2sgZGlnaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoZWNrRGlnaXQoU3RyaW5nIGNvZGUpIHsKLSAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCB8fCBjb2RlLmxlbmd0aCgpIDw9IGdldENoZWNrRGlnaXRMdGgoKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgICAgcmV0dXJuIGNvZGUuc3Vic3RyaW5nKDIsIDQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvSVNCTjEwQ2hlY2tEaWdpdFRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0lTQk4xMENoZWNrRGlnaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWQ4NjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvSVNCTjEwQ2hlY2tEaWdpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLQotLyoqCi0gKiBJU0JOLTEwIENoZWNrIERpZ2l0IFRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBJU0JOMTBDaGVja0RpZ2l0VGVzdCBleHRlbmRzIEFic3RyYWN0Q2hlY2tEaWdpdFRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRWYWxpZGF0b3I8PyBleHRlbmRzIEFubm90YXRpb24sIFN0cmluZz4gZ2V0Q29uc3RyYWludCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJU0JOMTBWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIjE5MzAxMTA5OTUiLAotICAgICAgICAgICAgIjAyMDE2MzM4NVgiLAotICAgICAgICAgICAgIjE5MzIzOTQzNTQiLAotICAgICAgICAgICAgIjE1OTA1OTYyNzciCi0gICAgICAgIH07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvY2hlY2tkaWdpdC9MdWhuQ2hlY2tEaWdpdFRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0x1aG5DaGVja0RpZ2l0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWM4MjM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L0x1aG5DaGVja0RpZ2l0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLmNoZWNrZGlnaXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotCi0vKioKLSAqIEx1aG4gQ2hlY2sgRGlnaXQgVGVzdC4KLSAqLwotcHVibGljIGNsYXNzIEx1aG5DaGVja0RpZ2l0VGVzdCBleHRlbmRzIEFic3RyYWN0Q2hlY2tEaWdpdFRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1ZJU0EgICAgICAgPSAiNDQxNzEyMzQ1Njc4OTExMyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfU0hPUlRfVklTQSA9ICI0MjIyMjIyMjIyMjIyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9BTUVYICAgICAgID0gIjM3ODI4MjI0NjMxMDAwNSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfTUFTVEVSQ0FSRCA9ICI1MTA1MTA1MTA1MTA1MTAwIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9ESVNDT1ZFUiAgID0gIjYwMTEwMDA5OTAxMzk0MjQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX0RJTkVSUyAgICAgPSAiMzA1NjkzMDkwMjU5MDQiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRWYWxpZGF0b3I8PyBleHRlbmRzIEFubm90YXRpb24sIFN0cmluZz4gZ2V0Q29uc3RyYWludCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMdWhuVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIFZBTElEX1ZJU0EsCi0gICAgICAgICAgICBWQUxJRF9TSE9SVF9WSVNBLAotICAgICAgICAgICAgVkFMSURfQU1FWCwKLSAgICAgICAgICAgIFZBTElEX01BU1RFUkNBUkQsCi0gICAgICAgICAgICBWQUxJRF9ESVNDT1ZFUiwKLSAgICAgICAgICAgIFZBTElEX0RJTkVSUwotICAgICAgICB9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvU2Vkb2xDaGVja0RpZ2l0VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvU2Vkb2xDaGVja0RpZ2l0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJkZTIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1NlZG9sQ2hlY2tEaWdpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLQotLyoqCi0gKiBTZWRvbCBDaGVjayBEaWdpdCBUZXN0LgotICovCi1wdWJsaWMgY2xhc3MgU2Vkb2xDaGVja0RpZ2l0VGVzdCBleHRlbmRzIEFic3RyYWN0Q2hlY2tEaWdpdFRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENvbnN0cmFpbnRWYWxpZGF0b3I8PyBleHRlbmRzIEFubm90YXRpb24sIFN0cmluZz4gZ2V0Q29uc3RyYWludCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWRvbFZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAiMDI2MzQ5NCIsCi0gICAgICAgICAgICAiMDg3MDYxMiIsCi0gICAgICAgICAgICAiQjA2TFE5NyIsCi0gICAgICAgICAgICAiMzQzNzU3NSIsCi0gICAgICAgICAgICAiQjA3TEY1NSIsCi0gICAgICAgIH07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEludmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyIxMjMjNTY3In07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRaZXJvU3VtKCkgewotICAgICAgICByZXR1cm4gIjAwMDAwMDAiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvVmVyaG9lZmZDaGVja0RpZ2l0VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL2NoZWNrZGlnaXQvVmVyaG9lZmZDaGVja0RpZ2l0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIyMzcyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9jaGVja2RpZ2l0L1ZlcmhvZWZmQ2hlY2tEaWdpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5jaGVja2RpZ2l0OwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICogVmVyaG9lZmYgQ2hlY2sgRGlnaXQgVGVzdC4KLSAqLwotcHVibGljIGNsYXNzIFZlcmhvZWZmQ2hlY2tEaWdpdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdENoZWNrRGlnaXRUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCBTdHJpbmc+IGdldENvbnN0cmFpbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmVyaG9lZmZWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgIjE1IiwKLSAgICAgICAgICAgICIxNDI4NTcwIiwKLSAgICAgICAgICAgICIxMjM0NTY3ODkwMiIKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHplcm8gc3VtCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgQFRlc3QKLSAgICBASWdub3JlCi0gICAgcHVibGljIHZvaWQgdGVzdFplcm9TdW0oKSB7Ci0gICAgICAgIC8vIGlnbm9yZSwgZG9uJ3QgcnVuIHRoaXMgdGVzdAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL25ldC9Eb21haW5WYWxpZGF0b3JUZXN0LmphdmEgYi90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0RvbWFpblZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmMzJlNC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWV4dHJhcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leHRyYXMvY29uc3RyYWludHMvbmV0L0RvbWFpblZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4dHJhcy5jb25zdHJhaW50cy5uZXQuRG9tYWluOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5leHRyYXMuY29uc3RyYWludHMubmV0LkRvbWFpblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgRG9tYWluVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluVmFsaWRhdG9yVGVzdCB7Ci0KLSAgICBwcml2YXRlIERvbWFpblZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHZhbGlkYXRvciA9IG5ldyBEb21haW5WYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZERvbWFpbnMoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoImFwYWNoZS5vcmcgc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoImFwYWNoZS5vcmciLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInd3dy5nb29nbGUuY29tIHNob3VsZCB2YWxpZGF0ZSIsIHZhbGlkYXRvci5pc1ZhbGlkKCJ3d3cuZ29vZ2xlLmNvbSIsIG51bGwpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0LWRvbWFpbi5jb20gc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoInRlc3QtZG9tYWluLmNvbSIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdC0tLWRvbWFpbi5jb20gc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoInRlc3QtLS1kb21haW4uY29tIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0LWQtby1tLWFpbi5jb20gc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoInRlc3QtZC1vLW0tYWluLmNvbSIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidHdvLWxldHRlciBkb21haW4gbGFiZWwgc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoImFzLnVrIiwgbnVsbCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoImNhc2UtaW5zZW5zaXRpdmUgQXBBY2hFLk9yZyBzaG91bGQgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgiQXBBY2hFLk9yZyIsIG51bGwpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJzaW5nbGUtY2hhcmFjdGVyIGRvbWFpbiBsYWJlbCBzaG91bGQgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgiei5jb20iLCBudWxsKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaS5oYXZlLmFuLWV4YW1wbGUuZG9tYWluLm5hbWUgc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoImkuaGF2ZS5hbi1leGFtcGxlLmRvbWFpbi5uYW1lIiwgbnVsbCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWREb21haW5zKCkgewotICAgICAgICBhc3NlcnRGYWxzZSgiYmFyZSBUTEQgLm9yZyBzaG91bGRuJ3QgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgiLm9yZyIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImRvbWFpbiBuYW1lIHdpdGggc3BhY2VzIHNob3VsZG4ndCB2YWxpZGF0ZSIsIHZhbGlkYXRvci5pc1ZhbGlkKCIgYXBhY2hlLm9yZyAiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJkb21haW4gbmFtZSBjb250YWluaW5nIHNwYWNlcyBzaG91bGRuJ3QgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgiYXBhIGNoZS5vcmciLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJkb21haW4gbmFtZSBzdGFydGluZyB3aXRoIGRhc2ggc2hvdWxkbid0IHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoIi10ZXN0ZG9tYWluLm5hbWUiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJkb21haW4gbmFtZSBlbmRpbmcgd2l0aCBkYXNoIHNob3VsZG4ndCB2YWxpZGF0ZSIsIHZhbGlkYXRvci5pc1ZhbGlkKCJ0ZXN0ZG9tYWluLS5uYW1lIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiZG9tYWluIG5hbWUgc3RhcnRpbmcgd2l0aCBtdWx0aXBsZSBkYXNoZXMgc2hvdWxkbid0IHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoIi0tLWMuY29tIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiZG9tYWluIG5hbWUgZW5kaW5nIHdpdGggbXVsdGlwbGUgZGFzaGVzIHNob3VsZG4ndCB2YWxpZGF0ZSIsIHZhbGlkYXRvci5pc1ZhbGlkKCJjLS0uY29tIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiZG9tYWluIG5hbWUgd2l0aCBpbnZhbGlkIFRMRCBzaG91bGRuJ3QgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgiYXBhY2hlLnJvZyIsIG51bGwpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSgiVVJMIHNob3VsZG4ndCB2YWxpZGF0ZSIsIHZhbGlkYXRvci5pc1ZhbGlkKCJodHRwOi8vd3d3LmFwYWNoZS5vcmciLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJFbXB0eSBzdHJpbmcgc2hvdWxkbid0IHZhbGlkYXRlIGFzIGRvbWFpbiBuYW1lIiwgdmFsaWRhdG9yLmlzVmFsaWQoIiAiLCBudWxsKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wTGV2ZWxEb21haW5zKCkgewotICAgICAgICAvLyBpbmZyYXN0cnVjdHVyZSBUTERzCi0gICAgICAgIGFzc2VydFRydWUoIi5hcnBhIHNob3VsZCB2YWxpZGF0ZSBhcyBpVExEIiwgRG9tYWluVmFsaWRhdG9yLmlzVmFsaWRJbmZyYXN0cnVjdHVyZVRsZCgiYXJwYSIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIi5jb20gc2hvdWxkbid0IHZhbGlkYXRlIGFzIGlUTEQiLCBEb21haW5WYWxpZGF0b3IuaXNWYWxpZEluZnJhc3RydWN0dXJlVGxkKCJjb20iKSk7Ci0KLSAgICAgICAgLy8gZ2VuZXJpYyBUTERzCi0gICAgICAgIGFzc2VydFRydWUoIi5uYW1lIHNob3VsZCB2YWxpZGF0ZSBhcyBnVExEIiwgRG9tYWluVmFsaWRhdG9yLmlzVmFsaWRHZW5lcmljVGxkKCJuYW1lIikpOwotICAgICAgICBhc3NlcnRGYWxzZSgiLnVzIHNob3VsZG4ndCB2YWxpZGF0ZSBhcyBnVExEIiwgRG9tYWluVmFsaWRhdG9yLmlzVmFsaWRHZW5lcmljVGxkKCJ1cyIpKTsKLQotICAgICAgICAvLyBjb3VudHJ5IGNvZGUgVExEcwotICAgICAgICBhc3NlcnRUcnVlKCIudWsgc2hvdWxkIHZhbGlkYXRlIGFzIGNjVExEIiwgRG9tYWluVmFsaWRhdG9yLmlzVmFsaWRDb3VudHJ5Q29kZVRsZCgidWsiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCIub3JnIHNob3VsZG4ndCB2YWxpZGF0ZSBhcyBjY1RMRCIsIERvbWFpblZhbGlkYXRvci5pc1ZhbGlkQ291bnRyeUNvZGVUbGQoIm9yZyIpKTsKLQotICAgICAgICAvLyBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICAgIGFzc2VydFRydWUoIi5DT00gc2hvdWxkIHZhbGlkYXRlIGFzIFRMRCIsIHZhbGlkYXRvci5pc1ZhbGlkVGxkKCJDT00iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIi5CaVogc2hvdWxkIHZhbGlkYXRlIGFzIFRMRCIsIHZhbGlkYXRvci5pc1ZhbGlkVGxkKCJCaVoiKSk7Ci0KLSAgICAgICAgLy8gY29ybmVyIGNhc2VzCi0gICAgICAgIGFzc2VydEZhbHNlKCJpbnZhbGlkIFRMRCBzaG91bGRuJ3QgdmFsaWRhdGUiLCB2YWxpZGF0b3IuaXNWYWxpZCgibm9wZSIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImVtcHR5IHN0cmluZyBzaG91bGRuJ3QgdmFsaWRhdGUgYXMgVExEIiwgdmFsaWRhdG9yLmlzVmFsaWQoIiIsIG51bGwpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd0xvY2FsKCkgewotICAgICAgIERvbWFpblZhbGlkYXRvciBub0xvY2FsID0gbmV3IERvbWFpblZhbGlkYXRvcigpOwotICAgICAgIERvbWFpblZhbGlkYXRvciBhbGxvd0xvY2FsID0gbmV3IERvbWFpblZhbGlkYXRvcigpOwotICAgICAgIGFsbG93TG9jYWwuaW5pdGlhbGl6ZSggbmV3IERvbWFpbigpCi0gICAgICAgewotCi0gICAgICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICAgICAgICAgIC8vIG5vdCBuZWVkZWQKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IG5lZWRlZAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2UoKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IG5lZWRlZAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBncm91cHMoKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90IG5lZWRlZAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGxvd0xvY2FsKCkgewotICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgbG9jYWwKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAvLyBEZWZhdWx0IHdvbid0IGFsbG93IGxvY2FsCi0gICAgICAgYXNzZXJ0RmFsc2UoImxvY2FsaG9zdC5sb2NhbGRvbWFpbiBzaG91bGQgdmFsaWRhdGUiLCBub0xvY2FsLmlzVmFsaWQoImxvY2FsaG9zdC5sb2NhbGRvbWFpbiIsIG51bGwpKTsKLSAgICAgICBhc3NlcnRGYWxzZSgibG9jYWxob3N0IHNob3VsZCB2YWxpZGF0ZSIsIG5vTG9jYWwuaXNWYWxpZCgibG9jYWxob3N0IiwgbnVsbCkpOwotCi0gICAgICAgLy8gQnV0IGl0IG1heSBiZSByZXF1ZXN0ZWQKLSAgICAgICBhc3NlcnRUcnVlKCJsb2NhbGhvc3QubG9jYWxkb21haW4gc2hvdWxkIHZhbGlkYXRlIiwgYWxsb3dMb2NhbC5pc1ZhbGlkKCJsb2NhbGhvc3QubG9jYWxkb21haW4iLCBudWxsKSk7Ci0gICAgICAgYXNzZXJ0VHJ1ZSgibG9jYWxob3N0IHNob3VsZCB2YWxpZGF0ZSIsIGFsbG93TG9jYWwuaXNWYWxpZCgibG9jYWxob3N0IiwgbnVsbCkpOwotICAgICAgIGFzc2VydFRydWUoImhvc3RuYW1lIHNob3VsZCB2YWxpZGF0ZSIsIGFsbG93TG9jYWwuaXNWYWxpZCgiaG9zdG5hbWUiLCBudWxsKSk7Ci0gICAgICAgYXNzZXJ0VHJ1ZSgibWFjaGluZW5hbWUgc2hvdWxkIHZhbGlkYXRlIiwgYWxsb3dMb2NhbC5pc1ZhbGlkKCJtYWNoaW5lbmFtZSIsIG51bGwpKTsKLQotICAgICAgIC8vIENoZWNrIHRoZSBsb2NhbGhvc3Qgb25lIHdpdGggYSBmZXcgb3RoZXJzCi0gICAgICAgYXNzZXJ0VHJ1ZSgiYXBhY2hlLm9yZyBzaG91bGQgdmFsaWRhdGUiLCBhbGxvd0xvY2FsLmlzVmFsaWQoImFwYWNoZS5vcmciLCBudWxsKSk7Ci0gICAgICAgYXNzZXJ0RmFsc2UoImRvbWFpbiBuYW1lIHdpdGggc3BhY2VzIHNob3VsZG4ndCB2YWxpZGF0ZSIsIGFsbG93TG9jYWwuaXNWYWxpZCgiIGFwYWNoZS5vcmcgIiwgbnVsbCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElETigpIHsKLSAgICAgICBhc3NlcnRUcnVlKCJiXHUwMGZjY2hlci5jaCBpbiBJRE4gc2hvdWxkIHZhbGlkYXRlIiwgdmFsaWRhdG9yLmlzVmFsaWQoInd3dy54bi0tYmNoZXIta3ZhLmNoIiwgbnVsbCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL25ldC9JbmV0QWRkcmVzc1ZhbGlkYXRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwtZXh0cmFzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4dHJhcy9jb25zdHJhaW50cy9uZXQvSW5ldEFkZHJlc3NWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDMyNzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1leHRyYXMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXh0cmFzL2NvbnN0cmFpbnRzL25ldC9JbmV0QWRkcmVzc1ZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLm5ldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuZXh0cmFzLmNvbnN0cmFpbnRzLm5ldC5JbmV0QWRkcmVzc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3QgY2FzZXMgZm9yIEluZXRBZGRyZXNzVmFsaWRhdG9yLgotICoKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKLSAqLwotcHVibGljIGNsYXNzIEluZXRBZGRyZXNzVmFsaWRhdG9yVGVzdCB7Ci0KLSAgICBwcml2YXRlIEluZXRBZGRyZXNzVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgdmFsaWRhdG9yID0gbmV3IEluZXRBZGRyZXNzVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBJUHMgdGhhdCBwb2ludCB0byByZWFsLCB3ZWxsLWtub3duIGhvc3RzICh3aXRob3V0IGFjdHVhbGx5IGxvb2tpbmcgdGhlbSB1cCkuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ldEFkZHJlc3Nlc0Zyb21UaGVXaWxkKCkgewotICAgICAgICBhc3NlcnRUcnVlKCJ3d3cuYXBhY2hlLm9yZyBJUCBzaG91bGQgYmUgdmFsaWQiLCAgICAgICB2YWxpZGF0b3IuaXNWYWxpZCgiMTQwLjIxMS4xMS4xMzAiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInd3dy5sLmdvb2dsZS5jb20gSVAgc2hvdWxkIGJlIHZhbGlkIiwgICAgIHZhbGlkYXRvci5pc1ZhbGlkKCI3Mi4xNC4yNTMuMTAzIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJmc2Yub3JnIElQIHNob3VsZCBiZSB2YWxpZCIsICAgICAgICAgICAgICB2YWxpZGF0b3IuaXNWYWxpZCgiMTk5LjIzMi40MS41IiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJhcHBzY3MuaWduLmNvbSBJUCBzaG91bGQgYmUgdmFsaWQiLCAgICAgICB2YWxpZGF0b3IuaXNWYWxpZCgiMjE2LjM1LjEyMy44NyIsIG51bGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHZhbGlkIGFuZCBpbnZhbGlkIElQcyBmcm9tIGVhY2ggYWRkcmVzcyBjbGFzcy4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmV0QWRkcmVzc2VzQnlDbGFzcygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY2xhc3MgQSBJUCBzaG91bGQgYmUgdmFsaWQiLCAgICAgICAgICAgICAgdmFsaWRhdG9yLmlzVmFsaWQoIjI0LjI1LjIzMS4xMiIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoImlsbGVnYWwgY2xhc3MgQSBJUCBzaG91bGQgYmUgaW52YWxpZCIsICAgdmFsaWRhdG9yLmlzVmFsaWQoIjIuNDEuMzIuMzI0IiwgbnVsbCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoImNsYXNzIEIgSVAgc2hvdWxkIGJlIHZhbGlkIiwgICAgICAgICAgICAgIHZhbGlkYXRvci5pc1ZhbGlkKCIxMzUuMTQuNDQuMTIiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJpbGxlZ2FsIGNsYXNzIEIgSVAgc2hvdWxkIGJlIGludmFsaWQiLCAgIHZhbGlkYXRvci5pc1ZhbGlkKCIxNTQuMTIzLjQ0MS4xMjMiLCBudWxsKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY2xhc3MgQyBJUCBzaG91bGQgYmUgdmFsaWQiLCAgICAgICAgICAgICAgdmFsaWRhdG9yLmlzVmFsaWQoIjIxMy4yNS4yMjQuMzIiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJpbGxlZ2FsIGNsYXNzIEMgSVAgc2hvdWxkIGJlIGludmFsaWQiLCAgIHZhbGlkYXRvci5pc1ZhbGlkKCIyMDEuNTQzLjIzLjExIiwgbnVsbCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoImNsYXNzIEQgSVAgc2hvdWxkIGJlIHZhbGlkIiwgICAgICAgICAgICAgIHZhbGlkYXRvci5pc1ZhbGlkKCIyMjkuMzUuMTU5LjYiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJpbGxlZ2FsIGNsYXNzIEQgSVAgc2hvdWxkIGJlIGludmFsaWQiLCAgIHZhbGlkYXRvci5pc1ZhbGlkKCIyMzEuNTQuMTEuOTg3IiwgbnVsbCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoImNsYXNzIEUgSVAgc2hvdWxkIGJlIHZhbGlkIiwgICAgICAgICAgICAgIHZhbGlkYXRvci5pc1ZhbGlkKCIyNDguODUuMjQuOTIiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJpbGxlZ2FsIGNsYXNzIEUgSVAgc2hvdWxkIGJlIGludmFsaWQiLCAgIHZhbGlkYXRvci5pc1ZhbGlkKCIyNTAuMjEuMzIzLjQ4IiwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgcmVzZXJ2ZWQgSVBzLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlc2VydmVkSW5ldEFkZHJlc3NlcygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibG9jYWxob3N0IElQIHNob3VsZCBiZSB2YWxpZCIsICAgICAgICAgICAgdmFsaWRhdG9yLmlzVmFsaWQoIjEyNy4wLjAuMSIsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYnJvYWRjYXN0IElQIHNob3VsZCBiZSB2YWxpZCIsICAgICAgICAgICAgdmFsaWRhdG9yLmlzVmFsaWQoIjI1NS4yNTUuMjU1LjI1NSIsIG51bGwpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG9idmlvdXNseSBicm9rZW4gSVBzLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJyb2tlbkluZXRBZGRyZXNzZXMoKSB7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJJUCB3aXRoIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGludmFsaWQiLCAgIHZhbGlkYXRvci5pc1ZhbGlkKCIxMjQuMTQuMzIuYWJjIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiSVAgd2l0aCB0aHJlZSBncm91cHMgc2hvdWxkIGJlIGludmFsaWQiLCB2YWxpZGF0b3IuaXNWYWxpZCgiMjMuNjQuMTIiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJJUCB3aXRoIGZpdmUgZ3JvdXBzIHNob3VsZCBiZSBpbnZhbGlkIiwgIHZhbGlkYXRvci5pc1ZhbGlkKCIyNi4zNC4yMy43Ny4yMzQiLCBudWxsKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWd1aWNlL3BvbS54bWwgYi90cnVuay9idmFsLWd1aWNlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmQ0OTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTwhLS0KLQlNYXZlbiByZWxlYXNlIHBsdWdpbiByZXF1aXJlcyB0aGUgcHJvamVjdCB0YWcgdG8gYmUgb24gYSBzaW5nbGUgbGluZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJ2YWw8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjQ8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5idmFsLWd1aWNlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBCVmFsIDo6IGJ2YWwtZ3VpY2UgKG9wdGlvbmFsKTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkJWYWwgLSBHb29nbGUgR3VpY2UgSW50ZWdyYXRpb248L2Rlc2NyaXB0aW9uPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJ2YWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmJ2YWwuYnVuZGxlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguaW5qZWN0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuaW5qZWN0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VpY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIGRlZmF1bHQgcHJvZmlsZSB1c2luZyBnZXJvbmltby12YWxpZGF0aW9uXzEuMF9zcGVjLmphcgotICAgICAgICAgICAgYWN0aXZlIHdoZW4gcHJvcGVydHkgInJpIiBpcyBub3QgcHJlc2VudC4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlcm9uaW1vPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IXJpPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby12YWxpZGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFsbG93IHVzZXJzIHRvIGNob29zZSBhbiBBUEkgcHJvdmlkZXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgb3B0aW9uYWwgcHJvZmlsZSB1c2luZyBqYXZheC52YWxpZGF0aW9uL3ZhbGlkYXRpb24tYXBpLmphcgotICAgICAgICAgICAgZnJvbSBSSSBtYW51YWxseSBhY3RpdmUgd2hlbiBwcm9wZXJ0eSAiLVByaSIgaXMgcHJvdmlkZWQuCi0gICAgICAgIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5yaTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnJpPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC52YWxpZGF0aW9uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhbGxvdyB1c2VycyB0byBjaG9vc2UgYW4gQVBJIHByb3ZpZGVyIC0tPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGRlZmF1bHRHb2FsPmluc3RhbGw8L2RlZmF1bHRHb2FsPgotCi0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvQ29uZmlndXJhdGlvblN0YXRlUHJvdmlkZXIuamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvQ29uZmlndXJhdGlvblN0YXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljNGRiOC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0NvbmZpZ3VyYXRpb25TdGF0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmd1aWNlOwotCi1pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKLWltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLkJvb3RzdHJhcFN0YXRlOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLkNvbmZpZ3VyYXRpb25TdGF0ZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5WYWxpZGF0aW9uUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNvbmZpZ3VyYXRpb25JbXBsOwotCi0vKioKLSAqIFRoZSB7QGNvZGUgamF2YXgudmFsaWRhdGlvbi5zcGkuQ29uZmlndXJhdGlvblN0YXRlfSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGVQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPENvbmZpZ3VyYXRpb25TdGF0ZT4gewotCi0gICAgQGNvbS5nb29nbGUuaW5qZWN0LkluamVjdChvcHRpb25hbCA9IHRydWUpCi0gICAgcHJpdmF0ZSBCb290c3RyYXBTdGF0ZSBib290c3RyYXBTdGF0ZTsKLQotICAgIEBJbmplY3QKLSAgICBwcml2YXRlIFZhbGlkYXRpb25Qcm92aWRlcjw/PiB2YWxpZGF0aW9uUHJvdmlkZXI7Ci0KLSAgICBASW5qZWN0Ci0gICAgcHJpdmF0ZSBUcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci0KLSAgICBASW5qZWN0Ci0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0KLSAgICBASW5qZWN0Ci0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEJvb3RzdHJhcFN0YXRlKEJvb3RzdHJhcFN0YXRlIGJvb3RzdHJhcFN0YXRlKSB7Ci0gICAgICAgIHRoaXMuYm9vdHN0cmFwU3RhdGUgPSBib290c3RyYXBTdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUHJvdmlkZXIoVmFsaWRhdGlvblByb3ZpZGVyPD8+IHZhbGlkYXRpb25Qcm92aWRlcikgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25Qcm92aWRlciA9IHZhbGlkYXRpb25Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmF2ZXJzYWJsZVJlc29sdmVyKFRyYXZlcnNhYmxlUmVzb2x2ZXIgdHJhdmVyc2FibGVSZXNvbHZlcikgewotICAgICAgICB0aGlzLnRyYXZlcnNhYmxlUmVzb2x2ZXIgPSB0cmF2ZXJzYWJsZVJlc29sdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJbnRlcnBvbGF0b3IoTWVzc2FnZUludGVycG9sYXRvciBtZXNzYWdlSW50ZXJwb2xhdG9yKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUludGVycG9sYXRvciA9IG1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSA9IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvblN0YXRlIGdldCgpIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uSW1wbCh0aGlzLmJvb3RzdHJhcFN0YXRlLCB0aGlzLnZhbGlkYXRpb25Qcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24udHJhdmVyc2FibGVSZXNvbHZlcih0aGlzLnRyYXZlcnNhYmxlUmVzb2x2ZXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLm1lc3NhZ2VJbnRlcnBvbGF0b3IodGhpcy5tZXNzYWdlSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSh0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0d1aWNlQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9HdWljZUF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxN2I3NC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0d1aWNlQXdhcmVDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwotCi0vKioKLSAqIHtAY29kZSBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbiB0aGF0Ci0gKiByZWxpZXMgb24gR29vZ2xlIEd1aWNlLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotQFNpbmdsZXRvbgotZmluYWwgY2xhc3MgR3VpY2VBd2FyZUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgewotCi0gICAgQEluamVjdAotICAgIHByaXZhdGUgSW5qZWN0b3IgaW5qZWN0b3I7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmplY3RvcihJbmplY3RvciBpbmplY3RvcikgewotICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4ga2V5KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldEluc3RhbmNlKGtleSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL1ZhbGlkYXRlLmphdmEgYi90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL1ZhbGlkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2E4MjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGluZ0Fubm90YXRpb247Ci0KLS8qKgotICogTWFya2VyIGZvciBtZXRob2RzIHdoaWNoIGFyZ3VtZW50cyBoYXZlIHRvIGJlIHZhbGlkYXRlZC4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBCaW5kaW5nQW5ub3RhdGlvbgotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QgfSkKLXB1YmxpYyBAaW50ZXJmYWNlIFZhbGlkYXRlIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBncm91cHMgaGF2ZSB0byBiZSB2YWxpZGF0ZWQsIGVtcHR5IGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBncm91cHMgaGF2ZSB0byBiZSB2YWxpZGF0ZWQsIGVtcHR5IGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgLyoqCi0gICAgICogTWFya3MgaWYgdGhlIHJldHVybmVkIG9iamVjdCBieSB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIGV4ZWN1dGlvbiBoYXMgdG8KLSAgICAgKiBiZSB2YWxpZGF0ZWQsIGZhbHNlIGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgYm9vbGVhbiB2YWxpZGF0ZVJldHVybmVkVmFsdWUoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGV4Y2VwdGlvbiByZS10aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHJlLXRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlCi0gICAgICogICAgICAgICB2YWxpZGF0aW9uLgotICAgICAqLwotICAgIENsYXNzPD8gZXh0ZW5kcyBUaHJvd2FibGU+IHJldGhyb3dFeGNlcHRpb25zQXMoKSBkZWZhdWx0IENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uY2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIHdoZW4gdGhyb3dpbmcgdGhlIGN1c3RvbSBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBJdCBzdXBwb3J0cyBqYXZhLnV0aWwuRm9ybWF0dGVyIHBsYWNlIGhvbGRlcnMsIGludGVyY2VwdGVkIG1ldGhvZAotICAgICAqIGFyZ3VtZW50cyB3aWxsIGJlIHVzZWQgYXMgbWVzc2FnZSBmb3JtYXQgYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHdoZW4gdGhyb3dpbmcgdGhlIGN1c3RvbSBleGNlcHRpb24uCi0gICAgICogQHNlZSBqYXZhLnV0aWwuRm9ybWF0dGVyI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikKLSAgICAgKi8KLSAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSgpIGRlZmF1bHQgIiI7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvVmFsaWRhdGVNZXRob2RJbnRlcmNlcHRvci5qYXZhIGIvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0ZU1ldGhvZEludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmY0ODEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0ZU1ldGhvZEludGVyY2VwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFvcGFsbGlhbmNlLmludGVyY2VwdC5NZXRob2RJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYW9wYWxsaWFuY2UuaW50ZXJjZXB0Lk1ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leHRlbnNpb25zLk1ldGhvZFZhbGlkYXRvcjsKLQotLyoqCi0gKiBNZXRob2QgaW50ZXJjZXB0b3IgZm9yIHtAbGluayBWYWxpZGF0ZX0gYW5ub3RhdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0ZU1ldGhvZEludGVyY2VwdG9yIGltcGxlbWVudHMgTWV0aG9kSW50ZXJjZXB0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBDQVVTRV9UWVBFUyA9IG5ldyBDbGFzc1tdeyBUaHJvd2FibGUuY2xhc3MgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gTUVTU0FHRV9DQVVTRV9UWVBFUyA9IG5ldyBDbGFzc1tdeyBTdHJpbmcuY2xhc3MsIFRocm93YWJsZS5jbGFzcyB9OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBWYWxpZGF0b3JGYWN0b3J5fSByZWZlcmVuY2UuCi0gICAgICovCi0gICAgQEluamVjdAotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSB2YWxpZGF0b3JGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIFZhbGlkYXRvckZhY3Rvcnl9IHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JGYWN0b3J5IHRoZSB7QGxpbmsgVmFsaWRhdG9yRmFjdG9yeX0gcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yRmFjdG9yeShWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0b3JGYWN0b3J5ID0gdmFsaWRhdG9yRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoTWV0aG9kSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgVmFsaWRhdGUgdmFsaWRhdGUgPSBpbnZvY2F0aW9uLmdldE1ldGhvZCgpLmdldEFubm90YXRpb24oVmFsaWRhdGUuY2xhc3MpOwotCi0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSB0aGlzLnZhbGlkYXRvckZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgICAgIE1ldGhvZFZhbGlkYXRvciBtZXRob2RWYWxpZGF0b3IgPSB2YWxpZGF0b3IudW53cmFwKE1ldGhvZFZhbGlkYXRvci5jbGFzcyk7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IGNvbnN0cmFpbnRWaW9sYXRpb25zID0gbmV3IEhhc2hTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4oKTsKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBpbnZvY2F0aW9uLmdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBpbnZvY2F0aW9uLmdldE1ldGhvZCgpOwotICAgICAgICBPYmplY3RbXSBhcmd1bWVudHMgPSBpbnZvY2F0aW9uLmdldEFyZ3VtZW50cygpOwotICAgICAgICBDbGFzczw/PltdIGdyb3VwcyA9IHZhbGlkYXRlLmdyb3VwcygpOwotCi0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zLmFkZEFsbChtZXRob2RWYWxpZGF0b3IudmFsaWRhdGVQYXJhbWV0ZXJzKGNsYXp6LAotICAgICAgICAgICAgICAgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICBhcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgZ3JvdXBzKSk7Ci0KLSAgICAgICAgaWYgKCFjb25zdHJhaW50VmlvbGF0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IGdldEV4Y2VwdGlvbihuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVmFsaWRhdGlvbiBlcnJvciB3aGVuIGNhbGxpbmcgbWV0aG9kICclcycgd2l0aCBhcmd1bWVudHMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuZGVlcFRvU3RyaW5nKGFyZ3VtZW50cykpLAotICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9ucyksCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLnJldGhyb3dFeGNlcHRpb25zQXMoKSwKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUuZXhjZXB0aW9uTWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHJldHVybmVkVmFsdWUgPSBpbnZvY2F0aW9uLnByb2NlZWQoKTsKLQotICAgICAgICBpZiAodmFsaWRhdGUudmFsaWRhdGVSZXR1cm5lZFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zLmFkZEFsbChtZXRob2RWYWxpZGF0b3IudmFsaWRhdGVSZXR1cm5lZFZhbHVlKGNsYXp6LCBtZXRob2QsIHJldHVybmVkVmFsdWUsIGdyb3VwcykpOwotCi0gICAgICAgICAgICBpZiAoIWNvbnN0cmFpbnRWaW9sYXRpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IGdldEV4Y2VwdGlvbihuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIk1ldGhvZCAnJXMnIHJldHVybmVkIGEgbm90IHZhbGlkIHZhbHVlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLnJldGhyb3dFeGNlcHRpb25zQXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlLmV4Y2VwdGlvbk1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuZWRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZpbmUgdGhlIHtAbGluayBUaHJvd2FibGV9IGhhcyB0byBiZSB0aHJvd24gd2hlbiBhIHZhbGlkYXRpb24gZXJyb3IKLSAgICAgKiBvY2N1cnMgYW5kIHRoZSB1c2VyIGRlZmluZWQgdGhlIGN1c3RvbSBlcnJvciB3cmFwcGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgb2NjdXJyZWQgdmFsaWRhdGlvbiBlcnJvci4KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uV3JhcHBlckNsYXNzIHRoZSB1c2VyIGRlZmluZWQgY3VzdG9tIGVycm9yIHdyYXBwZXIuCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFRocm93YWJsZX0gaGFzIG8gYmUgdGhyb3duLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24sCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBleGNlcHRpb25XcmFwcGVyQ2xhc3MsCi0gICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSwKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cykgewotICAgICAgICAvLyBjaGVjayB0aGUgdGhyb3duIGV4Y2VwdGlvbiBpcyBvZiBzYW1lIHJlLXRocm93IHR5cGUKLSAgICAgICAgaWYgKGV4Y2VwdGlvbldyYXBwZXJDbGFzcyA9PSBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiBhcyBuZXcgZXhjZXB0aW9uCi0gICAgICAgIFRocm93YWJsZSByZXRocm93RXggPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0gICAgICAgIE9iamVjdFtdIGluaXRhcmdzOwotICAgICAgICBDbGFzczw/PltdIGluaXRhcmdzVHlwZTsKLQotICAgICAgICBpZiAoZXhjZXB0aW9uTWVzc2FnZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KGV4Y2VwdGlvbk1lc3NhZ2UsIGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICBpbml0YXJncyA9IG5ldyBPYmplY3RbXXsgZXJyb3JNZXNzYWdlLCBleGNlcHRpb24gfTsKLSAgICAgICAgICAgIGluaXRhcmdzVHlwZSA9IE1FU1NBR0VfQ0FVU0VfVFlQRVM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbml0YXJncyA9IG5ldyBPYmplY3RbXXsgZXhjZXB0aW9uIH07Ci0gICAgICAgICAgICBpbml0YXJnc1R5cGUgPSBDQVVTRV9UWVBFUzsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBUaHJvd2FibGU+IGV4Y2VwdGlvbkNvbnN0cnVjdG9yID0gZ2V0TWF0Y2hpbmdDb25zdHJ1Y3RvcihleGNlcHRpb25XcmFwcGVyQ2xhc3MsIGluaXRhcmdzVHlwZSk7Ci0gICAgICAgIGlmIChleGNlcHRpb25Db25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldGhyb3dFeCA9IGV4Y2VwdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGluaXRhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiSW1wb3NzaWJsZSB0byByZS10aHJvdyAnJXMnLCBpdCBuZWVkcyB0aGUgY29uc3RydWN0b3Igd2l0aCAlcyBhcmd1bWVudChzKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uV3JhcHBlckNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhpbml0YXJnc1R5cGUpKTsKLSAgICAgICAgICAgICAgICByZXRocm93RXggPSBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiSW1wb3NzaWJsZSB0byByZS10aHJvdyAnJXMnLCBpdCBuZWVkcyB0aGUgY29uc3RydWN0b3Igd2l0aCAlcyBvciAlcyBhcmd1bWVudChzKS4iLAotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25XcmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoQ0FVU0VfVFlQRVMpLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoTUVTU0FHRV9DQVVTRV9UWVBFUykpOwotICAgICAgICAgICAgcmV0aHJvd0V4ID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXRocm93RXg7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgPEUgZXh0ZW5kcyBUaHJvd2FibGU+IENvbnN0cnVjdG9yPEU+IGdldE1hdGNoaW5nQ29uc3RydWN0b3IoQ2xhc3M8RT4gdHlwZSwKLSAgICAgICAgICAgIENsYXNzPD8+W10gYXJndW1lbnRzVHlwZSkgewotICAgICAgICBDbGFzczw/IHN1cGVyIEU+IGN1cnJlbnRUeXBlID0gdHlwZTsKLSAgICAgICAgd2hpbGUgKE9iamVjdC5jbGFzcyAhPSBjdXJyZW50VHlwZSkgewotICAgICAgICAgICAgZm9yIChDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA6IGN1cnJlbnRUeXBlLmdldENvbnN0cnVjdG9ycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFycmF5cy5lcXVhbHMoYXJndW1lbnRzVHlwZSwgY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDb25zdHJ1Y3RvcjxFPikgY29uc3RydWN0b3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL1ZhbGlkYXRpb25Nb2R1bGUuamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvVmFsaWRhdGlvbk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGRiZDZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvVmFsaWRhdGlvbk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5zcGkuQ29uZmlndXJhdGlvblN0YXRlOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5hb3BhbGxpYW5jZS5pbnRlcmNlcHQuTWV0aG9kSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnJlc29sdmVyLkRlZmF1bHRUcmF2ZXJzYWJsZVJlc29sdmVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm1hdGNoZXIuTWF0Y2hlcnM7Ci0KLS8qKgotICogVGhlIEdvb2dsZS1HdWljZSBtb2R1bGUgZm9yIEFwYWNoZSBCVmFsLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25Nb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICAvLyBhcGFjaGUgYnZhbCBib290c3RyYXAKLSAgICAgICAgdGhpcy5iaW5kKE1lc3NhZ2VJbnRlcnBvbGF0b3IuY2xhc3MpLnRvKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmNsYXNzKS5pbihTY29wZXMuU0lOR0xFVE9OKTsKLSAgICAgICAgdGhpcy5iaW5kKFRyYXZlcnNhYmxlUmVzb2x2ZXIuY2xhc3MpLnRvKERlZmF1bHRUcmF2ZXJzYWJsZVJlc29sdmVyLmNsYXNzKS5pbihTY29wZXMuU0lOR0xFVE9OKTsKLSAgICAgICAgdGhpcy5iaW5kKENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmNsYXNzKS50byhHdWljZUF3YXJlQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuY2xhc3MpOwotICAgICAgICB0aGlzLmJpbmQobmV3IFR5cGVMaXRlcmFsPFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4oKSB7fSkudG8oQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKS5pbihTY29wZXMuU0lOR0xFVE9OKTsKLSAgICAgICAgdGhpcy5iaW5kKENvbmZpZ3VyYXRpb25TdGF0ZS5jbGFzcykudG9Qcm92aWRlcihDb25maWd1cmF0aW9uU3RhdGVQcm92aWRlci5jbGFzcykuaW4oU2NvcGVzLlNJTkdMRVRPTik7Ci0gICAgICAgIHRoaXMuYmluZChWYWxpZGF0b3JGYWN0b3J5LmNsYXNzKS50b1Byb3ZpZGVyKFZhbGlkYXRvckZhY3RvcnlQcm92aWRlci5jbGFzcykuaW4oU2NvcGVzLlNJTkdMRVRPTik7Ci0gICAgICAgIHRoaXMuYmluZChWYWxpZGF0b3IuY2xhc3MpLnRvUHJvdmlkZXIoVmFsaWRhdG9yUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgIC8vIEFPUCBzdHVmZgotICAgICAgICBNZXRob2RJbnRlcmNlcHRvciB2YWxpZGF0ZU1ldGhvZEludGVyY2VwdG9yID0gbmV3IFZhbGlkYXRlTWV0aG9kSW50ZXJjZXB0b3IoKTsKLSAgICAgICAgdGhpcy5iaW5kZXIoKS5yZXF1ZXN0SW5qZWN0aW9uKHZhbGlkYXRlTWV0aG9kSW50ZXJjZXB0b3IpOwotICAgICAgICB0aGlzLmJpbmRJbnRlcmNlcHRvcihNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW5ub3RhdGVkV2l0aChWYWxpZGF0ZS5jbGFzcyksIHZhbGlkYXRlTWV0aG9kSW50ZXJjZXB0b3IpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0b3JGYWN0b3J5UHJvdmlkZXIuamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvVmFsaWRhdG9yRmFjdG9yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOWQ0NzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0b3JGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZ3VpY2U7Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5Db25maWd1cmF0aW9uU3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwYWNoZVZhbGlkYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBWYWxpZGF0b3IgRmFjdG9yeSBndWljZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBTaW5nbGV0b24KLWZpbmFsIGNsYXNzIFZhbGlkYXRvckZhY3RvcnlQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFZhbGlkYXRvckZhY3Rvcnk+IHsKLQotICAgIEBJbmplY3QKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25TdGF0ZSBjb25maWd1cmF0aW9uU3RhdGU7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uU3RhdGUoQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZ3VyYXRpb25TdGF0ZSkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25TdGF0ZSA9IGNvbmZpZ3VyYXRpb25TdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFZhbGlkYXRvckZhY3RvcnkgZ2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IEFwYWNoZVZhbGlkYXRpb25Qcm92aWRlcigpLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSh0aGlzLmNvbmZpZ3VyYXRpb25TdGF0ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL1ZhbGlkYXRvclByb3ZpZGVyLmphdmEgYi90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL1ZhbGlkYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjYyZGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9WYWxpZGF0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotCi0vKioKLSAqIFZhbGlkYXRvciBndWljZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBTaW5nbGV0b24KLWZpbmFsIGNsYXNzIFZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8VmFsaWRhdG9yPiB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsaWRhdG9yIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBASW5qZWN0Ci0gICAgcHJpdmF0ZSBWYWxpZGF0b3JGYWN0b3J5IHZhbGlkYXRvckZhY3Rvcnk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JGYWN0b3J5KFZhbGlkYXRvckZhY3RvcnkgdmFsaWRhdG9yRmFjdG9yeSkgewotICAgICAgICB0aGlzLnZhbGlkYXRvckZhY3RvcnkgPSB2YWxpZGF0b3JGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdG9yIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yRmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvcGFja2FnZS1pbmZvLmphdmEgYi90cnVuay9idmFsLWd1aWNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhkYzA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDb250YWlucyBBcGFjaGUgQlZhbCBzdXBwb3J0IGZvciBHb29nbGUtR3VpY2UuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvQ291bnRyeS5qYXZhIGIvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9Db3VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWIxODIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9Db3VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLS8qKgotICogCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQ291bnRyeSB7Ci0KLSAgICBATm90TnVsbChncm91cHMgPSB7IFVwZGF0ZS5jbGFzcyB9KQotICAgIHByaXZhdGUgTG9uZyBpZDsKLQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IHsgSW5zZXJ0LmNsYXNzIH0pCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IHsgSW5zZXJ0LmNsYXNzIH0pCi0gICAgQFNpemUobWF4ID0gMiwgZ3JvdXBzID0geyBJbnNlcnQuY2xhc3MsIFVwZGF0ZS5jbGFzcyB9KQotICAgIHByaXZhdGUgU3RyaW5nIGlzbzJDb2RlOwotCi0gICAgQE5vdE51bGwoZ3JvdXBzID0geyBJbnNlcnQuY2xhc3MgfSkKLSAgICBAU2l6ZShtYXggPSAzLCBncm91cHMgPSB7IEluc2VydC5jbGFzcywgVXBkYXRlLmNsYXNzIH0pCi0gICAgcHJpdmF0ZSBTdHJpbmcgaXNvM0NvZGU7Ci0KLSAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoTG9uZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJc28yQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzbzJDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzbzJDb2RlKFN0cmluZyBpc28yQ29kZSkgewotICAgICAgICB0aGlzLmlzbzJDb2RlID0gaXNvMkNvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJc28zQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzbzNDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzbzNDb2RlKFN0cmluZyBpc28zQ29kZSkgewotICAgICAgICB0aGlzLmlzbzNDb2RlID0gaXNvM0NvZGU7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9EdW1teUNvdW50cnlEYW8uamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvRHVtbXlDb3VudHJ5RGFvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzMxN2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9EdW1teUNvdW50cnlEYW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZ3VpY2U7Ci0KLWltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLQotLyoqCi0gKiAKLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBTaW5nbGV0b24KLXB1YmxpYyBjbGFzcyBEdW1teUNvdW50cnlEYW8gewotCi0gICAgQFZhbGlkYXRlKAotICAgICAgICBncm91cHMgPSB7IEluc2VydC5jbGFzcyB9LAotICAgICAgICB2YWxpZGF0ZVJldHVybmVkVmFsdWUgPSB0cnVlCi0gICAgKQotICAgIHB1YmxpYyBDb3VudHJ5IGluc2VydENvdW50cnkoQE5vdE51bGwoZ3JvdXBzID0geyBJbnNlcnQuY2xhc3MgfSkgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBATm90TnVsbChncm91cHMgPSB7IEluc2VydC5jbGFzcyB9KSBAU2l6ZShtYXggPSAyLCBncm91cHMgPSB7IEluc2VydC5jbGFzcywgVXBkYXRlLmNsYXNzIH0pIFN0cmluZyBpc28yQ29kZSwKLSAgICAgICAgICAgIEBOb3ROdWxsKGdyb3VwcyA9IHsgSW5zZXJ0LmNsYXNzIH0pIEBTaXplKG1heCA9IDMsIGdyb3VwcyA9IHsgSW5zZXJ0LmNsYXNzLCBVcGRhdGUuY2xhc3MgfSkgU3RyaW5nIGlzbzNDb2RlKSB7Ci0gICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCk7Ci0gICAgICAgIGNvdW50cnkuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgY291bnRyeS5zZXRJc28yQ29kZShpc28yQ29kZSk7Ci0gICAgICAgIGNvdW50cnkuc2V0SXNvM0NvZGUoaXNvM0NvZGUpOwotICAgICAgICByZXR1cm4gY291bnRyeTsKLSAgICB9Ci0KLSAgICBAVmFsaWRhdGUoCi0gICAgICAgIGdyb3VwcyA9IHsgVXBkYXRlLmNsYXNzIH0sCi0gICAgICAgIHJldGhyb3dFeGNlcHRpb25zQXMgPSBEdW1teUV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgZXhjZXB0aW9uTWVzc2FnZSA9ICJUaGlzIGlzIGp1c3QgYSBkdW1teSBtZXNzYWdlICVzIgotICAgICkKLSAgICBwdWJsaWMgaW50IHVwZGF0ZUNvdW50cnkoQFZhbGlkIENvdW50cnkgY291bnRyeSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvRHVtbXlFeGNlcHRpb24uamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvRHVtbXlFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0Y2E3MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWd1aWNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0R1bW15RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmd1aWNlOwotCi0vKioKLSAqIAotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIER1bW15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIER1bW15RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIER1bW15RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9HdWljZUF3YXJlVmFsaWRhdGlvblRlc3RDYXNlLmphdmEgYi90cnVuay9idmFsLWd1aWNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0d1aWNlQXdhcmVWYWxpZGF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3YmI5Mi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWd1aWNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0d1aWNlQXdhcmVWYWxpZGF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuZ3VpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7Ci0KLS8qKgotICogCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR3VpY2VBd2FyZVZhbGlkYXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEBJbmplY3QKLSAgICBwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICBASW5qZWN0Ci0gICAgcHJpdmF0ZSBEdW1teUNvdW50cnlEYW8gZHVtbXlDb3VudHJ5RGFvOwotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RHVtbXlDb3VudHJ5RGFvKER1bW15Q291bnRyeURhbyBkdW1teUNvdW50cnlEYW8pIHsKLSAgICAgICAgdGhpcy5kdW1teUNvdW50cnlEYW8gPSBkdW1teUNvdW50cnlEYW87Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IFZhbGlkYXRpb25Nb2R1bGUoKSkuaW5qZWN0TWVtYmVycyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IG51bGw7Ci0gICAgICAgIHRoaXMuZHVtbXlDb3VudHJ5RGFvID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0ZWRWYWxpZGF0aW9uKCkgewotICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgpOwotICAgICAgICBjb3VudHJ5LnNldE5hbWUoIkl0YWx5Iik7Ci0gICAgICAgIGNvdW50cnkuc2V0SXNvMkNvZGUoIml0Iik7Ci0gICAgICAgIGNvdW50cnkuc2V0SXNvM0NvZGUoIml0YSIpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPENvdW50cnk+PiB2aW9sYXRpb25zID0gdGhpcy52YWxpZGF0b3IudmFsaWRhdGUoY291bnRyeSk7Ci0gICAgICAgIGFzc2VydFRydWUodmlvbGF0aW9ucy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBT1BJbmplY3RlZFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHRoaXMuZHVtbXlDb3VudHJ5RGFvLmluc2VydENvdW50cnkoIkl0YWx5IiwgIml0IiwgIml0YSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBT1BJbmplY3RlZEZhaWxlZFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmR1bW15Q291bnRyeURhby5pbnNlcnRDb3VudHJ5KCJJdGFseSIsICJpdGEiLCAiaXRhIik7Ci0gICAgICAgICAgICBmYWlsKCJqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBjdmUpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRocm93V3JhcHBlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuZHVtbXlDb3VudHJ5RGFvLnVwZGF0ZUNvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgICAgICBmYWlsKCJvcmcuYXBhY2hlLmJ2YWwuZ3VpY2UuRHVtbXlFeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhEdW1teUV4Y2VwdGlvbi5jbGFzcywgZS5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiVGhpcyBpcyBqdXN0IGEgZHVtbXkgbWVzc2FnZSAiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvSW5zZXJ0LmphdmEgYi90cnVuay9idmFsLWd1aWNlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2d1aWNlL0luc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzg0NjkxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvSW5zZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5ndWljZTsKLQotLyoqCi0gKiAKLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5zZXJ0IHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9VcGRhdGUuamF2YSBiL3RydW5rL2J2YWwtZ3VpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZ3VpY2UvVXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmRlY2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1ndWljZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9ndWljZS9VcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmd1aWNlOwotCi0vKioKLSAqIAotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBVcGRhdGUgewotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzb24vcG9tLnhtbCBiL3RydW5rL2J2YWwtanNvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJiYzg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPCEtLQotCU1hdmVuIHJlbGVhc2UgcGx1Z2luIHJlcXVpcmVzIHRoZSBwcm9qZWN0IHRhZyB0byBiZSBvbiBhIHNpbmdsZSBsaW5lLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YnZhbC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuNDwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxhcnRpZmFjdElkPmJ2YWwtanNvbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQlZhbCA6OiBidmFsLWpzb24gKG9wdGlvbmFsKTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkJWYWwgLSBPcHRpb25hbCBKU09OIENvbXBvbmVudDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwteHN0cmVhbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5mcmVlbWFya2VyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZnJlZW1hcmtlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJ2YWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5idmFsLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwteHN0cmVhbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPnRlc3QtamFyPC90eXBlPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5pbnN0YWxsPC9kZWZhdWx0R29hbD4KLQotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNvbi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtIGIvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0Uudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGMxZWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0Uudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIwotIyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyMKLSMjICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMjCi0jIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyMKLQotVGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlKHMpIHdlcmUgYWZmaXhlZCB0byBwb3J0aW9ucyBvZiB0aGlzIGNvZGUKLXdpdGggd2hpY2ggdGhpcyBmaWxlIGlzIG5vdyBvciB3YXMgYXQgb25lIHRpbWUgZGlzdHJpYnV0ZWQuCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgYWdpbWF0ZWMgR21iSC4KLUNvcHlyaWdodCAyMDA3LTIwMTAgQWdpbWF0ZWMgR21iSC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzb24vSlNPTkdlbmVyYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzb24vSlNPTkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU5MDk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNvbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc29uL0pTT05HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc29uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci0KLWltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZTsKLWltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLlRlbXBsYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBHZW5lcmF0ZSBhIEpTT04gU3RyaW5nIGZvciBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIE1ldGFCZWFufXMuCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBmcmVlbWFya2VyIHRlbXBsYXRlIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuPGJyLz4KLSAqCi0gKiBUaGlzIGlzIGFuIG9wdGlvbmFsIG1vZHVsZSB3aGljaCByZXF1aXJlcyB0aGUgZnJlZW1hcmtlciBkZXBlbmRlbmN5Ci0gKiBhbmQgdGVtcGxhdGUgcmVzb3VyZWNlIGZpbGUgImJlYW4taW5mb3MtanNvbi5mdGwiIHdpdGggaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU09OR2VuZXJhdG9yIHsKLSAgICBwcml2YXRlIGZpbmFsIFRlbXBsYXRlIHRlbXBsYXRlOwotCi0gICAgcHVibGljIEpTT05HZW5lcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzKCJiZWFuLWluZm9zLWpzb24uZnRsIik7Ci0gICAgfQotCi0gICAgcHVibGljIEpTT05HZW5lcmF0b3IoU3RyaW5nIHRlbXBsYXRlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBmcmVlbWFya2VyID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZnJlZW1hcmtlci5zZXROdW1iZXJGb3JtYXQoIjAuIyMjIyMjIik7ICAvLyBwcmV2ZW50IGxvY2FsZS1zZW5zaXRpdmUgbnVtYmVyIGZvcm1hdAotICAgICAgICBmcmVlbWFya2VyLnNldENsYXNzRm9yVGVtcGxhdGVMb2FkaW5nKGdldENsYXNzKCksICIiKTsKLSAgICAgICAgdGVtcGxhdGUgPSBmcmVlbWFya2VyLmdldFRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEpTT05HZW5lcmF0b3IoVGVtcGxhdGUgdGVtcGxhdGUpIHsKLSAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9KU09OKE1ldGFCZWFuIG1ldGFCZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZXRhQmVhbj4gbWV0YUJlYW5zID0gbmV3IEFycmF5TGlzdDxNZXRhQmVhbj4oMSk7Ci0gICAgICAgIG1ldGFCZWFucy5hZGQobWV0YUJlYW4pOwotICAgICAgICByZXR1cm4gdG9KU09OKG1ldGFCZWFucyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b0pTT04oQ29sbGVjdGlvbjxNZXRhQmVhbj4gbWV0YUJlYW5zKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRvSlNPTihtZXRhQmVhbnMsIG91dCk7Ci0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0b0pTT04oQ29sbGVjdGlvbjxNZXRhQmVhbj4gbWV0YUJlYW5zLCBXcml0ZXIgb3V0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcm9vdE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICByb290TWFwLnB1dCgibWV0YUJlYW5zIiwgbWV0YUJlYW5zKTsKLSAgICAgICAgcm9vdE1hcC5wdXQoImdlbmVyYXRvciIsIHRoaXMpOwotICAgICAgICB0ZW1wbGF0ZS5wcm9jZXNzKHJvb3RNYXAsIG91dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvanNvbi9iZWFuLWluZm9zLWpzb24uZnRsIGIvdHJ1bmsvYnZhbC1qc29uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvanNvbi9iZWFuLWluZm9zLWpzb24uZnRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzAxMmFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzb24vYmVhbi1pbmZvcy1qc29uLmZ0bAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLWJ2YWwubmFtZXNwYWNlKCJidmFsLm1ldGFkYXRhIik7DQotDQotPCMtLSANCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotDQotKGZ1bmN0aW9uKCl7DQotPCNhc3NpZ24gdmFyID0gMD4NCi08I2Fzc2lnbiB2YXJyZWZzID0ge30+DQotDQotPCNsaXN0IG1ldGFCZWFucyBhcyBtZXRhQmVhbj4NCi08I2Fzc2lnbiB2YXJyZWZzID0gdmFycmVmcyArIHttZXRhQmVhbi5pZCA6IHZhcn0+DQotdmFyIG1ldGFCZWFuJHt2YXJ9ID0gew0KLSAiaWQiIDogIiR7bWV0YUJlYW4uaWR9IiwNCi0gPCNpZiBtZXRhQmVhbi5iZWFuQ2xhc3M/Pz4iYmVhbkNsYXNzIiA6ICIke21ldGFCZWFuLmJlYW5DbGFzcy5uYW1lfSIsPC8jaWY+DQotIDwjaWYgbWV0YUJlYW4ubmFtZT8/PiJuYW1lIiA6ICIke21ldGFCZWFuLm5hbWV9Iiw8LyNpZj4NCi0gImZlYXR1cmVzIiA6ezwjcnQvPg0KLSAgIDwjbGlzdCBtZXRhQmVhbi5mZWF0dXJlcz9rZXlzIGFzIGZlYXR1cmVLZXk+DQotICAgICAgPCNhc3NpZ24gdmFsdWUgPSBtZXRhQmVhbi5mZWF0dXJlc1tmZWF0dXJlS2V5XT4NCi0gICAiJHtmZWF0dXJlS2V5fSIgOiA8I2lmDQotICAgICAgICAgIHZhbHVlP2lzX3N0cmluZz4iJHt2YWx1ZX0iPCNlbHNlaWYNCi0gICAgICAgICAgdmFsdWU/aXNfYm9vbGVhbj4ke3ZhbHVlP3N0cmluZ308I2Vsc2VpZg0KLSAgICAgICAgICB2YWx1ZT9pc19udW1iZXI+JHt2YWx1ZX08I2Vsc2VpZg0KLSAgICAgICAgICB2YWx1ZT9pc19kYXRlPiR7dmFsdWU/c3RyaW5nLmZ1bGx9PCNlbHNlaWYNCi0gICAgICAgICAgISh2YWx1ZT8/KT5udWxsPCNlbHNlaWYgdmFsdWU/aXNfc2VxdWVuY2U+WzwjbGlzdCB2YWx1ZSBhcyB2PiIke3Z9IjwjaWYgdl9oYXNfbmV4dD4sPC8jaWY+PC8jbGlzdD5dPCNlbHNlaWYNCi0gICAgICAgICAgdmFsdWU/aXNfaGFzaD57PCNsaXN0IHZhbHVlP2tleXMgYXMga2V5PiIke2tleX0iIDogIiR7dmFsdWVba2V5XX0iPCNpZiBrZXlfaGFzX25leHQ+LDwvI2lmPjwvI2xpc3Q+fTwjZWxzZQ0KLSAgICAgICAgICA+Ij8iPC8jaWY+PCNydC8+PCNpZg0KLSAgICAgICAgICBmZWF0dXJlS2V5X2hhc19uZXh0Piw8LyNpZj4NCi0gICA8LyNsaXN0Pg0KLSAgIDwjbHQvPn0sDQotICJwcm9wZXJ0aWVzIiA6ew0KLSAgIDwjbGlzdCBtZXRhQmVhbi5wcm9wZXJ0aWVzIGFzIHByb3BlcnR5Pg0KLSAgICAgIiR7cHJvcGVydHkubmFtZX0iOnsNCi0gICAgICAgIm5hbWUiIDogIiR7cHJvcGVydHkubmFtZX0iLA0KLSAgICAgICA8I2lmIHByb3BlcnR5LnR5cGU/Pz4idHlwZSIgOiAiJHtwcm9wZXJ0eS50eXBlfSIsPC8jaWY+DQotICAgICAgIDwjaWYgcHJvcGVydHkudHlwZUNsYXNzPz8+InR5cGVDbGFzcyIgOiAiJHtwcm9wZXJ0eS50eXBlQ2xhc3MubmFtZX0iLDwvI2lmPg0KLSAgICAgICAiZmVhdHVyZXMiIDogezwjaWYgcHJvcGVydHkudHlwZT8/ICYmDQotICAgICAgIHByb3BlcnR5LnR5cGUuZW51bSFmYWxzZT4iZW51bSIgOiB7PCNsaXN0IHByb3BlcnR5LnR5cGUuZW51bUNvbnN0YW50cyBhcyBlbnVtPiIke2VudW0ubmFtZSgpfSI6ICIke2VudW0ubmFtZSgpfSI8I2lmIGVudW1faGFzX25leHQ+LCA8LyNpZj48LyNsaXN0Pn08I2lmIHByb3BlcnR5LmZlYXR1cmVzP3NpemUgJmd0OyAwPiw8LyNpZj48LyNpZj48I2xpc3QNCi0gICAgICAgcHJvcGVydHkuZmVhdHVyZXM/a2V5cyBhcyBmZWF0dXJlS2V5Pg0KLSAgICAgICA8I2Fzc2lnbiB2YWx1ZSA9IHByb3BlcnR5LmZlYXR1cmVzW2ZlYXR1cmVLZXldPg0KLSAgICAgICAiJHtmZWF0dXJlS2V5fSIgOiA8I3J0Lz48I2lmDQotICAgICAgICAgIHZhbHVlP2lzX3N0cmluZz4iJHt2YWx1ZX0iPCNlbHNlaWYNCi0gICAgICAgICAgdmFsdWU/aXNfYm9vbGVhbj4ke3ZhbHVlP3N0cmluZ308I2Vsc2VpZg0KLSAgICAgICAgICB2YWx1ZT9pc19udW1iZXI+JHt2YWx1ZX08I2Vsc2VpZg0KLSAgICAgICAgICB2YWx1ZT9pc19kYXRlPiR7dmFsdWU/c3RyaW5nLmZ1bGx9PCNlbHNlaWYNCi0gICAgICAgICAgISh2YWx1ZT8/KT5udWxsPCNlbHNlaWYgdmFsdWU/aXNfc2VxdWVuY2U+WzwjbGlzdCB2YWx1ZSBhcyB2PiIke3Z9IjwjaWYgdl9oYXNfbmV4dD4sPC8jaWY+PC8jbGlzdD5dPCNlbHNlaWYNCi0gICAgICAgICAgdmFsdWU/aXNfaGFzaF9leD57PCNsaXN0IHZhbHVlP2tleXMgYXMga2V5PiIke2tleX0iIDogIiR7dmFsdWVba2V5XX0iPCNpZiBrZXlfaGFzX25leHQ+LDwvI2lmPjwvI2xpc3Q+fTwjZWxzZQ0KLSAgICAgICAgICA+Ij8iPC8jaWY+PCNydC8+PCNpZiBmZWF0dXJlS2V5X2hhc19uZXh0Piw8LyNpZj4NCi0gICAgICAgPC8jbGlzdD4NCi0gICAgICAgfQ0KLSAgICAgfTwjaWYgcHJvcGVydHlfaGFzX25leHQ+LDwvI2lmPg0KLSAgIDwvI2xpc3Q+DQotICAgfQ0KLX07DQotPCNhc3NpZ24gdmFyID0gdmFyICsgMT4NCi08LyNsaXN0Pg0KLQ0KLTwjYXNzaWduIHZhciA9IDA+DQotPCNsaXN0IG1ldGFCZWFucyBhcyBtZXRhQmVhbj48I2xpc3QNCi0gICAgbWV0YUJlYW4ucHJvcGVydGllcyBhcyBwcm9wZXJ0eT48I2lmDQotICAgIHByb3BlcnR5Lm1ldGFCZWFuPz8gJiYgdmFycmVmc1twcm9wZXJ0eS5tZXRhQmVhbi5pZF0/Pz4NCi1tZXRhQmVhbiR7dmFyfS5wcm9wZXJ0aWVzLiR7cHJvcGVydHkubmFtZX0ubWV0YUJlYW4gPSBtZXRhQmVhbiR7dmFycmVmc1twcm9wZXJ0eS5tZXRhQmVhbi5pZF19Ow0KLTwvI2lmPjwvI2xpc3Q+PCNhc3NpZ24gdmFyID0gdmFyICsgMT48LyNsaXN0PjwjYXNzaWduIHZhciA9IDA+DQotYnZhbC5tZXRhZGF0YS5tZXRhQmVhbnMgPSB7DQotPCNsaXN0IG1ldGFCZWFucyBhcyBtZXRhQmVhbj4NCi0gICAgICAgIiR7bWV0YUJlYW4uaWR9IiA6IG1ldGFCZWFuJHt2YXJ9PCNpZiBtZXRhQmVhbl9oYXNfbmV4dD4sPC8jaWY+DQotICAgICAgIDwjYXNzaWduIHZhciA9IHZhciArIDE+DQotPC8jbGlzdD59Ow0KLX0pKCk7DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzb24vSlNPTkdlbmVyYXRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc29uL0pTT05HZW5lcmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWNmMzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzb24vSlNPTkdlbmVyYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuZXhhbXBsZS5CdXNpbmVzc0VudW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3RBZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5EeW5hVHlwZUVudW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnhtbC5YTUxNZXRhQmVhbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnhtbC5YTUxNZXRhQmVhblVSTExvYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxicj4KLSAqIEF1dGhvcjogcm9tYW4uc3R1bW08YnI+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU09OR2VuZXJhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFhNTE1ldGFCZWFuTWFuYWdlciBtYm07Ci0KLSAgICBwdWJsaWMgSlNPTkdlbmVyYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgbWJtID0gbmV3IFhNTE1ldGFCZWFuTWFuYWdlcigpOwotICAgICAgICBtYm0uYWRkTG9hZGVyKG5ldyBYTUxNZXRhQmVhblVSTExvYWRlcihCdXNpbmVzc09iamVjdC5jbGFzcy5nZXRSZXNvdXJjZSgidGVzdC1iZWFuSW5mb3MueG1sIikpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbkluZm9zQ3VzdG9tUGF0Y2hHZW5lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0YUJlYW4gbWJlYW4gPSBtYm0uZmluZEZvckNsYXNzKEJ1c2luZXNzT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgTWV0YVByb3BlcnR5IG1wcm9wID0gbWJlYW4uZ2V0UHJvcGVydHkoImxhc3ROYW1lIik7Ci0gICAgICAgIGFzc2VydFRydWUobXByb3AuaXNNYW5kYXRvcnkoKSk7Ci0KLSAgICAgICAgbWJtLmdldENhY2hlKCkucmVtb3ZlRnJvbUNhY2hlKG1iZWFuKTsKLSAgICAgICAgbWJtLmFkZExvYWRlcihuZXcgWE1MTWV0YUJlYW5VUkxMb2FkZXIoQnVzaW5lc3NPYmplY3QuY2xhc3MuZ2V0UmVzb3VyY2UoInRlc3QtYmVhbkluZm9zLWN1c3RvbS54bWwiKSkpOwotICAgICAgICBtYmVhbiA9IG1ibS5maW5kRm9yQ2xhc3MoQnVzaW5lc3NPYmplY3QuY2xhc3MpOwotICAgICAgICBtcHJvcCA9IG1iZWFuLmdldFByb3BlcnR5KCJsYXN0TmFtZSIpOwotICAgICAgICBhc3NlcnRUcnVlKCFtcHJvcC5pc01hbmRhdG9yeSgpKTsKLQotICAgICAgICBKU09OR2VuZXJhdG9yIGNvbnZlcnRlciA9IG5ldyBKU09OR2VuZXJhdG9yKCk7Ci0KLSAgICAgICAgTGlzdDxNZXRhQmVhbj4gbWV0YUJlYW5zID0gbmV3IEFycmF5TGlzdDxNZXRhQmVhbj4oMik7Ci0gICAgICAgIG1ldGFCZWFucy5hZGQobWJlYW4pOwotICAgICAgICBNZXRhQmVhbiBtYmVhbjIgPSBtYm0uZmluZEZvcklkKCJVbmtub3duT2JqZWN0Iik7Ci0gICAgICAgIG1ldGFCZWFucy5hZGQobWJlYW4yKTsKLSAgICAgICAgU3RyaW5nIGpzb24gPSBjb252ZXJ0ZXIudG9KU09OKG1ldGFCZWFucyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoanNvbik7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihqc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRhQmVhbiBpbmZvID0gbWJtLmZpbmRGb3JDbGFzcyhCdXNpbmVzc09iamVjdC5jbGFzcyk7Ci0gICAgICAgIE1ldGFCZWFuIGluZm8yID0gaW5mby5nZXRQcm9wZXJ0eSgiYWRkcmVzcyIpLmdldE1ldGFCZWFuKCk7Ci0KLSAgICAgICAgLy8gZW1wdHkgZGVmYXVsdCBiZWFuIHdpdGhvdXQgeG1sIGJhY2t1cAotICAgICAgICBNZXRhQmVhbiBpbmZvMyA9IG1ibS5maW5kRm9yQ2xhc3MoQnVzaW5lc3NPYmplY3RBZGRyZXNzLmNsYXNzKTsKLSAgICAgICAgSlNPTkdlbmVyYXRvciBjb252ZXJ0ZXIgPSBuZXcgSlNPTkdlbmVyYXRvcigpOwotCi0gICAgICAgIExpc3Q8TWV0YUJlYW4+IG1ldGFCZWFucyA9IG5ldyBBcnJheUxpc3Q8TWV0YUJlYW4+KDIpOwotICAgICAgICBtZXRhQmVhbnMuYWRkKGluZm8pOwotICAgICAgICBtZXRhQmVhbnMuYWRkKGluZm8yKTsKLSAgICAgICAgbWV0YUJlYW5zLmFkZChpbmZvMyk7Ci0gICAgICAgIFN0cmluZyBqc29uID0gY29udmVydGVyLnRvSlNPTihtZXRhQmVhbnMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGpzb24pOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oanNvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEpTT05fZHluYVR5cGVFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFCZWFuIGluZm8gPSBtYm0uZmluZEZvckNsYXNzKEJ1c2luZXNzT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgTWV0YVByb3BlcnR5IGNob2ljZSA9IGluZm8uZ2V0UHJvcGVydHkoImNob2ljZSIpOwotICAgICAgICBjaG9pY2Uuc2V0VHlwZShuZXcgRHluYVR5cGVFbnVtKEJ1c2luZXNzRW51bS5jbGFzcywgIkNVU1RPTV8xIiwgIkNVU1RPTV8yIikpOwotCi0gICAgICAgIEpTT05HZW5lcmF0b3IgY29udmVydGVyID0gbmV3IEpTT05HZW5lcmF0b3IoKTsKLQotICAgICAgICBMaXN0PE1ldGFCZWFuPiBtZXRhQmVhbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGFCZWFuPigxKTsKLSAgICAgICAgbWV0YUJlYW5zLmFkZChpbmZvKTsKLSAgICAgICAgU3RyaW5nIGpzb24gPSBjb252ZXJ0ZXIudG9KU09OKG1ldGFCZWFucyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoanNvbik7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihqc29uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmluZGV4T2YoIkNVU1RPTV8xIikgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmluZGV4T2YoIkNVU1RPTV8yIikgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmluZGV4T2YoIlZBTFVFMSIpIDwgMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvcG9tLnhtbCBiL3RydW5rL2J2YWwtanNyMzAzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGQxMjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KLSAgICAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0gICAgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotICAgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0gICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgotICAgIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgIExpY2Vuc2UuCi0tLT4KLTwhLS0KLQlNYXZlbiByZWxlYXNlIHBsdWdpbiByZXF1aXJlcyB0aGUgcHJvamVjdCB0YWcgdG8gYmUgb24gYSBzaW5nbGUgbGluZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJ2YWw8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjQ8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5idmFsLWpzcjMwMzwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQlZhbCA6OiBidmFsLWpzcjMwMzwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGRlc2NyaXB0aW9uPkltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNsYXNzZXMgZm9yIEpTUiAzMDMgQmVhbiBWYWxpZGF0aW9uIDEuMDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpheGI8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPGpkaz4xLjU8L2pkaz4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICBkZWZhdWx0IHByb2ZpbGUgdXNpbmcgZ2Vyb25pbW8tdmFsaWRhdGlvbl8xLjBfc3BlYy5qYXIgYWN0aXZlIHdoZW4KLSAgICAgICAgICAgIHByb3BlcnR5ICJyaSIgaXMgbm90IHByZXNlbnQuCi0gICAgICAgIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5nZXJvbmltbzwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFyaTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdmFsaWRhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhbGxvdyB1c2VycyB0byBjaG9vc2UgYW4gQVBJIHByb3ZpZGVyIC0tPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIG9wdGlvbmFsIHByb2ZpbGUgdXNpbmcgamF2YXgudmFsaWRhdGlvbi92YWxpZGF0aW9uLWFwaS5qYXIgZnJvbSBSSQotICAgICAgICAgICAgbWFudWFsbHkgYWN0aXZlIHdoZW4gcHJvcGVydHkgIi1EcmkiIGlzIHByb3ZpZGVkLgotICAgICAgICAtLT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5yaTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWxsb3cgdXNlcnMgdG8gY2hvb3NlIGFuIEFQSSBwcm92aWRlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5zZWM8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdENhc2UuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhLnBvbGljeTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gb3B0aW9uYWwgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ2YWwteHN0cmVhbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwhLS0gZG9uJ3QgcHVsbCBpbnRvIE9TR2kgYnVuZGxlIC0tPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qcGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8IS0tIGFsbG93IHVzZXJzIHRvIGNob29zZSBhbiBBUEkgcHJvdmlkZXIgLS0+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gVGVzdGluZyBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLXNpbXBsZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxkZWZhdWx0R29hbD5pbnN0YWxsPC9kZWZhdWx0R29hbD4KLQotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4veHNkPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4YjItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD54amM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5vcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbDwvcGFja2FnZU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24+dHJ1ZTwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnRlc3QtamFyPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0LWphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwhLS0gMi4xMiBoYXMgaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9TVVJFRklSRS04MzYgLS0+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0Q2FzZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0Uudm0gYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkYWU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0Uudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIwotIyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyMKLSMjICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMjCi0jIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyMKLQotCi1UaGUgZm9sbG93aW5nIGNvcHlyaWdodCBub3RpY2Uocykgd2VyZSBhZmZpeGVkIHRvIHBvcnRpb25zIG9mIHRoaXMgY29kZQotd2l0aCB3aGljaCB0aGlzIGZpbGUgaXMgbm93IG9yIHdhcyBhdCBvbmUgdGltZSBkaXN0cmlidXRlZC4KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBhZ2ltYXRlYyBHbWJILgotQ29weXJpZ2h0IDIwMDctMjAxMCBBZ2ltYXRlYyBHbWJILiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Bc3NlcnRGYWxzZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0RmFsc2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwMzQ1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Bc3NlcnRGYWxzZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkFzc2VydEZhbHNlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBhc3NlcnQgdGhhdCB2YWx1ZSBpcyBmYWxzZTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRGYWxzZVZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8QXNzZXJ0RmFsc2UsIEJvb2xlYW4+IHsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQXNzZXJ0RmFsc2UgYW5ub3RhdGlvbikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQm9vbGVhbiB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhdmFsdWU7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0VHJ1ZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0VHJ1ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZTE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Fzc2VydFRydWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBhc3NlcnQgdGhhdCB2YWx1ZSBpcyB0cnVlPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEFzc2VydFRydWVWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPEFzc2VydFRydWUsIEJvb2xlYW4+IHsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQXNzZXJ0VHJ1ZSBhbm5vdGF0aW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChCb29sZWFuIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RlY2ltYWxNYXhWYWxpZGF0b3JGb3JOdW1iZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RlY2ltYWxNYXhWYWxpZGF0b3JGb3JOdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMjJiZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9EZWNpbWFsTWF4VmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EZWNpbWFsTWF4OwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKiogRGVzY3JpcHRpb246IHZhbGlkYXRlIHRoYXQgbnVtYmVyLXZhbHVlIG9mIHBhc3NlZCBvYmplY3QgaXMgPD0gbWF4dmFsdWU8YnIvPiAqLwotcHVibGljIGNsYXNzIERlY2ltYWxNYXhWYWxpZGF0b3JGb3JOdW1iZXIKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxEZWNpbWFsTWF4LCBOdW1iZXI+IHsKLQotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBtYXhWYWx1ZTsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRGVjaW1hbE1heCBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gbmV3IEJpZ0RlY2ltYWwoYW5ub3RhdGlvbi52YWx1ZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgIGFubm90YXRpb24udmFsdWUoKSArICIgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgQmlnRGVjaW1hbCBmb3JtYXQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTnVtYmVyIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlKS5jb21wYXJlVG8obWF4VmFsdWUpICE9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG5ldyBCaWdEZWNpbWFsKChCaWdJbnRlZ2VyKSB2YWx1ZSkpLmNvbXBhcmVUbyhtYXhWYWx1ZSkgIT0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobmV3IEJpZ0RlY2ltYWwodmFsdWUuZG91YmxlVmFsdWUoKSkuY29tcGFyZVRvKG1heFZhbHVlKSkgIT0gMTsKLSAgICAgICAgfQotICAgIH0gICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1heFZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1heFZhbGlkYXRvckZvclN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjFhODYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RlY2ltYWxNYXhWYWxpZGF0b3JGb3JTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXg7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgU3RyaW5nIGJlaW5nIHZhbGlkYXRlZCByZXByZXNlbnRzIGEgbnVtYmVyLCBhbmQgaGFzIGEgdmFsdWUKLSAqIDw9IG1heHZhbHVlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpbWFsTWF4VmFsaWRhdG9yRm9yU3RyaW5nCi0gICAgICBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8RGVjaW1hbE1heCwgU3RyaW5nPiB7Ci0KLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgbWF4VmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKERlY2ltYWxNYXggYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG5ldyBCaWdEZWNpbWFsKGFubm90YXRpb24udmFsdWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLnZhbHVlKCkgKyAiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIEJpZ0RlY2ltYWwgZm9ybWF0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWx1ZSkuY29tcGFyZVRvKG1heFZhbHVlKSAhPSAxOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9EZWNpbWFsTWluVmFsaWRhdG9yRm9yTnVtYmVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9EZWNpbWFsTWluVmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGE4MGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1pblZhbGlkYXRvckZvck51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGVjaW1hbE1pbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqIERlc2NyaXB0aW9uOiB2YWxpZGF0ZSB0aGF0IG51bWJlci12YWx1ZSBvZiBwYXNzZWQgb2JqZWN0IGlzID49IG1pbnZhbHVlPGJyLz4gKi8KLXB1YmxpYyBjbGFzcyBEZWNpbWFsTWluVmFsaWRhdG9yRm9yTnVtYmVyCi0gICAgICBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8RGVjaW1hbE1pbiwgTnVtYmVyPiB7Ci0KLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgbWluVmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKERlY2ltYWxNaW4gYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG5ldyBCaWdEZWNpbWFsKGFubm90YXRpb24udmFsdWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLnZhbHVlKCkgKyAiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIEJpZ0RlY2ltYWwgZm9ybWF0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE51bWJlciB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSB2YWx1ZSkuY29tcGFyZVRvKG1pblZhbHVlKSAhPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV3IEJpZ0RlY2ltYWwoKEJpZ0ludGVnZXIpIHZhbHVlKSkuY29tcGFyZVRvKG1pblZhbHVlKSAhPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobmV3IEJpZ0RlY2ltYWwodmFsdWUuZG91YmxlVmFsdWUoKSkuY29tcGFyZVRvKG1pblZhbHVlKSkgIT0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9EZWNpbWFsTWluVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9EZWNpbWFsTWluVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTlkNTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1pblZhbGlkYXRvckZvclN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGVjaW1hbE1pbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrIHRoYXQgdGhlIFN0cmluZyBiZWluZyB2YWxpZGF0ZWQgcmVwcmVzZW50cyBhIG51bWJlciwgYW5kIGhhcyBhIHZhbHVlCi0gKiA+PSBtaW52YWx1ZQotICovCi1wdWJsaWMgY2xhc3MgRGVjaW1hbE1pblZhbGlkYXRvckZvclN0cmluZwotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPERlY2ltYWxNaW4sIFN0cmluZz4gewotCi0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIG1pblZhbHVlOwotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShEZWNpbWFsTWluIGFubm90YXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMubWluVmFsdWUgPSBuZXcgQmlnRGVjaW1hbChhbm5vdGF0aW9uLnZhbHVlKCkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi52YWx1ZSgpICsgIiBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBCaWdEZWNpbWFsIGZvcm1hdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy9udWxsIHZhbHVlcyBhcmUgdmFsaWQKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWUpLmNvbXBhcmVUbyhtaW5WYWx1ZSkgIT0gLTE7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RpZ2l0c1ZhbGlkYXRvckZvck51bWJlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzVmMjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EaWdpdHM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogVmFsaWRhdGVzIHRoYXQgdGhlIDxjb2RlPk51bWJlcjwvY29kZT4gYmVpbmcgdmFsaWRhdGVzIG1hdGNoZXMgdGhlIHBhdHRlcm4KLSAqIGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWdpdHNWYWxpZGF0b3JGb3JOdW1iZXIgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPERpZ2l0cywgTnVtYmVyPiB7Ci0KLSAgICBwcml2YXRlIGludCBpbnRlZ3JhbDsKLSAgICBwcml2YXRlIGludCBmcmFjdGlvbmFsOwotCi0gICAgcHVibGljIGludCBnZXRJbnRlZ3JhbCgpIHsKLSAgICAgICAgcmV0dXJuIGludGVncmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEludGVncmFsKGludCBpbnRlZ3JhbCkgewotICAgICAgICB0aGlzLmludGVncmFsID0gaW50ZWdyYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRGcmFjdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gZnJhY3Rpb25hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbmFsKGludCBmcmFjdGlvbmFsKSB7Ci0gICAgICAgIHRoaXMuZnJhY3Rpb25hbCA9IGZyYWN0aW9uYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShEaWdpdHMgYW5ub3RhdGlvbikgewotICAgICAgICB0aGlzLmludGVncmFsID0gYW5ub3RhdGlvbi5pbnRlZ2VyKCk7Ci0gICAgICAgIHRoaXMuZnJhY3Rpb25hbCA9IGFubm90YXRpb24uZnJhY3Rpb24oKTsKLSAgICAgICAgaWYgKGludGVncmFsIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICJUaGUgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHBhcnQgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFjdGlvbmFsIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICJUaGUgbGVuZ3RoIG9mIHRoZSBmcmFjdGlvbiBwYXJ0IGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTnVtYmVyIG51bSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAobnVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsOwotICAgICAgICBpZiAobnVtIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgewotICAgICAgICAgICAgYmlnRGVjaW1hbCA9IChCaWdEZWNpbWFsKSBudW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiaWdEZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWwobnVtLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJpZ0RlY2ltYWwgPSBiaWdEZWNpbWFsLnN0cmlwVHJhaWxpbmdaZXJvcygpOwotCi0gICAgICAgIGludCBpbnRMZW5ndGggPSBiaWdEZWNpbWFsLnByZWNpc2lvbigpIC0gYmlnRGVjaW1hbC5zY2FsZSgpOwotICAgICAgICBpZiAoaW50ZWdyYWwgPj0gaW50TGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgZmFjdGlvbkxlbmd0aCA9IGJpZ0RlY2ltYWwuc2NhbGUoKSA8IDAgPyAwIDogYmlnRGVjaW1hbC5zY2FsZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZyYWN0aW9uYWwgPj0gZmFjdGlvbkxlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RpZ2l0c1ZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmY4ODcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EaWdpdHM7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogVmFsaWRhdGVzIHRoYXQgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gYmVpbmcgdmFsaWRhdGVkIGNvbnNpc3RzIG9mIGRpZ2l0cywKLSAqIGFuZCBtYXRjaGVzIHRoZSBwYXR0ZXJuIGRlZmluZWQgaW4gdGhlIGNvbnN0cmFpbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWdpdHNWYWxpZGF0b3JGb3JTdHJpbmcgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPERpZ2l0cywgU3RyaW5nPiB7Ci0KLSAgICBwcml2YXRlIGludCBpbnRlZ3JhbDsKLSAgICBwcml2YXRlIGludCBmcmFjdGlvbmFsOwotCi0gICAgcHVibGljIGludCBnZXRJbnRlZ3JhbCgpIHsKLSAgICAgICAgcmV0dXJuIGludGVncmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEludGVncmFsKGludCBpbnRlZ3JhbCkgewotICAgICAgICB0aGlzLmludGVncmFsID0gaW50ZWdyYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRGcmFjdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gZnJhY3Rpb25hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcmFjdGlvbmFsKGludCBmcmFjdGlvbmFsKSB7Ci0gICAgICAgIHRoaXMuZnJhY3Rpb25hbCA9IGZyYWN0aW9uYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShEaWdpdHMgYW5ub3RhdGlvbikgewotICAgICAgICB0aGlzLmludGVncmFsID0gYW5ub3RhdGlvbi5pbnRlZ2VyKCk7Ci0gICAgICAgIHRoaXMuZnJhY3Rpb25hbCA9IGFubm90YXRpb24uZnJhY3Rpb24oKTsKLSAgICAgICAgaWYgKGludGVncmFsIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICJUaGUgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHBhcnQgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFjdGlvbmFsIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICJUaGUgbGVuZ3RoIG9mIHRoZSBmcmFjdGlvbiBwYXJ0IGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0ciwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICAvL251bGwgdmFsdWVzIGFyZSB2YWxpZAotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsID0gZ2V0QmlnRGVjaW1hbFZhbHVlKHN0cik7Ci0gICAgICAgIGlmIChiaWdEZWNpbWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbnRMZW5ndGggPSBiaWdEZWNpbWFsLnByZWNpc2lvbigpIC0gYmlnRGVjaW1hbC5zY2FsZSgpOwotICAgICAgICBpZiAoaW50ZWdyYWwgPj0gaW50TGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgZmFjdGlvbkxlbmd0aCA9IGJpZ0RlY2ltYWwuc2NhbGUoKSA8IDAgPyAwIDogYmlnRGVjaW1hbC5zY2FsZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZyYWN0aW9uYWwgPj0gZmFjdGlvbkxlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoU3RyaW5nIHN0cikgewotICAgICAgICBCaWdEZWNpbWFsIGJkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYmQgPSBuZXcgQmlnRGVjaW1hbChzdHIpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRW1haWwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0VtYWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTcyMzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRW1haWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogPHA+Ci0gKiAtLQotICogVE9ETyAtIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogLS0KLSAqIDwvcD4KLSAqIERlc2NyaXB0aW9uOiBhbm5vdGF0aW9uIHRvIHZhbGlkYXRlIGFuIGVtYWlsIGFkZHJlc3MgKGJ5IHBhdHRlcm4pPGJyLz4KLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gRW1haWxWYWxpZGF0b3IuY2xhc3MpCi1AVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIFBBUkFNRVRFUn0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBFbWFpbCB7Ci0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkVtYWlsLm1lc3NhZ2V9IjsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRW1haWxWYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0VtYWlsVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGQ4NDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRW1haWxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnJvdXRpbmVzLkVNYWlsVmFsaWRhdGlvblV0aWxzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEVtYWlsVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxFbWFpbCwgQ2hhclNlcXVlbmNlPiB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKENoYXJTZXF1ZW5jZSB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gRU1haWxWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShFbWFpbCBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcgKGFzIGxvbmcgYXMgRW1haWwgaGFzIG5vIHByb3BlcnRpZXMpCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRnV0dXJlVmFsaWRhdG9yRm9yQ2FsZW5kYXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Z1dHVyZVZhbGlkYXRvckZvckNhbGVuZGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGVjZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRnV0dXJlVmFsaWRhdG9yRm9yQ2FsZW5kYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IHZhbGlkYXRlIGEgZGF0ZSBvciBjYWxlbmRhciByZXByZXNlbnRpbmcgYSBkYXRlIGluIHRoZSBmdXR1cmUgPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEZ1dHVyZVZhbGlkYXRvckZvckNhbGVuZGFyIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxGdXR1cmUsIENhbGVuZGFyPiB7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEZ1dHVyZSBhbm5vdGF0aW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChDYWxlbmRhciBjYWwsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNhbCA9PSBudWxsIHx8IGNhbC5hZnRlcihub3coKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBvdmVyd3JpdGUgd2hlbiB5b3UgbmVlZCBhIGRpZmZlcmVudCBhbGdvcml0aG0gZm9yICdub3cnLgotICAgICAqCi0gICAgICogQHJldHVybiBjdXJyZW50IGRhdGUvdGltZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDYWxlbmRhciBub3coKSB7Ci0gICAgICAgIHJldHVybiBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Z1dHVyZVZhbGlkYXRvckZvckRhdGUuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Z1dHVyZVZhbGlkYXRvckZvckRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjZDE2OS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9GdXR1cmVWYWxpZGF0b3JGb3JEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5GdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IHZhbGlkYXRlIGEgZGF0ZSBvciBjYWxlbmRhciByZXByZXNlbnRpbmcgYSBkYXRlIGluIHRoZSBmdXR1cmUgPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEZ1dHVyZVZhbGlkYXRvckZvckRhdGUgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPEZ1dHVyZSwgRGF0ZT4gewotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShGdXR1cmUgYW5ub3RhdGlvbikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoRGF0ZSBkYXRlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBkYXRlID09IG51bGwgfHwgZGF0ZS5hZnRlcihub3coKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3ZlcndyaXRlIHdoZW4geW91IG5lZWQgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIGZvciAnbm93Jy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gY3VycmVudCBkYXRlL3RpbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGF0ZSBub3coKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01heFZhbGlkYXRvckZvck51bWJlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWF4VmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYWY5ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWF4VmFsaWRhdG9yRm9yTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIGJlaW5nIHZhbGlkYXRlZCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heGltdW0KLSAqIHZhbHVlIHNwZWNpZmllZC4KLSAqLwotcHVibGljIGNsYXNzIE1heFZhbGlkYXRvckZvck51bWJlciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8TWF4LCBOdW1iZXI+IHsKLQotICAgIHByaXZhdGUgbG9uZyBtYXg7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1heCBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRoaXMubWF4ID0gYW5ub3RhdGlvbi52YWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTnVtYmVyIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlKS5jb21wYXJlVG8oQmlnRGVjaW1hbC52YWx1ZU9mKG1heCkpICE9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChCaWdJbnRlZ2VyKSB2YWx1ZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihtYXgpKSAhPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmxvbmdWYWx1ZSgpIDw9IG1heDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01heFZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWF4VmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTJiY2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWF4VmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgU3RyaW5nIGJlaW5nIHZhbGlkYXRlZCByZXByZXNlbnRzIGEgbnVtYmVyLCBhbmQgaGFzIGEgdmFsdWUKLSAqIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWF4aW11bSB2YWx1ZSBzcGVjaWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXhWYWxpZGF0b3JGb3JTdHJpbmcgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE1heCwgU3RyaW5nPiB7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWF4OwotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNYXggYW5ub3RhdGlvbikgewotICAgICAgICB0aGlzLm1heCA9IGFubm90YXRpb24udmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWx1ZSkuY29tcGFyZVRvKEJpZ0RlY2ltYWwudmFsdWVPZihtYXgpKSAhPSAxOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9NaW5WYWxpZGF0b3JGb3JOdW1iZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01pblZhbGlkYXRvckZvck51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUzN2I5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01pblZhbGlkYXRvckZvck51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWluOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB2YWxpZGF0ZSB0aGF0IG51bWJlci12YWx1ZSBvZiBwYXNzZWQgb2JqZWN0IGlzID49IG1pbi12YWx1ZTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNaW5WYWxpZGF0b3JGb3JOdW1iZXIgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE1pbiwgTnVtYmVyPiB7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWluVmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1pbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRoaXMubWluVmFsdWUgPSBhbm5vdGF0aW9uLnZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChOdW1iZXIgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgewotICAgICAgICAgICAgcmV0dXJuICgoQmlnRGVjaW1hbCkgdmFsdWUpLmNvbXBhcmVUbyhCaWdEZWNpbWFsLnZhbHVlT2YobWluVmFsdWUpKSAhPSAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJpZ0ludGVnZXIpIHZhbHVlKS5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKG1pblZhbHVlKSkgIT0gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUubG9uZ1ZhbHVlKCkgPj0gbWluVmFsdWU7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01pblZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWluVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjY4ZGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTWluVmFsaWRhdG9yRm9yU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLS8qKgotICogQ2hlY2sgdGhhdCB0aGUgU3RyaW5nIGJlaW5nIHZhbGlkYXRlZCByZXByZXNlbnRzIGEgbnVtYmVyLCBhbmQgaGFzIGEgdmFsdWUKLSAqIG1vcmUgdGhhbiBvciBlcXVhbCB0byB0aGUgbWluaW11bSB2YWx1ZSBzcGVjaWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW5WYWxpZGF0b3JGb3JTdHJpbmcgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE1pbiwgU3RyaW5nPiB7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWluVmFsdWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1pbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRoaXMubWluVmFsdWUgPSBhbm5vdGF0aW9uLnZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWUpLmNvbXBhcmVUbyhCaWdEZWNpbWFsLnZhbHVlT2YobWluVmFsdWUpKSAhPSAtMTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTm90RW1wdHkuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTc4NzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTm90RW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogPHByZT4KLSAqIFRoaXMgY2xhc3MgaXMgTk9UIHBhcnQgb2YgdGhlIGJlYW5fdmFsaWRhdGlvbiBzcGVjIGFuZCBtaWdodCBkaXNhcHBlYXIKLSAqIGFzIHNvb24gYXMgYSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgotICogPC9wcmU+Ci0gKi8KLUBEb2N1bWVudGVkCi1AQ29uc3RyYWludCgKLSAgICAgIHZhbGlkYXRlZEJ5ID0ge05vdEVtcHR5VmFsaWRhdG9yRm9yQ29sbGVjdGlvbi5jbGFzcywgTm90RW1wdHlWYWxpZGF0b3JGb3JNYXAuY2xhc3MsCi0gICAgICAgICAgICBOb3RFbXB0eVZhbGlkYXRvckZvclN0cmluZy5jbGFzcywgTm90RW1wdHlWYWxpZGF0b3IuY2xhc3N9KQotQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFLCBQQVJBTUVURVJ9KQotQFJldGVudGlvbihSVU5USU1FKQotcHVibGljIEBpbnRlcmZhY2UgTm90RW1wdHkgewotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3RFbXB0eS5tZXNzYWdlfSI7Ci0KLSAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3RFbXB0eVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2IyNDkxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiAgQ2hlY2sgdGhlIG5vbiBlbXB0eW5lc3Mgb2YgYW4KLSAqIGFueSBvYmplY3QgdGhhdCBoYXMgYSBwdWJsaWMgaXNFbXB0eSgpOmJvb2xlYW4gb3IgYSB2YWxpZCB0b1N0cmluZygpIG1ldGhvZAotICovCi1wdWJsaWMgY2xhc3MgTm90RW1wdHlWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE5vdEVtcHR5LCBPYmplY3Q+IHsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5vdEVtcHR5IGNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICh2YWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5LmdldExlbmd0aCh2YWx1ZSkgPiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgaXNFbXB0eU1ldGhvZCA9IHZhbHVlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJpc0VtcHR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW1wdHlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgoQm9vbGVhbikgaXNFbXB0eU1ldGhvZC5pbnZva2UodmFsdWUpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3RFbXB0eVZhbGlkYXRvckZvckNvbGxlY3Rpb24uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yRm9yQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2MwZjNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yRm9yQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgTm90RW1wdHlWYWxpZGF0b3JGb3JDb2xsZWN0aW9uIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxOb3RFbXB0eSwgQ29sbGVjdGlvbjw/Pj4gewotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTm90RW1wdHkgY29uc3RyYWludEFubm90YXRpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQ29sbGVjdGlvbjw/PiB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUuaXNFbXB0eSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yRm9yTWFwLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3RFbXB0eVZhbGlkYXRvckZvck1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2EyOGJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdEVtcHR5VmFsaWRhdG9yRm9yTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIE5vdEVtcHR5VmFsaWRhdG9yRm9yTWFwIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxOb3RFbXB0eSwgTWFwPD8sID8+PiB7Ci0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShOb3RFbXB0eSBjb25zdHJhaW50QW5ub3RhdGlvbikgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChNYXA8PywgPz4gdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIXZhbHVlLmlzRW1wdHkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3RFbXB0eVZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTm90RW1wdHlWYWxpZGF0b3JGb3JTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NWM4ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3RFbXB0eVZhbGlkYXRvckZvclN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgTm90RW1wdHlWYWxpZGF0b3JGb3JTdHJpbmcgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE5vdEVtcHR5LCBTdHJpbmc+IHsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5vdEVtcHR5IGNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyB2YWx1ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA+IDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTm90TnVsbFZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTm90TnVsbFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNkYzIyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdE51bGxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotCi0vKiogdmFsaWQgd2hlbiBvYmplY3QgaXMgTk9UIG51bGwgKi8KLXB1YmxpYyBjbGFzcyBOb3ROdWxsVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxOb3ROdWxsLCBPYmplY3Q+IHsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5vdE51bGwgY29uc3RyYWludEFubm90YXRpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoT2JqZWN0IHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL051bGxWYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYTg1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9OdWxsVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTnVsbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdmFsaWQgd2hlbiBvYmplY3QgaXMgbnVsbDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxOdWxsLCBPYmplY3Q+IHsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTnVsbCBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCBvYmplY3QsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1Bhc3RWYWxpZGF0b3JGb3JDYWxlbmRhci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGFzdFZhbGlkYXRvckZvckNhbGVuZGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTBkYzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGFzdFZhbGlkYXRvckZvckNhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdmFsaWRhdGUgYSBkYXRlIG9yIGNhbGVuZGFyIHJlcHJlc2VudGluZyBhIGRhdGUgaW4gdGhlIHBhc3Q8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgUGFzdFZhbGlkYXRvckZvckNhbGVuZGFyIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxQYXN0LCBDYWxlbmRhcj4gewotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQYXN0IGFubm90YXRpb24pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKENhbGVuZGFyIGNhbCwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gY2FsID09IG51bGwgfHwgY2FsLmJlZm9yZShub3coKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBvdmVyd3JpdGUgd2hlbiB5b3UgbmVlZCBhIGRpZmZlcmVudCBhbGdvcml0aG0gZm9yICdub3cnLgotICAgICAqCi0gICAgICogQHJldHVybiBjdXJyZW50IGRhdGUvdGltZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDYWxlbmRhciBub3coKSB7Ci0gICAgICAgIHJldHVybiBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1Bhc3RWYWxpZGF0b3JGb3JEYXRlLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9QYXN0VmFsaWRhdG9yRm9yRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ4OGQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1Bhc3RWYWxpZGF0b3JGb3JEYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB2YWxpZGF0ZSBhIGRhdGUgb3IgY2FsZW5kYXIgcmVwcmVzZW50aW5nIGEgZGF0ZSBpbiB0aGUgcGFzdDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXN0VmFsaWRhdG9yRm9yRGF0ZSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8UGFzdCwgRGF0ZT4gewotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQYXN0IGFubm90YXRpb24pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKERhdGUgZGF0ZSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZGF0ZSA9PSBudWxsIHx8IGRhdGUuYmVmb3JlKG5vdygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBvdmVyd3JpdGUgd2hlbiB5b3UgbmVlZCBhIGRpZmZlcmVudCBhbGdvcml0aG0gZm9yICdub3cnLgotICAgICAqCi0gICAgICogQHJldHVybiBjdXJyZW50IGRhdGUvdGltZQotICAgICAqLwotICAgIHByb3RlY3RlZCBEYXRlIG5vdygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGF0dGVyblZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGF0dGVyblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDczNTYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1BhdHRlcm5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotCi0vKioKLSAqIHZhbGlkYXRvciB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwKLSAqIGJhc2VkIG9uIHRoZSBqc3IzMDMgUGF0dGVybiBjb25zdHJhaW50IGFubm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXR0ZXJuVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxQYXR0ZXJuLCBTdHJpbmc+IHsKLSAgICBwcm90ZWN0ZWQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4gcGF0dGVybjsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoUGF0dGVybiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIFBhdHRlcm4uRmxhZyBmbGFnc1tdID0gYW5ub3RhdGlvbi5mbGFncygpOwotICAgICAgICBpbnQgaW50RmxhZyA9IDA7Ci0gICAgICAgIGZvciAoUGF0dGVybi5GbGFnIGZsYWcgOiBmbGFncykgewotICAgICAgICAgICAgaW50RmxhZyA9IGludEZsYWcgfCBmbGFnLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGF0dGVybiA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoYW5ub3RhdGlvbi5yZWdleHAoKSwgaW50RmxhZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHBhdHRlcm4ubWF0Y2hlcih2YWx1ZSkubWF0Y2hlcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjNjhmZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IEFic3RyYWN0IHZhbGlkYXRvciBpbXBsLiBmb3IgQFNpemUgYW5ub3RhdGlvbjxici8+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaXplVmFsaWRhdG9yIHsKLSAgICBwcm90ZWN0ZWQgaW50IG1pbjsKLSAgICBwcm90ZWN0ZWQgaW50IG1heDsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGUgY29uc3RyYWludCB2YWxpZGF0b3IgYmFzZWQgb24gdGhlIGVsZW1lbnRzCi0gICAgICogc3BlY2lmaWVkIGF0IHRoZSB0aW1lIGl0IHdhcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnQgdGhlIGNvbnN0cmFpbnQgZGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2l6ZSBjb25zdHJhaW50KSB7Ci0gICAgICAgIG1pbiA9IGNvbnN0cmFpbnQubWluKCk7Ci0gICAgICAgIG1heCA9IGNvbnN0cmFpbnQubWF4KCk7Ci0gICAgICAgIGlmIChtaW4gPCAwKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiTWluIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICBpZiAobWF4IDwgMCkgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIk1heCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgaWYgKG1heCA8IG1pbikgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIk1heCBjYW5ub3QgYmUgbGVzcyB0aGFuIE1pbiIpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkJvb2xlYW4uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFiZjRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mQm9vbGVhbiBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBib29sZWFuW10+IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoYm9vbGVhbltdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkJ5dGUuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWUxN2NlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mQnl0ZSBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBieXRlW10+IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoYnl0ZVtdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkNoYXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQ2hhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY2MTY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mQ2hhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mQ2hhciBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBjaGFyW10+IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoY2hhcltdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkRvdWJsZS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZEb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY3NmU1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkRvdWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mRG91YmxlIGV4dGVuZHMgU2l6ZVZhbGlkYXRvcgotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPFNpemUsIGRvdWJsZVtdPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFuIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICAgVGhlIGFycmF5IHRvIHZhbGlkYXRlLgotICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbnN0cmFpbnQgaXMgZXZhbHVhdGVkLgotICAgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXkgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0gICAgICogICAgICAgICA8Y29kZT5hcnJheTwvY29kZT4gaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIDxjb2RlPm1pbjwvY29kZT4gYW5kIDxjb2RlPm1heDwvY29kZT4gdmFsdWVzIChpbmNsdXNpdmUpLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGRvdWJsZVtdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkZsb2F0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkZsb2F0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjNiNjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZGbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mRmxvYXQgZXh0ZW5kcyBTaXplVmFsaWRhdG9yCi0gICAgICBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8U2l6ZSwgZmxvYXRbXT4gewotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheSAgIFRoZSBhcnJheSB0byB2YWxpZGF0ZS4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IGluIHdoaWNoIHRoZSBjb25zdHJhaW50IGlzIGV2YWx1YXRlZC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFycmF5IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAqICAgICAgICAgPGNvZGU+YXJyYXk8L2NvZGU+IGlzIGJldHdlZW4gdGhlIHNwZWNpZmllZCA8Y29kZT5taW48L2NvZGU+IGFuZCA8Y29kZT5tYXg8L2NvZGU+IHZhbHVlcyAoaW5jbHVzaXZlKSwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChmbG9hdFtdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkludC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyZjZmMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mSW50IGV4dGVuZHMgU2l6ZVZhbGlkYXRvcgotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPFNpemUsIGludFtdPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFuIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5ICAgVGhlIGFycmF5IHRvIHZhbGlkYXRlLgotICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbnN0cmFpbnQgaXMgZXZhbHVhdGVkLgotICAgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXJyYXkgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0gICAgICogICAgICAgICA8Y29kZT5hcnJheTwvY29kZT4gaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIDxjb2RlPm1pbjwvY29kZT4gYW5kIDxjb2RlPm1heDwvY29kZT4gdmFsdWVzIChpbmNsdXNpdmUpLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGludFtdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkxvbmcuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY1Y2ViLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mTG9uZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotcHVibGljIGNsYXNzIFNpemVWYWxpZGF0b3JGb3JBcnJheU9mTG9uZyBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBsb25nW10+IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQobG9uZ1tdIGFycmF5LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKLSAgICAgICAgcmV0dXJuIGxlbmd0aCA+PSBtaW4gJiYgbGVuZ3RoIDw9IG1heDsKLQl9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZk9iamVjdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNDUwYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yQXJyYXlPZk9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLQotLyoqIENoZWNrIHRoYXQgdGhlIGxlbmd0aCBvZiBhbiBhcnJheSBpcyBiZXR3ZWVuIDxpPm1pbjwvaT4gYW5kIDxpPm1heDwvaT4gKi8KLXB1YmxpYyBjbGFzcyBTaXplVmFsaWRhdG9yRm9yQXJyYXlPZk9iamVjdCBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBPYmplY3RbXT4gewotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoT2JqZWN0W10gYXJyYXksIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOwotICAgICAgICByZXR1cm4gbGVuZ3RoID49IG1pbiAmJiBsZW5ndGggPD0gbWF4OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZTaG9ydC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQyZmFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JBcnJheU9mU2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLXB1YmxpYyBjbGFzcyBTaXplVmFsaWRhdG9yRm9yQXJyYXlPZlNob3J0IGV4dGVuZHMgU2l6ZVZhbGlkYXRvcgotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPFNpemUsIHNob3J0W10+IHsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJyYXkgICBUaGUgYXJyYXkgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhcnJheSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLSAgICAgKiAgICAgICAgIDxjb2RlPmFycmF5PC9jb2RlPiBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoc2hvcnRbXSBhcnJheSwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgIHJldHVybiBsZW5ndGggPj0gbWluICYmIGxlbmd0aCA8PSBtYXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckNvbGxlY3Rpb24uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3N2EzMDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKiBDaGVjayB0aGF0IGEgQ29sbGVjdGlvbidzIHNpemUgaXMgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KLXB1YmxpYyBjbGFzcyBTaXplVmFsaWRhdG9yRm9yQ29sbGVjdGlvbiBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBDb2xsZWN0aW9uPD8+PiB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGEgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgICAgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb2xsZWN0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotICAgICAqICAgICAgICAgPGNvZGU+Y29sbGVjdGlvbjwvY29kZT4gaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIDxjb2RlPm1pbjwvY29kZT4gYW5kIDxjb2RlPm1heDwvY29kZT4gdmFsdWVzIChpbmNsdXNpdmUpLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgICAgIHJldHVybiBsZW5ndGggPj0gbWluICYmIGxlbmd0aCA8PSBtYXg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yTWFwLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9TaXplVmFsaWRhdG9yRm9yTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzNjYzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogQ2hlY2sgdGhhdCBhIE1hcCdzIHNpemUgaXMgYmV0d2VlbiBtaW4gYW5kIG1heC4gKi8KLXB1YmxpYyBjbGFzcyBTaXplVmFsaWRhdG9yRm9yTWFwIGV4dGVuZHMgU2l6ZVZhbGlkYXRvcgotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPFNpemUsIE1hcDw/LCA/Pj4gewotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwICAgICBUaGUgbWFwIHRvIHZhbGlkYXRlLgotICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbnN0cmFpbnQgaXMgZXZhbHVhdGVkLgotICAgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFwIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiA8Y29kZT5tYXA8L2NvZGU+Ci0gICAgICogICAgICAgICBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWluPC9jb2RlPiBhbmQgPGNvZGU+bWF4PC9jb2RlPiB2YWx1ZXMgKGluY2x1c2l2ZSksCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoTWFwPD8sID8+IG1hcCwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaXplID0gbWFwLnNpemUoKTsKLSAgICAgICAgcmV0dXJuIHNpemUgPj0gbWluICYmIHNpemUgPD0gbWF4OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvclN0cmluZy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvU2l6ZVZhbGlkYXRvckZvclN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzMyNGM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1NpemVWYWxpZGF0b3JGb3JTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLS8qKiBDaGVjayB0aGF0IGEgc3RyaW5nJ3MgbGVuZ3RoIGlzIGJldHdlZW4gbWluIGFuZCBtYXguICovCi1wdWJsaWMgY2xhc3MgU2l6ZVZhbGlkYXRvckZvclN0cmluZyBleHRlbmRzIFNpemVWYWxpZGF0b3IKLSAgICAgIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxTaXplLCBTdHJpbmc+IHsKLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzICAgICAgIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUuCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBldmFsdWF0ZWQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIGxlbmd0aCBvZiA8Y29kZT5zPC9jb2RlPiBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQKLSAgICAgKiAgICAgICAgIDxjb2RlPm1pbjwvY29kZT4gYW5kIDxjb2RlPm1heDwvY29kZT4gdmFsdWVzIChpbmNsdXNpdmUpLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHMsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxlbmd0aCA9IHMubGVuZ3RoKCk7Ci0gICAgICAgIHJldHVybiBsZW5ndGggPj0gbWluICYmIGxlbmd0aCA8PSBtYXg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmYyNGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0Fubm90YXRpb25Db25zdHJhaW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnREZWNsYXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5PdmVycmlkZXNBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUmVwb3J0QXNTaW5nbGVWaW9sYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cHNDb21wdXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbC5Bbm5vdGF0aW9uUHJveHlCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBoZWxwZXIgY2xhc3MgdGhhdCBidWlsZHMgYSB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259IG9yIGl0cwotICogY29tcG9zaXRlIGNvbnN0cmFpbnQgdmFsaWRhdGlvbnMgYnkgcGFyc2luZyB0aGUganNyMzAzLWFubm90YXRpb25zIGFuZAotICogcHJvdmlkaW5nIGluZm9ybWF0aW9uIChlLmcuIGZvciBAT3ZlcnJpZGVzQXR0cmlidXRlcykgPGJyLz4KLSAqLwotZmluYWwgY2xhc3MgQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGNvbnN0cmFpbnRWYWxpZGF0aW9uOwotICAgIHByaXZhdGUgTGlzdDxDb25zdHJhaW50T3ZlcnJpZGVzPiBvdmVycmlkZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc2VzCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnRWYWxpZGF0b3IKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbgotICAgICAqIEBwYXJhbSBvd25lcgotICAgICAqIEBwYXJhbSBhY2Nlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyKENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+PltdIHZhbGlkYXRvckNsYXNzZXMsCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4gY29uc3RyYWludFZhbGlkYXRvciwgQSBhbm5vdGF0aW9uLCBDbGFzczw/PiBvd25lciwgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVwb3J0RnJvbUNvbXBvc2l0ZSA9Ci0gICAgICAgICAgICBhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmlzQW5ub3RhdGlvblByZXNlbnQoUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24uY2xhc3MpOwotICAgICAgICBjb25zdHJhaW50VmFsaWRhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgQ29uc3RyYWludFZhbGlkYXRpb248QT4odmFsaWRhdG9yQ2xhc3NlcywgY29uc3RyYWludFZhbGlkYXRvciwgYW5ub3RhdGlvbiwgb3duZXIsIGFjY2VzcywKLSAgICAgICAgICAgICAgICByZXBvcnRGcm9tQ29tcG9zaXRlKTsKLSAgICAgICAgYnVpbGRGcm9tQW5ub3RhdGlvbigpOwotICAgIH0KLQotICAgIC8qKiBidWlsZCBhdHRyaWJ1dGVzLCBwYXlsb2FkLCBncm91cHMgZnJvbSAnYW5ub3RhdGlvbicgKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRGcm9tQW5ub3RhdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnRWYWxpZGF0aW9uLmdldEFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBydW4obmV3IFByaXZpbGVnZWRBY3Rpb248T2JqZWN0PigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogY29uc3RyYWludFZhbGlkYXRpb24uZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwcyArIHBheWxvYWQgbXVzdCBhbHNvIGFwcGVhciBpbiBhdHRyaWJ1dGVzIChhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkIGJ5IFRDSy1UZXN0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuUEFZTE9BRC5nZXRBdHRyaWJ1dGVOYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFBheWxvYWQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuR1JPVVBTLmdldEF0dHJpYnV0ZU5hbWUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRHcm91cHMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWYWxpZGF0aW9uLmdldEF0dHJpYnV0ZXMoKS5wdXQobWV0aG9kLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGNvbnN0cmFpbnRWYWxpZGF0aW9uLmdldEFubm90YXRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLldBUk5JTkcsIFN0cmluZy5mb3JtYXQoIkVycm9yIHByb2Nlc3NpbmcgYW5ub3RhdGlvbjogJXMgIiwgY29uc3RyYWludFZhbGlkYXRpb24uZ2V0QW5ub3RhdGlvbigpKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkR3JvdXBzKE1ldGhvZCBtZXRob2QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHJhdyA9IG1ldGhvZC5pbnZva2UoY29uc3RyYWludFZhbGlkYXRpb24uZ2V0QW5ub3RhdGlvbigpKTsKLSAgICAgICAgQ2xhc3M8Pz5bXSBnYXJyOwotICAgICAgICBpZiAocmF3IGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKLSAgICAgICAgICAgIGdhcnIgPSBuZXcgQ2xhc3NbXSB7IChDbGFzczw/PikgcmF3IH07Ci0gICAgICAgIH0gZWxzZSBpZiAocmF3IGluc3RhbmNlb2YgQ2xhc3M8Pz5bXSkgewotICAgICAgICAgICAgZ2FyciA9IChDbGFzczw/PltdKSByYXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnYXJyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnYXJyID09IG51bGwgfHwgZ2Fyci5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgZ2FyciA9IEdyb3Vwc0NvbXB1dGVyLmdldERlZmF1bHRHcm91cEFycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3RyYWludFZhbGlkYXRpb24uc2V0R3JvdXBzKG5ldyBIYXNoU2V0PENsYXNzPD8+PihBcnJheXMuYXNMaXN0KGdhcnIpKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkUGF5bG9hZChNZXRob2QgbWV0aG9kKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWRfcmF3ID0KLSAgICAgICAgICAgIChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSkgbWV0aG9kLmludm9rZShjb25zdHJhaW50VmFsaWRhdGlvbi5nZXRBbm5vdGF0aW9uKCkpOwotICAgICAgICBTZXQ8Q2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+PiBwYXlsb2FkU2V0OwotICAgICAgICBpZiAocGF5bG9hZF9yYXcgPT0gbnVsbCkgewotICAgICAgICAgICAgcGF5bG9hZFNldCA9IENvbGxlY3Rpb25zLjxDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4+IGVtcHR5U2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXlsb2FkU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+PihwYXlsb2FkX3Jhdy5sZW5ndGgpOwotICAgICAgICAgICAgcGF5bG9hZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXlsb2FkX3JhdykpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0cmFpbnRWYWxpZGF0aW9uLnNldFBheWxvYWQocGF5bG9hZFNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb25maWd1cmVkIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0uCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkgewotICAgICAgICByZXR1cm4gY29uc3RyYWludFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhbGl6ZSBhIGNoaWxkIGNvbXBvc2l0ZSAndmFsaWRhdGlvbicgd2l0aCBAT3ZlcnJpZGVzQXR0cmlidXRlIGZyb20KLSAgICAgKiAnY29uc3RyYWludFZhbGlkYXRpb24nIGFuZCBhZGQgdG8gY29tcG9zaXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wb3NlZChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjb21wb3NpdGUpIHsKLSAgICAgICAgYXBwbHlPdmVycmlkZXNBdHRyaWJ1dGVzKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGNvbnN0cmFpbnRWYWxpZGF0aW9uLmFkZENvbXBvc2VkKGNvbXBvc2l0ZSk7IC8vIGFkZCBBRlRFUiBhcHBseSgpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5T3ZlcnJpZGVzQXR0cmlidXRlcyhDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjb21wb3NpdGUpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gb3ZlcnJpZGVzKSB7Ci0gICAgICAgICAgICBidWlsZE92ZXJyaWRlc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW92ZXJyaWRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGNvbXB1dGVJbmRleChjb21wb3NpdGUpOwotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBvdmVycmlkZXMgdG8gYXBwbHkKLSAgICAgICAgICAgIENvbnN0cmFpbnRPdmVycmlkZXMgZ2VuZXJhbE92ZXJyaWRlID0gZmluZE92ZXJyaWRlKGNvbXBvc2l0ZS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKSwgLTEpOwotICAgICAgICAgICAgaWYgKGdlbmVyYWxPdmVycmlkZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uc3RyYWludERlY2xhcmF0aW9uRXhjZXB0aW9uKCJXcm9uZyBPdmVycmlkZXNBdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhbE92ZXJyaWRlLmNvbnN0cmFpbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0IG5lZWRzIGEgZGVmaW5lZCBpbmRleCB3aGVuIHRoZXJlIGlzIGEgbGlzdCBvZiBjb25zdHJhaW50cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZW5lcmFsT3ZlcnJpZGUuYXBwbHlPbihjb21wb3NpdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25zdHJhaW50T3ZlcnJpZGVzIG92ZXJyaWRlID0gZmluZE92ZXJyaWRlKGNvbXBvc2l0ZS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKSwgaW5kZXgpOwotICAgICAgICAgICAgaWYgKG92ZXJyaWRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdmVycmlkZS5hcHBseU9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZXMgdGhlIGluZGV4IG9mIHRoZSBjb21wb3NpdGUgY29uc3RyYWludC4gVGhlIGluZGV4IHJlcHJlc2VudHMKLSAgICAgKiB0aGUgb3JkZXIgaW4gd2hpY2ggaXQgaXMgYWRkZWQgaW4gcmVmZXJlbmNlIHRvIG90aGVyIGNvbnN0cmFpbnRzIG9mIHRoZQotICAgICAqIHNhbWUgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICogICAgICAgICAgICBUaGUgY29tcG9zaXRlIGNvbnN0cmFpbnQgKG5vdCB5ZXQgYWRkZWQpLgotICAgICAqIEByZXR1cm4gQW4gaW50ZWdlciBpbmRleCBhbHdheXMgPj0gMAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNvbXB1dGVJbmRleChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjb21wb3NpdGUpIHsKLSAgICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICAgIGZvciAoQ29uc3RyYWludFZhbGlkYXRpb248Pz4gZWFjaCA6IGNvbnN0cmFpbnRWYWxpZGF0aW9uLmdldENvbXBvc2luZ1ZhbGlkYXRpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChlYWNoLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpID09IGNvbXBvc2l0ZS5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKSkgewotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZHg7Ci0gICAgfQotCi0gICAgLyoqIHJlYWQgb3ZlcnJpZGVzQXR0cmlidXRlcyBmcm9tIGNvbnN0cmFpbnRWYWxpZGF0aW9uLmFubm90YXRpb24gKi8KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRPdmVycmlkZXNBdHRyaWJ1dGVzKCkgewotICAgICAgICBvdmVycmlkZXMgPSBuZXcgTGlua2VkTGlzdDxDb25zdHJhaW50T3ZlcnJpZGVzPigpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBjb25zdHJhaW50VmFsaWRhdGlvbi5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotICAgICAgICAgICAgT3ZlcnJpZGVzQXR0cmlidXRlLkxpc3QgYW5ub09BTCA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKE92ZXJyaWRlc0F0dHJpYnV0ZS5MaXN0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vT0FMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE92ZXJyaWRlc0F0dHJpYnV0ZSBhbm5vT0EgOiBhbm5vT0FMLnZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VDb25zdHJhaW50T3ZlcnJpZGUobWV0aG9kLmdldE5hbWUoKSwgYW5ub09BKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPdmVycmlkZXNBdHRyaWJ1dGUgYW5ub09BID0gbWV0aG9kLmdldEFubm90YXRpb24oT3ZlcnJpZGVzQXR0cmlidXRlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vT0EgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnNlQ29uc3RyYWludE92ZXJyaWRlKG1ldGhvZC5nZXROYW1lKCksIGFubm9PQSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VDb25zdHJhaW50T3ZlcnJpZGUoU3RyaW5nIG1ldGhvZE5hbWUsIE92ZXJyaWRlc0F0dHJpYnV0ZSBvYSkgewotICAgICAgICBDb25zdHJhaW50T3ZlcnJpZGVzIHRhcmdldCA9IGZpbmRPdmVycmlkZShvYS5jb25zdHJhaW50KCksIG9hLmNvbnN0cmFpbnRJbmRleCgpKTsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBuZXcgQ29uc3RyYWludE92ZXJyaWRlcyhvYS5jb25zdHJhaW50KCksIG9hLmNvbnN0cmFpbnRJbmRleCgpKTsKLSAgICAgICAgICAgIG92ZXJyaWRlcy5hZGQodGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXQudmFsdWVzLnB1dChvYS5uYW1lKCksIGNvbnN0cmFpbnRWYWxpZGF0aW9uLmdldEF0dHJpYnV0ZXMoKS5nZXQobWV0aG9kTmFtZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29uc3RyYWludE92ZXJyaWRlcyBmaW5kT3ZlcnJpZGUoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNvbnN0cmFpbnQsIGludCBjb25zdHJhaW50SW5kZXgpIHsKLSAgICAgICAgZm9yIChDb25zdHJhaW50T3ZlcnJpZGVzIGVhY2ggOiBvdmVycmlkZXMpIHsKLSAgICAgICAgICAgIGlmIChlYWNoLmNvbnN0cmFpbnRUeXBlID09IGNvbnN0cmFpbnQgJiYgZWFjaC5jb25zdHJhaW50SW5kZXggPT0gY29uc3RyYWludEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVhY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHZhbHVlcyB0byBvdmVycmlkZSBpbiBhIGNvbXBvc2VkIGNvbnN0cmFpbnQgZHVyaW5nIGNyZWF0aW9uIG9mCi0gICAgICogYSBjb21wb3NlZCBDb25zdHJhaW50VmFsaWRhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnN0cmFpbnRPdmVycmlkZXMgewotICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gY29uc3RyYWludFR5cGU7Ci0gICAgICAgIGZpbmFsIGludCBjb25zdHJhaW50SW5kZXg7Ci0KLSAgICAgICAgLyoqIGtleSA9IGF0dHJpYnV0ZU5hbWUsIHZhbHVlID0gb3ZlcnJpZGRlbiB2YWx1ZSAqLwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlczsKLQotICAgICAgICBwcml2YXRlIENvbnN0cmFpbnRPdmVycmlkZXMoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGNvbnN0cmFpbnRUeXBlLCBpbnQgY29uc3RyYWludEluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRUeXBlID0gY29uc3RyYWludFR5cGU7Ci0gICAgICAgICAgICB0aGlzLmNvbnN0cmFpbnRJbmRleCA9IGNvbnN0cmFpbnRJbmRleDsKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIHByaXZhdGUgdm9pZCBhcHBseU9uKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGNvbXBvc2l0ZSkgewotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICBjb21wb3NpdGUuZ2V0QXR0cmlidXRlcygpLnB1dEFsbCh2YWx1ZXMpOwotCi0gICAgICAgICAgICAvLyBBbmQgdGhlIGFubm90YXRpb24KLSAgICAgICAgICAgIEFubm90YXRpb24gb3JpZ2luYWxBbm5vdCA9IGNvbXBvc2l0ZS5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uUHJveHlCdWlsZGVyPEFubm90YXRpb24+IGFwYiA9IG5ldyBBbm5vdGF0aW9uUHJveHlCdWlsZGVyPEFubm90YXRpb24+KG9yaWdpbmFsQW5ub3QpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogdmFsdWVzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYXBiLnB1dFZhbHVlKGtleSwgdmFsdWVzLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb24gbmV3QW5ub3QgPSBhcGIuY3JlYXRlQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgKChDb25zdHJhaW50VmFsaWRhdGlvbjxBbm5vdGF0aW9uPikgY29tcG9zaXRlKS5zZXRBbm5vdGF0aW9uKG5ld0Fubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJ1bihQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbikgewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Bbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI5ZTgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Bbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVW5leHBlY3RlZFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5Db25zdHJhaW50RGVmaW5pdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuU2VjdXJlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnJlZmxlY3QuVHlwZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBpbXBsZW1lbnRzIHVuaWZvcm0gaGFuZGxpbmcgb2YgSlNSMzAzIHtAbGluayBDb25zdHJhaW50fQotICogYW5ub3RhdGlvbnMsIGluY2x1ZGluZyBjb21wb3NlZCBjb25zdHJhaW50cyBhbmQgdGhlIHJlc29sdXRpb24gb2YKLSAqIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yfSBpbXBsZW1lbnRhdGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXY6IDk5Njk5MiAkICREYXRlOiAyMDEwLTA5LTE0IDEyOjA1OjQwIC0wNTAwIChUdWUsIDE0IFNlcCAyMDEwKSAkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAvKioge0BsaW5rIEFwYWNoZUZhY3RvcnlDb250ZXh0fSB1c2VkICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvblByb2Nlc3Nvcn0gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIEFubm90YXRpb25Qcm9jZXNzb3IoQXBhY2hlRmFjdG9yeUNvbnRleHQgZmFjdG9yeUNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5Q29udGV4dCA9IGZhY3RvcnlDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgSlNSMzAzIGFubm90YXRpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICogICAgICAgICAgICBwb3RlbnRpYWxseSBudWxsCi0gICAgICogQHBhcmFtIG93bmVyCi0gICAgICogICAgICAgICAgICBiZWFuIHR5cGUKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqICAgICAgICAgICAgd2hvc2UgYW5ub3RhdGlvbnMgdG8gcmVhZAotICAgICAqIEBwYXJhbSBhY2Nlc3MKLSAgICAgKiAgICAgICAgICAgIHN0cmF0ZWd5IGZvciA8Y29kZT5wcm9wPC9jb2RlPgotICAgICAqIEBwYXJhbSBhcHBlbmRlcgotICAgICAqICAgICAgICAgICAgaGFuZGxpbmcgYWNjdW11bGF0aW9uCi0gICAgICogQHJldHVybiB3aGV0aGVyIGFueSBwcm9jZXNzaW5nIHRvb2sgcGxhY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQW5ub3RhdGlvbnMoTWV0YVByb3BlcnR5IHByb3AsIENsYXNzPD8+IG93bmVyLCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsCi0gICAgICAgIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcywgQXBwZW5kVmFsaWRhdGlvbiBhcHBlbmRlcikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGVsZW1lbnQuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICBjaGFuZ2VkIHw9IHByb2Nlc3NBbm5vdGF0aW9uKGFubm90YXRpb24sIHByb3AsIG93bmVyLCBhY2Nlc3MsIGFwcGVuZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcHJvY2VzcyBhIHNpbmdsZSBjbGFzcy1sZXZlbCBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8QT4KLSAgICAgKiAgICAgICAgICAgIGFubm90YXRpb24gdHlwZQotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uCi0gICAgICogICAgICAgICAgICB0byBwcm9jZXNzCi0gICAgICogQHBhcmFtIG93bmVyCi0gICAgICogICAgICAgICAgICBiZWFuIHR5cGUKLSAgICAgKiBAcGFyYW0gYXBwZW5kZXIKLSAgICAgKiAgICAgICAgICAgIGhhbmRsaW5nIGFjY3VtdWxhdGlvbgotICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgcHJvY2Vzc2luZyB0b29rIHBsYWNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gYm9vbGVhbiBwcm9jZXNzQW5ub3RhdGlvbihBIGFubm90YXRpb24sIENsYXNzPD8+IG93bmVyLCBBcHBlbmRWYWxpZGF0aW9uIGFwcGVuZGVyKQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBudWxsLCBvd25lciwgbnVsbCwgYXBwZW5kZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBzaW5nbGUgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPEE+Ci0gICAgICogICAgICAgICAgICBhbm5vdGF0aW9uIHR5cGUKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbgotICAgICAqICAgICAgICAgICAgdG8gcHJvY2VzcwotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICogICAgICAgICAgICBwb3RlbnRpYWxseSBudWxsCi0gICAgICogQHBhcmFtIG93bmVyCi0gICAgICogICAgICAgICAgICBiZWFuIHR5cGUKLSAgICAgKiBAcGFyYW0gYWNjZXNzCi0gICAgICogICAgICAgICAgICBzdHJhdGVneSBmb3IgPGNvZGU+cHJvcDwvY29kZT4KLSAgICAgKiBAcGFyYW0gYXBwZW5kZXIKLSAgICAgKiAgICAgICAgICAgIGhhbmRsaW5nIGFjY3VtdWxhdGlvbgotICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgcHJvY2Vzc2luZyB0b29rIHBsYWNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gYm9vbGVhbiBwcm9jZXNzQW5ub3RhdGlvbihBIGFubm90YXRpb24sIE1ldGFQcm9wZXJ0eSBwcm9wLCBDbGFzczw/PiBvd25lciwKLSAgICAgICAgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzLCBBcHBlbmRWYWxpZGF0aW9uIGFwcGVuZGVyKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVmFsaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRBY2Nlc3NTdHJhdGVneShwcm9wLCBhY2Nlc3MpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbm5vdGF0aW9uIGlzIGNvbnNpZGVyZWQgYSBjb25zdHJhaW50IGRlZmluaXRpb24gaWYgaXRzIHJldGVudGlvbgotICAgICAgICAgKiBwb2xpY3kgY29udGFpbnMgUlVOVElNRSBhbmQgaWYgdGhlIGFubm90YXRpb24gaXRzZWxmIGlzIGFubm90YXRlZAotICAgICAgICAgKiB3aXRoIGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludC4KLSAgICAgICAgICovCi0gICAgICAgIENvbnN0cmFpbnQgdmNBbm5vID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldEFubm90YXRpb24oQ29uc3RyYWludC5jbGFzcyk7Ci0gICAgICAgIGlmICh2Y0Fubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgQ29uc3RyYWludERlZmluaXRpb25WYWxpZGF0b3IudmFsaWRhdGVDb25zdHJhaW50RGVmaW5pdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+PltdIHZhbGlkYXRvckNsYXNzZXM7Ci0gICAgICAgICAgICB2YWxpZGF0b3JDbGFzc2VzID0gZmluZENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKGFubm90YXRpb24sIHZjQW5ubyk7Ci0gICAgICAgICAgICByZXR1cm4gYXBwbHlDb25zdHJhaW50KGFubm90YXRpb24sIHZhbGlkYXRvckNsYXNzZXMsIHByb3AsIG93bmVyLCBhY2Nlc3MsIGFwcGVuZGVyKTsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGktdmFsdWVkIGNvbnN0cmFpbnRzOiBUbyBzdXBwb3J0IHRoaXMgcmVxdWlyZW1lbnQsIHRoZSBiZWFuCi0gICAgICAgICAqIHZhbGlkYXRpb24gcHJvdmlkZXIgdHJlYXRzIHJlZ3VsYXIgYW5ub3RhdGlvbnMgKGFubm90YXRpb25zIG5vdAotICAgICAgICAgKiBhbm5vdGF0ZWQgYnkgQENvbnN0cmFpbnQpIHdob3NlIHZhbHVlIGVsZW1lbnQgaGFzIGEgcmV0dXJuIHR5cGUgb2YgYW4KLSAgICAgICAgICogYXJyYXkgb2YgY29uc3RyYWludCBhbm5vdGF0aW9ucyBpbiBhIHNwZWNpYWwgd2F5LgotICAgICAgICAgKi8KLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9Ci0gICAgICAgICAgICBTZWN1cmVBY3Rpb25zLmdldEFubm90YXRpb25WYWx1ZShhbm5vdGF0aW9uLCBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuVkFMVUUuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFubm90YXRpb25bXSkgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gZWFjaCA6IChBbm5vdGF0aW9uW10pIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gcHJvY2Vzc0Fubm90YXRpb24oZWFjaCwgcHJvcCwgb3duZXIsIGFjY2VzcywgYXBwZW5kZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIHtAbGluayBBY2Nlc3NTdHJhdGVneX0gdG8gPGNvZGU+cHJvcDwvY29kZT47IG5vb3AgaWYKLSAgICAgKiA8Y29kZT5wcm9wID09IG51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICogQHBhcmFtIGFjY2VzcwotICAgICAqIEByZXR1cm4gd2hldGhlciBhbnl0aGluZyB0b29rIHBsYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZEFjY2Vzc1N0cmF0ZWd5KE1ldGFQcm9wZXJ0eSBwcm9wLCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MpIHsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIEFjY2Vzc1N0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IHByb3AuZ2V0RmVhdHVyZShGZWF0dXJlcy5Qcm9wZXJ0eS5SRUZfQ0FTQ0FERSk7Ci0gICAgICAgIGlmIChzdHJhdGVnaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmF0ZWdpZXMgPSBuZXcgQWNjZXNzU3RyYXRlZ3lbXSB7IGFjY2VzcyB9OwotICAgICAgICAgICAgcHJvcC5wdXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5LlJFRl9DQVNDQURFLCBzdHJhdGVnaWVzKTsKLSAgICAgICAgfSBlbHNlIGlmICghQXJyYXlVdGlscy5jb250YWlucyhzdHJhdGVnaWVzLCBhY2Nlc3MpKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuUkVGX0NBU0NBREUsIEFycmF5VXRpbHMuYWRkKHN0cmF0ZWdpZXMsIGFjY2VzcykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYXZhaWxhYmxlIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0gY2xhc3NlcyBmb3IgYSBnaXZlbgotICAgICAqIGNvbnN0cmFpbnQgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbgotICAgICAqIEBwYXJhbSB2Y0Fubm8KLSAgICAgKiBAcmV0dXJuIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0gaW1wbGVtZW50YXRpb24gY2xhc3MgYXJyYXkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4+W10gZmluZENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKAotICAgICAgICBBIGFubm90YXRpb24sIENvbnN0cmFpbnQgdmNBbm5vKSB7Ci0gICAgICAgIGlmICh2Y0Fubm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdmNBbm5vID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmdldEFubm90YXRpb24oQ29uc3RyYWludC5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4+W10gdmFsaWRhdG9yQ2xhc3NlczsKLSAgICAgICAgQ2xhc3M8QT4gYW5ub3RhdGlvblR5cGUgPSAoQ2xhc3M8QT4pIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKTsKLSAgICAgICAgdmFsaWRhdG9yQ2xhc3NlcyA9IGZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXRDb25zdHJhaW50c0NhY2hlKCkuZ2V0Q29uc3RyYWludFZhbGlkYXRvcnMoYW5ub3RhdGlvblR5cGUpOwotICAgICAgICBpZiAodmFsaWRhdG9yQ2xhc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3JDbGFzc2VzID0gKENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+PltdKSB2Y0Fubm8udmFsaWRhdGVkQnkoKTsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3JDbGFzc2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yQ2xhc3NlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXREZWZhdWx0Q29uc3RyYWludHMoKS5nZXRWYWxpZGF0b3JDbGFzc2VzKGFubm90YXRpb25UeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdG9yQ2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSBhIGNvbnN0cmFpbnQgdG8gdGhlIHNwZWNpZmllZCA8Y29kZT5hcHBlbmRlcjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnQgYW5ub3RhdGlvbgotICAgICAqIEBwYXJhbSBjb25zdHJhaW50Q2xhc3NlcwotICAgICAqICAgICAgICAgICAga25vd24ge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3J9IGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZm9yCi0gICAgICogICAgICAgICAgICA8Y29kZT5hbm5vdGF0aW9uPC9jb2RlPgotICAgICAqIEBwYXJhbSBwcm9wCi0gICAgICogICAgICAgICAgICBtZXRhLXByb3BlcnR5Ci0gICAgICogQHBhcmFtIG93bmVyCi0gICAgICogICAgICAgICAgICB0eXBlCi0gICAgICogQHBhcmFtIGFjY2VzcwotICAgICAqICAgICAgICAgICAgc3RyYXRlZ3kKLSAgICAgKiBAcGFyYW0gYXBwZW5kZXIKLSAgICAgKiBAcmV0dXJuIHN1Y2Nlc3MgZmxhZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBib29sZWFuIGFwcGx5Q29uc3RyYWludChBIGFubm90YXRpb24sCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+PltdIGNvbnN0cmFpbnRDbGFzc2VzLCBNZXRhUHJvcGVydHkgcHJvcCwgQ2xhc3M8Pz4gb3duZXIsCi0gICAgICAgIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcywgQXBwZW5kVmFsaWRhdGlvbiBhcHBlbmRlcikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4gdmFsaWRhdG9yID0KLSAgICAgICAgICAgIGdldENvbnN0cmFpbnRWYWxpZGF0b3IoYW5ub3RhdGlvbiwgY29uc3RyYWludENsYXNzZXMsIG93bmVyLCBhY2Nlc3MpOwotICAgICAgICBmaW5hbCBBbm5vdGF0aW9uQ29uc3RyYWludEJ1aWxkZXI8QT4gYnVpbGRlciA9Ci0gICAgICAgICAgICBuZXcgQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyPEE+KGNvbnN0cmFpbnRDbGFzc2VzLCB2YWxpZGF0b3IsIGFubm90YXRpb24sIG93bmVyLCBhY2Nlc3MpOwotCi0gICAgICAgIC8vIEpTUi0zMDMgMy40LjQ6IEFkZCBpbXBsaWNpdCBncm91cHMKLSAgICAgICAgaWYgKHByb3AgIT0gbnVsbCAmJiBwcm9wLmdldFBhcmVudE1ldGFCZWFuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTWV0YUJlYW4gcGFyZW50TWV0YUJlYW4gPSBwcm9wLmdldFBhcmVudE1ldGFCZWFuKCk7Ci0gICAgICAgICAgICAvLyBJZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG93bmVyIGlzIGFuIGludGVyZmFjZQotICAgICAgICAgICAgLy8gLSB0aGUgY2xhc3Mgb2YgdGhlIG1ldGFiZWFuIGJlaW5nIGJ1aWxkIGlzIGRpZmZlcmVudCB0aGFuIHRoZQotICAgICAgICAgICAgLy8gb3duZXIKLSAgICAgICAgICAgIC8vIC0gYW5kIG9ubHkgdGhlIERlZmF1bHQgZ3JvdXAgaXMgZGVmaW5lZAotICAgICAgICAgICAgLy8gVGhlbjogYWRkIHRoZSBvd25lciBpbnRlcmZhY2UgYXMgaW1wbGljaXQgZ3JvdXBzCi0gICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLmdldE93bmVyKCkuaXNJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICYmIHBhcmVudE1ldGFCZWFuLmdldEJlYW5DbGFzcygpICE9IGJ1aWxkZXIuZ2V0Q29uc3RyYWludFZhbGlkYXRpb24oKS5nZXRPd25lcigpCi0gICAgICAgICAgICAgICAgJiYgYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLmdldEdyb3VwcygpLnNpemUoKSA9PSAxCi0gICAgICAgICAgICAgICAgJiYgYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLmdldEdyb3VwcygpLmNvbnRhaW5zKERlZmF1bHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgU2V0PENsYXNzPD8+PiBncm91cHMgPSBidWlsZGVyLmdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXBzLmFkZChidWlsZGVyLmdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkuZ2V0T3duZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLnNldEdyb3Vwcyhncm91cHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYWxyZWFkeSBidWlsZGluZyBhIGNvbnN0cmFpbnQgY29tcG9zaXRpb24gdHJlZSwgZW5zdXJlIHRoYXQ6Ci0gICAgICAgIC8vIC0gdGhlIHBhcmVudCBncm91cHMgYXJlIGluaGVyaXRlZAotICAgICAgICAvLyAtIHRoZSBwYXJlbnQgcGF5bG9hZCBpcyBpbmhlcml0ZWQKLSAgICAgICAgaWYgKGFwcGVuZGVyIGluc3RhbmNlb2YgQXBwZW5kVmFsaWRhdGlvblRvQnVpbGRlcikgewotICAgICAgICAgICAgQXBwZW5kVmFsaWRhdGlvblRvQnVpbGRlciBhdmIgPSAoQXBwZW5kVmFsaWRhdGlvblRvQnVpbGRlcikgYXBwZW5kZXI7Ci0gICAgICAgICAgICBidWlsZGVyLmdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkuc2V0R3JvdXBzKGF2Yi5nZXRJbmhlcml0ZWRHcm91cHMoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkuc2V0UGF5bG9hZChhdmIuZ2V0SW5oZXJpdGVkUGF5bG9hZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb2Nlc3MgY29tcG9zZWQgY29uc3RyYWludHM6Ci0gICAgICAgIC8vIGhlcmUgYXJlIG5vdCBvdGhlciBzdXBlcmNsYXNzZXMgcG9zc2libGUsIGJlY2F1c2UgYW5ub3RhdGlvbnMgZG8gbm90Ci0gICAgICAgIC8vIGluaGVyaXQhCi0gICAgICAgIHByb2Nlc3NBbm5vdGF0aW9ucyhwcm9wLCBvd25lciwgYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLCBhY2Nlc3MsIG5ldyBBcHBlbmRWYWxpZGF0aW9uVG9CdWlsZGVyKGJ1aWxkZXIpKTsKLQotICAgICAgICAvLyBFdmVuIGlmIHRoZSB2YWxpZGF0b3IgaXMgbnVsbCwgaXQgbXVzdCBiZSBhZGRlZCB0byBtaW1pYyB0aGUgUkkgaW1wbAotICAgICAgICBhcHBlbmRlci5hcHBlbmQoYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8QSBleHRlbmRzIEFubm90YXRpb24sIFQ+IENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPyBzdXBlciBUPiBnZXRDb25zdHJhaW50VmFsaWRhdG9yKEEgYW5ub3RhdGlvbiwKLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4+W10gY29uc3RyYWludENsYXNzZXMsIENsYXNzPD8+IG93bmVyLCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MpIHsKLSAgICAgICAgaWYgKGNvbnN0cmFpbnRDbGFzc2VzICE9IG51bGwgJiYgY29uc3RyYWludENsYXNzZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgVHlwZSB0eXBlID0gZGV0ZXJtaW5lVGFyZ2V0ZWRUeXBlKG93bmVyLCBhY2Nlc3MpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBzcGVjIHNheXMgaW4gY2hhcHRlciAzLjUuMy46IFRoZSBDb25zdHJhaW50VmFsaWRhdG9yIGNob3NlbiB0bwotICAgICAgICAgICAgICogdmFsaWRhdGUgYSBkZWNsYXJlZCB0eXBlIFQgaXMgdGhlIG9uZSB3aGVyZSB0aGUgdHlwZSBzdXBwb3J0ZWQgYnkKLSAgICAgICAgICAgICAqIHRoZSBDb25zdHJhaW50VmFsaWRhdG9yIGlzIGEgc3VwZXJ0eXBlIG9mIFQgYW5kIHdoZXJlIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAgKiBvdGhlciBDb25zdHJhaW50VmFsaWRhdG9yIHdob3NlIHN1cHBvcnRlZCB0eXBlIGlzIGEgc3VwZXJ0eXBlIG9mCi0gICAgICAgICAgICAgKiBUIGFuZCBub3QgYSBzdXBlcnR5cGUgb2YgdGhlIGNob3NlbiBDb25zdHJhaW50VmFsaWRhdG9yIHN1cHBvcnRlZAotICAgICAgICAgICAgICogdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTWFwPFR5cGUsIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+Pj4gdmFsaWRhdG9yVHlwZXMgPQotICAgICAgICAgICAgICAgIGdldFZhbGlkYXRvcnNUeXBlcyhjb25zdHJhaW50Q2xhc3Nlcyk7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFR5cGU+IGFzc2lnbmFibGVUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZT4oY29uc3RyYWludENsYXNzZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGxBc3NpZ25hYmxlVHlwZXModHlwZSwgdmFsaWRhdG9yVHlwZXMua2V5U2V0KCksIGFzc2lnbmFibGVUeXBlcyk7Ci0gICAgICAgICAgICByZWR1Y2VBc3NpZ25hYmxlVHlwZXMoYXNzaWduYWJsZVR5cGVzKTsKLSAgICAgICAgICAgIGNoZWNrT25lVHlwZShhc3NpZ25hYmxlVHlwZXMsIHR5cGUsIG93bmVyLCBhbm5vdGF0aW9uLCBhY2Nlc3MpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPyBzdXBlciBUPiB2YWxpZGF0b3IgPQotICAgICAgICAgICAgICAgIChDb25zdHJhaW50VmFsaWRhdG9yPEEsID8gc3VwZXIgVD4pIGZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSh2YWxpZGF0b3JUeXBlcy5nZXQoYXNzaWduYWJsZVR5cGVzLmdldCgwKSkpOwotICAgICAgICAgICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkZhY3RvcnkgcmV0dXJuZWQgbnVsbCB2YWxpZGF0b3IgZm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICsgdmFsaWRhdG9yVHlwZXMuZ2V0KGFzc2lnbmFibGVUeXBlcy5nZXQoMCkpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgICAgICAgICAgIC8vIE5PVEU6IHZhbGlkYXRvciBpbml0aWFsaXphdGlvbiBkZWZlcnJlZCB1bnRpbCBhcHBlbmQgcGhhc2UKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT25lVHlwZShMaXN0PFR5cGU+IHR5cGVzLCBUeXBlIHRhcmdldFR5cGUsIENsYXNzPD8+IG93bmVyLCBBbm5vdGF0aW9uIGFubm8sCi0gICAgICAgIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcykgewotCi0gICAgICAgIGlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCgiTm8gdmFsaWRhdG9yIGNvdWxkIGJlIGZvdW5kIGZvciB0eXBlICIpLmFwcGVuZChzdHJpbmdGb3JUeXBlKHRhcmdldFR5cGUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIFNlZTogQCIpLmFwcGVuZChhbm5vLmFubm90YXRpb25UeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoIiBhdCAiKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JMb2NhdGlvbihvd25lciwgYWNjZXNzKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFR5cGVFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFtYmlndW91cyB2YWxpZGF0b3JzIGZvciB0eXBlICIpOwotICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdGb3JUeXBlKHRhcmdldFR5cGUpKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi4gU2VlOiBAIikuYXBwZW5kKGFubm8uYW5ub3RhdGlvblR5cGUoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgiIGF0ICIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBzdHJpbmdGb3JMb2NhdGlvbihvd25lciwgYWNjZXNzKSk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIuIFZhbGlkYXRvcnMgYXJlOiAiKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoVHlwZSBlYWNoIDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tbWEpCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgY29tbWEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZWFjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFR5cGVFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGltcGxlbWVudHMgc3BlYyBjaGFwdGVyIDMuNS4zLiBDb25zdHJhaW50VmFsaWRhdG9yIHJlc29sdXRpb24gYWxnb3JpdGhtLiAqLwotICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZGV0ZXJtaW5lVGFyZ2V0ZWRUeXBlKENsYXNzPD8+IG93bmVyLCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MpIHsKLSAgICAgICAgLy8gaWYgdGhlIGNvbnN0cmFpbnQgZGVjbGFyYXRpb24gaXMgaG9zdGVkIG9uIGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlLAotICAgICAgICAvLyB0aGUgdGFyZ2V0ZWQgdHlwZSBpcyB0aGUgY2xhc3Mgb3IgdGhlIGludGVyZmFjZS4KLSAgICAgICAgaWYgKGFjY2VzcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG93bmVyOwotICAgICAgICBUeXBlIHR5cGUgPSBhY2Nlc3MuZ2V0SmF2YVR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pCi0gICAgICAgICAgICB0eXBlID0gQ2xhc3NVdGlscy5wcmltaXRpdmVUb1dyYXBwZXIoKENsYXNzPD8+KSB0eXBlKTsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvclR5cGUoVHlwZSBjbGF6eikgewotICAgICAgICBpZiAoY2xhenogaW5zdGFuY2VvZiBDbGFzczw/PikgewotICAgICAgICAgICAgaWYgKCgoQ2xhc3M8Pz4pIGNsYXp6KS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChDbGFzczw/PikgY2xhenopLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCkgKyAiW10iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChDbGFzczw/PikgY2xhenopLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjbGF6ei50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmluZ0ZvckxvY2F0aW9uKENsYXNzPD8+IG93bmVyLCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MpIHsKLSAgICAgICAgaWYgKGFjY2VzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWNjZXNzLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gb3duZXIuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsQXNzaWduYWJsZVR5cGVzKFR5cGUgdHlwZSwgU2V0PFR5cGU+IHZhbGlkYXRvcnNUeXBlcywgTGlzdDxUeXBlPiBzdWl0YWJsZVR5cGVzKSB7Ci0gICAgICAgIGZvciAoVHlwZSB2YWxpZGF0b3JUeXBlIDogdmFsaWRhdG9yc1R5cGVzKSB7Ci0gICAgICAgICAgICBpZiAob3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnJlZmxlY3QuVHlwZVV0aWxzLmlzQXNzaWduYWJsZSh0eXBlLCB2YWxpZGF0b3JUeXBlKQotICAgICAgICAgICAgICAgICYmICFzdWl0YWJsZVR5cGVzLmNvbnRhaW5zKHZhbGlkYXRvclR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgc3VpdGFibGVUeXBlcy5hZGQodmFsaWRhdG9yVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byByZWR1Y2UgYWxsIGFzc2lnbmFibGUgY2xhc3NlcyBkb3duIHRvIGEgc2luZ2xlIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhc3NpZ25hYmxlVHlwZXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBzZXQgb2YgYWxsIGNsYXNzZXMgd2hpY2ggYXJlIGFzc2lnbmFibGUgdG8gdGhlIGNsYXNzIG9mCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkIGFuZCB3aGljaCBhcmUgaGFuZGxlZCBieSBhdCBsZWFzdAotICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSB2YWxpZGF0b3JzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWR1Y2VBc3NpZ25hYmxlVHlwZXMoTGlzdDxUeXBlPiBhc3NpZ25hYmxlVHlwZXMpIHsKLSAgICAgICAgaWYgKGFzc2lnbmFibGVUeXBlcy5zaXplKCkgPD0gMSkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHJlZHVjZQotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlZDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlID0gYXNzaWduYWJsZVR5cGVzLmdldCgwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXNzaWduYWJsZVR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHlwZSBuZXh0VHlwZSA9IGFzc2lnbmFibGVUeXBlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFR5cGVVdGlscy5pc0Fzc2lnbmFibGUobmV4dFR5cGUsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2lnbmFibGVUeXBlcy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbHMuaXNBc3NpZ25hYmxlKHR5cGUsIG5leHRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NpZ25hYmxlVHlwZXMucmVtb3ZlKGktLSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmVtb3ZlZCAmJiBhc3NpZ25hYmxlVHlwZXMuc2l6ZSgpID4gMSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIHNldCBvZiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvcn0gaW1wbGVtZW50YXRpb24gY2xhc3NlcywgbWFwCi0gICAgICogdGhvc2UgdG8gdGhlaXIgdGFyZ2V0IHR5cGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlcwotICAgICAqIEByZXR1cm4ge0BsaW5rIE1hcH0gb2Yge0BsaW5rIFR5cGV9IDoge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3J9IHN1YnR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyA8QSBleHRlbmRzIEFubm90YXRpb24+IE1hcDxUeXBlLCBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj4+IGdldFZhbGlkYXRvcnNUeXBlcygKLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8QSwgPz4+W10gY29uc3RyYWludFZhbGlkYXRvckNsYXNzZXMpIHsKLSAgICAgICAgTWFwPFR5cGUsIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+Pj4gdmFsaWRhdG9yc1R5cGVzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFR5cGUsIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+Pj4oKTsKLSAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj4gdmFsaWRhdG9yVHlwZSA6IGNvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKSB7Ci0gICAgICAgICAgICBUeXBlIHZhbGlkYXRlZFR5cGUgPQotICAgICAgICAgICAgICAgIFR5cGVVdGlscy5nZXRUeXBlQXJndW1lbnRzKHZhbGlkYXRvclR5cGUsIENvbnN0cmFpbnRWYWxpZGF0b3IuY2xhc3MpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvci5jbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpWzFdKTsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDb3VsZCBub3QgZGV0ZWN0IHZhbGlkYXRlZCB0eXBlIGZvciAlcyIsIHZhbGlkYXRvclR5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRUeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgewotICAgICAgICAgICAgICAgIFR5cGUgY29tcG9uZW50VHlwZSA9IFR5cGVVdGlscy5nZXRBcnJheUNvbXBvbmVudFR5cGUodmFsaWRhdGVkVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgewotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRUeXBlID0gQXJyYXkubmV3SW5zdGFuY2UoKENsYXNzPD8+KSBjb21wb25lbnRUeXBlLCAwKS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbGlkYXRvcnNUeXBlcy5wdXQodmFsaWRhdGVkVHlwZSwgdmFsaWRhdG9yVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnNUeXBlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVGYWN0b3J5Q29udGV4dC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwYWNoZUZhY3RvcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzJmNTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwYWNoZUZhY3RvcnlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yQ29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5JbnRyb3NwZWN0b3JNZXRhQmVhbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLk1ldGFCZWFuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5TZWN1cmVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC54bWwuWE1MTWV0YUJlYW5CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC54bWwuWE1MTWV0YUJlYW5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC54bWwuWE1MTWV0YUJlYW5NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMucmVmbGVjdC5Db25zdHJ1Y3RvclV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBSZXByZXNlbnRzIHRoZSBjb250ZXh0IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUKLSAqIDxjb2RlPkNsYXNzVmFsaWRhdG9yPC9jb2RlPiBpbnN0YW5jZXMuPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEFwYWNoZUZhY3RvcnlDb250ZXh0IGltcGxlbWVudHMgVmFsaWRhdG9yQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRhQmVhbkZpbmRlciBtZXRhQmVhbkZpbmRlcjsKLQotICAgIHByaXZhdGUgTWVzc2FnZUludGVycG9sYXRvciBtZXNzYWdlSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgVHJhdmVyc2FibGVSZXNvbHZlciB0cmF2ZXJzYWJsZVJlc29sdmVyOwotICAgIHByaXZhdGUgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQXBhY2hlRmFjdG9yeUNvbnRleHQgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBhY2hlRmFjdG9yeUNvbnRleHQoQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIHRoaXMubWV0YUJlYW5GaW5kZXIgPSBidWlsZE1ldGFCZWFuRmluZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEFwYWNoZUZhY3RvcnlDb250ZXh0IGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHBhcmFtIG1ldGFCZWFuRmluZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFwYWNoZUZhY3RvcnlDb250ZXh0KEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeSwgTWV0YUJlYW5GaW5kZXIgbWV0YUJlYW5GaW5kZXIpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgdGhpcy5tZXRhQmVhbkZpbmRlciA9IG1ldGFCZWFuRmluZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIEFwYWNoZVZhbGlkYXRvckZhY3Rvcnl9IHVzZWQgYnkgdGhpcwotICAgICAqIHtAbGluayBBcGFjaGVGYWN0b3J5Q29udGV4dH0uCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeX0KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1ldGFCZWFuRmluZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0BsaW5rIE1ldGFCZWFuRmluZGVyfQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBNZXRhQmVhbkZpbmRlciBnZXRNZXRhQmVhbkZpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFCZWFuRmluZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCBtZXNzYWdlSW50ZXJwb2xhdG9yKE1lc3NhZ2VJbnRlcnBvbGF0b3IgbWVzc2FnZUludGVycG9sYXRvcikgewotICAgICAgICB0aGlzLm1lc3NhZ2VJbnRlcnBvbGF0b3IgPSBtZXNzYWdlSW50ZXJwb2xhdG9yOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFZhbGlkYXRvckNvbnRleHQgdHJhdmVyc2FibGVSZXNvbHZlcihUcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy50cmF2ZXJzYWJsZVJlc29sdmVyID0gdHJhdmVyc2FibGVSZXNvbHZlcjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnl9LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5fQotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBnZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwgPyBmYWN0b3J5LmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgIDogY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICBDbGFzc1ZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ2xhc3NWYWxpZGF0b3IodGhpcyk7Ci0gICAgICAgIGlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihmYWN0b3J5LmdldFByb3BlcnRpZXMoKS5nZXQoCi0gICAgICAgICAgICBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uLlByb3BlcnRpZXMuVFJFQVRfTUFQU19MSUtFX0JFQU5TKSkpIHsKLSAgICAgICAgICAgIHZhbGlkYXRvci5zZXRUcmVhdE1hcHNMaWtlQmVhbnModHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBNZXNzYWdlSW50ZXJwb2xhdG9yfS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAbGluayBNZXNzYWdlSW50ZXJwb2xhdG9yfQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlSW50ZXJwb2xhdG9yID09IG51bGwgPyBmYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSA6IG1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgVHJhdmVyc2FibGVSZXNvbHZlcn0uCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgVHJhdmVyc2FibGVSZXNvbHZlcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhdmVyc2FibGVSZXNvbHZlciBnZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gdHJhdmVyc2FibGVSZXNvbHZlciA9PSBudWxsID8gZmFjdG9yeS5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkgOiB0cmF2ZXJzYWJsZVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBNZXRhQmVhbk1hbmFnZXIgdGhhdCB1c2VzIGZhY3RvcmllczoKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPmlmIGVuYWJsZWQgYnkKLSAgICAgKiB7QGxpbmsgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzI0VOQUJMRV9JTlRST1NQRUNUT1J9LCBhbgotICAgICAqIHtAbGluayBJbnRyb3NwZWN0b3JNZXRhQmVhbkZhY3Rvcnl9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1ldGFCZWFuRmFjdG9yeX0gdHlwZXMgKGlmIGFueSkgc3BlY2lmaWVkIGJ5Ci0gICAgICoge0BsaW5rIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24uUHJvcGVydGllcyNNRVRBQkVBTl9GQUNUT1JZX0NMQVNTTkFNRVN9Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+aWYgbm8ge0BsaW5rIEpzcjMwM01ldGFCZWFuRmFjdG9yeX0gaGFzIHlldCBiZWVuIHNwZWNpZmllZCAodGhpcwotICAgICAqIGFsbG93cyBmYWN0b3J5IG9yZGVyIGN1c3RvbWl6YXRpb24pLCBhIHtAbGluayBKc3IzMDNNZXRhQmVhbkZhY3Rvcnl9Ci0gICAgICogd2hpY2ggaGFuZGxlcyBib3RoIEpTUjMwMy1YTUwgYW5kIEpTUjMwMy1Bbm5vdGF0aW9uczwvbGk+Ci0gICAgICogPGxpPmlmIGVuYWJsZWQgYnkKLSAgICAgKiB7QGxpbmsgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzI0VOQUJMRV9NRVRBQkVBTlNfWE1MfSwgYW4KLSAgICAgKiB7QGxpbmsgWE1MTWV0YUJlYW5GYWN0b3J5fTwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIE1ldGFCZWFuTWFuYWdlciB3aXRoIGFkZXF1YXRlIE1ldGFCZWFuRmFjdG9yaWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGFCZWFuRmluZGVyIGJ1aWxkTWV0YUJlYW5GaW5kZXIoKSB7Ci0gICAgICAgIExpc3Q8TWV0YUJlYW5GYWN0b3J5PiBidWlsZGVycyA9IG5ldyBBcnJheUxpc3Q8TWV0YUJlYW5GYWN0b3J5PigpOwotICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oZmFjdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KAotICAgICAgICAgICAgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzLkVOQUJMRV9JTlRST1NQRUNUT1IpKSkgewotICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBJbnRyb3NwZWN0b3JNZXRhQmVhbkZhY3RvcnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gZmFjdG9yeUNsYXNzTmFtZXMgPQotICAgICAgICAgICAgU3RyaW5nVXRpbHMuc3BsaXQoCi0gICAgICAgICAgICAgICAgZmFjdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24uUHJvcGVydGllcy5NRVRBQkVBTl9GQUNUT1JZX0NMQVNTTkFNRVMpKTsKLSAgICAgICAgaWYgKGZhY3RvcnlDbGFzc05hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsc05hbWUgOiBmYWN0b3J5Q2xhc3NOYW1lcykgewotICAgICAgICAgICAgICAgIC8vIGNhc3QsIHJlbHlpbmcgb24gI2NyZWF0ZU1ldGFCZWFuRmFjdG9yeSB0byB0aHJvdyB0aGUgZXhjZXB0aW9uIGlmIGluY29tcGF0aWJsZToKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgTWV0YUJlYW5GYWN0b3J5PiBmYWN0b3J5Q2xhc3MgPSAoQ2xhc3M8PyBleHRlbmRzIE1ldGFCZWFuRmFjdG9yeT4pIGxvYWRDbGFzcyhjbHNOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVycy5hZGQoY3JlYXRlTWV0YUJlYW5GYWN0b3J5KGZhY3RvcnlDbGFzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4ganNyMzAzRm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChNZXRhQmVhbkZhY3RvcnkgYnVpbGRlciA6IGJ1aWxkZXJzKSB7Ci0gICAgICAgICAgICBqc3IzMDNGb3VuZCB8PSBidWlsZGVyIGluc3RhbmNlb2YgSnNyMzAzTWV0YUJlYW5GYWN0b3J5OwotICAgICAgICB9Ci0gICAgICAgIGlmICghanNyMzAzRm91bmQpIHsKLSAgICAgICAgICAgIGJ1aWxkZXJzLmFkZChuZXcgSnNyMzAzTWV0YUJlYW5GYWN0b3J5KHRoaXMpKTsKLSAgICAgICAgfQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgICAgICBib29sZWFuIGVuYWJsZU1ldGFCZWFuc1htbCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGZhY3RvcnkuZ2V0UHJvcGVydGllcygpLmdldCgKLSAgICAgICAgICAgIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24uUHJvcGVydGllcy5FTkFCTEVfTUVUQUJFQU5TX1hNTCkpOwotICAgICAgICBpZiAoZW5hYmxlTWV0YUJlYW5zWG1sKSB7Ci0gICAgICAgICAgICBYTUxNZXRhQmVhbk1hbmFnZXJDcmVhdG9yLmFkZEZhY3RvcnkoYnVpbGRlcnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXRhQmVhbk1hbmFnZXIoYnVpbGRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHtAbGluayBNZXRhQmVhbk1hbmFnZXJ9IHVzaW5nIHRoZSBzcGVjaWZpZWQgYnVpbGRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1aWxkZXJzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgTWV0YUJlYW5GYWN0b3J5fSB7QGxpbmsgTGlzdH0KLSAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRhQmVhbk1hbmFnZXJ9Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwcm90ZWN0ZWQgTWV0YUJlYW5GaW5kZXIgY3JlYXRlTWV0YUJlYW5NYW5hZ2VyKExpc3Q8TWV0YUJlYW5GYWN0b3J5PiBidWlsZGVycykgewotICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHN1cHBvcnQgYm90aDoganNyMzAzIChpbiB0aGUgYnVpbGRlcnMgbGlzdCkgYW5kIHhzdHJlYW0teG1sIG1ldGFiZWFuczoKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKGZhY3RvcnkuZ2V0UHJvcGVydGllcygpLmdldCgKLSAgICAgICAgICAgIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24uUHJvcGVydGllcy5FTkFCTEVfTUVUQUJFQU5TX1hNTCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MTWV0YUJlYW5NYW5hZ2VyQ3JlYXRvci5jcmVhdGVYTUxNZXRhQmVhbk1hbmFnZXIoYnVpbGRlcnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWV0YUJlYW5NYW5hZ2VyKG5ldyBNZXRhQmVhbkJ1aWxkZXIoYnVpbGRlcnMudG9BcnJheShuZXcgTWV0YUJlYW5GYWN0b3J5W2J1aWxkZXJzLnNpemUoKV0pKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8RiBleHRlbmRzIE1ldGFCZWFuRmFjdG9yeT4gRiBjcmVhdGVNZXRhQmVhbkZhY3RvcnkoZmluYWwgQ2xhc3M8Rj4gY2xzKSB7Ci0gICAgICAgIHJldHVybiBydW4obmV3IFByaXZpbGVnZWRBY3Rpb248Rj4oKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBGIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvcjxGPiBjID0gQ29uc3RydWN0b3JVdGlscy5nZXRNYXRjaGluZ0FjY2Vzc2libGVDb25zdHJ1Y3RvcihjbHMsIEFwYWNoZUZhY3RvcnlDb250ZXh0LnRoaXMuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLm5ld0luc3RhbmNlKEFwYWNoZUZhY3RvcnlDb250ZXh0LnRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBDb25zdHJ1Y3RvclV0aWxzLmdldE1hdGNoaW5nQWNjZXNzaWJsZUNvbnN0cnVjdG9yKGNscywgZ2V0RmFjdG9yeSgpLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5uZXdJbnN0YW5jZShnZXRGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlcGFyYXRlIGNsYXNzIHRvIHByZXZlbnQgdGhlIGNsYXNzbG9hZGVyIHRvIGltbWVkaWF0ZWx5IGxvYWQgb3B0aW9uYWwKLSAgICAgKiBjbGFzc2VzOiBYTUxNZXRhQmVhbk1hbmFnZXIsIFhNTE1ldGFCZWFuRmFjdG9yeSwgWE1MTWV0YUJlYW5CdWlsZGVyIHRoYXQKLSAgICAgKiBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYTUxNZXRhQmVhbk1hbmFnZXJDcmVhdG9yIHsKLQotICAgICAgICBzdGF0aWMgdm9pZCBhZGRGYWN0b3J5KExpc3Q8TWV0YUJlYW5GYWN0b3J5PiBidWlsZGVycykgewotICAgICAgICAgICAgYnVpbGRlcnMuYWRkKG5ldyBYTUxNZXRhQmVhbkZhY3RvcnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIHRoZSB7QGxpbmsgTWV0YUJlYW5NYW5hZ2VyfSB0byBwcm9jZXNzIEpTUjMwMyBYTUwuIFJlcXVpcmVzCi0gICAgICAgICAqIGJ2YWwteHN0cmVhbSBhdCBSVC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBidWlsZGVycwotICAgICAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRhQmVhbk1hbmFnZXJ9Ci0gICAgICAgICAqLwotICAgICAgICAvLyBOT1RFIC0gV2UgcmV0dXJuIE1ldGFCZWFuTWFuYWdlciBpbnN0ZWFkIG9mIFhNTE1ldGFCZWFuTWFuYWdlciB0bwotICAgICAgICAvLyBrZWVwCi0gICAgICAgIC8vIGJ2YWwteHN0cmVhbSBhbiBvcHRpb25hbCBtb2R1bGUuCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgTWV0YUJlYW5NYW5hZ2VyIGNyZWF0ZVhNTE1ldGFCZWFuTWFuYWdlcihMaXN0PE1ldGFCZWFuRmFjdG9yeT4gYnVpbGRlcnMpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWE1MTWV0YUJlYW5NYW5hZ2VyKAotICAgICAgICAgICAgICAgIG5ldyBYTUxNZXRhQmVhbkJ1aWxkZXIoYnVpbGRlcnMudG9BcnJheShuZXcgTWV0YUJlYW5GYWN0b3J5W2J1aWxkZXJzLnNpemUoKV0pKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoZmluYWwgUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzPD8+IGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGRvUHJpdmlsZWdlZChTZWN1cmVBY3Rpb25zLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQotICAgICAgICAgICAgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGxvYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcnVuKFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwYWNoZVZhbGlkYXRpb25Qcm92aWRlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwYWNoZVZhbGlkYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODYwMTZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5zcGkuQm9vdHN0cmFwU3RhdGU7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5zcGkuQ29uZmlndXJhdGlvblN0YXRlOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVmFsaWRhdGlvblByb3ZpZGVyfSBmb3IganNyMzAzCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXBhY2hlLXZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogPHAvPgotICogPGJyLz4KLSAqIFVzZXI6IHJvbWFuLnN0dW1tIDxici8+Ci0gKiBEYXRlOiAyOS4xMC4yMDA4IDxici8+Ci0gKiBUaW1lOiAxNDo0NTo0MSA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblByb3ZpZGVyPEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24+IHsKLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGJ1aWxkZXIgY2xhc3MgaXMgc3VpdGFibGUgZm9yIHRoaXMKLSAgICAgKiB7QGxpbmsgVmFsaWRhdGlvblByb3ZpZGVyfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRlckNsYXNzCi0gICAgICogQHJldHVybiBib29sZWFuIHN1aXRhYmlsaXR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWl0YWJsZShDbGFzczw/IGV4dGVuZHMgQ29uZmlndXJhdGlvbjw/Pj4gYnVpbGRlckNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uLmNsYXNzID09IGJ1aWxkZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gY3JlYXRlU3BlY2lhbGl6ZWRDb25maWd1cmF0aW9uKEJvb3RzdHJhcFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbkltcGwoc3RhdGUsIHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbjw/PiBjcmVhdGVHZW5lcmljQ29uZmlndXJhdGlvbihCb290c3RyYXBTdGF0ZSBzdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25JbXBsKHN0YXRlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogQHRocm93cyBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgVmFsaWRhdG9yRmFjdG9yeSBjYW5ub3QgYmUgYnVpbHQKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgVmFsaWRhdG9yRmFjdG9yeSBidWlsZFZhbGlkYXRvckZhY3RvcnkoZmluYWwgQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRvckZhY3Rvcnk+IHZhbGlkYXRvckZhY3RvcnlDbGFzczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0b3JGYWN0b3J5Q2xhc3NuYW1lID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKS5nZXQoQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzLlZBTElEQVRPUl9GQUNUT1JZX0NMQVNTTkFNRSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3JGYWN0b3J5Q2xhc3NuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yRmFjdG9yeUNsYXNzID0gQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5jbGFzczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JGYWN0b3J5Q2xhc3MKLSAgICAgICAgICAgICAgICAgID0gKENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0b3JGYWN0b3J5PikgQ2xhc3NVdGlscy5nZXRDbGFzcyh2YWxpZGF0b3JGYWN0b3J5Q2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JGYWN0b3J5Q2xhc3MuYXNTdWJjbGFzcyhWYWxpZGF0b3JGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oImVycm9yIGJ1aWxkaW5nIFZhbGlkYXRvckZhY3RvcnkiLCBleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRSAyMDExLTAzLTI3IGp3OgotICAgICAgICAvLyBTaG91bGQgbm90IHVzZSBwcml2aWxlZ2VkIGFjdGlvbiwgYnV0IHRvIGF2b2lkIGJyZWFraW5nIHRoaW5ncwotICAgICAgICAvLyBkb2luZyBpdCBoZXJlIGxpa2UgdGhlIGZvcm1lciB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MgZGlkLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgcHJpdmlsZWdlZCBhY3Rpb24gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIFZhbGlkYXRvckZhY3RvcnkKLSAgICAgICAgLy8gaXRzZWxmLCBpZiByZXF1aXJlZC4KLSAgICAgICAgLy8gTm8gcHJpdmlsZWdlcyBzaG91bGQgYmUgcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSBjb25zdHJ1Y3RvciwKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgY2xhc3Nsb2FkZXIgb2YgQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyIHdpbGwgYWx3YXlzCi0gICAgICAgIC8vIGJlIGFuIGFuY2VzdG9yIG9mIHRoZSBsb2FkZXIgb2YgdmFsaWRhdG9yRmFjdG9yeUNsYXNzLgotICAgICAgICByZXR1cm4gKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKQotICAgICAgICAgICAgPyBpbnN0YW50aWF0ZVZhbGlkYXRvckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeUNsYXNzLCBjb25maWd1cmF0aW9uKQotICAgICAgICAgICAgOiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxWYWxpZGF0b3JGYWN0b3J5PigpIHsKLSAgICAgICAgICAgICAgICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVWYWxpZGF0b3JGYWN0b3J5KHZhbGlkYXRvckZhY3RvcnlDbGFzcywgY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGluc3RhbnRpYXRlVmFsaWRhdG9yRmFjdG9yeSgKLSAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRvckZhY3Rvcnk+IHZhbGlkYXRvckZhY3RvcnlDbGFzcywKLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvblN0YXRlICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24KLSAgICApIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAgIHJldHVybiB2YWxpZGF0b3JGYWN0b3J5Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ29uZmlndXJhdGlvblN0YXRlLmNsYXNzKS5uZXdJbnN0YW5jZShjb25maWd1cmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSA6ICIgKyB2YWxpZGF0b3JGYWN0b3J5Q2xhc3MsIGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQzY2NmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5Db25maWd1cmF0aW9uU3RhdGU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IFVuaXF1ZWx5IGlkZW50aWZ5IEFwYWNoZSBCVmFsIGluIHRoZSBCZWFuIFZhbGlkYXRpb24gYm9vdHN0cmFwCi0gKiBzdHJhdGVneS4gQWxzbyBjb250YWlucyBBcGFjaGUgQlZhbCBzcGVjaWZpYyBjb25maWd1cmF0aW9uczxici8+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbgotICAgICAgZXh0ZW5kcyBDb25maWd1cmF0aW9uPEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24+IHsKLQotICAgIC8qKgotICAgICAqIFByb3ByaWV0YXJ5IHByb3BlcnR5IGtleXMgZm9yIHtAbGluayBDb25maWd1cmF0aW9uSW1wbH0gIAotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydGllcyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiB0aGUgbG9jYXRpb24gd2hlcmUgdG8gbG9vayBmb3IgdGhlIHZhbGlkYXRpb24ueG1sIGZpbGUuCi0gICAgICAgICAqIGRlZmF1bHQ6ICJNRVRBLUlORi92YWxpZGF0aW9uLnhtbCIKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBWQUxJREFUSU9OX1hNTF9QQVRIID0gImFwYWNoZS5idmFsLnZhbGlkYXRpb24teG1sLXBhdGgiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB0cnVlL2ZhbHNlLiB1c2UgSW50cm9zcGVjdG9yIChqYXZhIGJlYW5zKSBtZXRhZGF0YSBhZGRpdGlvbmFsbHkKLSAgICAgICAgICogdG8gYnVpbGQgbWV0YWRhdGEgd2l0aCBKU1IzMDMuPGJyPgotICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgYWxsIHByb3BlcnRpZXMgZXhpc3QgdGhhdCBhcmUgamF2YS1iZWFuIHByb3BlcnRpZXMgYW5kCi0gICAgICAgICAqIGFuZCB0aGF0IHNvbWUgZmVhdHVyZXMgKEhpZGRlbiwgUmVhZG9ubHkpIGFyZSB0YWtlbiBmcm9tIEludHJvc3BlY3RvcgotICAgICAgICAgKiB0byBjcmVhdGUgdGhlIG1ldGEgZGF0YS48YnI+Ci0gICAgICAgICAqIGRlZmF1bHQ6IGZhbHNlCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgRU5BQkxFX0lOVFJPU1BFQ1RPUiA9ICJhcGFjaGUuYnZhbC5lbmFibGUtaW50cm9zcGVjdG9yIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogdHJ1ZS9mYWxzZS4gdXNlIEFwYWNoZSBtZXRhQmVhbnMgeG1sIGZvcm1hdCBhZGRpdGlvbmFsbHkgdG8KLSAgICAgICAgICogYnVpbGQgbWV0YWRhdGEgd2l0aCBKU1IzMDMuCi0gICAgICAgICAqIGRlZmF1bHQ6IGZhbHNlCi0gICAgICAgICAqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIHdlIGNvdWxkIGRlY2lkZSB0byBkcm9wIHRoaXMgZmVhdHVyZSBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgKiB3ZSBrZWVwIGl0IGFzIGxvbmcgYXMgd2Ugc3VwcG9ydCBib3RoOiBqc3IzMDMgYW5kIHhzdHJlYW0teG1sIG1ldGEgZGF0YSBhdAotICAgICAgICAgKiB0aGUgc2FtZSB0aW1lIChhbmQgcG90ZW50aWFsbHkgZm9yIHRoZSBzYW1lIGRvbWFpbiBjbGFzc2VzKQotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIEVOQUJMRV9NRVRBQkVBTlNfWE1MID0gImFwYWNoZS5idmFsLmVuYWJsZS1tZXRhYmVhbnMteG1sIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQmVhblZhbGlkYXRvci50cmVhdE1hcHNMaWtlQmVhbnMuCi0gICAgICAgICAqIGRlZmF1bHQ6IGZhbHNlCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgVFJFQVRfTUFQU19MSUtFX0JFQU5TID0gImFwYWNoZS5idmFsLnRyZWF0LW1hcHMtbGlrZS1iZWFucyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNwZWNpZmllcyB0aGUgY2xhc3NuYW1lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdG9yRmFjdG9yeX0gdG8gdXNlOiB0aGlzCi0gICAgICAgICAqIGNsYXNzIGlzIHByZXN1bWVkIGhhdmUgYSBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgYSBzaW5nbGUKLSAgICAgICAgICoge0BsaW5rIENvbmZpZ3VyYXRpb25TdGF0ZX0gYXJndW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICAgU3RyaW5nIFZBTElEQVRPUl9GQUNUT1JZX0NMQVNTTkFNRSA9ICJhcGFjaGUuYnZhbC52YWxpZGF0b3ItZmFjdG9yeS1jbGFzc25hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWVzLCBkZWxpbWl0ZWQgYnkgd2hpdGVzcGFjZSwgb2YKLSAgICAgICAgICoge0BsaW5rIE1ldGFCZWFuRmFjdG9yeX0gY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBjb2xsYWJvcmF0ZQotICAgICAgICAgKiB3aXRoIGFuIHtAbGluayBBcGFjaGVGYWN0b3J5Q29udGV4dH0ncyB7QGxpbmsgTWV0YUJlYW5GaW5kZXJ9LiBUaGVzZQotICAgICAgICAgKiBhcmUgaW5zdGFudGlhdGVkIHBlciB7QGxpbmsgVmFsaWRhdG9yQ29udGV4dH0sIGF0dGVtcHRpbmcgdG8gdXNlCi0gICAgICAgICAqIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiBkZWNyZWFzaW5nIHNwZWNpZmljaXR5OgotICAgICAgICAgKiA8b2w+Ci0gICAgICAgICAqIDxsaT5hc3NpZ25hYmxlIGZyb20gdGhlIGNyZWF0aW5nIHtAbGluayBBcGFjaGVGYWN0b3J5Q29udGV4dH08L2xpPgotICAgICAgICAgKiA8bGk+YXNzaWduYWJsZSBmcm9tIHRoZSBhc3NvY2lhdGVkIHtAbGluayBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5fTwvbGk+Ci0gICAgICAgICAqIDxsaT5kZWZhdWx0IChuby1hcmdzKSBjb25zdHJ1Y3RvcjwvbGk+Ci0gICAgICAgICAqIDwvb2w+Ci0gICAgICAgICAqLwotICAgICAgICAgU3RyaW5nIE1FVEFCRUFOX0ZBQ1RPUllfQ0xBU1NOQU1FUyA9ICJhcGFjaGUuYnZhbC5tZXRhYmVhbi1mYWN0b3J5LWNsYXNzbmFtZXMiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFlZmQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuQW5ub3RhdGlvbklnbm9yZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuTWV0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuVmFsaWRhdGlvbk1hcHBpbmdQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLio7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ib290c3RyYXAuUHJvdmlkZXJTcGVjaWZpY0Jvb3RzdHJhcDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5Db25maWd1cmF0aW9uU3RhdGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBhIGZhY3RvcnkgaXMgYSBjb21wbGV0ZSBjb25maWd1cmF0ZWQgb2JqZWN0IHRoYXQgY2FuIGNyZWF0ZQotICogdmFsaWRhdG9ycy48YnIvPgotICogVGhpcyBpbnN0YW5jZSBpcyBub3QgdGhyZWFkLXNhZmUuPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgaW1wbGVtZW50cyBWYWxpZGF0b3JGYWN0b3J5LCBDbG9uZWFibGUgewotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgREVGQVVMVF9GQUNUT1JZOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN0cmFpbnREZWZhdWx0cyBkZWZhdWx0Q29uc3RyYWludHMgPQotICAgICAgICAgICAgbmV3IENvbnN0cmFpbnREZWZhdWx0cygpOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VSZXNvbHZlcjsKLSAgICBwcml2YXRlIFRyYXZlcnNhYmxlUmVzb2x2ZXIgdHJhdmVyc2FibGVSZXNvbHZlcjsKLSAgICBwcml2YXRlIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogaW5mb3JtYXRpb24gZnJvbSB4bWwgcGFyc2luZwotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbklnbm9yZXMgYW5ub3RhdGlvbklnbm9yZXMgPSBuZXcgQW5ub3RhdGlvbklnbm9yZXMoKTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnN0cmFpbnRDYWNoZWQgY29uc3RyYWludHNDYWNoZSA9IG5ldyBDb25zdHJhaW50Q2FjaGVkKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8Pz4sIENsYXNzPD8+W10+IGRlZmF1bHRTZXF1ZW5jZXM7Ci0gICAgLyoqCi0gICAgICogYWNjZXNzIHN0cmF0ZWdpZXMgZm9yIHByb3BlcnRpZXMgd2l0aCBjYXNjYWRlIHZhbGlkYXRpb24gQFZhbGlkIHN1cHBvcnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxBY2Nlc3NTdHJhdGVneT4+IHZhbGlkQWNjZXNzZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8Pz4sIExpc3Q8TWV0YUNvbnN0cmFpbnQ8PywgPyBleHRlbmRzIEFubm90YXRpb24+Pj4gY29uc3RyYWludE1hcDsKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXRyaWV2ZSBhIGRlZmF1bHQgZ2xvYmFsIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0BsaW5rIEFwYWNoZVZhbGlkYXRvckZhY3Rvcnl9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoREVGQVVMVF9GQUNUT1JZID09IG51bGwpIHsKLSAgICAgICAgICAgIFByb3ZpZGVyU3BlY2lmaWNCb290c3RyYXA8QXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbj4gcHJvdmlkZXIgPQotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmJ5UHJvdmlkZXIoQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICAgIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHByb3ZpZGVyLmNvbmZpZ3VyZSgpOwotICAgICAgICAgICAgREVGQVVMVF9GQUNUT1JZID0KLSAgICAgICAgICAgICAgICAgICAgKEFwYWNoZVZhbGlkYXRvckZhY3RvcnkpIGNvbmZpZ3VyYXRpb24uYnVpbGRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIERFRkFVTFRfRkFDVE9SWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBwYXJ0aWN1bGFyIHtAbGluayBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5fSBpbnN0YW5jZSBhcyB0aGUgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhRGVmYXVsdEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChBcGFjaGVWYWxpZGF0b3JGYWN0b3J5IGFEZWZhdWx0RmFjdG9yeSkgewotICAgICAgICBERUZBVUxUX0ZBQ1RPUlkgPSBhRGVmYXVsdEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkoQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZ3VyYXRpb25TdGF0ZSkgewotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz5bXT4oKTsKLSAgICAgICAgdmFsaWRBY2Nlc3NlcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8+LCBMaXN0PEFjY2Vzc1N0cmF0ZWd5Pj4oKTsKLSAgICAgICAgY29uc3RyYWludE1hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIExpc3Q8TWV0YUNvbnN0cmFpbnQ8PywgPyBleHRlbmRzIEFubm90YXRpb24+Pj4oKTsKLSAgICAgICAgY29uZmlndXJlKGNvbmZpZ3VyYXRpb25TdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoaXMge0BsaW5rIEFwYWNoZVZhbGlkYXRvckZhY3Rvcnl9IGZyb20gYQotICAgICAqIHtAbGluayBDb25maWd1cmF0aW9uU3RhdGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgZ2V0UHJvcGVydGllcygpLnB1dEFsbChjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIHNldE1lc3NhZ2VJbnRlcnBvbGF0b3IoY29uZmlndXJhdGlvbi5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOwotICAgICAgICBzZXRUcmF2ZXJzYWJsZVJlc29sdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpKTsKLSAgICAgICAgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKTsKLSAgICAgICAgVmFsaWRhdGlvbk1hcHBpbmdQYXJzZXIgcGFyc2VyID0gbmV3IFZhbGlkYXRpb25NYXBwaW5nUGFyc2VyKHRoaXMpOwotICAgICAgICBwYXJzZXIucHJvY2Vzc01hcHBpbmdDb25maWcoY29uZmlndXJhdGlvbi5nZXRNYXBwaW5nU3RyZWFtcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3BlcnR5IG1hcCBvZiB0aGlzIHtAbGluayBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5fS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTWFwPFN0cmluZywgU3RyaW5nPgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCB7QGxpbmsgTWVzc2FnZUludGVycG9sYXRvcn0gdXNlZCBieSB0aGlzCi0gICAgICoge0BsaW5rIEFwYWNoZVZhbGlkYXRvckZhY3Rvcnl9LgotICAgICAqCi0gICAgICogQHJldHVybiB7QGxpbmsgTWVzc2FnZUludGVycG9sYXRvcn0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUludGVycG9sYXRvciBnZXREZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFZhbGlkYXRvciBpbnN0YW5jZSB3aXRoIGZhY3RvcnkncwotICAgICAqIHNldHRpbmdzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsaWRhdG9yIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiB1c2luZ0NvbnRleHQoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IgZmFjdG9yeSdzIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBhY2hlRmFjdG9yeUNvbnRleHQgdXNpbmdDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbmV3IEFwYWNoZUZhY3RvcnlDb250ZXh0KHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgY2xvbmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKEFwYWNoZVZhbGlkYXRvckZhY3RvcnkpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7IC8vIFZNIGJ1Zy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUge0BsaW5rIE1lc3NhZ2VJbnRlcnBvbGF0b3J9IHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZVJlc29sdmVyCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TWVzc2FnZUludGVycG9sYXRvcihNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VSZXNvbHZlcikgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZXNvbHZlciA9IG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpIHsKLSAgICAgICAgcmV0dXJuICgobWVzc2FnZVJlc29sdmVyICE9IG51bGwpID8gbWVzc2FnZVJlc29sdmVyCi0gICAgICAgICAgICAgICAgOiBnZXREZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHtAbGluayBUcmF2ZXJzYWJsZVJlc29sdmVyfSB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYXZlcnNhYmxlUmVzb2x2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmF2ZXJzYWJsZVJlc29sdmVyKAotICAgICAgICAgICAgVHJhdmVyc2FibGVSZXNvbHZlciB0cmF2ZXJzYWJsZVJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMudHJhdmVyc2FibGVSZXNvbHZlciA9IHRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzYWJsZVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5fSB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoCi0gICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSkgewotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBnZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGFsbG93IGFjY2VzcyB0byB0aGUKLSAgICAgKiBwcm92aWRlci1zcGVjaWZpYyBBUEkuIElmIHRoZSBCZWFuIFZhbGlkYXRpb24gcHJvdmlkZXIgaW1wbGVtZW50YXRpb24KLSAgICAgKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgY2xhc3MsIHRoZSBWYWxpZGF0aW9uRXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHVybmVkLgotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcwotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2FsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFQgdW53cmFwKGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKLSAgICAgICAgLy8gRklYTUUgMjAxMS0wMy0yNyBqdzoKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHVuc2VjdXJlLgotICAgICAgICAvLyBJdCBzaG91bGQgYWxsb3cgb25seSBhIGZpeGVkIHNldCBvZiBjbGFzc2VzLgotICAgICAgICAvLyBDYW4ndCBmaXggdGhpcyBiZWNhdXNlIGRvbid0IGtub3cgd2hpY2ggY2xhc3NlcyB0aGlzIG1ldGhvZCBzaG91bGQgc3VwcG9ydC4KLQotICAgICAgICBpZiAodHlwZS5pc0luc3RhbmNlKHRoaXMpKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIFQgcmVzdWx0ID0gKFQpIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgaWYgKCEodHlwZS5pc0ludGVyZmFjZSgpIHx8IE1vZGlmaWVyLmlzQWJzdHJhY3QodHlwZQotICAgICAgICAgICAgICAgIC5nZXRNb2RpZmllcnMoKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UodHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IGNscyA9IENsYXNzVXRpbHMuZ2V0Q2xhc3ModHlwZS5nZXROYW1lKCkgKyAiSW1wbCIpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgVCByZXN1bHQgPSAoVCkgbmV3SW5zdGFuY2UoY2xzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiVHlwZSAiICsgdHlwZSArICIgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8VD4gVCBuZXdJbnN0YW5jZShmaW5hbCBDbGFzczxUPiBjbHMpIHsKLSAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFQ+KCkgewotICAgICAgICAgICAgcHVibGljIFQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSA6ICIgKyBjbHMsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGV0ZWN0ZWQge0BsaW5rIENvbnN0cmFpbnREZWZhdWx0c30uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENvbnN0cmFpbnREZWZhdWx0cwotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50RGVmYXVsdHMgZ2V0RGVmYXVsdENvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0cmFpbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGV0ZWN0ZWQge0BsaW5rIEFubm90YXRpb25JZ25vcmVzfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW5ub3RhdGlvbklnbm9yZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGlvbklnbm9yZXMgZ2V0QW5ub3RhdGlvbklnbm9yZXMoKSB7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSWdub3JlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbnN0cmFpbnQgY2FjaGUgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN0cmFpbnRDYWNoZWR9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRDYWNoZWQgZ2V0Q29uc3RyYWludHNDYWNoZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzQ2FjaGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbWV0YS1jb25zdHJhaW50IHRvIHRoaXMge0BsaW5rIEFwYWNoZVZhbGlkYXRvckZhY3Rvcnl9J3MgcnVudGltZQotICAgICAqIGN1c3RvbWl6YXRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEBwYXJhbSBtZXRhQ29uc3RyYWludAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFDb25zdHJhaW50KENsYXNzPD8+IGJlYW5DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhQ29uc3RyYWludDw/LCA/PiBtZXRhQ29uc3RyYWludCkgewotICAgICAgICBMaXN0PE1ldGFDb25zdHJhaW50PD8sID8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gc2xvdCA9Ci0gICAgICAgICAgICAgICAgY29uc3RyYWludE1hcC5nZXQoYmVhbkNsYXNzKTsKLSAgICAgICAgaWYgKHNsb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2xvdC5hZGQobWV0YUNvbnN0cmFpbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxNZXRhQ29uc3RyYWludDw/LCA/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGNvbnN0cmFpbnRMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRhQ29uc3RyYWludDw/LCA/IGV4dGVuZHMgQW5ub3RhdGlvbj4+KCk7Ci0gICAgICAgICAgICBjb25zdHJhaW50TGlzdC5hZGQobWV0YUNvbnN0cmFpbnQpOwotICAgICAgICAgICAgY29uc3RyYWludE1hcC5wdXQoYmVhbkNsYXNzLCBjb25zdHJhaW50TGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrIGEgcHJvcGVydHkgb2YgPGNvZGU+YmVhbkNsYXNzPC9jb2RlPiBmb3IgbmVzdGVkIHZhbGlkYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICogQHBhcmFtIGFjY2Vzc1N0cmF0ZWd5Ci0gICAgICogICAgICAgICAgICBkZWZpbmluZyB0aGUgcHJvcGVydHkgdG8gdmFsaWRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRWYWxpZChDbGFzczw/PiBiZWFuQ2xhc3MsIEFjY2Vzc1N0cmF0ZWd5IGFjY2Vzc1N0cmF0ZWd5KSB7Ci0gICAgICAgIExpc3Q8QWNjZXNzU3RyYXRlZ3k+IHNsb3QgPSB2YWxpZEFjY2Vzc2VzLmdldChiZWFuQ2xhc3MpOwotICAgICAgICBpZiAoc2xvdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzbG90LmFkZChhY2Nlc3NTdHJhdGVneSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PEFjY2Vzc1N0cmF0ZWd5PiB0bXBMaXN0ID0gbmV3IEFycmF5TGlzdDxBY2Nlc3NTdHJhdGVneT4oKTsKLSAgICAgICAgICAgIHRtcExpc3QuYWRkKGFjY2Vzc1N0cmF0ZWd5KTsKLSAgICAgICAgICAgIHZhbGlkQWNjZXNzZXMucHV0KGJlYW5DbGFzcywgdG1wTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZ3JvdXAgc2VxdWVuY2UgZm9yIGEgcGFydGljdWxhciBiZWFuIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEBwYXJhbSBncm91cFNlcXVlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdFNlcXVlbmNlKENsYXNzPD8+IGJlYW5DbGFzcywgQ2xhc3M8Pz5bXSBncm91cFNlcXVlbmNlKSB7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZXMucHV0KGJlYW5DbGFzcywgZ3JvdXBTZXF1ZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHJ1bnRpbWUgY29uc3RyYWludCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIDxUPgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2Yge0BsaW5rIE1ldGFDb25zdHJhaW50fXMgYXBwbGljYWJsZSB0bwotICAgICAqICAgICAgICAgPGNvZGU+YmVhbkNsYXNzPC9jb2RlPgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBwdWJsaWMgPFQ+IExpc3Q8TWV0YUNvbnN0cmFpbnQ8VCwgPyBleHRlbmRzIEFubm90YXRpb24+PiBnZXRNZXRhQ29uc3RyYWludHMoCi0gICAgICAgICAgICBDbGFzczxUPiBiZWFuQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZXRhQ29uc3RyYWludDw/LCA/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IHNsb3QgPQotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRNYXAuZ2V0KGJlYW5DbGFzcyk7Ci0gICAgICAgIGlmIChzbG90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBSZWR1bmRhbnRDYXN0Ci0gICAgICAgICAgICByZXR1cm4gKExpc3QpIHNsb3Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIEFjY2Vzc1N0cmF0ZWd5fSB7QGxpbmsgTGlzdH0gaW5kaWNhdGluZyBuZXN0ZWQgYmVhbgotICAgICAqIHZhbGlkYXRpb25zIHRoYXQgbXVzdCBiZSB0cmlnZ2VyZWQgaW4gdGhlIGNvdXJzZSBvZiB2YWxpZGF0aW5nIGEKLSAgICAgKiA8Y29kZT5iZWFuQ2xhc3M8L2NvZGU+IGdyYXBoLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEByZXR1cm4ge0BsaW5rIExpc3R9IG9mIHtAbGluayBBY2Nlc3NTdHJhdGVneX0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBY2Nlc3NTdHJhdGVneT4gZ2V0VmFsaWRBY2Nlc3NlcyhDbGFzczw/PiBiZWFuQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxBY2Nlc3NTdHJhdGVneT4gc2xvdCA9IHZhbGlkQWNjZXNzZXMuZ2V0KGJlYW5DbGFzcyk7Ci0gICAgICAgIGlmIChzbG90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzbG90OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxBY2Nlc3NTdHJhdGVneT5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCBncm91cCBzZXF1ZW5jZSBjb25maWd1cmVkIGZvciA8Y29kZT5iZWFuQ2xhc3M8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEByZXR1cm4gZ3JvdXAgQ2xhc3MgYXJyYXkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXREZWZhdWx0U2VxdWVuY2UoQ2xhc3M8Pz4gYmVhbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0U2VxdWVuY2VzLmdldChiZWFuQ2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwcGVuZFZhbGlkYXRpb24uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcHBlbmRWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2RiYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0FwcGVuZFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB1bmlmaWVkIGludGVyZmFjZSB0byBhY2N1bXVsYXRlIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn1zCi0gKiB0byB2YXJpZWQgdGFyZ2V0cy48YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGVuZFZhbGlkYXRpb24gewotICAgIC8qKgotICAgICAqIEFwcGVuZCBhIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0uCi0gICAgICogQHBhcmFtIDxUPgotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uCi0gICAgICovCi0gICAgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiB2b2lkIGFwcGVuZChDb25zdHJhaW50VmFsaWRhdGlvbjxUPiB2YWxpZGF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcHBlbmRWYWxpZGF0aW9uVG9CdWlsZGVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQXBwZW5kVmFsaWRhdGlvblRvQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTEyMjUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcHBlbmRWYWxpZGF0aW9uVG9CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuQW5ub3RhdGlvblByb3h5QnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IEFkYXB0IHtAbGluayBBbm5vdGF0aW9uQ29uc3RyYWludEJ1aWxkZXJ9IHRvIHRoZSB7QGxpbmsgQXBwZW5kVmFsaWRhdGlvbn0gaW50ZXJmYWNlLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHBlbmRWYWxpZGF0aW9uVG9CdWlsZGVyIGV4dGVuZHMgQmFzZUFwcGVuZFZhbGlkYXRpb24gewotICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkNvbnN0cmFpbnRCdWlsZGVyPD8+IGJ1aWxkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQXBwZW5kVmFsaWRhdGlvblRvQnVpbGRlciBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gYnVpbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBBcHBlbmRWYWxpZGF0aW9uVG9CdWlsZGVyKEFubm90YXRpb25Db25zdHJhaW50QnVpbGRlcjw/PiBidWlsZGVyKSB7Ci0gICAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IHZvaWQgcHJlUHJvY2Vzc1ZhbGlkYXRpb24oQ29uc3RyYWludFZhbGlkYXRpb248VD4gdmFsaWRhdGlvbikgewotICAgICAgICAvLyBKU1ItMzAzIDIuMzoKLSAgICAgICAgLy8gR3JvdXBzIGZyb20gdGhlIG1haW4gY29uc3RyYWludCBhbm5vdGF0aW9uIGFyZSBpbmhlcml0ZWQgYnkgdGhlIGNvbXBvc2luZyBhbm5vdGF0aW9ucy4KLSAgICAgICAgLy8gQW55IGdyb3VwcyBkZWZpbml0aW9uIG9uIGEgY29tcG9zaW5nIGFubm90YXRpb24gaXMgaWdub3JlZC4KLSAgICAgICAgU2V0PENsYXNzPD8+PiBpbmhlcml0ZWRHcm91cHMgPSBidWlsZGVyLmdldENvbnN0cmFpbnRWYWxpZGF0aW9uKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgIHZhbGlkYXRpb24uc2V0R3JvdXBzKGluaGVyaXRlZEdyb3Vwcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBKU1ItMzAzIDIuMyBwOgotICAgICAgICAvLyBQYXlsb2FkcyBhcmUgYWxzbyBpbmhlcml0ZWQKLSAgICAgICAgU2V0PENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPj4gaW5oZXJpdGVkUGF5bG9hZCA9IGJ1aWxkZXIuZ2V0Q29uc3RyYWludFZhbGlkYXRpb24oKS5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIHZhbGlkYXRpb24uc2V0UGF5bG9hZChpbmhlcml0ZWRQYXlsb2FkKTsKLQotICAgICAgICAvLyBJbmhlcml0ZWQgZ3JvdXBzIGFuZCBwYXlsb2FkIHZhbHVlcyBtdXN0IGFsc28gYmUgcmVwbGljYXRlZCBpbiB0aGUgCi0gICAgICAgIC8vIGFubm90YXRpb24sIHNvIGl0IGhhcyB0byBiZSBzdWJzdGl0dXRlZCB3aXRoIGEgbmV3IHByb3h5LgotICAgICAgICBUIG9yaWdpbmFsQW5ub3QgPSB2YWxpZGF0aW9uLmdldEFubm90YXRpb24oKTsKLSAgICAgICAgQW5ub3RhdGlvblByb3h5QnVpbGRlcjxUPiBhcGIgPSBuZXcgQW5ub3RhdGlvblByb3h5QnVpbGRlcjxUPihvcmlnaW5hbEFubm90KTsKLSAgICAgICAgYXBiLnB1dFZhbHVlKENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5HUk9VUFMuZ2V0QXR0cmlidXRlTmFtZSgpLAotICAgICAgICAgICAgaW5oZXJpdGVkR3JvdXBzLnRvQXJyYXkobmV3IENsYXNzW2luaGVyaXRlZEdyb3Vwcy5zaXplKCldKSk7Ci0gICAgICAgIGFwYi5wdXRWYWx1ZShDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuUEFZTE9BRC5nZXRBdHRyaWJ1dGVOYW1lKCksCi0gICAgICAgICAgICBpbmhlcml0ZWRQYXlsb2FkLnRvQXJyYXkobmV3IENsYXNzW2luaGVyaXRlZFBheWxvYWQuc2l6ZSgpXSkpOwotICAgICAgICBUIG5ld0Fubm90ID0gYXBiLmNyZWF0ZUFubm90YXRpb24oKTsKLSAgICAgICAgdmFsaWRhdGlvbi5zZXRBbm5vdGF0aW9uKG5ld0Fubm90KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gdm9pZCBwZXJmb3JtQXBwZW5kKENvbnN0cmFpbnRWYWxpZGF0aW9uPFQ+IHZhbGlkYXRpb24pIHsKLSAgICAgICAgYnVpbGRlci5hZGRDb21wb3NlZCh2YWxpZGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgaW5oZXJpdGVkIGdyb3Vwcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzZXQgb2YgZ3JvdXBzIGZyb20gdGhlIHBhcmVudCBjb25zdHJhaW50LgotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldEluaGVyaXRlZEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Q29uc3RyYWludFZhbGlkYXRpb24oKS5nZXRHcm91cHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgaW5oZXJpdGVkIHBheWxvYWQuCi0gICAgICogQHJldHVybiBUaGUgc2V0IG9mIHBheWxvYWRzIGZyb20gdGhlIHBhcmVudCBjb25zdHJhaW50LgotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+PiBnZXRJbmhlcml0ZWRQYXlsb2FkKCkgewotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLmdldFBheWxvYWQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcHBlbmRWYWxpZGF0aW9uVG9NZXRhLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQXBwZW5kVmFsaWRhdGlvblRvTWV0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODcxMjg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9BcHBlbmRWYWxpZGF0aW9uVG9NZXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzQ2FwYWJsZTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGFkYXB0IGFueSB7QGxpbmsgRmVhdHVyZXNDYXBhYmxlfSBmcm9tIHRoZSBjb3JlIG1ldGEtbW9kZWwgdG8gdGhlIHtAbGluayBBcHBlbmRWYWxpZGF0aW9ufSBpbnRlcmZhY2UuPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEFwcGVuZFZhbGlkYXRpb25Ub01ldGEgZXh0ZW5kcyBCYXNlQXBwZW5kVmFsaWRhdGlvbiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlc0NhcGFibGUgZmVhdHVyZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBBcHBlbmRWYWxpZGF0aW9uVG9NZXRhIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBtZXRhCi0gICAgICovCi0gICAgcHVibGljIEFwcGVuZFZhbGlkYXRpb25Ub01ldGEoRmVhdHVyZXNDYXBhYmxlIG1ldGEpIHsKLSAgICAgICAgdGhpcy5mZWF0dXJlID0gbWV0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gdm9pZCBwZXJmb3JtQXBwZW5kKENvbnN0cmFpbnRWYWxpZGF0aW9uPFQ+IHZhbGlkYXRpb24pIHsKLSAgICAgICAgZmVhdHVyZS5hZGRWYWxpZGF0aW9uKHZhbGlkYXRpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9CYXNlQXBwZW5kVmFsaWRhdGlvbi5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0Jhc2VBcHBlbmRWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjE0YTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0Jhc2VBcHBlbmRWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgdmFsaWRhdGlvbiBhcHBlbmRlciB0aGF0IGluaXRpYWxpemVzIHRoZQotICoge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0aW9uI2dldFZhbGlkYXRvcigpfSBvbiBwb3N0LXByb2Nlc3NpbmcuCi0gKiAKLSAqIEBhdXRob3IgQ2FybG9zIFZhcmEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VBcHBlbmRWYWxpZGF0aW9uIGltcGxlbWVudHMgQXBwZW5kVmFsaWRhdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICoKLSAgICAgKiBBcHBlbmQgb3BlcmF0aW9uIGRpdmlkZWQgaW4gMyBzdGFnZXM6IHByZSAmIHBvc3QgcHJvY2Vzc2luZyBhbmQgdGhlCi0gICAgICogInJlYWwiIGFwcGVuZCBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCA8VCBleHRlbmRzIEFubm90YXRpb24+IHZvaWQgYXBwZW5kKENvbnN0cmFpbnRWYWxpZGF0aW9uPFQ+IHZhbGlkYXRpb24pIHsKLSAgICAgICAgcHJlUHJvY2Vzc1ZhbGlkYXRpb24odmFsaWRhdGlvbik7Ci0gICAgICAgIHBlcmZvcm1BcHBlbmQodmFsaWRhdGlvbik7Ci0gICAgICAgIHBvc3RQcm9jZXNzVmFsaWRhdGlvbih2YWxpZGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgYWN0dWFsICJhcHBlbmRpbmciIG9wZXJhdGlvbiB0byB0aGUgdW5kZXJseWluZyBkYXRhCi0gICAgICogc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHZhbGlkYXRpb25zLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkbid0IHRyeSB0byBkbwotICAgICAqIG1vcmUgdGhhbiB0aGF0IGluIHRoaXMgc3RlcC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gdG8gYmUgYXBwZW5kZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gdm9pZCBwZXJmb3JtQXBwZW5kKENvbnN0cmFpbnRWYWxpZGF0aW9uPFQ+IHZhbGlkYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogUHJlLXByb2Nlc3MgdGhlIHZhbGlkYXRpb24gYmVmb3JlIGFwcGVuZGluZyBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgVGhlIHZhbGlkYXRpb24gdG8gYmUgYXBwZW5kZWQuCi0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gdm9pZCBwcmVQcm9jZXNzVmFsaWRhdGlvbihDb25zdHJhaW50VmFsaWRhdGlvbjxUPiB2YWxpZGF0aW9uKSB7Ci0gICAgICAgIC8vIE5vIGdlbmVyaWMgcHJlLXByb2Nlc3NpbmcKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUG9zdC1wcm9jZXNzIHRoZSB2YWxpZGF0aW9uIG9uY2UgaXQgaGFzIGJlZW4gYXBwZW5kZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIDxUPgotICAgICAqICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHZhbGlkYXRpb24uCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIHRvIGJlIGFwcGVuZGVkLgotICAgICAqLwotICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IHZvaWQgcG9zdFByb2Nlc3NWYWxpZGF0aW9uKENvbnN0cmFpbnRWYWxpZGF0aW9uPFQ+IHZhbGlkYXRpb24pIHsKLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yCi0gICAgICAgIHZhbGlkYXRpb24uaW5pdGlhbGl6ZSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9CZWFuRGVzY3JpcHRvckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9CZWFuRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNTAwYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQmVhbkRlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkJlYW5EZXNjcmlwdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRzIHtAbGluayBCZWFuRGVzY3JpcHRvcn0uPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJlYW5EZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIEJlYW5EZXNjcmlwdG9yIHsKLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIEFwYWNoZUZhY3RvcnlDb250ZXh0fSAobm90KSB1c2VkIGJ5IHRoaXMKLSAgICAgKiB7QGxpbmsgQmVhbkRlc2NyaXB0b3JJbXBsfQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBCZWFuRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlDb250ZXh0Ci0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJlYW5EZXNjcmlwdG9ySW1wbChBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dCwgTWV0YUJlYW4gbWV0YUJlYW4pIHsKLSAgICAgICAgc3VwZXIobWV0YUJlYW4sIG1ldGFCZWFuLmdldEJlYW5DbGFzcygpLCBtZXRhQmVhbi5nZXRWYWxpZGF0aW9ucygpKTsKLSAgICAgICAgdGhpcy5mYWN0b3J5Q29udGV4dCA9IGZhY3RvcnlDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmVhbiBpbnZvbHZlcyB2YWxpZGF0aW9uOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+YSBjb25zdHJhaW50IGlzIGhvc3RlZCBvbiB0aGUgYmVhbiBpdHNlbGY8L2xpPgotICAgICAqIDxsaT5hIGNvbnN0cmFpbnQgaXMgaG9zdGVkIG9uIG9uZSBvZiB0aGUgYmVhbiBwcm9wZXJ0aWVzLCBPUjwvbGk+Ci0gICAgICogPGxpPmEgYmVhbiBwcm9wZXJ0eSBpcyBtYXJrZWQgZm9yIGNhc2NhZGUgKDxjb2RlPkBWYWxpZDwvY29kZT4pPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmVhbiBpbnZvbHZlcyB2YWxpZGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNCZWFuQ29uc3RyYWluZWQoKSB7Ci0gICAgICAgIGlmIChoYXNBbnlDb25zdHJhaW50cygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGZvciAoTWV0YVByb3BlcnR5IG1wcm9wIDogbWV0YUJlYW4uZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBpZiAobXByb3AuZ2V0TWV0YUJlYW4oKSAhPSBudWxsIHx8IG1wcm9wLmdldEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuUkVGX0NBU0NBREUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBbnlDb25zdHJhaW50cygpIHsKLSAgICAgICAgaWYgKGhhc0NvbnN0cmFpbnRzKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZm9yIChNZXRhUHJvcGVydHkgbXByb3AgOiBtZXRhQmVhbi5nZXRQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChnZXRDb25zdHJhaW50RGVzY3JpcHRvcnMobXByb3AuZ2V0VmFsaWRhdGlvbnMoKSkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBsZXZlbCBjb25zdHJhaW50cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eU5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmCi0gICAgICogZWl0aGVyIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBvciBoYXMgbm8gY29uc3RyYWludC4gVGhlIHJldHVybmVkCi0gICAgICogb2JqZWN0IChhbmQgYXNzb2NpYXRlZCBvYmplY3RzIGluY2x1ZGluZyBDb25zdHJhaW50RGVzY3JpcHRvcnMpIGFyZQotICAgICAqIGltbXV0YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogICAgICAgICAgICBwcm9wZXJ0eSBldmFsdWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlEZXNjcmlwdG9yIGdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm9wZXJ0eU5hbWUgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBNZXRhUHJvcGVydHkgcHJvcCA9IG1ldGFCZWFuLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwcm9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gSWYgbm8gY29uc3RyYWludHMgYW5kIG5vdCBjYXNjYWRlZCwgcmV0dXJuIG51bGwKLSAgICAgICAgaWYgKHByb3AuZ2V0VmFsaWRhdGlvbnMoKS5sZW5ndGggPT0gMCAmJiBwcm9wLmdldEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuUkVGX0NBU0NBREUpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE1ldGFQcm9wZXJ0eSBwcm9wKSB7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvckltcGwgZWRlc2MgPSBwcm9wLmdldEZlYXR1cmUoSnNyMzAzRmVhdHVyZXMuUHJvcGVydHkuUHJvcGVydHlEZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKGVkZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIGVkZXNjID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvckltcGwocHJvcCk7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoSnNyMzAzRmVhdHVyZXMuUHJvcGVydHkuUHJvcGVydHlEZXNjcmlwdG9yLCBlZGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVkZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBoYXZpbmcgYXQgbGVhc3QgYSBjb25zdHJhaW50IGRlZmluZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCkgewotICAgICAgICBTZXQ8UHJvcGVydHlEZXNjcmlwdG9yPiB2YWxpZGF0ZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQ8UHJvcGVydHlEZXNjcmlwdG9yPigpOwotICAgICAgICBmb3IgKE1ldGFQcm9wZXJ0eSBwcm9wIDogbWV0YUJlYW4uZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcC5nZXRWYWxpZGF0aW9ucygpLmxlbmd0aCA+IDAKLSAgICAgICAgICAgICAgICB8fCAocHJvcC5nZXRNZXRhQmVhbigpICE9IG51bGwgfHwgcHJvcC5nZXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5LlJFRl9DQVNDQURFKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlZFByb3BlcnRpZXMuYWRkKGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh2YWxpZGF0ZWRQcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJCZWFuRGVzY3JpcHRvckltcGx7IiArICJyZXR1cm5UeXBlPSIgKyBlbGVtZW50Q2xhc3MgKyAnfSc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0Nhc2NhZGluZ1Byb3BlcnR5VmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzMDk2MC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotCi0vKioKLSAqIFBlciB0aGUgYmVhbiB2YWxpZGF0aW9uIHNwZWMsIHtAbGluayBWYWxpZH0gaXMgbm90IGhvbm9yZWQgYnkgdGhlCi0gKiB7QGxpbmsgI3ZhbGlkYXRlUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcsIENsYXNzLi4uKX0gYW5kCi0gKiB7QGxpbmsgI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9IG1ldGhvZHMuIFRoZQotICoge0BsaW5rIENhc2NhZGluZ1Byb3BlcnR5VmFsaWRhdG9yfSBpbnRlcmZhY2UgdGh1cyBkZWZpbmVzIGEge0BsaW5rIFZhbGlkYXRvcn0gdGhhdAotICogcHJvdmlkZXMgY29ycmVzcG9uZGluZyBtZXRob2RzIHRoYXQgPGVtPm1heTwvZW0+IGhvbm9yIHtAbGluayBWYWxpZH0uCi0gKiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcsIENsYXNzLi4uKX0KLSAqIGFuZCB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9IGFyZSBhc3N1bWVkCi0gKiBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSB7QGxpbmsgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3J9LWRlZmluZWQKLSAqIG1ldGhvZHMgd2l0aCA8Y29kZT5jYXNjYWRlID09IGZhbHNlPC9jb2RlPi4KLSAqIAotICogQHZlcnNpb24gJFJldjogOTkzNTM5ICQgJERhdGU6IDIwMTAtMDktMDcgMTY6Mjc6NTAgLTA1MDAgKFR1ZSwgMDcgU2VwIDIwMTApICQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYWxsIGNvbnN0cmFpbnRzIHBsYWNlZCBvbiA8Y29kZT5vYmplY3Q8L2NvZGU+J3MKLSAgICAgKiA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHByb3BlcnR5LCB3aXRoIG9wdGlvbmFsIHZhbGlkYXRpb24gY2FzY2FkaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQotICAgICAqIEBwYXJhbSBjYXNjYWRlCi0gICAgICogQHBhcmFtIGdyb3VwcwotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ29uc3RyYWludFZpb2xhdGlvbn1zLgotICAgICAqLwotICAgIDxUIGV4dGVuZHMgT2JqZWN0PiBqYXZhLnV0aWwuU2V0PGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVQcm9wZXJ0eShUIG9iamVjdCwKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBjYXNjYWRlLCBqYXZhLmxhbmcuQ2xhc3M8Pz4uLi4gZ3JvdXBzKTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBhbGwgY29uc3RyYWludHMgcGxhY2VkIG9uIDxjb2RlPm9iamVjdDwvY29kZT4ncwotICAgICAqIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcHJvcGVydHksIHdpdGggb3B0aW9uYWwgdmFsaWRhdGlvbiBjYXNjYWRpbmcsCi0gICAgICogZ2l2ZW4gYSBoeXBvdGhldGljYWwgcHJvcGVydHkgPGNvZGU+dmFsdWU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0gYmVhblR5cGUKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIGNhc2NhZGUKLSAgICAgKiBAcGFyYW0gZ3JvdXBzCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHtAbGluayBTZXR9IG9mIHtAbGluayBDb25zdHJhaW50VmlvbGF0aW9ufXMuCi0gICAgICovCi0gICAgPFQgZXh0ZW5kcyBPYmplY3Q+IGphdmEudXRpbC5TZXQ8amF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVZhbHVlKAotICAgICAgICBqYXZhLmxhbmcuQ2xhc3M8VD4gYmVhblR5cGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBjYXNjYWRlLCBqYXZhLmxhbmcuQ2xhc3M8Pz4uLi4gZ3JvdXBzKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9DbGFzc1ZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NsYXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWM5NTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NsYXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuRHluYW1pY01ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuR3JvdXBzQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLkNsYXNzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuUGF0aEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlBhdGhOYXZpZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5WYWxpZGF0aW9uQ29udGV4dFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzQ2FwYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFQcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5BY2Nlc3NTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5WYWxpZGF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5PYmplY3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMucmVmbGVjdC5UeXBlVXRpbHM7Ci0KLS8vIFRPRE86IGNlbnRyYWxpemUgdHJlYXRNYXBzTGlrZUJlYW5zCi0KLS8qKgotICogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFyZSBhYmxlIHRvIHZhbGlkYXRlIGJlYW4gaW5zdGFuY2VzIChhbmQgdGhlIGFzc29jaWF0ZWQgb2JqZWN0IGdyYXBocykuCi0gKiA8cC8+Ci0gKiBJbXBsZW1lbnRhdGlvbiBpcyB0aHJlYWQtc2FmZS4KLSAqIDxwLz4KLSAqIEFQSSBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICogCi0gKiBAYXV0aG9yIFJvbWFuIFN0dW1tCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc1ZhbGlkYXRvciBpbXBsZW1lbnRzIENhc2NhZGluZ1Byb3BlcnR5VmFsaWRhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMSURBVEVfUFJPUEVSVFkgPSBuZXcgT2JqZWN0KCkgewotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJWQUxJREFURV9QUk9QRVJUWSI7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIEFwYWNoZUZhY3RvcnlDb250ZXh0fSB1c2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEFwYWNoZUZhY3RvcnlDb250ZXh0IGZhY3RvcnlDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICoge0BsaW5rIEdyb3Vwc0NvbXB1dGVyfSB1c2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEdyb3Vwc0NvbXB1dGVyIGdyb3Vwc0NvbXB1dGVyID0gbmV3IEdyb3Vwc0NvbXB1dGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ2xhc3NWYWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NWYWxpZGF0b3IoQXBhY2hlRmFjdG9yeUNvbnRleHQgZmFjdG9yeUNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5Q29udGV4dCA9IGZhY3RvcnlDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDbGFzc1ZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQGRlcHJlY2F0ZWQgcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NWYWxpZGF0b3IoQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMoZmFjdG9yeS51c2luZ0NvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXRhYmVhbiBmaW5kZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmFsaWRhdG9yLgotICAgICAqCi0gICAgICogQHJldHVybiBhIE1ldGFCZWFuRmluZGVyCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5NYW5hZ2VyRmFjdG9yeSNnZXRGaW5kZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRhQmVhbkZpbmRlciBnZXRNZXRhQmVhbkZpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnlDb250ZXh0LmdldE1ldGFCZWFuRmluZGVyKCk7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30gVmFsaWRhdGVzIGFsbCBjb25zdHJhaW50cyBvbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBvYmplY3QgdG8gdmFsaWRhdGUKLSAgICAgKiBAcGFyYW0gZ3JvdXBzIGdyb3VwIG9yIGxpc3Qgb2YgZ3JvdXBzIHRhcmdldGVkIGZvciB2YWxpZGF0aW9uIChkZWZhdWx0IHRvCi0gICAgICogICAgICAgICAgICAgICB7QGxpbmsgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdH0pCi0gICAgICogQHJldHVybiBjb25zdHJhaW50IHZpb2xhdGlvbnMgb3IgYW4gZW1wdHkgU2V0IGlmIG5vbmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBvYmplY3QgaXMgbnVsbCBvciBpZiBudWxsIGlzIHBhc3NlZCB0byB0aGUgdmFyYXJncyBncm91cHMKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gICAgICBpZiBhIG5vbiByZWNvdmVyYWJsZSBlcnJvciBoYXBwZW5zIGR1cmluZyB0aGUgdmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MKLSAgICAgKi8KLSAgICAvLyBAT3ZlcnJpZGUgLSBub3QgYWxsb3dlZCBpbiAxLjUgZm9yIEludGVyZmFjZSBtZXRob2RzCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGUoVCBvYmplY3QsIENsYXNzPD8+Li4uIGdyb3VwcykgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW5ub3QgdmFsaWRhdGUgbnVsbCIpOwotICAgICAgICBjaGVja0dyb3Vwcyhncm91cHMpOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIENsYXNzPFQ+IG9iamVjdENsYXNzID0gKENsYXNzPFQ+KSBvYmplY3QuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGFCZWFuIG9iamVjdE1ldGFCZWFuID0gZ2V0TWV0YUJlYW5GaW5kZXIoKS5maW5kRm9yQ2xhc3Mob2JqZWN0Q2xhc3MpOwotCi0gICAgICAgICAgICBmaW5hbCBHcm91cFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KG9iamVjdE1ldGFCZWFuLCBvYmplY3QsIG9iamVjdENsYXNzLCBncm91cHMpOwotICAgICAgICAgICAgZmluYWwgQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lcjxUPiByZXN1bHQgPSBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBHcm91cHMgc2VxdWVuY2UgPSBjb250ZXh0LmdldEdyb3VwcygpOwotCi0gICAgICAgICAgICAvLyAxLiBwcm9jZXNzIGdyb3VwcwotICAgICAgICAgICAgZm9yIChHcm91cCBjdXJyZW50IDogc2VxdWVuY2UuZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUJlYW5OZXQoY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDIuIHByb2Nlc3Mgc2VxdWVuY2VzCi0gICAgICAgICAgICBmb3IgKExpc3Q8R3JvdXA+IGVhY2hTZXEgOiBzZXF1ZW5jZS5nZXRTZXF1ZW5jZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgY3VycmVudCA6IGVhY2hTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQmVhbk5ldChjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBncm91cCBwcm9jZXNzIGluIHRoZSBzZXF1ZW5jZSBsZWFkcyB0byBvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgbW9yZSB2YWxpZGF0aW9uIGZhaWx1cmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBncm91cHMgZm9sbG93aW5nIGluIHRoZSBzZXF1ZW5jZSBtdXN0IG5vdCBiZQotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IHVucmVjb3ZlcmFibGVWYWxpZGF0aW9uRXJyb3IoZXgsIG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IFZhbGlkYXRlcyBhbGwgY29uc3RyYWludHMgcGxhY2VkIG9uIHRoZSBwcm9wZXJ0eSBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IG5hbWVkCi0gICAgICogPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgICAgICAgb2JqZWN0IHRvIHZhbGlkYXRlCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBwcm9wZXJ0eSB0byB2YWxpZGF0ZSAoaWUgZmllbGQgYW5kIGdldHRlciBjb25zdHJhaW50cykuIE5lc3RlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBtYXkgYmUgcmVmZXJlbmNlZCAoZS5nLiBwcm9wWzJdLnN1YnByb3BBLnN1YnByb3BCKQotICAgICAqIEBwYXJhbSBncm91cHMgICAgICAgZ3JvdXAgb3IgbGlzdCBvZiBncm91cHMgdGFyZ2V0ZWQgZm9yIHZhbGlkYXRpb24gKGRlZmF1bHQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0fSkKLSAgICAgKiBAcmV0dXJuIGNvbnN0cmFpbnQgdmlvbGF0aW9ucyBvciBhbiBlbXB0eSBTZXQgaWYgbm9uZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm9iamVjdDwvY29kZT4gaXMgbnVsbCwgaWYgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGVtcHR5IG9yIG5vdCBhIHZhbGlkIG9iamVjdCBwcm9wZXJ0eSBvciBpZiBudWxsIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSB2YXJhcmdzIGdyb3VwcwotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAgICAgIGlmIGEgbm9uIHJlY292ZXJhYmxlIGVycm9yIGhhcHBlbnMgZHVyaW5nIHRoZSB2YWxpZGF0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcwotICAgICAqLwotICAgIC8vIEBPdmVycmlkZSAtIG5vdCBhbGxvd2VkIGluIDEuNSBmb3IgSW50ZXJmYWNlIG1ldGhvZHMKLSAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVByb3BlcnR5KFQgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzczw/Pi4uLiBncm91cHMpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCBncm91cHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVByb3BlcnR5KFQgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIGNhc2NhZGUsCi0gICAgICAgIENsYXNzPD8+Li4uIGdyb3VwcykgewotCi0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCB2YWxpZGF0ZSBudWxsIik7Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiByZXN1bHQgPQotICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZUltcGwoKENsYXNzPFQ+KSBvYmplY3QuZ2V0Q2xhc3MoKSwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUsIFZBTElEQVRFX1BST1BFUlRZLCBjYXNjYWRlLCBncm91cHMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30gVmFsaWRhdGVzIGFsbCBjb25zdHJhaW50cyBwbGFjZWQgb24gdGhlIHByb3BlcnR5IG5hbWVkIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gb2YgdGhlIGNsYXNzCi0gICAgICogPGNvZGU+YmVhblR5cGU8L2NvZGU+IHdvdWxkIHRoZSBwcm9wZXJ0eSB2YWx1ZSBiZSA8Y29kZT52YWx1ZTwvY29kZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPGNvZGU+Q29uc3RyYWludFZpb2xhdGlvbjwvY29kZT4gb2JqZWN0cyByZXR1cm4gbnVsbCBmb3Ige0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb24jZ2V0Um9vdEJlYW4oKX0gYW5kCi0gICAgICoge0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb24jZ2V0TGVhZkJlYW4oKX0KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuVHlwZSAgICAgdGhlIGJlYW4gdHlwZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgcHJvcGVydHkgdG8gdmFsaWRhdGUKLSAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAgIHByb3BlcnR5IHZhbHVlIHRvIHZhbGlkYXRlCi0gICAgICogQHBhcmFtIGdyb3VwcyAgICAgICBncm91cCBvciBsaXN0IG9mIGdyb3VwcyB0YXJnZXRlZCBmb3IgdmFsaWRhdGlvbiAoZGVmYXVsdCB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rIGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHR9KQotICAgICAqIEByZXR1cm4gY29uc3RyYWludCB2aW9sYXRpb25zIG9yIGFuIGVtcHR5IFNldCBpZiBub25lCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmVhblR5cGU8L2NvZGU+IGlzIG51bGwsIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBudWxsLCBlbXB0eSBvciBub3QgYSB2YWxpZCBvYmplY3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvciBpZiBudWxsIGlzIHBhc3NlZCB0byB0aGUgdmFyYXJncyBncm91cHMKLSAgICAgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gICAgICBpZiBhIG5vbiByZWNvdmVyYWJsZSBlcnJvciBoYXBwZW5zIGR1cmluZyB0aGUgdmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MKLSAgICAgKi8KLSAgICAvLyBAT3ZlcnJpZGUgLSBub3QgYWxsb3dlZCBpbiAxLjUgZm9yIEludGVyZmFjZSBtZXRob2RzCi0gICAgcHVibGljIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVWYWx1ZShDbGFzczxUPiBiZWFuVHlwZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlLAotICAgICAgICBDbGFzczw/Pi4uLiBncm91cHMpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlVmFsdWUoYmVhblR5cGUsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZhbHNlLCBncm91cHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVZhbHVlKENsYXNzPFQ+IGJlYW5UeXBlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUsCi0gICAgICAgIGJvb2xlYW4gY2FzY2FkZSwgQ2xhc3M8Pz4uLi4gZ3JvdXBzKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZVZhbHVlSW1wbChjaGVja0JlYW5UeXBlKGJlYW5UeXBlKSwgbnVsbCwgcHJvcGVydHlOYW1lLCB2YWx1ZSwgY2FzY2FkZSwgZ3JvdXBzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IFJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgZGVzY3JpYmluZyBiZWFuIGNvbnN0cmFpbnRzLiBUaGUgcmV0dXJuZWQgb2JqZWN0IChhbmQgYXNzb2NpYXRlZAotICAgICAqIG9iamVjdHMgaW5jbHVkaW5nIDxjb2RlPkNvbnN0cmFpbnREZXNjcmlwdG9yPGNvZGU+cykgYXJlIGltbXV0YWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZSBldmFsdWF0ZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBiZWFuIGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgY2xhenogaXMgbnVsbAotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAgICAgIGlmIGEgbm9uIHJlY292ZXJhYmxlIGVycm9yIGhhcHBlbnMgZHVyaW5nIHRoZSBtZXRhZGF0YQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyeSBvciBpZiBzb21lIGNvbnN0cmFpbnRzIGFyZSBpbnZhbGlkLgotICAgICAqLwotICAgIC8vIEBPdmVycmlkZSAtIG5vdCBhbGxvd2VkIGluIDEuNSBmb3IgSW50ZXJmYWNlIG1ldGhvZHMKLSAgICBwdWJsaWMgQmVhbkRlc2NyaXB0b3IgZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhDbGFzczw/PiBjbGF6eikgewotICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3MgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0YUJlYW4gbWV0YUJlYW4gPSBnZXRNZXRhQmVhbkZpbmRlcigpLmZpbmRGb3JDbGFzcyhjbGF6eik7Ci0gICAgICAgICAgICBCZWFuRGVzY3JpcHRvckltcGwgZWRlc2MgPSBtZXRhQmVhbi5nZXRGZWF0dXJlKEpzcjMwM0ZlYXR1cmVzLkJlYW4uQkVBTl9ERVNDUklQVE9SKTsKLSAgICAgICAgICAgIGlmIChlZGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZWRlc2MgPSBjcmVhdGVCZWFuRGVzY3JpcHRvcihtZXRhQmVhbik7Ci0gICAgICAgICAgICAgICAgbWV0YUJlYW4ucHV0RmVhdHVyZShKc3IzMDNGZWF0dXJlcy5CZWFuLkJFQU5fREVTQ1JJUFRPUiwgZWRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVkZXNjOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiZXJyb3IgcmV0cmlldmluZyBjb25zdHJhaW50cyBmb3IgIiArIGNsYXp6LCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYWxsb3dpbmcgYWNjZXNzIHRvIHByb3ZpZGVyLXNwZWNpZmljIEFQSXMuIElmIHRoZSBCZWFuCi0gICAgICogVmFsaWRhdGlvbiBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgY2xhc3MsIDxjb2RlPlZhbGlkYXRpb25FeGNlcHRpb248L2NvZGU+IGlzCi0gICAgICogdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0dXJuZWQuCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0gICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYWxsLgotICAgICAqLwotICAgIC8vIEBPdmVycmlkZSAtIG5vdCBhbGxvd2VkIGluIDEuNSBmb3IgSW50ZXJmYWNlIG1ldGhvZHMKLSAgICBwdWJsaWMgPFQ+IFQgdW53cmFwKENsYXNzPFQ+IHR5cGUpIHsKLSAgICAgICAgLy8gRklYTUUgMjAxMS0wMy0yNyBqdzoKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHVuc2VjdXJlLgotICAgICAgICAvLyBJdCBzaG91bGQgYWxsb3cgb25seSBhIGZpeGVkIHNldCBvZiBjbGFzc2VzLgotICAgICAgICAvLyBDYW4ndCBmaXggdGhpcyBiZWNhdXNlIGRvbid0IGtub3cgd2hpY2ggY2xhc3NlcyB0aGlzIG1ldGhvZCBzaG91bGQgc3VwcG9ydC4KLQotICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKGdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIGZpbmFsIFQgcmVzdWx0ID0gKFQpIHRoaXM7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgaWYgKCEodHlwZS5pc0ludGVyZmFjZSgpIHx8IE1vZGlmaWVyLmlzQWJzdHJhY3QodHlwZS5nZXRNb2RpZmllcnMoKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UodHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IGNscyA9IENsYXNzVXRpbHMuZ2V0Q2xhc3ModHlwZS5nZXROYW1lKCkgKyAiSW1wbCIpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFQ+IGltcGxDbGFzcyA9IChDbGFzczw/IGV4dGVuZHMgVD4pIGNsczsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGltcGxDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiVHlwZSAiICsgdHlwZSArICIgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8VD4gVCBuZXdJbnN0YW5jZShmaW5hbCBDbGFzczxUPiBjbHMpIHsKLSAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFQ+KCkgewotICAgICAgICAgICAgcHVibGljIFQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPFQ+IGNvbnMgPSBjbHMuZ2V0Q29uc3RydWN0b3IoQXBhY2hlRmFjdG9yeUNvbnRleHQuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnMuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnMuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ucy5uZXdJbnN0YW5jZShmYWN0b3J5Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgOiAiICsgY2xzLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBIZWxwZXJzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGEgYmVhbiBhbmQgYWxsIGl0cyBjYXNjYWRlZCByZWxhdGVkIGJlYW5zIGZvciB0aGUgY3VycmVudGx5IGRlZmluZWQgZ3JvdXAuCi0gICAgICogPHAvPgotICAgICAqIFNwZWNpYWwgY29kZSBpcyBwcmVzZW50IHRvIG1hbmFnZSB0aGUge0BsaW5rIERlZmF1bHR9IGdyb3VwLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25Db250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhpcyB2YWxpZGF0aW9uIGNhbGwuIE11c3QgaGF2ZSBpdHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEdyb3VwVmFsaWRhdGlvbkNvbnRleHQjZ2V0Q3VycmVudEdyb3VwKCl9IGZpZWxkIHNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJlYW5OZXQoR3JvdXBWYWxpZGF0aW9uQ29udGV4dDw/PiBjb250ZXh0KSB7Ci0KLSAgICAgICAgLy8gSWYgcmVhY2hlZCBhIGNhc2NhZGVkIGJlYW4gd2hpY2ggaXMgbnVsbAotICAgICAgICBpZiAoY29udGV4dC5nZXRCZWFuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgcmVhY2hlZCBhIGNhc2NhZGVkIGJlYW4gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgZm9yIHRoZQotICAgICAgICAvLyBjdXJyZW50IGdyb3VwCi0gICAgICAgIGlmICghY29udGV4dC5jb2xsZWN0VmFsaWRhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyBGaXJzdCwgdmFsaWRhdGUgdGhlIGJlYW4KLQotICAgICAgICAvLyBEZWZhdWx0IGlzIGEgc3BlY2lhbCBjYXNlCi0gICAgICAgIGlmIChjb250ZXh0LmdldEN1cnJlbnRHcm91cCgpLmlzRGVmYXVsdCgpKSB7Ci0KLSAgICAgICAgICAgIExpc3Q8R3JvdXA+IGRlZmF1bHRHcm91cHMgPSBleHBhbmREZWZhdWx0R3JvdXAoY29udGV4dCk7Ci0gICAgICAgICAgICBmaW5hbCBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPD8+IHJlc3VsdCA9IChDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPD8+KSBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSByb290QmVhbiBkZWZpbmVzIGEgR3JvdXBTZXF1ZW5jZQotICAgICAgICAgICAgaWYgKGRlZmF1bHRHcm91cHMgIT0gbnVsbCAmJiBkZWZhdWx0R3JvdXBzLnNpemUoKSA+IDEpIHsKLQotICAgICAgICAgICAgICAgIGludCBudW1WaW9sYXRpb25zID0gcmVzdWx0LnZpb2xhdGlvbnNTaXplKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYmVhbiBmb3IgZWFjaCBncm91cCBpbiB0aGUgc2VxdWVuY2UKLSAgICAgICAgICAgICAgICBHcm91cCBjdXJyZW50R3JvdXAgPSBjb250ZXh0LmdldEN1cnJlbnRHcm91cCgpOwotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgZWFjaCA6IGRlZmF1bHRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoZWFjaCk7Ci0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVCZWFuKGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIDMuNC4zIC0gU3RvcCB2YWxpZGF0aW9uIGlmIGVycm9ycyBhbHJlYWR5IGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmlvbGF0aW9uc1NpemUoKSA+IG51bVZpb2xhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGN1cnJlbnRHcm91cCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggY2xhc3MgaW4gdGhlIGhpZXJhcmNoeSBvZiBjbGFzc2VzIG9mIHJvb3RCZWFuLAotICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBjb25zdHJhaW50cyBkZWZpbmVkIGluIHRoYXQgY2xhc3MgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIEdyb3VwU2VxdWVuY2UgZGVmaW5lZCBpbiB0aGUgc2FtZSBjbGFzcwotCi0gICAgICAgICAgICAgICAgLy8gT2J0YWluIHRoZSBmdWxsIGNsYXNzIGhpZXJhcmNoeQotICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzSGllcmFyY2h5ID0gbmV3IEFycmF5TGlzdDxDbGFzczw/Pj4oKTsKLSAgICAgICAgICAgICAgICBDbGFzc0hlbHBlci5maWxsRnVsbENsYXNzSGllcmFyY2h5QXNMaXN0KGNsYXNzSGllcmFyY2h5LCBjb250ZXh0LmdldE1ldGFCZWFuKCkuZ2V0QmVhbkNsYXNzKCkpOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGluaXRpYWxPd25lciA9IGNvbnRleHQuZ2V0Q3VycmVudE93bmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBvd25lciBpbiB0aGUgaGllcmFyY2h5Ci0gICAgICAgICAgICAgICAgZm9yIChDbGFzczw/PiBvd25lciA6IGNsYXNzSGllcmFyY2h5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudE93bmVyKG93bmVyKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtVmlvbGF0aW9ucyA9IHJlc3VsdC52aW9sYXRpb25zU2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIE9idGFpbiB0aGUgZ3JvdXAgc2VxdWVuY2Ugb2YgdGhlIG93bmVyLCBhbmQgdXNlIGl0IGZvcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29uc3RyYWludHMgdGhhdCBiZWxvbmcgdG8gaXQKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxHcm91cD4gb3duZXJEZWZhdWx0R3JvdXBzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWV0YUJlYW4oKS5nZXRGZWF0dXJlKCJ7R3JvdXBTZXF1ZW5jZToiICsgb3duZXIuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChHcm91cCBlYWNoIDogb3duZXJEZWZhdWx0R3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChlYWNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVCZWFuKGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyAzLjQuMyAtIFN0b3AgdmFsaWRhdGlvbiBpZiBlcnJvcnMgYWxyZWFkeSBmb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52aW9sYXRpb25zU2l6ZSgpID4gbnVtVmlvbGF0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50T3duZXIoaW5pdGlhbE93bmVyKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChHcm91cC5ERUZBVUxUKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbm90IHRoZSBkZWZhdWx0IGdyb3VwLCBwcm9jZWVkIGFzIG5vcm1hbAotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVCZWFuKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIFRoZW4sIHRoZSBjYXNjYWRlZCBiZWFucyAoQFZhbGlkKQotICAgICAgICBmb3IgKE1ldGFQcm9wZXJ0eSBwcm9wIDogY29udGV4dC5nZXRNZXRhQmVhbigpLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgdmFsaWRhdGVDYXNjYWRlZEJlYW4oY29udGV4dCwgcHJvcCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgdGhlIG1ldGEgcHJvcGVydHkgPGNvZGU+cHJvcDwvY29kZT4gZGVmaW5lcyBhIGNhc2NhZGVkIGJlYW4sIGFuZCBpbiBjYXNlIGl0IGRvZXMsIHZhbGlkYXRlcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjdXJyZW50IHZhbGlkYXRpb24gY29udGV4dC4KLSAgICAgKiBAcGFyYW0gcHJvcCAgICBUaGUgcHJvcGVydHkgdG8gY2FzY2FkZSBmcm9tIChpbiBjYXNlIGl0IGlzIHBvc3NpYmxlKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDYXNjYWRlZEJlYW4oR3JvdXBWYWxpZGF0aW9uQ29udGV4dDw/PiBjb250ZXh0LCBNZXRhUHJvcGVydHkgcHJvcCkgewotICAgICAgICBBY2Nlc3NTdHJhdGVneVtdIGFjY2VzcyA9IHByb3AuZ2V0RmVhdHVyZShGZWF0dXJlcy5Qcm9wZXJ0eS5SRUZfQ0FTQ0FERSk7Ci0gICAgICAgIGlmIChhY2Nlc3MgIT0gbnVsbCkgeyAvLyBkaWZmZXJlbnQgYWNjZXNzZXMgdG8gcmVsYXRpb24KLSAgICAgICAgICAgIC8vIHNhdmUgb2xkIHZhbHVlcyBmcm9tIGNvbnRleHQKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBiZWFuID0gY29udGV4dC5nZXRCZWFuKCk7Ci0gICAgICAgICAgICBmaW5hbCBNZXRhQmVhbiBtYmVhbiA9IGNvbnRleHQuZ2V0TWV0YUJlYW4oKTsKLSAgICAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IFZhbGlkYXRpb24uZ3JvdXBzIHN1cHBvcnQgb24gcmVsYXRlZCBiZWFuCi0vLyAgICAgICAgICAgIENsYXNzW10gZ3JvdXBzID0gcHJvcC5nZXRGZWF0dXJlKEpzcjMwM0ZlYXR1cmVzLlByb3BlcnR5LlJFRl9HUk9VUFMpOwotICAgICAgICAgICAgZm9yIChBY2Nlc3NTdHJhdGVneSBlYWNoIDogYWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2FzY2FkYWJsZShjb250ZXh0LCBwcm9wLCBlYWNoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBtb2RpZnkgY29udGV4dCBzdGF0ZSBmb3IgcmVsYXRpb25zaGlwLXRhcmdldCBiZWFuCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubW92ZURvd24ocHJvcCwgZWFjaCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdywgaWYgdGhlIHJlbGF0ZWQgYmVhbiBpcyBhbiBpbnN0YW5jZSBvZiBNYXAvQXJyYXkvZXRjLAotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIG5ldyBKc3IzMDNWYWxpZGF0aW9uQ2FsbGJhY2soY29udGV4dCksIHRyZWF0TWFwc0xpa2VCZWFucyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgb2xkIHZhbHVlcyBpbiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubW92ZVVwKGJlYW4sIG1iZWFuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCZWZvcmUgYWNjZXNzaW5nIGEgcmVsYXRlZCBiZWFuIChtYXJrZWQgd2l0aCB7QGxpbmsgamF2YXgudmFsaWRhdGlvbi5WYWxpZH0pLCB0aGUgdmFsaWRhdG9yIGhhcyB0byBjaGVjayBpZiBpdCBpcwotICAgICAqIHJlYWNoYWJsZSBhbmQgY2FzY2FkYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjdXJyZW50IHZhbGlkYXRpb24gY29udGV4dC4KLSAgICAgKiBAcGFyYW0gcHJvcCAgICBUaGUgcHJvcGVydHkgb2YgdGhlIHJlbGF0ZWQgYmVhbi4KLSAgICAgKiBAcGFyYW0gYWNjZXNzICBUaGUgYWNjZXNzIHN0cmF0ZWd5IHVzZWQgdG8gZ2V0IHRoZSByZWxhdGVkIGJlYW4gdmFsdWUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsaWRhdG9yIGNhbiBhY2Nlc3MgdGhlIHJlbGF0ZWQgYmVhbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDYXNjYWRhYmxlKEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dCwgTWV0YVByb3BlcnR5IHByb3AsIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcykgewotCi0gICAgICAgIFBhdGhJbXBsIGJlYW5QYXRoID0gY29udGV4dC5nZXRQcm9wZXJ0eVBhdGgoKTsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9IG5ldyBOb2RlSW1wbChwcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChiZWFuUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiZWFuUGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKS5pc1JlYWNoYWJsZShjb250ZXh0LmdldEJlYW4oKSwgbm9kZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJvb3RNZXRhQmVhbigpLmdldEJlYW5DbGFzcygpLCBiZWFuUGF0aCwgYWNjZXNzLmdldEVsZW1lbnRUeXBlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiRXJyb3IgaW4gVHJhdmVyc2FibGVSZXNvbHZlci5pc1JlYWNoYWJsZSgpIGZvciAiICsgY29udGV4dC5nZXRCZWFuKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghY29udGV4dC5nZXRUcmF2ZXJzYWJsZVJlc29sdmVyKCkuaXNDYXNjYWRhYmxlKGNvbnRleHQuZ2V0QmVhbigpLCBub2RlLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Um9vdE1ldGFCZWFuKCkuZ2V0QmVhbkNsYXNzKCksIGJlYW5QYXRoLCBhY2Nlc3MuZ2V0RWxlbWVudFR5cGUoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJFcnJvciBUcmF2ZXJzYWJsZVJlc29sdmVyLmlzQ2FzY2FkYWJsZSgpIGZvciAiICsgY29udGV4dC5nZXRCZWFuKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW4gY2FzZSBvZiBhIGRlZmF1bHQgZ3JvdXAgcmV0dXJuIHRoZSBsaXN0IG9mIGdyb3VwcyBmb3IgYSByZWRlZmluZWQgZGVmYXVsdCBHcm91cFNlcXVlbmNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgd2hlbiBubyBpbiBkZWZhdWx0IGdyb3VwIG9yIGRlZmF1bHQgZ3JvdXAgc2VxdWVuY2Ugbm90IHJlZGVmaW5lZAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxHcm91cD4gZXhwYW5kRGVmYXVsdEdyb3VwKEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXRDdXJyZW50R3JvdXAoKS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgLy8gbWVudGlvbiBpZiBtZXRhQmVhbiByZWRlZmluZXMgdGhlIGRlZmF1bHQgZ3JvdXAKLSAgICAgICAgICAgIExpc3Q8R3JvdXA+IGdyb3VwU2VxID0gY29udGV4dC5nZXRNZXRhQmVhbigpLmdldEZlYXR1cmUoSnNyMzAzRmVhdHVyZXMuQmVhbi5HUk9VUF9TRVFVRU5DRSk7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBTZXEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0R3JvdXBzKCkuYXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGUoZ3JvdXBTZXEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdyb3VwU2VxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhbiB1bnJlY292ZXJhYmxlIHZhbGlkYXRpb24gZXJyb3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBleAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZpbmFsbHkiKQotICAgIHByb3RlY3RlZCBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiB1bnJlY292ZXJhYmxlVmFsaWRhdGlvbkVycm9yKFJ1bnRpbWVFeGNlcHRpb24gZXgsIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgSW5jb21wYXRpYmxlUHJvcGVydHlWYWx1ZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gQ29udmVydCB0byBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgIHJldHVybiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgVmFsaWRhdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGV4OyAvLyBkbyBub3Qgd3JhcCBzcGVjaWZpYyBWYWxpZGF0aW9uRXhjZXB0aW9ucyAob3IKLSAgICAgICAgICAgIC8vIGluc3RhbmNlcyBmcm9tIHN1YmNsYXNzZXMpCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAiIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdElkID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQgPSAiPG51bGw+IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG9iamVjdElkID0gIjx1bmtub3duPiI7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiZXJyb3IgZHVyaW5nIHZhbGlkYXRpb24gb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3RJZCwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHlJbkdyb3VwKGZpbmFsIEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dCkgewotICAgICAgICBmaW5hbCBSdW5uYWJsZSBoZWxwZXI7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlbHBlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlci52YWxpZGF0ZUJlYW4oY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlbHBlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlci52YWxpZGF0ZVByb3BlcnR5KGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgR3JvdXAgY3VycmVudEdyb3VwID0gY29udGV4dC5nZXRDdXJyZW50R3JvdXAoKTsKLSAgICAgICAgTGlzdDxHcm91cD4gZGVmYXVsdEdyb3VwcyA9IGV4cGFuZERlZmF1bHRHcm91cChjb250ZXh0KTsKLSAgICAgICAgaWYgKGRlZmF1bHRHcm91cHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChHcm91cCBlYWNoIDogZGVmYXVsdEdyb3VwcykgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGVhY2gpOwotICAgICAgICAgICAgICAgIGhlbHBlci5ydW4oKTsKLSAgICAgICAgICAgICAgICAvLyBjb250aW51ZSB2YWxpZGF0aW9uLCBldmVuIGlmIGVycm9ycyBhbHJlYWR5IGZvdW5kCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChjdXJyZW50R3JvdXApOyAvLyByZXN0b3JlCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWxwZXIucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB7QGxpbmsgR3JvdXBWYWxpZGF0aW9uQ29udGV4dH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEBwYXJhbSBvYmplY3RDbGFzcwotICAgICAqIEBwYXJhbSBncm91cHMKLSAgICAgKiBAcmV0dXJuIHtAbGluayBHcm91cFZhbGlkYXRpb25Db250ZXh0fSBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCA8VD4gR3JvdXBWYWxpZGF0aW9uQ29udGV4dDxUPiBjcmVhdGVDb250ZXh0KE1ldGFCZWFuIG1ldGFCZWFuLCBUIG9iamVjdCwgQ2xhc3M8VD4gb2JqZWN0Q2xhc3MsCi0gICAgICAgIENsYXNzPD8+Li4uIGdyb3VwcykgewotICAgICAgICBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPFQ+IGxpc3RlbmVyID0gbmV3IENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4ob2JqZWN0LCBvYmplY3RDbGFzcyk7Ci0gICAgICAgIEdyb3VwVmFsaWRhdGlvbkNvbnRleHRJbXBsPFQ+IGNvbnRleHQgPQotICAgICAgICAgICAgbmV3IEdyb3VwVmFsaWRhdGlvbkNvbnRleHRJbXBsPFQ+KGxpc3RlbmVyLCB0aGlzLmZhY3RvcnlDb250ZXh0LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSwKLSAgICAgICAgICAgICAgICB0aGlzLmZhY3RvcnlDb250ZXh0LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSwgbWV0YUJlYW4pOwotICAgICAgICBjb250ZXh0LnNldEJlYW4ob2JqZWN0LCBtZXRhQmVhbik7Ci0gICAgICAgIGNvbnRleHQuc2V0R3JvdXBzKGdyb3Vwc0NvbXB1dGVyLmNvbXB1dGVHcm91cHMoZ3JvdXBzKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHtAbGluayBCZWFuRGVzY3JpcHRvckltcGx9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0YUJlYW4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBCZWFuRGVzY3JpcHRvckltcGx9IGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJlYW5EZXNjcmlwdG9ySW1wbCBjcmVhdGVCZWFuRGVzY3JpcHRvcihNZXRhQmVhbiBtZXRhQmVhbikgewotICAgICAgICByZXR1cm4gbmV3IEJlYW5EZXNjcmlwdG9ySW1wbChmYWN0b3J5Q29udGV4dCwgbWV0YUJlYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB0cmVhdE1hcHNMaWtlQmVhbnMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEJlaGF2aW9yIGNvbmZpZ3VyYXRpb24gLQotICAgICAqIDxwLz4KLSAgICAgKiA8cHJlPgotICAgICAqIEByZXR1cm4gdHJlYXRNYXBzTGlrZUJlYW5zIC0gdHJ1ZSAodmFsaWRhdGUgbWFwcyBsaWtlIGJlYW5zLCBzbyB0aGF0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHVzZSBNYXBzIHRvIHZhbGlkYXRlIGR5bmFtaWMgY2xhc3NlcyBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbnMgZm9yIHdoaWNoIHlvdSBoYXZlIHRoZSBNZXRhQmVhbiBidXQgbm8gaW5zdGFuY2VzKQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZmFsc2UgKGRlZmF1bHQpLCB2YWxpZGF0ZSBtYXBzIGxpa2UgY29sbGVjdGlvbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW5nIHRoZSB2YWx1ZXMgb25seSkKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogKGlzIHN0aWxsIGNvbmZpZ3VyYXRpb24gdG8gYmV0dGVyIGluIEJlYW5WYWxpZGF0aW9uQ29udGV4dD8pCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNUcmVhdE1hcHNMaWtlQmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiB0cmVhdE1hcHNMaWtlQmVhbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgbWFwcyBhcmUgdG8gYmUgdHJlYXRlZCBsaWtlIGJlYW5zLgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogQHBhcmFtIHRyZWF0TWFwc0xpa2VCZWFucyAtIHRydWUgKHZhbGlkYXRlIG1hcHMgbGlrZSBiZWFucywgc28gdGhhdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHVzZSBNYXBzIHRvIHZhbGlkYXRlIGR5bmFtaWMgY2xhc3NlcyBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFucyBmb3Igd2hpY2ggeW91IGhhdmUgdGhlIE1ldGFCZWFuIGJ1dCBubyBpbnN0YW5jZXMpCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIGZhbHNlIChkZWZhdWx0KSwgdmFsaWRhdGUgbWFwcyBsaWtlIGNvbGxlY3Rpb25zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW5nIHRoZSB2YWx1ZXMgb25seSkKLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmVhdE1hcHNMaWtlQmVhbnMoYm9vbGVhbiB0cmVhdE1hcHNMaWtlQmVhbnMpIHsKLSAgICAgICAgdGhpcy50cmVhdE1hcHNMaWtlQmVhbnMgPSB0cmVhdE1hcHNMaWtlQmVhbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYmVhblR5cGUgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHNwZWMgU2VjdGlvbiA0LjEuMSBpLiBUaHJvd3MgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgaXQKLSAgICAgKiBpcyBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhblR5cGUgQmVhbiB0eXBlIHRvIGNoZWNrLgotICAgICAqLwotICAgIHByaXZhdGUgPFQ+IENsYXNzPFQ+IGNoZWNrQmVhblR5cGUoQ2xhc3M8VD4gYmVhblR5cGUpIHsKLSAgICAgICAgaWYgKGJlYW5UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJlYW4gdHlwZSBjYW5ub3QgYmUgbnVsbC4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdGhlIHByb3BlcnR5IG5hbWUgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHNwZWMgU2VjdGlvbiA0LjEuMSBpLiBUaHJvd3MgYW4KLSAgICAgKiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiBpdCBpcyBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IG5hbWUgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsIHx8IHByb3BlcnR5TmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgcGF0aCBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IHRoZSBncm91cHMgYXJyYXkgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHNwZWMgU2VjdGlvbiA0LjEuMSBpLiBUaHJvd3MgYW4KLSAgICAgKiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiBpdCBpcyBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JvdXBzIFRoZSBncm91cHMgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrR3JvdXBzKENsYXNzPD8+W10gZ3JvdXBzKSB7Ci0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR3JvdXBzIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGF0Y2hlcyBhIGNhbGwgZnJvbSB7QGxpbmsgI3ZhbGlkYXRlKCl9IHRvIHtAbGluayBDbGFzc1ZhbGlkYXRvciN2YWxpZGF0ZUJlYW5OZXQoR3JvdXBWYWxpZGF0aW9uQ29udGV4dCl9IHdpdGgKLSAgICAgKiB0aGUgY3VycmVudCBjb250ZXh0IHNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgSnNyMzAzVmFsaWRhdGlvbkNhbGxiYWNrIGltcGxlbWVudHMgVmFsaWRhdGlvbkhlbHBlci5WYWxpZGF0ZUNhbGxiYWNrIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dDsKLQotICAgICAgICBwdWJsaWMgSnNyMzAzVmFsaWRhdGlvbkNhbGxiYWNrKEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dCkgewotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgICAgICAgdmFsaWRhdGVCZWFuTmV0KGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB7QGxpbmsgVmFsaWRhdGlvbkNvbnRleHRUcmF2ZXJzYWx9IGluc3RhbmNlIGZvciB0aGlzIHtAbGluayBDbGFzc1ZhbGlkYXRvcn0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25Db250ZXh0Ci0gICAgICogQHJldHVybiB7QGxpbmsgVmFsaWRhdGlvbkNvbnRleHRUcmF2ZXJzYWx9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRpb25Db250ZXh0VHJhdmVyc2FsIGNyZWF0ZVZhbGlkYXRpb25Db250ZXh0VHJhdmVyc2FsKEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4gdmFsaWRhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uQ29udGV4dFRyYXZlcnNhbCh2YWxpZGF0aW9uQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHtAbGluayAjdmFsaWRhdGVQcm9wZXJ0eShPYmplY3QsIFN0cmluZywgYm9vbGVhbiwgQ2xhc3MuLi4pfSBhbmQKLSAgICAgKiB7QGxpbmsgI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBib29sZWFuLCBDbGFzcy4uLil9LgotICAgICAqIAotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0gYmVhblR5cGUKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSBjYXNjYWRlCi0gICAgICogQHBhcmFtIGdyb3VwcwotICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb259IHtAbGluayBTZXR9Ci0gICAgICovCi0gICAgcHJpdmF0ZSA8VD4gU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+IHZhbGlkYXRlVmFsdWVJbXBsKENsYXNzPFQ+IGJlYW5UeXBlLCBUIG9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgT2JqZWN0IHZhbHVlLCBmaW5hbCBib29sZWFuIGNhc2NhZGUsIENsYXNzPD8+Li4uIGdyb3VwcykgewotCi0gICAgICAgIGFzc2VydCAob2JqZWN0ID09IG51bGwpIF4gKHZhbHVlID09IFZBTElEQVRFX1BST1BFUlRZKTsKLSAgICAgICAgY2hlY2tQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgY2hlY2tHcm91cHMoZ3JvdXBzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgTWV0YUJlYW4gaW5pdGlhbE1ldGFCZWFuID0gbmV3IER5bmFtaWNNZXRhQmVhbihnZXRNZXRhQmVhbkZpbmRlcigpKTsKLSAgICAgICAgICAgIGluaXRpYWxNZXRhQmVhbi5zZXRCZWFuQ2xhc3MoYmVhblR5cGUpOwotICAgICAgICAgICAgR3JvdXBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0ID0gY3JlYXRlQ29udGV4dChpbml0aWFsTWV0YUJlYW4sIG9iamVjdCwgYmVhblR5cGUsIGdyb3Vwcyk7Ci0gICAgICAgICAgICBWYWxpZGF0aW9uQ29udGV4dFRyYXZlcnNhbCBjb250ZXh0VHJhdmVyc2FsID0gY3JlYXRlVmFsaWRhdGlvbkNvbnRleHRUcmF2ZXJzYWwoY29udGV4dCk7Ci0gICAgICAgICAgICBQYXRoTmF2aWdhdGlvbi5uYXZpZ2F0ZShwcm9wZXJ0eU5hbWUsIGNvbnRleHRUcmF2ZXJzYWwpOwotCi0gICAgICAgICAgICBNZXRhUHJvcGVydHkgcHJvcCA9IGNvbnRleHQuZ2V0TWV0YVByb3BlcnR5KCk7Ci0gICAgICAgICAgICBib29sZWFuIGZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gVkFMSURBVEVfUFJPUEVSVFkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbnRleHQuZ2V0UHJvcGVydHlQYXRoKCkuaXNSb290UGF0aCgpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wID09IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldE1ldGFCZWFuKGdldE1ldGFCZWFuRmluZGVyKCkuZmluZEZvckNsYXNzKHZhbHVlLmdldENsYXNzKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjYXNjYWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vVENLIGRvZXNuJ3QgY2FyZSB3aGF0IHR5cGUgYSBwcm9wZXJ0eSBpcyBpZiB0aGVyZSBhcmUgbm8gY29uc3RyYWludHMgdG8gdmFsaWRhdGU6Ci0gICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzQ2FwYWJsZSBtZXRhID0gcHJvcCA9PSBudWxsID8gY29udGV4dC5nZXRNZXRhQmVhbigpIDogcHJvcDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5VXRpbHMuaXNFbXB0eShtZXRhLmdldFZhbGlkYXRpb25zKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbnN0cmFpbnRWaW9sYXRpb248VD4+IGVtcHR5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUeXBlVXRpbHMuaXNBc3NpZ25hYmxlKHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUuZ2V0Q2xhc3MoKSwgY29udGV4dFRyYXZlcnNhbC5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiJTMkcyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHkgJTIkcyBvZiB0eXBlICUxJHMiLCBiZWFuVHlwZSwgcHJvcGVydHlOYW1lLCB2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QmVhbih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRGaXhlZFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gZG9DYXNjYWRlID0gY2FzY2FkZSAmJiAocHJvcCA9PSBudWxsIHx8IHByb3AuZ2V0TWV0YUJlYW4oKSAhPSBudWxsKTsKLQotICAgICAgICAgICAgT2JqZWN0IGJlYW4gPSBjb250ZXh0LmdldEJlYW4oKTsKLQotICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lcjxUPiByZXN1bHQgPSBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0gICAgICAgICAgICBHcm91cHMgc2VxdWVuY2UgPSBjb250ZXh0LmdldEdyb3VwcygpOwotCi0gICAgICAgICAgICAvLyAxLiBwcm9jZXNzIGdyb3VwcwotCi0gICAgICAgICAgICBmb3IgKEdyb3VwIGN1cnJlbnQgOiBzZXF1ZW5jZS5nZXRHcm91cHMoKSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGN1cnJlbnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFkb0Nhc2NhZGUgfHwgcHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHlJbkdyb3VwKGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZG9DYXNjYWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRUcmF2ZXJzYWwubW92ZURvd25JZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNZXRhQmVhbigpIGluc3RhbmNlb2YgRHluYW1pY01ldGFCZWFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldE1ldGFCZWFuKGNvbnRleHQuZ2V0TWV0YUJlYW4oKS5yZXNvbHZlTWV0YUJlYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VXRpbHMuZGVmYXVsdElmTnVsbChjb250ZXh0LmdldEJlYW4oKSwgY29udGV4dFRyYXZlcnNhbC5nZXRSYXdUeXBlKCkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCZWFuTmV0KGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1vdmVVcChiZWFuLCBwcm9wLmdldFBhcmVudE1ldGFCZWFuKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRNZXRhUHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZpeGVkVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyAyLiBwcm9jZXNzIHNlcXVlbmNlcwotCi0gICAgICAgICAgICBpbnQgZ3JvdXBWaW9sYXRpb25zID0gcmVzdWx0LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCkuc2l6ZSgpOwotCi0gICAgICAgICAgICBvdXRlcjogZm9yIChMaXN0PEdyb3VwPiBlYWNoU2VxIDogc2VxdWVuY2UuZ2V0U2VxdWVuY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEdyb3VwIGN1cnJlbnQgOiBlYWNoU2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGN1cnJlbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghZG9DYXNjYWRlIHx8IHByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUluR3JvdXAoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvQ2FzY2FkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFRyYXZlcnNhbC5tb3ZlRG93bklmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNZXRhQmVhbigpIGluc3RhbmNlb2YgRHluYW1pY01ldGFCZWFuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRNZXRhQmVhbihjb250ZXh0LmdldE1ldGFCZWFuKCkucmVzb2x2ZU1ldGFCZWFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RVdGlscy5kZWZhdWx0SWZOdWxsKGNvbnRleHQuZ2V0QmVhbigpLCBjb250ZXh0VHJhdmVyc2FsLmdldFJhd1R5cGUoKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQmVhbk5ldChjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1vdmVVcChiZWFuLCBwcm9wLmdldFBhcmVudE1ldGFCZWFuKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TWV0YVByb3BlcnR5KHByb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZpeGVkVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogaWYgb25lIG9mIHRoZSBncm91cCBwcm9jZXNzIGluIHRoZSBzZXF1ZW5jZSBsZWFkcyB0byBvbmUgb3IgbW9yZSB2YWxpZGF0aW9uIGZhaWx1cmUsIHRoZSBncm91cHMKLSAgICAgICAgICAgICAgICAgICAgICogZm9sbG93aW5nIGluIHRoZSBzZXF1ZW5jZSBtdXN0IG5vdCBiZSBwcm9jZXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKS5zaXplKCkgPiBncm91cFZpb2xhdGlvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IHVucmVjb3ZlcmFibGVWYWxpZGF0aW9uRXJyb3IoZXgsIE9iamVjdFV0aWxzLmRlZmF1bHRJZk51bGwob2JqZWN0LCB2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uZmlndXJhdGlvbkltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ExYzQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5yZXNvbHZlci5EZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuU2VjdXJlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbC5WYWxpZGF0aW9uUGFyc2VyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi4qOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLkJvb3RzdHJhcFN0YXRlOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLkNvbmZpZ3VyYXRpb25TdGF0ZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5WYWxpZGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdXNlZCB0byBjb25maWd1cmUgYXBhY2hlLXZhbGlkYXRpb24gZm9yIGpzcjMwMy4KLSAqIEltcGxlbWVudGF0aW9uIG9mIENvbmZpZ3VyYXRpb24gdGhhdCBhbHNvIGltcGxlbWVudHMgQ29uZmlndXJhdGlvblN0YXRlLAotICogaGVuY2UgdGhpcyBjYW4gYmUgcGFzc2VkIHRvIGJ1aWxkVmFsaWRhdG9yRmFjdG9yeShDb25maWd1cmF0aW9uU3RhdGUpLgotICogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbXBsIGltcGxlbWVudHMgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbiwgQ29uZmlndXJhdGlvblN0YXRlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihDb25maWd1cmF0aW9uSW1wbC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlZCB7QGxpbmsgVmFsaWRhdGlvblByb3ZpZGVyfQotICAgICAqLwotICAgIC8vY291bGRuJ3QgdGhpcyBiZSBwYXJhbWV0ZXJpemVkIDxBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uPiBvciA8PyBzdXBlciBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uPj8KLSAgICBwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvblByb3ZpZGVyPD8+IHByb3ZpZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlZCB7QGxpbmsgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXJ9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25Qcm92aWRlclJlc29sdmVyIHByb3ZpZGVyUmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVkIHtAbGluayBWYWxpZGF0aW9uUHJvdmlkZXJ9IGNsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBWYWxpZGF0aW9uUHJvdmlkZXI8Pz4+IHByb3ZpZGVyQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVkIHtAbGluayBNZXNzYWdlSW50ZXJwb2xhdG9yfQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVkIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeX0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIFRyYXZlcnNhYmxlUmVzb2x2ZXIgdHJhdmVyc2FibGVSZXNvbHZlcjsKLQotICAgIC8vIEJFR0lOIERFRkFVTFRTCi0gICAgLyoqCi0gICAgICogZmFsc2UgPSBkaXJ0eSBmbGFnICh0byBwcmV2ZW50IGZyb20gbXVsdGlwbGUgcGFyc2luZyB2YWxpZGF0aW9uLnhtbCkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJlcGFyZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGZpbmFsIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZGVmYXVsdFRyYXZlcnNhYmxlUmVzb2x2ZXIgPQotICAgICAgICAgIG5ldyBEZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlcigpOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCB7QGxpbmsgTWVzc2FnZUludGVycG9sYXRvcn0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWVzc2FnZUludGVycG9sYXRvciBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciA9Ci0gICAgICAgICAgbmV3IERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGRlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSA9Ci0gICAgICAgICAgbmV3IERlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpOwotICAgIC8vIEVORCBERUZBVUxUUwotCi0gICAgcHJpdmF0ZSBTZXQ8SW5wdXRTdHJlYW0+IG1hcHBpbmdTdHJlYW1zID0gbmV3IEhhc2hTZXQ8SW5wdXRTdHJlYW0+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlWG1sQ29uZmlndXJhdGlvbiA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbmZpZ3VyYXRpb25JbXBsIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBhU3RhdGUKLSAgICAgKiBAcGFyYW0gYVByb3ZpZGVyCi0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25JbXBsKEJvb3RzdHJhcFN0YXRlIGFTdGF0ZSwgVmFsaWRhdGlvblByb3ZpZGVyPD8+IGFQcm92aWRlcikgewotICAgICAgICBpZiAoYVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyUmVzb2x2ZXIgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKGFTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhU3RhdGUuZ2V0VmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXJSZXNvbHZlciA9IGFTdGF0ZS5nZXREZWZhdWx0VmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXJSZXNvbHZlciA9IGFTdGF0ZS5nZXRWYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oImVpdGhlciBwcm92aWRlciBvciBzdGF0ZSBhcmUgcmVxdWlyZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbiB0cmF2ZXJzYWJsZVJlc29sdmVyKFRyYXZlcnNhYmxlUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgdHJhdmVyc2FibGVSZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICB0aGlzLnByZXBhcmVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBJZ25vcmUgZGF0YSBmcm9tIHRoZSA8aT5NRVRBLUlORi92YWxpZGF0aW9uLnhtbDwvaT4gZmlsZSBpZiB0aGlzCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uIGlnbm9yZVhtbENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIGlnbm9yZVhtbENvbmZpZ3VyYXRpb24gPSB0cnVlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25JbXBsIG1lc3NhZ2VJbnRlcnBvbGF0b3IoTWVzc2FnZUludGVycG9sYXRvciByZXNvbHZlcikgewotICAgICAgICB0aGlzLm1lc3NhZ2VJbnRlcnBvbGF0b3IgPSByZXNvbHZlcjsKLSAgICAgICAgdGhpcy5wcmVwYXJlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25JbXBsIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KAotICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGNvbnN0cmFpbnRGYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgPSBjb25zdHJhaW50RmFjdG9yeTsKLSAgICAgICAgdGhpcy5wcmVwYXJlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQWRkIGEgc3RyZWFtIGRlc2NyaWJpbmcgY29uc3RyYWludCBtYXBwaW5nIGluIHRoZSBCZWFuIFZhbGlkYXRpb24KLSAgICAgKiBYTUwgZm9ybWF0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gYWRkTWFwcGluZyhJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAgICAgbWFwcGluZ1N0cmVhbXMuYWRkKHN0cmVhbSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBBZGQgYSBwcm92aWRlciBzcGVjaWZpYyBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBpcyBlcXVpdmFsZW50IHRvCi0gICAgICogWE1MIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAgICAgKiBJZiB3ZSBkbyBub3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBwcm9wZXJ0eSwgd2Ugc2lsZW50bHkgaWdub3JlIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gYWRkUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBSZXR1cm4gYSBtYXAgb2Ygbm9uIHR5cGUtc2FmZSBjdXN0b20gcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ29uZmlndXJhdGlvbi5pZ25vcmVYTUxDb25maWd1cmF0aW9uKCkgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqIEluIHRoaXMgY2FzZSwgd2UgaWdub3JlIE1FVEEtSU5GL3ZhbGlkYXRpb24ueG1sCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVhtbENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBpZ25vcmVYbWxDb25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PElucHV0U3RyZWFtPiBnZXRNYXBwaW5nU3RyZWFtcygpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdTdHJlYW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUludGVycG9sYXRvciBnZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUludGVycG9sYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0RGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0RGVmYXVsdFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldERlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogbWFpbiBmYWN0b3J5IG1ldGhvZCB0byBidWlsZCBhIFZhbGlkYXRvckZhY3RvcnkKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVmFsaWRhdG9yRmFjdG9yeSBjYW5ub3QgYmUgYnVpbHQKLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdG9yRmFjdG9yeSBidWlsZFZhbGlkYXRvckZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBydW4oU2VjdXJlQWN0aW9ucy5kb1ByaXZCdWlsZFZhbGlkYXRvckZhY3RvcnkodGhpcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IGRvUHJpdkJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgcHJlcGFyZSgpOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSh0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaW5kUHJvdmlkZXIoKS5idWlsZFZhbGlkYXRvckZhY3RvcnkodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgaWYgKHByZXBhcmVkKSByZXR1cm47Ci0gICAgICAgIHBhcnNlVmFsaWRhdGlvblhtbCgpOwotICAgICAgICBhcHBseURlZmF1bHRzKCk7Ci0gICAgICAgIHByZXBhcmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgd2hldGhlciBhIHZhbGlkYXRpb24ueG1sIGZpbGUgZXhpc3RzIGFuZCBwYXJzZXMgaXQgd2l0aCBKQVhCICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlVmFsaWRhdGlvblhtbCgpIHsKLSAgICAgICAgaWYgKGlzSWdub3JlWG1sQ29uZmlndXJhdGlvbigpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiaWdub3JlWG1sQ29uZmlndXJhdGlvbiA9PSB0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXcgVmFsaWRhdGlvblBhcnNlcihnZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnRpZXMuVkFMSURBVElPTl9YTUxfUEFUSCkpCi0gICAgICAgICAgICAgICAgICAucHJvY2Vzc1ZhbGlkYXRpb25Db25maWcodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlEZWZhdWx0cygpIHsKLSAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHVzZSB0aGUgZGVmYXVsdHMgaW4gY2FzZSB0aGV5IGhhdmVuJ3QgYmVlbiBwcm92aWRlZCB5ZXQKLSAgICAgICAgaWYgKHRyYXZlcnNhYmxlUmVzb2x2ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJhdmVyc2FibGVSZXNvbHZlciA9IGdldERlZmF1bHRUcmF2ZXJzYWJsZVJlc29sdmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lc3NhZ2VJbnRlcnBvbGF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUludGVycG9sYXRvciA9IGdldERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ID0gZ2V0RGVmYXVsdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQHJldHVybiB0aGUgY29uc3RyYWludCB2YWxpZGF0b3IgZmFjdG9yeSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gY29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzYWJsZVJlc29sdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uZmlndXJlZCB7QGxpbmsgVmFsaWRhdGlvblByb3ZpZGVyfS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBWYWxpZGF0aW9uUHJvdmlkZXJ9Ci0gICAgICovCi0gICAgcHVibGljIFZhbGlkYXRpb25Qcm92aWRlcjw/PiBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgVmFsaWRhdGlvblByb3ZpZGVyPD8+IGZpbmRQcm92aWRlcigpIHsKLSAgICAgICAgaWYgKHByb3ZpZGVyQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChWYWxpZGF0aW9uUHJvdmlkZXI8Pz4gcHJvdmlkZXIgOiBwcm92aWRlclJlc29sdmVyCi0gICAgICAgICAgICAgICAgICAuZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwcm92aWRlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgc3VpdGFibGUgcHJvdmlkZXI6ICIgKyBwcm92aWRlckNsYXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8VmFsaWRhdGlvblByb3ZpZGVyPD8+PiBwcm92aWRlcnMgPSBwcm92aWRlclJlc29sdmVyLmdldFZhbGlkYXRpb25Qcm92aWRlcnMoKTsKLSAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHtAbGluayBWYWxpZGF0aW9uUHJvdmlkZXJ9IGNsYXNzLgotICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXJDbGFzcyhDbGFzczw/IGV4dGVuZHMgVmFsaWRhdGlvblByb3ZpZGVyPD8+PiBwcm92aWRlckNsYXNzKSB7Ci0gICAgICAgIHRoaXMucHJvdmlkZXJDbGFzcyA9IHByb3ZpZGVyQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcnVuKFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzJlNjRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlNlY3VyZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnJlZmxlY3QuVHlwZVV0aWxzOwotCi0vKioKLSAqIERlZmluZXMgdGhlIHdlbGwta25vd24gYXR0cmlidXRlcyBvZiB7QGxpbmsgQ29uc3RyYWludH0gYW5ub3RhdGlvbnMuCi0gKiAKLSAqIEB2ZXJzaW9uICRSZXY6IDExNjU5MjMgJCAkRGF0ZTogMjAxMS0wOS0wNiAxODowNzo1MyAtMDUwMCAoVHVlLCAwNiBTZXAgMjAxMSkgJAotICovCi1wdWJsaWMgZW51bSBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMgewotICAgIC8qKgotICAgICAqICJtZXNzYWdlIgotICAgICAqLwotICAgIE1FU1NBR0UsCi0KLSAgICAvKioKLSAgICAgKiAiZ3JvdXBzIgotICAgICAqLwotICAgIEdST1VQUywKLQotICAgIC8qKgotICAgICAqICJwYXlsb2FkIgotICAgICAqLwotICAgIFBBWUxPQUQsCi0KLSAgICAvKioKLSAgICAgKiAidmFsdWUiIGZvciBtdWx0aS12YWx1ZWQgY29uc3RyYWludHMKLSAgICAgKi8KLSAgICBWQUxVRSh0cnVlKTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgIENsYXNzPD8+W10gZ3JvdXBzOwotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkOwotICAgICAgICBBbm5vdGF0aW9uW10gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBlcm1pdE51bGxEZWZhdWx0VmFsdWU7Ci0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcygpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMoYm9vbGVhbiBwZXJtaXROdWxsRGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGVybWl0TnVsbERlZmF1bHRWYWx1ZSA9IHBlcm1pdE51bGxEZWZhdWx0VmFsdWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKGdldEF0dHJpYnV0ZU5hbWUoKSkuZ2V0R2VuZXJpY1R5cGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZXByZXNlbnRlZCBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBDbGFzczw/PgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXR0cmlidXRlIG5hbWUgcmVwcmVzZW50ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXQgPGNvZGU+dmFsdWU8L2NvZGU+IGludG8gYSBtYXAgd2l0aCA8Y29kZT50aGlzLmF0dHJpYnV0ZU5hbWU8L2NvZGU+IGFzCi0gICAgICoga2V5LgotICAgICAqIAotICAgICAqIEBwYXJhbSA8Vj4KLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiBwcmV2aW91cyB2YWx1ZSBtYXBwZWQgdG8gPGNvZGU+dGhpcy5hdHRyaWJ1dGVOYW1lPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyA8Vj4gT2JqZWN0IHB1dChNYXA8PyBzdXBlciBTdHJpbmcsID8gc3VwZXIgVj4gbWFwLCBWIHZhbHVlKSB7Ci0gICAgICAgIGlmICghVHlwZVV0aWxzLmlzSW5zdGFuY2UodmFsdWUsIGdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCAnJXMnIHZhbHVlOiAlcyIsIGdldEF0dHJpYnV0ZU5hbWUoKSwgdmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLnB1dChnZXRBdHRyaWJ1dGVOYW1lKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIDxjb2RlPnRoaXMuYXR0cmlidXRlTmFtZTwvY29kZT4gZnJvbSA8Y29kZT5tYXA8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSA8Vj4KLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICogQHJldHVybiBWIGlmIHlvdSBzYXkgc28KLSAgICAgKi8KLSAgICBwdWJsaWMgPFY+IFYgZ2V0KE1hcDw/IHN1cGVyIFN0cmluZywgPyBzdXBlciBWPiBtYXApIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFYgcmVzdWx0ID0gKFYpIG1hcC5nZXQoZ2V0QXR0cmlidXRlTmFtZSgpKTsKLSAgICAgICAgaWYgKCFUeXBlVXRpbHMuaXNJbnN0YW5jZShyZXN1bHQsIGdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCAnJXMnIHZhbHVlOiAlcyIsIGdldEF0dHJpYnV0ZU5hbWUoKSwgcmVzdWx0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCB0aGlzIGF0dHJpYnV0ZSBpcyB2YWxpZGx5IGRlZmluZWQgb24gdGhlIGdpdmVuIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiBAdGhyb3dzIENvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gdm9pZCB2YWxpZGF0ZU9uKENsYXNzPEE+IHR5cGUpIHsKLSAgICAgICAgbmV3IFdvcmtlcjxBPih0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCZW5pZ24gbWVhbnMgb2YgY2hlY2tpbmcgZm9yIGFuIGF0dHJpYnV0ZSdzIGV4aXN0ZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIHdhcyAocHJvcGVybHkpIGRlY2xhcmVkCi0gICAgICovCi0gICAgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gYm9vbGVhbiBpc0RlY2xhcmVkT24oQ2xhc3M8QT4gdHlwZSkgewotICAgICAgICByZXR1cm4gbmV3IFdvcmtlcjxBPih0eXBlLCB0cnVlKS52YWxpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmllZCBjb25zdHJhaW50IGFubm90YXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnQKLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZShBbm5vdGF0aW9uIGNvbnN0cmFpbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgICAgIFQgcmVzdWx0ID0gKFQpIG5ldyBXb3JrZXIoY29uc3RyYWludC5hbm5vdGF0aW9uVHlwZSgpKS5yZWFkKGNvbnN0cmFpbnQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBnZXQgdmFsdWUgb2YgJTEkcygpIGZyb20gJTIkcyIsIGdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZS4KLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyA8VCwgQSBleHRlbmRzIEFubm90YXRpb24+IFQgZ2V0RGVmYXVsdFZhbHVlKENsYXNzPEE+IHR5cGUpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFQgcmVzdWx0ID0gKFQpIG5ldyBXb3JrZXI8QT4odHlwZSkuZGVmYXVsdFZhbHVlOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbikgewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgV29ya2VyPEM+IHsKLSAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZDsKLSAgICAgICAgZmluYWwgT2JqZWN0IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB2YWxpZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IFdvcmtlciBpbnN0YW5jZS4KLSAgICAgICAgICogQHBhcmFtIGNvbnN0cmFpbnRUeXBlIHRvIGhhbmRsZQotICAgICAgICAgKi8KLSAgICAgICAgV29ya2VyKENsYXNzPEM+IGNvbnN0cmFpbnRUeXBlKSB7Ci0gICAgICAgICAgICB0aGlzKGNvbnN0cmFpbnRUeXBlLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IFdvcmtlciBpbnN0YW5jZS4KLSAgICAgICAgICogQHBhcmFtIGNvbnN0cmFpbnRUeXBlIHRvIGhhbmRsZQotICAgICAgICAgKiBAcGFyYW0gcXVpZXQgd2hldGhlciB0byBzaW1wbHkgc2V0ICF2YWxpZCByYXRoZXIgdGhhbiB0aHJvdyBhbiBFeGNlcHRpb24gb24gZXJyb3IKLSAgICAgICAgICovCi0gICAgICAgIFdvcmtlcihDbGFzczxDPiBjb25zdHJhaW50VHlwZSwgYm9vbGVhbiBxdWlldCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gX3ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIE9iamVjdCBfZGVmYXVsdFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gZG9Qcml2aWxlZ2VkKFNlY3VyZUFjdGlvbnMuZ2V0UHVibGljTWV0aG9kKGNvbnN0cmFpbnRUeXBlLCBnZXRBdHRyaWJ1dGVOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHF1aWV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQW5ub3RhdGlvbiAlMSRzIGhhcyBubyAlMiRzKCkgbWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRUeXBlLCBnZXRBdHRyaWJ1dGVOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIVR5cGVVdGlscy5pc0Fzc2lnbmFibGUobWV0aG9kLmdldFJldHVyblR5cGUoKSwgZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocXVpZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF92YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlJldHVybiB0eXBlIGZvciAlMSRzKCkgbXVzdCBiZSBvZiB0eXBlICUyJHMiLCBnZXRBdHRyaWJ1dGVOYW1lKCksIGdldFR5cGUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChfZGVmYXVsdFZhbHVlID09IG51bGwgJiYgcGVybWl0TnVsbERlZmF1bHRWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUeXBlVXRpbHMuaXNBcnJheVR5cGUoZ2V0VHlwZSgpKSAmJiBBcnJheS5nZXRMZW5ndGgoX2RlZmF1bHRWYWx1ZSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWlldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdCB2YWx1ZSBmb3IgJTEkcygpIG11c3QgYmUgYW4gZW1wdHkgYXJyYXkiLCBnZXRBdHRyaWJ1dGVOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHZhbGlkID0gX3ZhbGlkOwotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IF9kZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICA8VD4gVCByZWFkKGZpbmFsIEMgY29uc3RyYWludCkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBUIHJlc3VsdCA9IChUKSBkb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248T2JqZWN0PigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoY29uc3RyYWludCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50Q2FjaGVkLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludENhY2hlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ0ZDNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50Q2FjaGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGhvbGQgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9uLT52YWxpZGF0ZWRCeVtdIENvbnN0cmFpbnRWYWxpZGF0b3IgY2xhc3NlcwotICogdGhhdCBhcmUgYWxyZWFkeSBwYXJzZWQgaW4gYSBjYWNoZS48YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludENhY2hlZCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj5bXT4gY2xhc3NlcyA9Ci0gICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LD8+PltdPigpOwotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBzZXQgb2YgdmFsaWRhdG9yIGNsYXNzZXMgZm9yIGEgZ2l2ZW4gY29uc3RyYWludCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbkNsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiB2b2lkIHB1dENvbnN0cmFpbnRWYWxpZGF0b3IoQ2xhc3M8QT4gYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj5bXSBkZWZpbml0aW9uQ2xhc3NlcykgewotICAgICAgICBjbGFzc2VzLnB1dChhbm5vdGF0aW9uQ2xhc3MsIGRlZmluaXRpb25DbGFzc2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIHdlIGhhdmUgY2FjaGVkIHRoZSB2YWxpZGF0b3IgY2xhc3NlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb25zdHJhaW50IGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0byBsb29rIHVwCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNDb25zdHJhaW50VmFsaWRhdG9yKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzZXMuY29udGFpbnNLZXkoYW5ub3RhdGlvbkNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNhY2hlZCB2YWxpZGF0b3IgY2xhc3NlcyBmb3IgdGhlIHJlcXVlc3RlZCBjb25zdHJhaW50IGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyB0byBsb29rIHVwCi0gICAgICogQHJldHVybiBhcnJheSBvZiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvcn0gaW1wbGVtZW50YXRpb24gdHlwZXMKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj5bXSBnZXRDb25zdHJhaW50VmFsaWRhdG9ycygKLSAgICAgICAgICBDbGFzczxBPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj5bXSkgY2xhc3Nlcy5nZXQoYW5ub3RhdGlvbkNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RGVmYXVsdHMuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViMDFmNS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGVmYXVsdCBjb25zdHJhaW50cy92YWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBidWlsdCBpbnRvIHRoZSBmcmFtZXdvcmsuCi0gKiBUaGVzZSBhcmUgY29uZmlndXJlZCBpbiBEZWZhdWx0Q29uc3RyYWludHMucHJvcGVydGllcy48YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludERlZmF1bHRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihDb25zdHJhaW50RGVmYXVsdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05TVFJBSU5UUyA9Ci0gICAgICAgICAgIm9yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRGVmYXVsdENvbnN0cmFpbnRzLnByb3BlcnRpZXMiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cmFpbnQgZGF0YSBzdG9yZWQgaGVyZWluLgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj5bXT4gZGVmYXVsdENvbnN0cmFpbnRzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbnN0cmFpbnREZWZhdWx0cyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludERlZmF1bHRzKCkgewotICAgICAgICBkZWZhdWx0Q29uc3RyYWludHMgPSBsb2FkRGVmYXVsdENvbnN0cmFpbnRzKERFRkFVTFRfQ09OU1RSQUlOVFMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCBjb25zdHJhaW50IGRhdGEuCi0gICAgICogQHJldHVybiBTdHJpbmcta2V5ZWQgbWFwCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+PltdPiBnZXREZWZhdWx0Q29uc3RyYWludHMoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiB0eXBlcyBmb3IgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50IGFubm90YXRpb24gdHlwZS4gCi0gICAgICogQHBhcmFtIGFubm90YXRpb25UeXBlCi0gICAgICogQHJldHVybiBhcnJheSBvZiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvcn0gaW1wbGVtZW50YXRpb24gY2xhc3NlcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8QSBleHRlbmRzIEFubm90YXRpb24+IENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPEEsID8+PltdIGdldFZhbGlkYXRvckNsYXNzZXMoCi0gICAgICAgICAgQ2xhc3M8QT4gYW5ub3RhdGlvblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxBLCA/Pj5bXSkgZ2V0RGVmYXVsdENvbnN0cmFpbnRzKCkuZ2V0KGFubm90YXRpb25UeXBlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj5bXT4gbG9hZERlZmF1bHRDb25zdHJhaW50cyhTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgUHJvcGVydGllcyBjb25zdHJhaW50UHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY2xhc3Nsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50UHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsIFN0cmluZy5mb3JtYXQoIkNhbm5vdCBsb2FkICVzIiwgcmVzb3VyY2UpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuV0FSTklORywgU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGZpbmQgJXMiLCByZXNvdXJjZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+W10+IGxvYWRlZENvbnN0cmFpbnRzCi0gICAgICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8sPz4+W10+KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IGNvbnN0cmFpbnRQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLQotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSwgIiwgIik7Ci0gICAgICAgICAgICBMaW5rZWRMaXN0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IExpbmtlZExpc3Q8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlYWNoQ2xhc3NOYW1lID0gdG9rZW5zLm5leHRUb2tlbigpOwotCi0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY29uc3RyYWludFZhbGlkYXRvckNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICBydW4obmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3M8Pz4+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShlYWNoQ2xhc3NOYW1lLCB0cnVlLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLlNFVkVSRSwgU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGZpbmQgY2xhc3MgJXMiLCBlYWNoQ2xhc3NOYW1lKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3MgIT0gbnVsbCkgY2xhc3Nlcy5hZGQoY29uc3RyYWludFZhbGlkYXRvckNsYXNzKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9hZGVkQ29uc3RyYWludHMKLSAgICAgICAgICAgICAgICAgIC5wdXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+W10pIGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9hZGVkQ29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY2xhc3Nsb2FkZXIgPT0gbnVsbCkgY2xhc3Nsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHJldHVybiBjbGFzc2xvYWRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBydW4oUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludERlc2NyaXB0b3JJbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDRiODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGltbXV0YWJsZSwgc2VyaWFsaXphYmxlIGltcGxlbWVudGF0aW9uIG9mIENvbnN0cmFpbnREZXNjcmlwdG9yCi0gKiBpbnRlcmZhY2Ugb2YgSlNSMzAzPGJyPgotICogVXNlcjogcm9tYW4uc3R1bW08YnI+Ci0gKiBEYXRlOiAyMi4wNC4yMDEwPGJyPgotICogVGltZTogMTA6MjE6MjM8YnI+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50RGVzY3JpcHRvckltcGw8VCBleHRlbmRzIEFubm90YXRpb24+IGltcGxlbWVudHMgQ29uc3RyYWludERlc2NyaXB0b3I8VD4sIFNlcmlhbGl6YWJsZSB7Ci0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUIGFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGdyb3VwczsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkPj4gcGF5bG9hZDsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I8VCwgPz4+PiBjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlczsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29tcG9zaW5nQ29uc3RyYWludHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcG9ydEFzU2luZ2xlVmlvbGF0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbnN0cmFpbnREZXNjcmlwdG9ySW1wbCBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50RGVzY3JpcHRvckltcGwoQ29uc3RyYWludERlc2NyaXB0b3I8VD4gZGVzY3JpcHRvcikgewotICAgICAgICB0aGlzKGRlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLCBkZXNjcmlwdG9yLmdldEdyb3VwcygpLCBkZXNjcmlwdG9yLmdldFBheWxvYWQoKSwgZGVzY3JpcHRvcgotICAgICAgICAgICAgLmdldENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKCksIGRlc2NyaXB0b3IuZ2V0QXR0cmlidXRlcygpLCBkZXNjcmlwdG9yLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCksCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmlzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbnN0cmFpbnREZXNjcmlwdG9ySW1wbCBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbgotICAgICAqIEBwYXJhbSBncm91cHMKLSAgICAgKiBAcGFyYW0gcGF5bG9hZAotICAgICAqIEBwYXJhbSBjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlcwotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIGNvbXBvc2luZ0NvbnN0cmFpbnRzCi0gICAgICogQHBhcmFtIHJlcG9ydEFzU2luZ2xlVmlvbGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9ySW1wbChUIGFubm90YXRpb24sIFNldDxDbGFzczw/Pj4gZ3JvdXBzLAotICAgICAgICBTZXQ8Q2xhc3M8PyBleHRlbmRzIGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZD4+IHBheWxvYWQsCi0gICAgICAgIExpc3Q8amF2YS5sYW5nLkNsYXNzPD8gZXh0ZW5kcyBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I8VCwgPz4+PiBjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlcywKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhdHRyaWJ1dGVzLCBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbXBvc2luZ0NvbnN0cmFpbnRzLAotICAgICAgICBib29sZWFuIHJlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKSB7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOwotICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOwotICAgICAgICB0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzID0gY29uc3RyYWludFZhbGlkYXRvckNsYXNzZXM7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgICAgIHRoaXMuY29tcG9zaW5nQ29uc3RyYWludHMgPSBjb21wb3NpbmdDb25zdHJhaW50czsKLSAgICAgICAgdGhpcy5yZXBvcnRBc1NpbmdsZVZpb2xhdGlvbiA9IHJlcG9ydEFzU2luZ2xlVmlvbGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVCBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0R3JvdXBzKCkgewotICAgICAgICByZXR1cm4gZ3JvdXBzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPj4gZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgcmV0dXJuIHBheWxvYWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PGphdmEubGFuZy5DbGFzczw/IGV4dGVuZHMgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yPFQsID8+Pj4gZ2V0Q29uc3RyYWludFZhbGlkYXRvckNsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gY29tcG9zaW5nQ29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiByZXBvcnRBc1NpbmdsZVZpb2xhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludEZpbmRlckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RmluZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhjZDFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RmluZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuR3JvdXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLkdyb3Vwc0NvbXB1dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yLkNvbnN0cmFpbnRGaW5kZXI7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5TY29wZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gb2YgdGhlIGZsdWVudCB7QGxpbmsgQ29uc3RyYWludEZpbmRlcn0gaW50ZXJmYWNlLjxici8+Ci0gKi8KLWZpbmFsIGNsYXNzIENvbnN0cmFpbnRGaW5kZXJJbXBsIGltcGxlbWVudHMgRWxlbWVudERlc2NyaXB0b3IuQ29uc3RyYWludEZpbmRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRhQmVhbiBtZXRhQmVhbjsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxTY29wZT4gZmluZEluU2NvcGVzOwotICAgIHByaXZhdGUgU2V0PENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+PiBjb25zdHJhaW50RGVzY3JpcHRvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ29uc3RyYWludEZpbmRlckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnREZXNjcmlwdG9ycwotICAgICAqLwotICAgIENvbnN0cmFpbnRGaW5kZXJJbXBsKE1ldGFCZWFuIG1ldGFCZWFuLCBTZXQ8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IGNvbnN0cmFpbnREZXNjcmlwdG9ycykgewotICAgICAgICB0aGlzLm1ldGFCZWFuID0gbWV0YUJlYW47Ci0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3JzID0gY29uc3RyYWludERlc2NyaXB0b3JzOwotICAgICAgICB0aGlzLmZpbmRJblNjb3BlcyA9IG5ldyBIYXNoU2V0PFNjb3BlPihBcnJheXMuYXNMaXN0KFNjb3BlLnZhbHVlcygpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvci5Db25zdHJhaW50RmluZGVyIHVub3JkZXJlZEFuZE1hdGNoaW5nR3JvdXBzKENsYXNzPD8+Li4uIGdyb3VwcykgewotICAgICAgICBTZXQ8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IG1hdGNoaW5nRGVzY3JpcHRvcnMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+KGNvbnN0cmFpbnREZXNjcmlwdG9ycy5zaXplKCkpOwotICAgICAgICBHcm91cHMgZ3JvdXBDaGFpbiA9IG5ldyBHcm91cHNDb21wdXRlcigpLmNvbXB1dGVHcm91cHMoZ3JvdXBzKTsKLSAgICAgICAgZm9yIChHcm91cCBncm91cCA6IGdyb3VwQ2hhaW4uZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgICAgIGlmIChncm91cC5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIGdyb3VwIGlzIGRlZmF1bHQsIGNoZWNrIGlmIGl0IGdldHMgcmVkZWZpbmVkCi0gICAgICAgICAgICAgICAgTGlzdDxHcm91cD4gZXhwYW5kZWREZWZhdWx0R3JvdXAgPSBtZXRhQmVhbi5nZXRGZWF0dXJlKEpzcjMwM0ZlYXR1cmVzLkJlYW4uR1JPVVBfU0VRVUVOQ0UpOwotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgZGVmYXVsdEdyb3VwTWVtYmVyIDogZXhwYW5kZWREZWZhdWx0R3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBkZXNjcmlwdG9yIDogY29uc3RyYWludERlc2NyaXB0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKGRlc2NyaXB0b3IpICYmIGlzSW5Hcm91cChkZXNjcmlwdG9yLCBkZWZhdWx0R3JvdXBNZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFZhbGlkYXRpb248Pz4gZGVzY3JpcHRvciA6IGNvbnN0cmFpbnREZXNjcmlwdG9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKGRlc2NyaXB0b3IpICYmIGlzSW5Hcm91cChkZXNjcmlwdG9yLCBncm91cCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nRGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzV2l0aChtYXRjaGluZ0Rlc2NyaXB0b3JzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnREZXNjcmlwdG9yLkNvbnN0cmFpbnRGaW5kZXIgbG9va2luZ0F0KFNjb3BlIHNjb3BlKSB7Ci0gICAgICAgIGlmIChzY29wZS5lcXVhbHMoU2NvcGUuTE9DQUxfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgIGZpbmRJblNjb3Blcy5yZW1vdmUoU2NvcGUuSElFUkFSQ0hZKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IGl0ID0gY29uc3RyYWludERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjdiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3YuZ2V0T3duZXIoKSAhPSBtZXRhQmVhbi5nZXRCZWFuQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvci5Db25zdHJhaW50RmluZGVyIGRlY2xhcmVkT24oRWxlbWVudFR5cGUuLi4gZWxlbWVudFR5cGVzKSB7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4gbWF0Y2hpbmdEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICBuZXcgSGFzaFNldDxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4oY29uc3RyYWludERlc2NyaXB0b3JzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoRWxlbWVudFR5cGUgZWFjaCA6IGVsZW1lbnRUeXBlcykgewotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBkZXNjcmlwdG9yIDogY29uc3RyYWludERlc2NyaXB0b3JzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSW5TY29wZShkZXNjcmlwdG9yKSAmJiBpc0F0RWxlbWVudChkZXNjcmlwdG9yLCBlYWNoKSkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXNXaXRoKG1hdGNoaW5nRGVzY3JpcHRvcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0F0RWxlbWVudChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBkZXNjcmlwdG9yLCBFbGVtZW50VHlwZSBlYWNoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEFjY2VzcygpLmdldEVsZW1lbnRUeXBlKCkgPT0gZWFjaDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJblNjb3BlKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKGZpbmRJblNjb3Blcy5zaXplKCkgPT0gU2NvcGUudmFsdWVzKCkubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFsbCBzY29wZXMKLSAgICAgICAgaWYgKG1ldGFCZWFuICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzPD8+IG93bmVyID0gZGVzY3JpcHRvci5nZXRPd25lcigpOwotICAgICAgICAgICAgZm9yIChTY29wZSBzY29wZSA6IGZpbmRJblNjb3BlcykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoc2NvcGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIExPQ0FMX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvd25lci5lcXVhbHMobWV0YUJlYW4uZ2V0QmVhbkNsYXNzKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSElFUkFSQ0hZOgotICAgICAgICAgICAgICAgICAgICBpZiAoIW93bmVyLmVxdWFscyhtZXRhQmVhbi5nZXRCZWFuQ2xhc3MoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbkdyb3VwKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGRlc2NyaXB0b3IsIEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEdyb3VwcygpLmNvbnRhaW5zKGdyb3VwLmdldEdyb3VwKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgRWxlbWVudERlc2NyaXB0b3IuQ29uc3RyYWludEZpbmRlciB0aGlzV2l0aChTZXQ8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IG1hdGNoaW5nRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgY29uc3RyYWludERlc2NyaXB0b3JzID0gbWF0Y2hpbmdEZXNjcmlwdG9yczsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9ycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy48Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGVtcHR5U2V0KCkgOiBDb2xsZWN0aW9ucwotICAgICAgICAgICAgLjxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gdW5tb2RpZmlhYmxlU2V0KGNvbnN0cmFpbnREZXNjcmlwdG9ycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gIWNvbnN0cmFpbnREZXNjcmlwdG9ycy5pc0VtcHR5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRWYWxpZGF0aW9uLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ZWM3MC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuUGF0aEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogQWRhcHRlciBiZXR3ZWVuIENvbnN0cmFpbnQgKEpTUjMwMykgYW5kIFZhbGlkYXRpb24gKENvcmUpPGJyLz4KLSAqIHRoaXMgaW5zdGFuY2UgaXMgaW1tdXRhYmxlITxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50VmFsaWRhdGlvbjxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gaW1wbGVtZW50cyBWYWxpZGF0aW9uLCBDb25zdHJhaW50RGVzY3JpcHRvcjxUPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yPFQsID8+IHZhbGlkYXRvcjsKLSAgICBwcml2YXRlIFQgYW5ub3RhdGlvbjsgLy8gZm9yIG1ldGFkYXRhIHJlcXVlc3QgQVBJCi0gICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcG9ydEZyb21Db21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXM7Ci0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4gY29tcG9zZWRDb25zdHJhaW50czsKLQotICAgIC8qKgotICAgICAqIHRoZSBvd25lciBpcyB0aGUgdHlwZSB3aGVyZSB0aGUgdmFsaWRhdGlvbiBjb21lcyBmcm9tLiBpdCBpcyB1c2VkIHRvCi0gICAgICogc3VwcG9ydCBpbXBsaWNpdCBncm91cGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IG93bmVyOwotICAgIHByaXZhdGUgU2V0PENsYXNzPD8+PiBncm91cHM7Ci0gICAgcHJpdmF0ZSBTZXQ8Q2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+PiBwYXlsb2FkOwotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8VCwgPz4+W10gdmFsaWRhdG9yQ2xhc3NlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb25zdHJhaW50VmFsaWRhdGlvbiBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NlcwotICAgICAqIEBwYXJhbSB2YWxpZGF0b3IKLSAgICAgKiAgICAgICAgICAgIC0gdGhlIGNvbnN0cmFpbnQgdmFsaWRhdG9yCi0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKiAgICAgICAgICAgIC0gdGhlIGFubm90YXRpb24gb2YgdGhlIGNvbnN0cmFpbnQKLSAgICAgKiBAcGFyYW0gb3duZXIKLSAgICAgKiAgICAgICAgICAgIC0gdGhlIHR5cGUgd2hlcmUgdGhlIGFubm90YXRlZCBlbGVtZW50IGlzIHBsYWNlZCAoY2xhc3MsCi0gICAgICogICAgICAgICAgICBpbnRlcmZhY2UsIGFubm90YXRpb24gdHlwZSkKLSAgICAgKiBAcGFyYW0gYWNjZXNzCi0gICAgICogICAgICAgICAgICAtIGhvdyB0byBhY2Nlc3MgdGhlIHZhbHVlCi0gICAgICogQHBhcmFtIHJlcG9ydEZyb21Db21wb3NpdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRpb24oQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8VCwgPz4+W10gdmFsaWRhdG9yQ2xhc3NlcywKLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcjxULCA/PiB2YWxpZGF0b3IsIFQgYW5ub3RhdGlvbiwgQ2xhc3M8Pz4gb3duZXIsIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcywKLSAgICAgICAgYm9vbGVhbiByZXBvcnRGcm9tQ29tcG9zaXRlKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB0aGlzLnZhbGlkYXRvckNsYXNzZXMgPSBBcnJheVV0aWxzLmNsb25lKHZhbGlkYXRvckNsYXNzZXMpOwotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzczsKLSAgICAgICAgdGhpcy5yZXBvcnRGcm9tQ29tcG9zaXRlID0gcmVwb3J0RnJvbUNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB7QGxpbmsgU2VyaWFsaXphYmxlfSB7QGxpbmsgQ29uc3RyYWludERlc2NyaXB0b3J9IGNhcHR1cmluZyBhCi0gICAgICogc25hcHNob3Qgb2YgY3VycmVudCBzdGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAbGluayBDb25zdHJhaW50RGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8VD4gYXNTZXJpYWxpemFibGVEZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbnN0cmFpbnREZXNjcmlwdG9ySW1wbDxUPih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFwcGxpY2FibGUgdmFsaWRhdGlvbiBncm91cHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGdyb3VwcwotICAgICAqLwotICAgIHZvaWQgc2V0R3JvdXBzKFNldDxDbGFzczw/Pj4gZ3JvdXBzKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOwotICAgICAgICBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuR1JPVVBTLnB1dChhdHRyaWJ1dGVzLCBncm91cHMudG9BcnJheShuZXcgQ2xhc3NbZ3JvdXBzLnNpemUoKV0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBheWxvYWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBheWxvYWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFBheWxvYWQoU2V0PENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPj4gcGF5bG9hZCkgewotICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOwotICAgICAgICBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuUEFZTE9BRC5wdXQoYXR0cmlidXRlcywgcGF5bG9hZC50b0FycmF5KG5ldyBDbGFzc1twYXlsb2FkLnNpemUoKV0pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9ydEZyb21Db21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgY29tcG9zaW5nIGNvbnN0cmFpbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFDb25zdHJhaW50VmFsaWRhdGlvbgotICAgICAqICAgICAgICAgICAgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcG9zZWQoQ29uc3RyYWludFZhbGlkYXRpb248Pz4gYUNvbnN0cmFpbnRWYWxpZGF0aW9uKSB7Ci0gICAgICAgIGlmIChjb21wb3NlZENvbnN0cmFpbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2VkQ29uc3RyYWludHMgPSBuZXcgSGFzaFNldDxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4oKTsKLSAgICAgICAgfQotICAgICAgICBjb21wb3NlZENvbnN0cmFpbnRzLmFkZChhQ29uc3RyYWludFZhbGlkYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPEwgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGUoVmFsaWRhdGlvbkNvbnRleHQ8TD4gY29udGV4dCkgewotICAgICAgICB2YWxpZGF0ZSgoR3JvdXBWYWxpZGF0aW9uQ29udGV4dDw/PikgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgYSB7QGxpbmsgR3JvdXBWYWxpZGF0aW9uQ29udGV4dH0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHJvb3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IGNvbnRleHQpIHsKLSAgICAgICAgY29udGV4dC5zZXRDb25zdHJhaW50VmFsaWRhdGlvbih0aGlzKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGV4ZWN1dGUgdW5sZXNzIHRoZSBnaXZlbiB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgKiBwcm9jZXNzZWQgZHVyaW5nIHRoaXMgdmFsaWRhdGlvbiByb3V0aW5lIChhcyBwYXJ0IG9mIGEgcHJldmlvdXMgZ3JvdXAKLSAgICAgICAgICogbWF0Y2gpCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIWlzTWVtYmVyT2YoY29udGV4dC5nZXRDdXJyZW50R3JvdXAoKS5nZXRHcm91cCgpKSkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBub3QgdmFsaWRhdGUgaW4gdGhlIGN1cnJlbnQgZ3JvdXAKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dC5nZXRDdXJyZW50T3duZXIoKSAhPSBudWxsICYmIHRoaXMub3duZXIgIT0gY29udGV4dC5nZXRDdXJyZW50T3duZXIoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCAmJiAhY29udGV4dC5jb2xsZWN0VmFsaWRhdGVkKHZhbGlkYXRvcikpCi0gICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgZG9uZQotCi0gICAgICAgIGlmIChjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpICE9IG51bGwgJiYgIWlzUmVhY2hhYmxlKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzIGNvbXBvc2VkIGNvbnN0cmFpbnRzCi0gICAgICAgIGlmIChpc1JlcG9ydEFzU2luZ2xlVmlvbGF0aW9uKCkpIHsKLSAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8Pz4gbGlzdGVuZXIgPSBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5iZWdpblJlcG9ydEFzU2luZ2xlKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gbGlzdGVuZXIuaGFzVmlvbGF0aW9ucygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzdG9wIHZhbGlkYXRpbmcgd2hlbiBhbHJlYWR5IGZhaWxlZCBhbmQKLSAgICAgICAgICAgICAgICAvLyBSZXBvcnRBc1NpbmdsZUludmFsaWRDb25zdHJhaW50ID0gdHJ1ZSA/Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4gY29tcG9zZWQgPSBnZXRDb21wb3NpbmdWYWxpZGF0aW9ucygpLml0ZXJhdG9yKCk7ICFmYWlsZWQgJiYgY29tcG9zZWQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBjb21wb3NlZC5uZXh0KCkudmFsaWRhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IGxpc3RlbmVyLmhhc1Zpb2xhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFJlcG9ydEFzU2luZ2xlKCk7Ci0gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjdXJyZW50IGNvbnN0cmFpbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uc3RyYWludFZhbGlkYXRpb24odGhpcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWlsZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIFJTdCAtIGhvdyBzaG91bGQgdGhlIGNvbXBvc2VkIGNvbnN0cmFpbnQgZXJyb3IgcmVwb3J0IGxvb2sgbGlrZT8KLSAgICAgICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwganNyQ29udGV4dCA9IG5ldyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwoY29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JzKGNvbnRleHQsIGpzckNvbnRleHQpOyAvLyBhZGQgZGVmYXVsdEVycm9yTWVzc2FnZSBvbmx5Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjb21wb3NlZCA6IGdldENvbXBvc2luZ1ZhbGlkYXRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wb3NlZC52YWxpZGF0ZShjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBjdXJyZW50IGNvbnN0cmFpbnQgdmFsaWRhdGlvbgotICAgICAgICAgICAgY29udGV4dC5zZXRDb25zdHJhaW50VmFsaWRhdGlvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIGpzckNvbnRleHQgPSBuZXcgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsKGNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yPFQsIE9iamVjdD4gb2JqZWN0VmFsaWRhdG9yID0gKENvbnN0cmFpbnRWYWxpZGF0b3I8VCwgT2JqZWN0PikgdmFsaWRhdG9yOwotICAgICAgICAgICAgaWYgKCFvYmplY3RWYWxpZGF0b3IuaXNWYWxpZChjb250ZXh0LmdldFZhbGlkYXRlZFZhbHVlKCksIGpzckNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXJyb3JzKGNvbnRleHQsIGpzckNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIChpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4pIHdpdGggdGhlIHN0b3JlZAotICAgICAqIGFubm90YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gdmFsaWRhdG9yKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRvci5pbml0aWFsaXplKGFubm90YXRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRWl0aGVyIGEgImxlZ2l0IiBwcm9ibGVtIGluaXRpYWxpemluZyB0aGUgdmFsaWRhdG9yIG9yIGEKLSAgICAgICAgICAgICAgICAvLyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbGlkYXRvciBhc3NvY2lhdGVkIGFubm90YXRpb24gaXMKLSAgICAgICAgICAgICAgICAvLyBub3QgYSBzdXBlcnR5cGUgb2YgdGhlIHZhbGlkYXRlZCBhbm5vdGF0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbigiSW5jb3JyZWN0IHZhbGlkYXRvciBbIgotICAgICAgICAgICAgICAgICAgICArIHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICJdIGZvciBhbm5vdGF0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgKyBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlYWNoYWJsZShHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IGNvbnRleHQpIHsKLSAgICAgICAgUGF0aEltcGwgcGF0aCA9IGNvbnRleHQuZ2V0UHJvcGVydHlQYXRoKCk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSBwYXRoLmdldExlYWZOb2RlKCk7Ci0gICAgICAgIFBhdGhJbXBsIGJlYW5QYXRoID0gcGF0aC5nZXRQYXRoV2l0aG91dExlYWZOb2RlKCk7Ci0gICAgICAgIGlmIChiZWFuUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiZWFuUGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKS5pc1JlYWNoYWJsZShjb250ZXh0LmdldEJlYW4oKSwgbm9kZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJvb3RNZXRhQmVhbigpLmdldEJlYW5DbGFzcygpLCBiZWFuUGF0aCwgYWNjZXNzLmdldEVsZW1lbnRUeXBlKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiRXJyb3IgaW4gVHJhdmVyc2FibGVSZXNvbHZlci5pc1JlYWNoYWJsZSgpIGZvciAiICsgY29udGV4dC5nZXRCZWFuKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVycm9ycyhHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IGNvbnRleHQsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0SW1wbCBqc3JDb250ZXh0KSB7Ci0gICAgICAgIGZvciAoVmFsaWRhdGlvbkxpc3RlbmVyLkVycm9yIGVhY2ggOiBqc3JDb250ZXh0LmdldEVycm9yTWVzc2FnZXMoKSkgewotICAgICAgICAgICAgY29udGV4dC5nZXRMaXN0ZW5lcigpLmFkZEVycm9yKGVhY2gsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ29uc3RyYWludFZhbGlkYXRpb257IiArIHZhbGlkYXRvciArICd9JzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgdXNlZCBieSB0aGlzIGNvbnN0cmFpbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5NRVNTQUdFLmdldChhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yfSBpbnZva2VkIGJ5IHRoaXMKLSAgICAgKiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259LgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvcjxULCA/PiBnZXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGlzIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0gYmVsb25ncyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogZ3JvdXAuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcUdyb3VwCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNZW1iZXJPZihDbGFzczw/PiByZXFHcm91cCkgewotICAgICAgICByZXR1cm4gZ3JvdXBzLmNvbnRhaW5zKHJlcUdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG93bmluZyBjbGFzcyBvZiB0aGlzIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0uCi0gICAgICogCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRPd25lcigpIHsKLSAgICAgICAgcmV0dXJuIG93bmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVCBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBBY2Nlc3NTdHJhdGVneX0gdXNlZCBieSB0aGlzIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0uCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgQWNjZXNzU3RyYXRlZ3l9Ci0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc1N0cmF0ZWd5IGdldEFjY2VzcygpIHsKLSAgICAgICAgcmV0dXJuIGFjY2VzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0aGUgQW5ub3RhdGlvbiBzZXQgYXQgY29uc3RydWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihUIGFubm90YXRpb24pIHsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvbnN0cmFpbnREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gY29tcG9zZWRDb25zdHJhaW50cyA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDogY29tcG9zZWRDb25zdHJhaW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbXBvc2luZyB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259IG9iamVjdHMuIFRoaXMgaXMKLSAgICAgKiBlZmZlY3RpdmVseSBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhbmFsb2d1ZSB0bwotICAgICAqIHtAbGluayAjZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKX0uCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgU2V0PENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+PiBnZXRDb21wb3NpbmdWYWxpZGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2VkQ29uc3RyYWludHMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IGNvbXBvc2VkQ29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFNldDxDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4+IGdldFBheWxvYWQoKSB7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjxULCA/Pj4+IGdldENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKCkgewotICAgICAgICBpZiAodmFsaWRhdG9yQ2xhc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QodmFsaWRhdG9yQ2xhc3Nlcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwOTcyYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuUGF0aEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IEpTUi0zMDMge0BsaW5rIFZhbGlkYXRpb25MaXN0ZW5lcn0gaW1wbGVtZW50YXRpb247IHByb3ZpZGVzIHtAbGluayBDb25zdHJhaW50VmlvbGF0aW9ufXMuPGJyLz4KLSAqIAotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPFQ+IGltcGxlbWVudHMgVmFsaWRhdGlvbkxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiBjb25zdHJhaW50VmlvbGF0aW9ucyA9IG5ldyBIYXNoU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUIHJvb3RCZWFuOwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gcm9vdEJlYW5UeXBlOwotICAgIC8vIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MgaXMgc2luZ2xlLXRocmVhZGVkIGFuZCBpdCdzIHVubGlrZWx5IHRvIGNoYW5nZSBpbiB0aGUgbmVhciBmdXR1cmUgKG90aGVyd2lzZSB1c2UgQXRvbWljSW50ZWdlcikuCi0gICAgcHJpdmF0ZSBpbnQgY29tcG9zaXRlRGVwdGggPSAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDb21wb3NpdGVFcnJvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBhUm9vdEJlYW4KLSAgICAgKiBAcGFyYW0gcm9vdEJlYW5UeXBlCi0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXIoVCBhUm9vdEJlYW4sIENsYXNzPFQ+IHJvb3RCZWFuVHlwZSkgewotICAgICAgICB0aGlzLnJvb3RCZWFuID0gYVJvb3RCZWFuOwotICAgICAgICB0aGlzLnJvb3RCZWFuVHlwZSA9IHJvb3RCZWFuVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIDxWTCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCBhZGRFcnJvcihTdHJpbmcgcmVhc29uLCBWYWxpZGF0aW9uQ29udGV4dDxWTD4gY29udGV4dCkgewotICAgICAgICBhZGRFcnJvcihyZWFzb24sIG51bGwsIGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFZMIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIGFkZEVycm9yKEVycm9yIGVycm9yLCBWYWxpZGF0aW9uQ29udGV4dDxWTD4gY29udGV4dCkgewotICAgICAgICBpZiAoZXJyb3IuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIFBhdGgpIHsKLSAgICAgICAgICAgIGFkZEVycm9yKGVycm9yLmdldFJlYXNvbigpLCAoUGF0aCkgZXJyb3IuZ2V0T3duZXIoKSwgY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRFcnJvcihlcnJvci5nZXRSZWFzb24oKSwgbnVsbCwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZSwgUGF0aCBwcm9wUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbnRleHQ8Pz4gY29udGV4dCkgewotICAgICAgICBpZiAoY29tcG9zaXRlRGVwdGggPiAwKSB7Ci0gICAgICAgICAgICBoYXNDb21wb3NpdGVFcnJvciB8PSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZTsKLQotICAgICAgICBmaW5hbCBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBkZXNjcmlwdG9yOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+KSB7Ci0gICAgICAgICAgICBHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IGdjb250ZXh0ID0gKEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8Pz4pIGNvbnRleHQ7Ci0gICAgICAgICAgICB2YWx1ZSA9IGdjb250ZXh0LmdldFZhbGlkYXRlZFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoZ2NvbnRleHQgaW5zdGFuY2VvZiBNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gZ2NvbnRleHQuZ2V0TWVzc2FnZVJlc29sdmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJwb2xhdGUobWVzc2FnZVRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQpIGdjb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgZ2NvbnRleHQuZ2V0TWVzc2FnZVJlc29sdmVyKCkuaW50ZXJwb2xhdGUobWVzc2FnZVRlbXBsYXRlLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBnY29udGV4dC5nZXRDb25zdHJhaW50VmFsaWRhdGlvbigpLmFzU2VyaWFsaXphYmxlRGVzY3JpcHRvcigpOwotICAgICAgICAgICAgaWYgKHByb3BQYXRoID09IG51bGwpIHByb3BQYXRoID0gZ2NvbnRleHQuZ2V0UHJvcGVydHlQYXRoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNZXRhUHJvcGVydHkoKSA9PSBudWxsKSB2YWx1ZSA9IGNvbnRleHQuZ2V0QmVhbigpOwotICAgICAgICAgICAgZWxzZSB2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpOwotICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VUZW1wbGF0ZTsKLSAgICAgICAgICAgIGlmIChwcm9wUGF0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHByb3BQYXRoID0gUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoY29udGV4dC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IChjb250ZXh0LmdldEFjY2VzcygpICE9IG51bGwpID8gY29udGV4dC5nZXRBY2Nlc3MoKS5nZXRFbGVtZW50VHlwZSgpIDogbnVsbDsKLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbkltcGw8VD4gaWMgPSBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkltcGw8VD4obWVzc2FnZVRlbXBsYXRlLAotICAgICAgICAgICAgICBtZXNzYWdlLCByb290QmVhbiwgY29udGV4dC5nZXRCZWFuKCksIHByb3BQYXRoLCB2YWx1ZSwgZGVzY3JpcHRvciwgcm9vdEJlYW5UeXBlLCBlbGVtZW50VHlwZSk7Ci0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zLmFkZChpYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgQ29uc3RyYWludFZpb2xhdGlvbn1zIGFjY3VtdWxhdGVkIGJ5IHRoaXMge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXJ9LgotICAgICAqIEByZXR1cm4ge0BsaW5rIFNldH0gb2Yge0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb259Ci0gICAgICovCi0gICAgcHVibGljIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiBnZXRDb25zdHJhaW50VmlvbGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWaW9sYXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgbm8gdmlvbGF0aW9ucyB3ZXJlIGZvdW5kLiAKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICByZXR1cm4gY29uc3RyYWludFZpb2xhdGlvbnMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcm9vdCBiZWFuLgotICAgICAqIEByZXR1cm4gVAotICAgICAqLwotICAgIHB1YmxpYyBUIGdldFJvb3RCZWFuKCkgewotICAgICAgICByZXR1cm4gcm9vdEJlYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByb290IGJlYW4gdHlwZSBvZiB0aGlzIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyfS4KLSAgICAgKiBAcmV0dXJuIENsYXNzPFQ+Ci0gICAgICovCi0gICAgcHVibGljIENsYXNzPFQ+IGdldFJvb3RCZWFuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJvb3RCZWFuVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb3VudCBvZiBlbmNvdW50ZXJlZCB2aW9sYXRpb25zLgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCB2aW9sYXRpb25zU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWaW9sYXRpb25zLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIHRoZXJlIGFyZSB2aW9sYXRpb25zIGF2YWlsYWJsZS4KLSAgICAgKiBJZiBpbiByZXBvcnQtYXMtc2luZ2xlLXZpb2xhdGlvbiBtb2RlLCB0aGUgcmVzdWx0IGlzIHNjb3BlZCBhY2NvcmRpbmdseS4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZWFucyB5b3UgbXVzdCBjaGVjayBiZWZvcmUgZXhpdGluZyByZXBvcnQtYXMtc2luZ2xlLXZpb2xhdGlvbiBtb2RlCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVmlvbGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZURlcHRoID09IDAgPyAhY29uc3RyYWludFZpb2xhdGlvbnMuaXNFbXB0eSgpIDogaGFzQ29tcG9zaXRlRXJyb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2lnbmlmeSB0aGUgYmVnaW5uaW5nIG9mIGEgcmVwb3J0LWFzLXNpbmdsZS12aW9sYXRpb24gY29tcG9zaXRlIHZhbGlkYXRpb24uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBhcyB0aGlzIGNhbGwgY2F1c2VkIHRoZSBsaXN0ZW5lciB0byBlbnRlciByZXBvcnQtYXMtc2luZ2xlLXZpb2xhdGlvbiBtb2RlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYmVnaW5SZXBvcnRBc1NpbmdsZSgpIHsKLSAgICAgICAgcmV0dXJuICsrY29tcG9zaXRlRGVwdGggPT0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaWduaWZ5IHRoZSBlbmQgb2YgYSByZXBvcnQtYXMtc2luZ2xlLXZpb2xhdGlvbiBjb21wb3NpdGUgdmFsaWRhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGFzIHRoaXMgY2FsbCBjYXVzZWQgdGhlIGxpc3RlbmVyIHRvIGV4aXQgcmVwb3J0LWFzLXNpbmdsZS12aW9sYXRpb24gbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVuZFJlcG9ydEFzU2luZ2xlKCkgewotICAgICAgICByZXR1cm4gLS1jb21wb3NpdGVEZXB0aCA9PSAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNzk0MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5Ob2RlQnVpbGRlckRlZmluZWRDb250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlBhdGhJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IFNob3J0LWxpdmVkIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dH0gaW1wbGVtZW50YXRpb24gcGFzc2VkIGJ5Ci0gKiBhIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0gdG8gaXRzIGFkYXB0ZWQge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3J9LiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxWYWxpZGF0aW9uTGlzdGVuZXIuRXJyb3I+IGVycm9yTWVzc2FnZXMgPQotICAgICAgICAgIG5ldyBMaW5rZWRMaXN0PFZhbGlkYXRpb25MaXN0ZW5lci5FcnJvcj4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29uc3RyYWludFZhbGlkYXRpb248Pz4gY29uc3RyYWludERlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IHZhbGlkYXRpb25Db250ZXh0OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHREaXNhYmxlZDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25Db250ZXh0Ci0gICAgICogQHBhcmFtIGFDb25zdHJhaW50VmFsaWRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwoR3JvdXBWYWxpZGF0aW9uQ29udGV4dDw/PiB2YWxpZGF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGFDb25zdHJhaW50VmFsaWRhdGlvbikgewotICAgICAgICB0aGlzLnZhbGlkYXRpb25Db250ZXh0ID0gdmFsaWRhdGlvbkNvbnRleHQ7Ci0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBhQ29uc3RyYWludFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2FibGVEZWZhdWx0Q29uc3RyYWludFZpb2xhdGlvbigpIHsKLSAgICAgICAgZGVmYXVsdERpc2FibGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29uc3RyYWludE1lc3NhZ2VUZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9yLmdldE1lc3NhZ2VUZW1wbGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZpb2xhdGlvbkJ1aWxkZXIgYnVpbGRDb25zdHJhaW50VmlvbGF0aW9uV2l0aFRlbXBsYXRlKAotICAgICAgICAgIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50VmlvbGF0aW9uQnVpbGRlckltcGwodGhpcywgbWVzc2FnZVRlbXBsYXRlLAotICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5nZXRQcm9wZXJ0eVBhdGgoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29uc3RyYWludFZpb2xhdGlvbkJ1aWxkZXJJbXBsCi0gICAgICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dC5Db25zdHJhaW50VmlvbGF0aW9uQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIHBhcmVudDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGhJbXBsIHByb3BlcnR5UGF0aDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IENvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVySW1wbCBpbnN0YW5jZS4KLSAgICAgICAgICogQHBhcmFtIGNvbnRleHRJbXBsCi0gICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQotICAgICAgICAgKiBAcGFyYW0gcGF0aAotICAgICAgICAgKi8KLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbkJ1aWxkZXJJbXBsKENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0SW1wbCBjb250ZXh0SW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSwgUGF0aEltcGwgcGF0aCkgewotICAgICAgICAgICAgcGFyZW50ID0gY29udGV4dEltcGw7Ci0gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICAgICAgICAgIHByb3BlcnR5UGF0aCA9IHBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE5vZGVCdWlsZGVyRGVmaW5lZENvbnRleHQgYWRkTm9kZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgUGF0aEltcGwgcGF0aDsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eVBhdGguaXNSb290UGF0aCgpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IFBhdGhJbXBsLmNvcHkocHJvcGVydHlQYXRoKTsKLSAgICAgICAgICAgICAgICBwYXRoLmFkZE5vZGUobmV3IE5vZGVJbXBsKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUJ1aWxkZXJEZWZpbmVkQ29udGV4dEltcGwocGFyZW50LCBtZXNzYWdlVGVtcGxhdGUsIHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBhZGRDb25zdHJhaW50VmlvbGF0aW9uKCkgewotICAgICAgICAgICAgcGFyZW50LmFkZEVycm9yKG1lc3NhZ2VUZW1wbGF0ZSwgcHJvcGVydHlQYXRoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHF1ZXVlZCBlcnJvciBtZXNzYWdlcy4KLSAgICAgKiBAcmV0dXJuIExpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uTGlzdGVuZXIuRXJyb3I+IGdldEVycm9yTWVzc2FnZXMoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0RGlzYWJsZWQgJiYgZXJyb3JNZXNzYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgIkF0IGxlYXN0IG9uZSBjdXN0b20gbWVzc2FnZSBtdXN0IGJlIGNyZWF0ZWQgaWYgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSBnZXRzIGRpc2FibGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxWYWxpZGF0aW9uTGlzdGVuZXIuRXJyb3I+IHJldHVybmVkRXJyb3JNZXNzYWdlcyA9Ci0gICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkxpc3RlbmVyLkVycm9yPihlcnJvck1lc3NhZ2VzKTsKLSAgICAgICAgaWYgKCFkZWZhdWx0RGlzYWJsZWQpIHsKLSAgICAgICAgICAgIHJldHVybmVkRXJyb3JNZXNzYWdlcy5hZGQobmV3IFZhbGlkYXRpb25MaXN0ZW5lci5FcnJvcigKLSAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRDb25zdHJhaW50TWVzc2FnZVRlbXBsYXRlKCksIHZhbGlkYXRpb25Db250ZXh0LmdldFByb3BlcnR5UGF0aCgpLAotICAgICAgICAgICAgICAgICAgbnVsbCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5lZEVycm9yTWVzc2FnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoaXMge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0fSdzIHtAbGluayBHcm91cFZhbGlkYXRpb25Db250ZXh0fS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBHcm91cFZhbGlkYXRpb25Db250ZXh0fQotICAgICAqLwotICAgIHB1YmxpYyBHcm91cFZhbGlkYXRpb25Db250ZXh0PD8+IGdldFZhbGlkYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhpcyB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHR9LgotICAgICAqIEBwYXJhbSBtZXNzYWdlVGVtcGxhdGUKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlQYXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZSwgUGF0aCBwcm9wZXJ0eVBhdGgpIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlcy5hZGQobmV3IFZhbGlkYXRpb25MaXN0ZW5lci5FcnJvcihtZXNzYWdlVGVtcGxhdGUsIHByb3BlcnR5UGF0aCwgbnVsbCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50VmFsaWRhdG9ySWRlbnRpdHkuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50VmFsaWRhdG9ySWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0YjZmYS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZhbGlkYXRvcklkZW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOwotCi0vKioKLSAqIENsYXNzIHRoYXQgc3RvcmVzIHRoZSBuZWVkZWQgcHJvcGVydGllcyB0byBlbnN1cmUgdGhhdCBhIHZhbGlkYXRpb24gaXMgbm90Ci0gKiBjaGVja2VkIG1vcmUgdGhhbiBvbmNlLgotICogPHA+Ci0gKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZToKLSAqIDx1bD4KLSAqIDxsaT5UaGUgcmVmIG9mIHRoZSBiZWFuIHRvIHdoaWNoIHRoZSB2YWxpZGF0aW9uIHdvdWxkIGJlIGFwcGxpZWQuPC9saT4KLSAqIDxsaT5UaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkuPC9saT4KLSAqIDxsaT5UaGUgcmVmIG9mIHRoZSB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvcn0uPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBhdXRob3IgQ2FybG9zIFZhcmEKLSAqLwotZmluYWwgY2xhc3MgQ29uc3RyYWludFZhbGlkYXRvcklkZW50aXR5IHsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGJlYW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHBhdGg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+IGNvbnN0cmFpbnRWYWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ29uc3RyYWludFZhbGlkYXRvcklkZW50aXR5IGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiBAcGFyYW0gY29uc3RyYWludFZhbGlkYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9ySWRlbnRpdHkoT2JqZWN0IGJlYW4sIFBhdGggcGF0aCwgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/PiBjb25zdHJhaW50VmFsaWRhdG9yKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIHRoaXMuY29uc3RyYWludFZhbGlkYXRvciA9IGNvbnN0cmFpbnRWYWxpZGF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZWZlcmVuY2VkIGJlYW4uCi0gICAgICogQHJldHVybiBPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSB7QGxpbmsgUGF0aH0uCi0gICAgICogQHJldHVybiBQYXRoCi0gICAgICovCi0gICAgcHVibGljIFBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhc3NvY2lhdGVkIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yfS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBDb25zdHJhaW50VmFsaWRhdG9yfQotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+IGdldENvbnN0cmFpbnRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJhaW50VmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCi0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnN0cmFpbnRWYWxpZGF0b3JJZGVudGl0eSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnN0cmFpbnRWYWxpZGF0b3JJZGVudGl0eSBvdGhlciA9IChDb25zdHJhaW50VmFsaWRhdG9ySWRlbnRpdHkpIG9iajsKLQotICAgICAgICAvLyBCZWFuIHJlZiBtdXN0IGJlIHRoZSBzYW1lCi0gICAgICAgIGlmICh0aGlzLmJlYW4gIT0gb3RoZXIuYmVhbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29uc3RyYWludFZhbGlkYXRvciByZWYgbXVzdCBiZSB0aGUgc2FtZQotICAgICAgICBpZiAodGhpcy5jb25zdHJhaW50VmFsaWRhdG9yICE9IG90aGVyLmNvbnN0cmFpbnRWYWxpZGF0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBhdGggbXVzdCBiZSBlcXVhbHMKLSAgICAgICAgaWYgKCF0aGlzLnBhdGguZXF1YWxzKG90aGVyLnBhdGgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgIGludCByZXN1bHQgPSAxOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLmJlYW4gPT0gbnVsbCkgPyAwIDogdGhpcy5iZWFuLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLnBhdGggPT0gbnVsbCkgPyAwIDogdGhpcy5wYXRoLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLmNvbnN0cmFpbnRWYWxpZGF0b3IgPT0gbnVsbCkgPyAwIDogdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yLmhhc2hDb2RlKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRWaW9sYXRpb25JbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZpb2xhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZDM2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludFZpb2xhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCi0gKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGCi0gKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogRGVzY3JpYmUgYSBjb25zdHJhaW50IHZhbGlkYXRpb24gZGVmZWN0Ljxici8+Ci0gKiBGcm9tIHJvb3RCZWFuIGFuZCBwcm9wZXJ0eVBhdGgsIGl0IGlzIHBvc3NpYmxlIHRvIHJlYnVpbGQgdGhlIGNvbnRleHQgb2YgdGhlIGZhaWx1cmUKLSAqLwotY2xhc3MgQ29uc3RyYWludFZpb2xhdGlvbkltcGw8VD4gaW1wbGVtZW50cyBDb25zdHJhaW50VmlvbGF0aW9uPFQ+LCBTZXJpYWxpemFibGUgewotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOwotICAgIC8qKiByb290IGJlYW4gdmFsaWRhdGlvbiB3YXMgaW52b2tlZCBvbi4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFQgcm9vdEJlYW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiByb290QmVhbkNsYXNzOwotICAgIC8qKiBsYXN0IGJlYW4gdmFsaWRhdGVkLiAqLwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGxlYWZCZWFuOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHZhbHVlOwotICAgIHByaXZhdGUgZmluYWwgUGF0aCBwcm9wZXJ0eVBhdGg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBDb25zdHJhaW50VmlvbGF0aW9uSW1wbCBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZVRlbXBsYXRlIC0gbWVzc2FnZSByZWFzb24gKHJhdyBtZXNzYWdlKSAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIGludGVycG9sYXRlZCBtZXNzYWdlIChsb2NhbGUgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIHJvb3RCZWFuCi0gICAgICogQHBhcmFtIGxlYWZCZWFuCi0gICAgICogQHBhcmFtIHByb3BlcnR5UGF0aAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSBjb25zdHJhaW50RGVzY3JpcHRvcgotICAgICAqIEBwYXJhbSByb290QmVhbkNsYXNzCi0gICAgICogQHBhcmFtIGVsZW1lbnRUeXBlCi0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWaW9sYXRpb25JbXBsKFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIFN0cmluZyBtZXNzYWdlLCBUIHJvb3RCZWFuLCBPYmplY3QgbGVhZkJlYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggcHJvcGVydHlQYXRoLCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnN0cmFpbnREZXNjcmlwdG9yLCBDbGFzczxUPiByb290QmVhbkNsYXNzLCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IG1lc3NhZ2VUZW1wbGF0ZTsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgdGhpcy5yb290QmVhbiA9IHJvb3RCZWFuOwotICAgICAgICB0aGlzLnJvb3RCZWFuQ2xhc3MgPSByb290QmVhbkNsYXNzOwotICAgICAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aDsKLSAgICAgICAgdGhpcy5sZWFmQmVhbiA9IGxlYWZCZWFuOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMuY29uc3RyYWludERlc2NyaXB0b3IgPSBjb25zdHJhaW50RGVzY3JpcHRvcjsKLSAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBmb3JtZXIgbmFtZSBnZXRJbnRlcnBvbGF0ZWRNZXNzYWdlKCkKLSAgICAgKiBAcmV0dXJuIFRoZSBpbnRlcnBvbGF0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBjb25zdHJhaW50IHZpb2xhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VUZW1wbGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQHJldHVybiBSb290IGJlYW4gYmVpbmcgdmFsaWRhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgZ2V0Um9vdEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiByb290QmVhbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENsYXNzPFQ+IGdldFJvb3RCZWFuQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiByb290QmVhbkNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldExlYWZCZWFuKCkgewotICAgICAgICByZXR1cm4gbGVhZkJlYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGZhaWxpbmcgdG8gcGFzcyB0aGUgY29uc3RyYWludAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0SW52YWxpZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHBhdGggdG8gdGhlIHZhbHVlIGZyb20gPGNvZGU+cm9vdEJlYW48L2NvZGU+Ci0gICAgICogICAgICAgICBOdWxsIGlmIHRoZSB2YWx1ZSBpcyB0aGUgcm9vdEJlYW4gaXRzZWxmCi0gICAgICovCi0gICAgcHVibGljIFBhdGggZ2V0UHJvcGVydHlQYXRoKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJhaW50RGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJDb25zdHJhaW50VmlvbGF0aW9uSW1wbHsiICsgInJvb3RCZWFuPSIgKyByb290QmVhbiArICIsIHByb3BlcnR5UGF0aD0nIiArCi0gICAgICAgICAgICAgIHByb3BlcnR5UGF0aCArICdcJycgKyAiLCBtZXNzYWdlPSciICsgbWVzc2FnZSArICdcJycgKyAiLCBsZWFmQmVhbj0iICsKLSAgICAgICAgICAgICAgbGVhZkJlYW4gKyAiLCB2YWx1ZT0iICsgdmFsdWUgKyAnfSc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICBpbnQgcmVzdWx0ID0gMTsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKLSAgICAgICAgICAgICAgICArICgodGhpcy5sZWFmQmVhbiA9PSBudWxsKSA/IDAgOiB0aGlzLmxlYWZCZWFuLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLm1lc3NhZ2UgPT0gbnVsbCkgPyAwIDogdGhpcy5tZXNzYWdlLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZQotICAgICAgICAgICAgICAgICogcmVzdWx0Ci0gICAgICAgICAgICAgICAgKyAoKHRoaXMucHJvcGVydHlQYXRoID09IG51bGwpID8gMCA6IHRoaXMucHJvcGVydHlQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzaENvZGUoKSk7Ci0gICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0Ci0gICAgICAgICAgICAgICAgKyAoKHRoaXMucm9vdEJlYW4gPT0gbnVsbCkgPyAwIDogdGhpcy5yb290QmVhbi5oYXNoQ29kZSgpKTsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKLSAgICAgICAgICAgICAgICArICgodGhpcy52YWx1ZSA9PSBudWxsKSA/IDAgOiB0aGlzLnZhbHVlLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLmVsZW1lbnRUeXBlID09IG51bGwpID8gMCA6IHRoaXMuZWxlbWVudFR5cGUuaGFzaENvZGUoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIE5PVEU6IE5lZWRlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiBpbiB0aGUgcmVwb3J0ZWQgdmlvbGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gICBvYmogICB0aGUgcmVmZXJlbmNlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmUuCi0gICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIG9iagotICAgICAqICAgICAgICAgIGFyZ3VtZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29uc3RyYWludFZpb2xhdGlvbkltcGw8Pz4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uSW1wbDw/PiBvdGhlciA9IChDb25zdHJhaW50VmlvbGF0aW9uSW1wbDw/Pikgb2JqOwotCi0gICAgICAgIGlmICh0aGlzLmxlYWZCZWFuID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5sZWFmQmVhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmxlYWZCZWFuLmVxdWFscyhvdGhlci5sZWFmQmVhbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIubWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm1lc3NhZ2UuZXF1YWxzKG90aGVyLm1lc3NhZ2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLnByb3BlcnR5UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIucHJvcGVydHlQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucHJvcGVydHlQYXRoLmVxdWFscyhvdGhlci5wcm9wZXJ0eVBhdGgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLnJvb3RCZWFuID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5yb290QmVhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnJvb3RCZWFuLmVxdWFscyhvdGhlci5yb290QmVhbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMucm9vdEJlYW5DbGFzcyAhPSBvdGhlci5yb290QmVhbkNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci52YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudFR5cGUgIT0gb3RoZXIuZWxlbWVudFR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdmZjdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9EZWZhdWx0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBjcmVhdGUgY29uc3RyYWludCBpbnN0YW5jZXMgd2l0aCB0aGUgZGVmYXVsdCAvIG5vLWFyZyBjb25zdHJ1Y3RvciA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGUgYSBDb25zdHJhaW50LgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENvbnN0cmFpbnQgaW5zdGFuY2UKLSAgICAgKiAgICAgICAgIFRoZSBDb25zdHJhaW50RmFjdG9yeSBpcyA8Yj5ub3Q8L2I+IHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIENvbnN0cmFpbnQjaW5pdGlhbGl6ZQotICAgICAqLwotICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+IFQgZ2V0SW5zdGFuY2UoZmluYWwgQ2xhc3M8VD4gY29uc3RyYWludENsYXNzKQotICAgIHsKLSAgICAgIC8vIDIwMTEtMDMtMjcganc6IERvIG5vdCB1c2UgUHJpdmlsZWdlZEFjdGlvbi4KLSAgICAgIC8vIE90aGVyd2lzZSBhbnkgdXNlciBjb2RlIHdvdWxkIGJlIGV4ZWN1dGVkIHdpdGggdGhlIHByaXZpbGVnZXMgb2YgdGhpcyBjbGFzcy4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXR1cm4gY29uc3RyYWludENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIDogIiArIGNvbnN0cmFpbnRDbGFzcywgZXgpOwotICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMzQxYTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcwotICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgotICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuU2VjdXJlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogUmVzb3VyY2UgYnVuZGxlIGJhY2tlZCBtZXNzYWdlIGludGVycG9sYXRvci4KLSAqIFRoaXMgbWVzc2FnZSByZXNvbHZlciByZXNvbHZlIG1lc3NhZ2UgZGVzY3JpcHRvcnMKLSAqIGludG8gaHVtYW4tcmVhZGFibGUgbWVzc2FnZXMuIEl0IHVzZXMgUmVzb3VyY2VCdW5kbGVzIHRvIGZpbmQgdGhlIG1lc3NhZ2VzLgotICogVGhpcyBjbGFzcyBpcyB0aHJlYWRzYWZlLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkFMSURBVElPTl9NRVNTQUdFUyA9Ci0gICAgICAgICAgIm9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuVmFsaWRhdGlvbk1lc3NhZ2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9WQUxJREFUSU9OX01FU1NBR0VTID0gIlZhbGlkYXRpb25NZXNzYWdlcyI7Ci0KLSAgICAvKiogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZG8gbWVzc2FnZSBpbnRlcnBvbGF0aW9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gbWVzc2FnZVBhcmFtZXRlclBhdHRlcm4gPQotICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKFxce1tcXHdcXC5dK1xcfSkiKTsKLQotICAgIC8qKiBUaGUgZGVmYXVsdCBsb2NhbGUgZm9yIHRoZSBjdXJyZW50IHVzZXIuICovCi0gICAgcHJpdmF0ZSBMb2NhbGUgZGVmYXVsdExvY2FsZTsKLQotICAgIC8qKiBVc2VyIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGVzIGhhc2hlZCBhZ2FpbnN0IHRoZWlyIGxvY2FsZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxMb2NhbGUsIFJlc291cmNlQnVuZGxlPiB1c2VyQnVuZGxlc01hcCA9Ci0gICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPExvY2FsZSwgUmVzb3VyY2VCdW5kbGU+KCk7Ci0KLSAgICAvKiogQnVpbHRpbiByZXNvdXJjZSBidW5kbGVzIGhhc2hlZCBhZ2FpbnN0IHRoZWlyIGxvY2FsZS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxMb2NhbGUsIFJlc291cmNlQnVuZGxlPiBkZWZhdWx0QnVuZGxlc01hcCA9Ci0gICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPExvY2FsZSwgUmVzb3VyY2VCdW5kbGU+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKCkgewotICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKLQotICAgICAgICBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RmlsZUJhc2VkUmVzb3VyY2VCdW5kbGUoZGVmYXVsdExvY2FsZSk7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyQnVuZGxlc01hcC5wdXQoZGVmYXVsdExvY2FsZSwgYnVuZGxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNlckJ1bmRsZXNNYXAucHV0KGRlZmF1bHRMb2NhbGUsIHJlc291cmNlQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHRCdW5kbGVzTWFwLnB1dChkZWZhdWx0TG9jYWxlLAotICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoREVGQVVMVF9WQUxJREFUSU9OX01FU1NBR0VTLCBkZWZhdWx0TG9jYWxlKSk7Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gcHJvYmFibHkgbm8gbmVlZCBmb3IgY2FjaGluZywgYnV0IGl0IGNvdWxkIGJlIGRvbmUgYnkgcGFyYW1ldGVycyBzaW5jZSB0aGUgbWFwCi0gICAgICAgIC8vIGlzIGltbXV0YWJsZSBhbmQgdW5pcXVlbHkgYnVpbHQgcGVyIFZhbGlkYXRpb24gZGVmaW5pdGlvbiwgdGhlIGNvbXBhcmlzb24gaGFzIHRvIGJlIGJhc2VkIG9uID09IGFuZCBub3QgZXF1YWxzIHRob3VnaAotICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobWVzc2FnZSwgY29udGV4dCwgZGVmYXVsdExvY2FsZSk7Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKFN0cmluZyBtZXNzYWdlLCBDb250ZXh0IGNvbnRleHQsIExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgcmV0dXJuIGludGVycG9sYXRlTWVzc2FnZShtZXNzYWdlLAotICAgICAgICAgICAgICBjb250ZXh0LmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0QXR0cmlidXRlcygpLCBsb2NhbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIG1lc3NhZ2UgaW50ZXJwb2xhdGlvbiBhY2NvcmRpbmcgdG8gYWxnb3JpdGhtIHNwZWNpZmllZCBpbiBKU1IgMzAzLgotICAgICAqIDxici8+Ci0gICAgICogTm90ZToKLSAgICAgKiA8YnIvPgotICAgICAqIExvb2t1cHMgaW4gdXNlciBidW5kbGVzIGFyZSByZWN1cnNpdmUgd2hlcmVhcyBsb29rdXBzIGluIGRlZmF1bHQgYnVuZGxlIGFyZSBub3QhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW50ZXJwb2xhdGUKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblBhcmFtZXRlcnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGFubm90YXRpb24gZm9yIHdoaWNoIHRvIGludGVycG9sYXRlIHRoaXMgbWVzc2FnZQotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgICAgICAgICB0aGUgPGNvZGU+TG9jYWxlPC9jb2RlPiB0byB1c2UgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJwb2xhdGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJwb2xhdGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFubm90YXRpb25QYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIHVzZXJSZXNvdXJjZUJ1bmRsZSA9IGZpbmRVc2VyUmVzb3VyY2VCdW5kbGUobG9jYWxlKTsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgZGVmYXVsdFJlc291cmNlQnVuZGxlID0gZmluZERlZmF1bHRSZXNvdXJjZUJ1bmRsZShsb2NhbGUpOwotCi0gICAgICAgIFN0cmluZyB1c2VyQnVuZGxlUmVzb2x2ZWRNZXNzYWdlOwotICAgICAgICBTdHJpbmcgcmVzb2x2ZWRNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgYm9vbGVhbiBldmFsdWF0ZWREZWZhdWx0QnVuZGxlT25jZSA9IGZhbHNlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAvLyBzZWFyY2ggdGhlIHVzZXIgYnVuZGxlIHJlY3Vyc2l2ZSAoc3RlcDEpCi0gICAgICAgICAgICB1c2VyQnVuZGxlUmVzb2x2ZWRNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgIHJlcGxhY2VWYXJpYWJsZXMocmVzb2x2ZWRNZXNzYWdlLCB1c2VyUmVzb3VyY2VCdW5kbGUsIGxvY2FsZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIGV4aXQgY29uZGl0aW9uIC0gd2UgaGF2ZSBhdCBsZWFzdCB0cmllZCB0byB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGJ1bmRsZSBhbmQgdGhlcmUgd2VyZSBubwotICAgICAgICAgICAgLy8gZnVydGhlciByZXBsYWNlbWVudHMKLSAgICAgICAgICAgIGlmIChldmFsdWF0ZWREZWZhdWx0QnVuZGxlT25jZSAmJgotICAgICAgICAgICAgICAgICAgIWhhc1JlcGxhY2VtZW50VGFrZW5QbGFjZSh1c2VyQnVuZGxlUmVzb2x2ZWRNZXNzYWdlLCByZXNvbHZlZE1lc3NhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlYXJjaCB0aGUgZGVmYXVsdCBidW5kbGUgbm9uIHJlY3Vyc2l2ZSAoc3RlcDIpCi0gICAgICAgICAgICByZXNvbHZlZE1lc3NhZ2UgPSByZXBsYWNlVmFyaWFibGVzKHVzZXJCdW5kbGVSZXNvbHZlZE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0UmVzb3VyY2VCdW5kbGUsIGxvY2FsZSwgZmFsc2UpOwotCi0gICAgICAgICAgICBldmFsdWF0ZWREZWZhdWx0QnVuZGxlT25jZSA9IHRydWU7Ci0gICAgICAgIH0gd2hpbGUgKHRydWUpOwotCi0gICAgICAgIC8vIHJlc29sdmUgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIChzdGVwIDQpCi0gICAgICAgIHJlc29sdmVkTWVzc2FnZSA9Ci0gICAgICAgICAgICAgIHJlcGxhY2VBbm5vdGF0aW9uQXR0cmlidXRlcyhyZXNvbHZlZE1lc3NhZ2UsIGFubm90YXRpb25QYXJhbWV0ZXJzKTsKLQotICAgICAgICAvLyBjdXJseSBicmFjZXMgbmVlZCB0byBiZSBzY2FwZWQgaW4gdGhlIG9yaWdpbmFsIG1zZywgc28gdW5lc2NhcGUgdGhlbSBub3cKLSAgICAgICAgcmVzb2x2ZWRNZXNzYWdlID0gcmVzb2x2ZWRNZXNzYWdlLnJlcGxhY2UoICJcXHsiLCAieyIgKS5yZXBsYWNlKCAiXFx9IiwgIn0iICkucmVwbGFjZSggIlxcXFwiLCAiXFwiICk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnRUYWtlblBsYWNlKFN0cmluZyBvcmlnTWVzc2FnZSwgU3RyaW5nIG5ld01lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuICFvcmlnTWVzc2FnZS5lcXVhbHMobmV3TWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGN1cnJlbnQgdGhyZWFkIGNsYXNzbG9hZGVyIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlLiBJZiBub3QgZm91bmQsIHNlYXJjaCB2YWxpZGF0b3IgKHRoaXMpIGNsYXNzbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIG9mIHRoZSBidW5kbGUgdG8gbG9hZC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldEZpbGVCYXNlZFJlc291cmNlQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBudWxsOwotICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGRvUHJpdmlsZWdlZChTZWN1cmVBY3Rpb25zLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJiID0gbG9hZEJ1bmRsZShjbGFzc0xvYWRlciwgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgVVNFUl9WQUxJREFUSU9OX01FU1NBR0VTICsgIiBub3QgZm91bmQgYnkgdGhyZWFkIGxvY2FsIGNsYXNzbG9hZGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAyMDExLTAzLTI3IGp3OiBObyBwcml2aWxlZ2VkIGFjdGlvbiByZXF1aXJlZC4KLSAgICAgICAgLy8gQSBjbGFzcyBjYW4gYWx3YXlzIGFjY2VzcyB0aGUgY2xhc3Nsb2FkZXIgb2YgaXRzZWxmIGFuZCBvZiBzdWJjbGFzc2VzLgotICAgICAgICBpZiAocmIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmIgPSBsb2FkQnVuZGxlKAotICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgVVNFUl9WQUxJREFUSU9OX01FU1NBR0VTICsgIiBub3QgZm91bmQgYnkgdmFsaWRhdG9yIGNsYXNzbG9hZGVyIgotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FU1QsIFN0cmluZy5mb3JtYXQoIiVzIGZvdW5kIiwgVVNFUl9WQUxJREFUSU9OX01FU1NBR0VTKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiJXMgbm90IGZvdW5kLiBEZWxlZ2F0aW5nIHRvICVzIiwgVVNFUl9WQUxJREFUSU9OX01FU1NBR0VTLCBERUZBVUxUX1ZBTElEQVRJT05fTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBsb2FkQnVuZGxlKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShVU0VSX1ZBTElEQVRJT05fTUVTU0FHRVMsIGxvY2FsZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmZpbmUobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VWYXJpYWJsZXMoU3RyaW5nIG1lc3NhZ2UsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVjdXJzZSkgewotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBtZXNzYWdlUGFyYW1ldGVyUGF0dGVybi5tYXRjaGVyKG1lc3NhZ2UpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KTsKLSAgICAgICAgU3RyaW5nIHJlc29sdmVkUGFyYW1ldGVyVmFsdWU7Ci0gICAgICAgIHdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICByZXNvbHZlZFBhcmFtZXRlclZhbHVlID0gcmVzb2x2ZVBhcmFtZXRlcihwYXJhbWV0ZXIsIGJ1bmRsZSwgbG9jYWxlLCByZWN1cnNlKTsKLQotICAgICAgICAgICAgbWF0Y2hlci5hcHBlbmRSZXBsYWNlbWVudChzYiwgc2FuaXRpemVGb3JBcHBlbmRSZXBsYWNlbWVudChyZXNvbHZlZFBhcmFtZXRlclZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWF0Y2hlci5hcHBlbmRUYWlsKHNiKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZUFubm90YXRpb25BdHRyaWJ1dGVzKFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFubm90YXRpb25QYXJhbWV0ZXJzKSB7Ci0gICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IG1lc3NhZ2VQYXJhbWV0ZXJQYXR0ZXJuLm1hdGNoZXIobWVzc2FnZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOwotICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFBhcmFtZXRlclZhbHVlOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFyaWFibGUgPSBhbm5vdGF0aW9uUGFyYW1ldGVycy5nZXQocmVtb3ZlQ3VybHlCcmFjZShwYXJhbWV0ZXIpKTsKLSAgICAgICAgICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUGFyYW1ldGVyVmFsdWUgPSBBcnJheVV0aWxzLnRvU3RyaW5nKHZhcmlhYmxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFBhcmFtZXRlclZhbHVlID0gdmFyaWFibGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc29sdmVkUGFyYW1ldGVyVmFsdWUgPSBwYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaGVyLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBzYW5pdGl6ZUZvckFwcGVuZFJlcGxhY2VtZW50KHJlc29sdmVkUGFyYW1ldGVyVmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBtYXRjaGVyLmFwcGVuZFRhaWwoc2IpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlUGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLCBib29sZWFuIHJlY3Vyc2UpIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclZhbHVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBidW5kbGUuZ2V0U3RyaW5nKHJlbW92ZUN1cmx5QnJhY2UocGFyYW1ldGVyTmFtZSkpOwotICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVZhcmlhYmxlcyhwYXJhbWV0ZXJWYWx1ZSwgYnVuZGxlLCBsb2NhbGUsIHJlY3Vyc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBwYXJhbWV0ZXJOYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmV0dXJuIHBhcmFtZXRlciBpdHNlbGYKLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gcGFyYW1ldGVyTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyVmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQ3VybHlCcmFjZShTdHJpbmcgcGFyYW1ldGVyKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXIuc3Vic3RyaW5nKDEsIHBhcmFtZXRlci5sZW5ndGgoKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZmluZERlZmF1bHRSZXNvdXJjZUJ1bmRsZShMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGRlZmF1bHRCdW5kbGVzTWFwLmdldChsb2NhbGUpOwotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShERUZBVUxUX1ZBTElEQVRJT05fTUVTU0FHRVMsIGxvY2FsZSk7Ci0gICAgICAgICAgICBkZWZhdWx0QnVuZGxlc01hcC5wdXQobG9jYWxlLCBidW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmaW5kVXNlclJlc291cmNlQnVuZGxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gdXNlckJ1bmRsZXNNYXAuZ2V0KGxvY2FsZSk7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVuZGxlID0gZ2V0RmlsZUJhc2VkUmVzb3VyY2VCdW5kbGUobG9jYWxlKTsKLSAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVzZXJCdW5kbGVzTWFwLnB1dChsb2NhbGUsIGJ1bmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHVzZWQgYnkgdGhpcyB7QGxpbmsgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3J9LgotICAgICAqIEBwYXJhbSBsb2NhbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZXMgdGhlIHN0cmluZyB0byBjb21wbHkgd2l0aAotICAgICAqIHtAbGluayBNYXRjaGVyI2FwcGVuZFJlcGxhY2VtZW50KFN0cmluZ0J1ZmZlciwgU3RyaW5nKX0gcmVxdWlyZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNyYwotICAgICAqICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHN0cmluZy4KLSAgICAgKiBAcmV0dXJuIFRoZSBzYW5pdGl6ZWQgc3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNhbml0aXplRm9yQXBwZW5kUmVwbGFjZW1lbnQoU3RyaW5nIHNyYykgewotICAgICAgICByZXR1cm4gc3JjLnJlcGxhY2UoIlxcIiwgIlxcXFwiKS5yZXBsYWNlKCIkIiwgIlxcJCIpOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFjdGlvbiB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCkgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKiAgdGhlIGFjdGlvbiB0byBydW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogIHJlc3VsdCBvZiB0aGUgYWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZG9Qcml2aWxlZ2VkKGZpbmFsIFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRGVmYXVsdFZhbGlkYXRpb25Qcm92aWRlclJlc29sdmVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRGVmYXVsdFZhbGlkYXRpb25Qcm92aWRlclJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTYzMzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRWYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcwotICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgotICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5zcGkuVmFsaWRhdGlvblByb3ZpZGVyOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRpb25Qcm92aWRlclJlc29sdmVyIGltcGxlbWVudHMgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIgewotCi0gICAgLy9UT0RPIC0gU3BlYyByZWNvbW1lbmRzIGNhY2hpbmcgcGVyIGNsYXNzbG9hZGVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQSV9DRkcgPQotICAgICAgICAgICAgIk1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlciI7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8VmFsaWRhdGlvblByb3ZpZGVyPD8+PiBnZXRWYWxpZGF0aW9uUHJvdmlkZXJzKCkgewotICAgICAgICBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uUHJvdmlkZXI8Pz4+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgb3VyIGNsYXNzbG9hZGVyCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjbCA9IERlZmF1bHRWYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgLy8gZmluZCBhbGwgc2VydmljZSBwcm92aWRlciBjZmdzCi0gICAgICAgICAgICBFbnVtZXJhdGlvbjxVUkw+IGNmZ3MgPSBjbC5nZXRSZXNvdXJjZXMoU1BJX0NGRyk7Ci0gICAgICAgICAgICB3aGlsZSAoY2Zncy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBjZmdzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKSwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBjZmdzIG1heSBjb250YWluIG11bHRpcGxlIHByb3ZpZGVycyBhbmQvb3IgY29tbWVudHMKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSBsb2FkaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXIgPSBjbC5sb2FkQ2xhc3MobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnN0YW5jZSB0byByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb3ZpZGVyPD8+IHZwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxWYWxpZGF0aW9uUHJvdmlkZXI8Pz4+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVmFsaWRhdGlvblByb3ZpZGVyPD8+IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uUHJvdmlkZXI8Pz4pIHByb3ZpZGVyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIDogIiArIHByb3ZpZGVyLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5hZGQodnApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBwcm92aWRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICsgIiBjb25maWd1cmVkIGluIGZpbGUgIiArIHVybCwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJFcnJvciB0cnlpbmcgdG8gcmVhZCAiICsgdXJsLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiRXJyb3IgdHJ5aW5nIHRvIHJlYWQgYSAiICsgU1BJX0NGRywgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FsbGVyIG11c3QgaGFuZGxlIHRoZSBjYXNlIG9mIG5vIHByb3ZpZGVycyBmb3VuZAotICAgICAgICByZXR1cm4gcHJvdmlkZXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9FbGVtZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9FbGVtZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNGU1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRWxlbWVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcwotICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgotICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IE1ldGFEYXRhIGNsYXNzPGJyLz4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnREZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIEVsZW1lbnREZXNjcmlwdG9yIHsKLQotICAgIC8qKgotICAgICAqIEdldCBhIHNldCBvZiB7QGxpbmsgQ29uc3RyYWludERlc2NyaXB0b3J9cyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YKLSAgICAgKiB7QGxpbmsgVmFsaWRhdGlvbn1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9ucwotICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN0cmFpbnREZXNjcmlwdG9yfSBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucykgewotICAgICAgICBmaW5hbCBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+Pih2YWxpZGF0aW9ucy5sZW5ndGgpOwotICAgICAgICBmb3IgKFZhbGlkYXRpb24gdmFsaWRhdGlvbiA6IHZhbGlkYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAodmFsaWRhdGlvbiBpbnN0YW5jZW9mIENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoQ29uc3RyYWludFZhbGlkYXRpb248Pz4pIHZhbGlkYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqIHRoZSBNZXRhQmVhbiBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgTWV0YUJlYW4gbWV0YUJlYW47Ci0KLSAgICAvKiogdGhlIHJhdyB0eXBlIG9mIHRoaXMgZWxlbWVudCAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiBlbGVtZW50Q2xhc3M7Ci0KLSAgICBwcml2YXRlIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gY29uc3RyYWludERlc2NyaXB0b3JzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEVsZW1lbnREZXNjcmlwdG9ySW1wbCBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0YUJlYW4KLSAgICAgKiBAcGFyYW0gZWxlbWVudENsYXNzCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnREZXNjcmlwdG9ySW1wbChNZXRhQmVhbiBtZXRhQmVhbiwgQ2xhc3M8Pz4gZWxlbWVudENsYXNzLCBWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5tZXRhQmVhbiA9IG1ldGFCZWFuOwotICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IGVsZW1lbnRDbGFzczsKLSAgICAgICAgc2V0Q29uc3RyYWludERlc2NyaXB0b3JzKGdldENvbnN0cmFpbnREZXNjcmlwdG9ycyh2YWxpZGF0aW9ucykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBFbGVtZW50RGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnRDbGFzcwotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9ucwotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50RGVzY3JpcHRvckltcGwoQ2xhc3M8Pz4gZWxlbWVudENsYXNzLCBWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgdGhpcyhudWxsLCBlbGVtZW50Q2xhc3MsIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogQHJldHVybiBTdGF0aWNhbGx5IGRlZmluZWQgcmV0dXJuZWQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RWxlbWVudENsYXNzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudENsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyJ9KQotICAgIHB1YmxpYyBFbGVtZW50RGVzY3JpcHRvci5Db25zdHJhaW50RmluZGVyIGZpbmRDb25zdHJhaW50cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJhaW50RmluZGVySW1wbChtZXRhQmVhbiwgbmV3IEhhc2hTZXQoKFNldCkgY29uc3RyYWludERlc2NyaXB0b3JzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnREZXNjcmlwdG9ycy5pc0VtcHR5KCkgPyBDb2xsZWN0aW9ucy48Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGVtcHR5U2V0KCkgOiBDb2xsZWN0aW9ucwotICAgICAgICAgICAgLnVubW9kaWZpYWJsZVNldChjb25zdHJhaW50RGVzY3JpcHRvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbXV0YWJsZSB7QGxpbmsgQ29uc3RyYWludERlc2NyaXB0b3J9IHtAbGluayBTZXR9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gU2V0IG9mIHtAbGluayBDb25zdHJhaW50RGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBnZXRNdXRhYmxlQ29uc3RyYWludERlc2NyaXB0b3JzKCkgewotICAgICAgICByZXR1cm4gY29uc3RyYWludERlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30gcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnN0cmFpbnQgZGVjbGFyYXRpb24gaXMKLSAgICAgKiBwcmVzZW50IG9uIHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gIWdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbnN0cmFpbnREZXNjcmlwdG9ycyBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25zdHJhaW50RGVzY3JpcHRvcnMKLSAgICAgKiAgICAgICAgICAgIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnREZXNjcmlwdG9ycyhTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbnN0cmFpbnREZXNjcmlwdG9ycykgewotICAgICAgICB0aGlzLmNvbnN0cmFpbnREZXNjcmlwdG9ycyA9IGNvbnN0cmFpbnREZXNjcmlwdG9yczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1vZGVsIHtAbGluayBNZXRhQmVhbn0gdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE1ldGFCZWFuCi0gICAgICovCi0gICAgcHVibGljIE1ldGFCZWFuIGdldE1ldGFCZWFuKCkgewotICAgICAgICByZXR1cm4gbWV0YUJlYW47Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0dyYXBoQmVhbklkZW50aXR5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvR3JhcGhCZWFuSWRlbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4YmJhYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvR3JhcGhCZWFuSWRlbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLS8qKgotICogQ2xhc3MgdGhhdCBzdG9yZXMgdGhlIG5lZWRlZCBwcm9wZXJ0aWVzIHRvIGF2b2lkIGNpcmN1bGFyIHBhdGhzIHdoZW4KLSAqIHZhbGlkYXRpbmcgYW4gb2JqZWN0IGdyYXBoLgotICogPHA+Ci0gKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZToKLSAqIDx1bD4KLSAqIDxsaT5UaGUgcmVmIG9mIHRoZSBiZWFuIHRvIHdoaWNoIHRoZSB2YWxpZGF0aW9uIHdvdWxkIGJlIGFwcGxpZWQuPC9saT4KLSAqIDxsaT5UaGUgY3VycmVudCBncm91cCBiZWluZyB2YWxpZGF0ZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEZJWE1FOiBPd25lciBpcyBjdXJyZW50bHkgbm90IHVzZWQgaW4gaWRlbnRpdHkgY2hlY2tpbmcsIGFuZCBwcm9iYWJseQotICogbmV2ZXIgd2lsbCBiZS4gIFNvIGl0IGlzIGxpa2VseSB0byBiZSBkZWxldGVkLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEJlYW5JZGVudGl0eSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgYmVhbjsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGdyb3VwOwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gb3duZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgR3JhcGhCZWFuSWRlbnRpdHkgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKiBAcGFyYW0gZ3JvdXAKLSAgICAgKiBAcGFyYW0gb3duZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgR3JhcGhCZWFuSWRlbnRpdHkoT2JqZWN0IGJlYW4sIENsYXNzPD8+IGdyb3VwLCBDbGFzczw/PiBvd25lcikgewotICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOwotICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7Ci0gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBiZWFuLgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGdyb3VwIGJlaW5nIHZhbGlkYXRlZC4KLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHVibGljIENsYXNzPD8+IGdldEdyb3VwKCkgewotICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvd25pbmcgY2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzPD8+IGdldE93bmVyKCkgewotICAgICAgICByZXR1cm4gb3duZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgR3JhcGhCZWFuSWRlbnRpdHkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBHcmFwaEJlYW5JZGVudGl0eSBvdGhlciA9IChHcmFwaEJlYW5JZGVudGl0eSkgb2JqOwotCi0gICAgICAgIC8vIEJlYW4gcmVmIG11c3QgYmUgdGhlIHNhbWUKLSAgICAgICAgaWYgKHRoaXMuYmVhbiAhPSBvdGhlci5iZWFuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHcm91cCByZWYgbXVzdCBiZSB0aGUgc2FtZQotICAgICAgICBpZiAodGhpcy5ncm91cCAhPSBvdGhlci5ncm91cCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotLy8gICAgICAgIC8vIE93bmVyIHJlZiBtdXN0IGJlIHRoZSBzYW1lCi0vLyAgICAgICAgaWYgKHRoaXMub3duZXIgIT0gb3RoZXIub3duZXIpIHsKLS8vICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotLy8gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgIGludCByZXN1bHQgPSAxOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLmJlYW4gPT0gbnVsbCkgPyAwIDogdGhpcy5iZWFuLmhhc2hDb2RlKCkpOwotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdAotICAgICAgICAgICAgICAgICsgKCh0aGlzLmdyb3VwID09IG51bGwpID8gMCA6IHRoaXMuZ3JvdXAuaGFzaENvZGUoKSk7Ci0vLyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKLS8vICAgICAgICAgICAgICAgICsgKCh0aGlzLm93bmVyID09IG51bGwpID8gMCA6IHRoaXMub3duZXIuaGFzaENvZGUoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvR3JvdXBWYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0dyb3VwVmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4YTUxYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvR3JvdXBWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlBhdGhJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogSlNSLTMwMyB7QGxpbmsgVmFsaWRhdGlvbkNvbnRleHR9IGV4dGVuc2lvbi4gPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBHcm91cFZhbGlkYXRpb25Db250ZXh0PFQ+Ci0gICAgICBleHRlbmRzIFZhbGlkYXRpb25Db250ZXh0PENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4+IHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGdyb3VwcyBvZiB0aGlzIHtAbGluayBHcm91cFZhbGlkYXRpb25Db250ZXh0fS4KLSAgICAgKiBAcmV0dXJuIHRoZSBncm91cHMgaW4gdGhlaXIgc2VxdWVuY2UgZm9yIHZhbGlkYXRpb24KLSAgICAgKi8KLSAgICBHcm91cHMgZ2V0R3JvdXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGN1cnJlbnQge0BsaW5rIEdyb3VwfS4KLSAgICAgKiBAcGFyYW0gZ3JvdXAgdG8gc2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRDdXJyZW50R3JvdXAoR3JvdXAgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHtAbGluayBHcm91cH0uCi0gICAgICogQHJldHVybiBHcm91cAotICAgICAqLwotICAgIEdyb3VwIGdldEN1cnJlbnRHcm91cCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm9wZXJ0eSBwYXRoLgotICAgICAqIEByZXR1cm4ge0BsaW5rIFBhdGhJbXBsfQotICAgICAqLwotICAgIFBhdGhJbXBsIGdldFByb3BlcnR5UGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByb290IHtAbGluayBNZXRhQmVhbn0uCi0gICAgICogQHJldHVybiB7QGxpbmsgTWV0YUJlYW59Ci0gICAgICovCi0gICAgTWV0YUJlYW4gZ2V0Um9vdE1ldGFCZWFuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0uCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnQgdG8gc2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRDb25zdHJhaW50VmFsaWRhdGlvbihDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBjb25zdHJhaW50KTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0aW9ufS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBDb25zdHJhaW50VmFsaWRhdGlvbn0KLSAgICAgKi8KLSAgICBDb25zdHJhaW50VmFsaWRhdGlvbjw/PiBnZXRDb25zdHJhaW50VmFsaWRhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAgICogQHJldHVybiBPYmplY3QKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0VmFsaWRhdGVkVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldCBhIGZpeGVkIHZhbHVlIGZvciB0aGUgY29udGV4dC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRGaXhlZFZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgcmVzb2x2ZXIuCi0gICAgICogQHJldHVybiB7QGxpbmsgTWVzc2FnZUludGVycG9sYXRvcn0KLSAgICAgKi8KLSAgICBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VSZXNvbHZlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgVHJhdmVyc2FibGVSZXNvbHZlcn0uCi0gICAgICogQHJldHVybiB7QGxpbmsgVHJhdmVyc2FibGVSZXNvbHZlcn0KLSAgICAgKi8KLSAgICBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKTsKLQotICAgIC8qKgotICAgICAqIEFjY3VtdWxhdGUgYSB2YWxpZGF0ZWQgY29uc3RyYWludC4KLSAgICAgKiBAcGFyYW0gY29uc3RyYWludAotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjb25zdHJhaW50IGZvciB0aGUgb2JqZWN0IGluIHRoaXMgcGF0aCB3YXMgbm90Ci0gICAgICogICAgICAgICBhbHJlYWR5IHZhbGlkYXRlZCBpbiB0aGlzIGNvbnRleHQKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbGxlY3RWYWxpZGF0ZWQoQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/PiBjb25zdHJhaW50KTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBvd25pbmcgY2xhc3MuCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIENsYXNzPD8+IGdldEN1cnJlbnRPd25lcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjdXJyZW50IG93bmluZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gY3VycmVudE93bmVyIHRvIHNldAotICAgICAqLwotICAgIHZvaWQgc2V0Q3VycmVudE93bmVyKENsYXNzPD8+IGN1cnJlbnRPd25lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Hcm91cFZhbGlkYXRpb25Db250ZXh0SW1wbC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0dyb3VwVmFsaWRhdGlvbkNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjUwOTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0dyb3VwVmFsaWRhdGlvbkNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcwotICogd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRgotICogbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuQmVhblZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLkdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLkdyb3VwczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnJlc29sdmVyLkNhY2hpbmdUcmF2ZXJzYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuUGF0aEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGluc3RhbmNlIHBlciB2YWxpZGF0aW9uIHByb2Nlc3MsIG5vdCB0aHJlYWQtc2FmZTxici8+Ci0gKi8KLWZpbmFsIGNsYXNzIEdyb3VwVmFsaWRhdGlvbkNvbnRleHRJbXBsPFQ+IGV4dGVuZHMgQmVhblZhbGlkYXRpb25Db250ZXh0PENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4+IGltcGxlbWVudHMKLSAgICBHcm91cFZhbGlkYXRpb25Db250ZXh0PFQ+LCBNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VSZXNvbHZlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBhdGhJbXBsIHBhdGg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRhQmVhbiByb290TWV0YUJlYW47Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZ3JvdXBzIGluIHRoZSBzZXF1ZW5jZSBvZiB2YWxpZGF0aW9uIHRvIHRha2UgcGxhY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIEdyb3VwcyBncm91cHM7Ci0gICAgLyoqCi0gICAgICogdGhlIGN1cnJlbnQgZ3JvdXAgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIEdyb3VwIGN1cnJlbnRHcm91cDsKLQotICAgIHByaXZhdGUgQ2xhc3M8Pz4gY3VycmVudE93bmVyOwotCi0gICAgLyoqCi0gICAgICogY29udGFpbnMgdGhlIHZhbGlkYXRpb24gY29uc3RyYWludHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQKLSAgICAgKiBkdXJpbmcgdGhpcyB2YWxpZGF0aW9uIHJvdXRpbmUgKGFzIHBhcnQgb2YgYSBwcmV2aW91cyBncm91cCBtYXRjaCkKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hTZXQ8Q29uc3RyYWludFZhbGlkYXRvcklkZW50aXR5PiB2YWxpZGF0ZWRDb25zdHJhaW50cyA9IG5ldyBIYXNoU2V0PENvbnN0cmFpbnRWYWxpZGF0b3JJZGVudGl0eT4oKTsKLQotICAgIHByaXZhdGUgQ29uc3RyYWludFZhbGlkYXRpb248Pz4gY29uc3RyYWludFZhbGlkYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBUcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgR3JvdXBWYWxpZGF0aW9uQ29udGV4dEltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyCi0gICAgICogQHBhcmFtIGFNZXNzYWdlUmVzb2x2ZXIKLSAgICAgKiBAcGFyYW0gdHJhdmVyc2FibGVSZXNvbHZlcgotICAgICAqIEBwYXJhbSByb290TWV0YUJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBWYWxpZGF0aW9uQ29udGV4dEltcGwoQ29uc3RyYWludFZhbGlkYXRpb25MaXN0ZW5lcjxUPiBsaXN0ZW5lciwgTWVzc2FnZUludGVycG9sYXRvciBhTWVzc2FnZVJlc29sdmVyLAotICAgICAgICBUcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXIsIE1ldGFCZWFuIHJvb3RNZXRhQmVhbikgewotICAgICAgICAvLyBpbmhlcml0ZWQgdmFyaWFibGUgJ3ZhbGlkYXRlZE9iamVjdHMnIGlzIG9mIHR5cGU6Ci0gICAgICAgIC8vIEhhc2hNYXA8R3JhcGhCZWFuSWRlbnRpdHksIFNldDxQYXRoSW1wbD4+IGluIHRoaXMgY2xhc3MKLSAgICAgICAgc3VwZXIobGlzdGVuZXIsIG5ldyBIYXNoTWFwPEdyYXBoQmVhbklkZW50aXR5LCBTZXQ8UGF0aEltcGw+PigpKTsKLSAgICAgICAgdGhpcy5tZXNzYWdlUmVzb2x2ZXIgPSBhTWVzc2FnZVJlc29sdmVyOwotICAgICAgICB0aGlzLnRyYXZlcnNhYmxlUmVzb2x2ZXIgPSBDYWNoaW5nVHJhdmVyc2FibGVSZXNvbHZlci5jYWNoZUZvcih0cmF2ZXJzYWJsZVJlc29sdmVyKTsKLSAgICAgICAgdGhpcy5yb290TWV0YUJlYW4gPSByb290TWV0YUJlYW47Ci0gICAgICAgIHRoaXMucGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGV4KEludGVnZXIgaW5kZXgpIHsKLSAgICAgICAgTm9kZUltcGwgbGVhZiA9IHBhdGguZ2V0TGVhZk5vZGUoKTsKLSAgICAgICAgaWYgKGxlYWYuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGxlYWYuc2V0SW5kZXgoaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGF0aC5hZGROb2RlKE5vZGVJbXBsLmF0SW5kZXgoaW5kZXgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgTm9kZUltcGwgbGVhZiA9IHBhdGguZ2V0TGVhZk5vZGUoKTsKLSAgICAgICAgaWYgKGxlYWYuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGxlYWYuc2V0S2V5KGtleSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXRoLmFkZE5vZGUoTm9kZUltcGwuYXRLZXkoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW92ZURvd24oTWV0YVByb3BlcnR5IHByb3AsIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcykgewotICAgICAgICBwYXRoLmFkZFByb3BlcnR5KHByb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIubW92ZURvd24ocHJvcCwgYWNjZXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBiZWFuLCBNZXRhQmVhbiBtZXRhQmVhbikgewotICAgICAgICBOb2RlSW1wbCBsZWFmID0gcGF0aC5nZXRMZWFmTm9kZSgpOwotICAgICAgICBpZiAobGVhZi5pc0luSXRlcmFibGUoKSAmJiBsZWFmLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsZWFmLnNldE5hbWUobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXRoLnJlbW92ZUxlYWZOb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIubW92ZVVwKGJlYW4sIG1ldGFCZWFuKTsgLy8gY2FsbCBzdXBlciEKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IEhlcmUsIHN0YXRlIGVxdWF0ZXMgdG8gYmVhbiBpZGVudGl0eSArIGdyb3VwLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbGxlY3RWYWxpZGF0ZWQoKSB7Ci0KLSAgICAgICAgLy8gQ29tYmluYXRpb24gb2YgYmVhbitncm91cCtvd25lciAob3duZXIgaXMgY3VycmVudGx5IGlnbm9yZWQpCi0gICAgICAgIEdyYXBoQmVhbklkZW50aXR5IGdiaSA9IG5ldyBHcmFwaEJlYW5JZGVudGl0eShnZXRCZWFuKCksIGdldEN1cnJlbnRHcm91cCgpLmdldEdyb3VwKCksIGdldEN1cnJlbnRPd25lcigpKTsKLQotICAgICAgICBTZXQ8UGF0aEltcGw+IHZhbGlkYXRlZFBhdGhzRm9yR0JJID0gKFNldDxQYXRoSW1wbD4pIHZhbGlkYXRlZE9iamVjdHMuZ2V0KGdiaSk7Ci0gICAgICAgIGlmICh2YWxpZGF0ZWRQYXRoc0ZvckdCSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZWRQYXRoc0ZvckdCSSA9IG5ldyBIYXNoU2V0PFBhdGhJbXBsPigpOwotICAgICAgICAgICAgdmFsaWRhdGVkT2JqZWN0cy5wdXQoZ2JpLCB2YWxpZGF0ZWRQYXRoc0ZvckdCSSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHBhdGhzIGlzIGEgc3VicGF0aCBvZiB0aGUgY3VycmVudCBwYXRoLCB0aGVyZSBpcyBhCi0gICAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvIHJldHVybiBmYWxzZQotICAgICAgICBmb3IgKFBhdGhJbXBsIHZhbGlkYXRlZFBhdGggOiB2YWxpZGF0ZWRQYXRoc0ZvckdCSSkgewotICAgICAgICAgICAgaWYgKHBhdGguaXNTdWJQYXRoT2YodmFsaWRhdGVkUGF0aCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbHNlLCBhZGQgdGhlIGN1cnJlbnRQYXRoIHRvIHRoZSBzZXQgb2YgdmFsaWRhdGVkUGF0aHMKLSAgICAgICAgdmFsaWRhdGVkUGF0aHNGb3JHQkkuYWRkKFBhdGhJbXBsLmNvcHkocGF0aCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFZhbGlkYXRlZChDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+IGNvbnN0cmFpbnQpIHsKLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvcklkZW50aXR5IGN2aSA9IG5ldyBDb25zdHJhaW50VmFsaWRhdG9ySWRlbnRpdHkoZ2V0QmVhbigpLCBnZXRQcm9wZXJ0eVBhdGgoKSwgY29uc3RyYWludCk7Ci0gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlZENvbnN0cmFpbnRzLmFkZChjdmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSB2YWxpZGF0ZWQgY29uc3RyYWludHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRWYWxpZGF0ZWRDb25zdHJhaW50cygpIHsKLSAgICAgICAgdmFsaWRhdGVkQ29uc3RyYWludHMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IElmIGFuIGFzc29jaWF0ZWQgb2JqZWN0IGlzIHZhbGlkYXRlZCwgYWRkIHRoZSBhc3NvY2lhdGlvbgotICAgICAqIGZpZWxkIG9yIEphdmFCZWFucyBwcm9wZXJ0eSBuYW1lIGFuZCBhIGRvdCAoJy4nKSBhcyBhIHByZWZpeCB0byB0aGUKLSAgICAgKiBwcmV2aW91cyBydWxlcy4gdXNlcyBwcm9wW2luZGV4XSBpbiBwcm9wZXJ0eSBwYXRoIGZvciBlbGVtZW50cyBpbgotICAgICAqIHRvLW1hbnktcmVsYXRpb25zaGlwcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIGluIGRvdCBub3RhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoSW1wbCBnZXRQcm9wZXJ0eVBhdGgoKSB7Ci0gICAgICAgIFBhdGhJbXBsIGN1cnJlbnRQYXRoID0gUGF0aEltcGwuY29weShwYXRoKTsKLSAgICAgICAgaWYgKGdldE1ldGFQcm9wZXJ0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRQYXRoLmFkZFByb3BlcnR5KGdldE1ldGFQcm9wZXJ0eSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUJlYW4gZ2V0Um9vdE1ldGFCZWFuKCkgewotICAgICAgICByZXR1cm4gcm9vdE1ldGFCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgR3JvdXBzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBncm91cHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoR3JvdXBzIGdyb3VwcykgewotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIEdyb3VwcyBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBncm91cHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBHcm91cCBnZXRDdXJyZW50R3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50R3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRHcm91cChHcm91cCBjdXJyZW50R3JvdXApIHsKLSAgICAgICAgdGhpcy5jdXJyZW50R3JvdXAgPSBjdXJyZW50R3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnRWYWxpZGF0aW9uKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+IGNvbnN0cmFpbnQpIHsKLSAgICAgICAgY29uc3RyYWludFZhbGlkYXRpb24gPSBjb25zdHJhaW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRpb248Pz4gZ2V0Q29uc3RyYWludFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJhaW50VmFsaWRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gY29uc3RyYWludFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVkVmFsdWUoKSB7Ci0gICAgICAgIGlmIChnZXRNZXRhUHJvcGVydHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShjb25zdHJhaW50VmFsaWRhdGlvbi5nZXRBY2Nlc3MoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QmVhbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlSW50ZXJwb2xhdG9yIGdldE1lc3NhZ2VSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpIHsKLSAgICAgICAgcmV0dXJuIHRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDdXJyZW50T3duZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRPd25lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudE93bmVyKENsYXNzPD8+IGN1cnJlbnRPd25lcikgewotICAgICAgICB0aGlzLmN1cnJlbnRPd25lciA9IGN1cnJlbnRPd25lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvSW5jb21wYXRpYmxlUHJvcGVydHlWYWx1ZUV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0luY29tcGF0aWJsZVByb3BlcnR5VmFsdWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2Nzc1MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvSW5jb21wYXRpYmxlUHJvcGVydHlWYWx1ZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVybmFsIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0cnlpbmcgdG8gdmFsaWRhdGUgYSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBmb3Igd2hpY2ggaXQgaXMgbm90IGFzc2lnbm1lbnQtY29tcGF0aWJsZS4KLSAqIAotICogQHZlcnNpb24gJFJldjogMTAzMTgzMyAkICREYXRlOiAyMDEwLTExLTA1IDE2OjUzOjAzIC0wNTAwIChGcmksIDA1IE5vdiAyMDEwKSAkCi0gKiAKLSAqIEBhdXRob3IgTWF0dCBCZW5zb24KLSAqLwotcHVibGljIGNsYXNzIEluY29tcGF0aWJsZVByb3BlcnR5VmFsdWVFeGNlcHRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9ufSBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBJbmNvbXBhdGlibGVQcm9wZXJ0eVZhbHVlRXhjZXB0aW9uIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEluY29tcGF0aWJsZVByb3BlcnR5VmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEluY29tcGF0aWJsZVByb3BlcnR5VmFsdWVFeGNlcHRpb24gaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEluY29tcGF0aWJsZVByb3BlcnR5VmFsdWVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Kc3IzMDNGZWF0dXJlcy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0pzcjMwM0ZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDY5OTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0pzcjMwM0ZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXM7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IENvbnRhaW5zIE1ldGFCZWFuIGZlYXR1cmUga2V5cyBvZiBhZGRpdGlvbmFsIGZlYXR1cmVzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uCi0gKiBvZiBKU1IzMDM8YnIvPgotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzQ2FwYWJsZQotICogQHNlZSBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBKc3IzMDNGZWF0dXJlcyB7Ci0gICAgLyoqCi0gICAgICogSlNSMzAzIFByb3BlcnR5IGZlYXR1cmVzCi0gICAgICovCi0gICAgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRmVhdHVyZXMuUHJvcGVydHkgewotICAgICAgICAvKiogSU5GTzogY2FjaGVkIFByb3BlcnR5RGVzY3JpcHRvckltcGwgb2YgdGhlIHByb3BlcnR5ICovCi0gICAgICAgIFN0cmluZyBQcm9wZXJ0eURlc2NyaXB0b3IgPSAiUHJvcGVydHlEZXNjcmlwdG9yIjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIElORk86IENsYXNzW10gd2l0aCB0aGUgZ3JvdXBzIHRvIHZhbGlkYXRlIGEgUkVGX0NBU0NBREUKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBSRUZfR1JPVVBTID0gInJlZkdyb3VwcyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNSMzAzIGJlYW4gZmVhdHVyZXMKLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgQmVhbiBleHRlbmRzIEZlYXR1cmVzLkJlYW4gewotICAgICAgICAvKioKLSAgICAgICAgICogSU5GTzogTGlzdCBvZiBHcm91cChDbGFzcykgZm9yIHtAbGluayBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2UjdmFsdWUoKX0KLSAgICAgICAgICogKHJlZGVmaW5lZCBkZWZhdWx0IGdyb3VwKQotICAgICAgICAgKiovCi0gICAgICAgIFN0cmluZyBHUk9VUF9TRVFVRU5DRSA9ICJHcm91cFNlcXVlbmNlIjsKLQotLy8gICAgICAgIElORk86IGNhY2hlZCBzb3J0ZWQgQXJyYXkgd2l0aCBWYWxpZGF0aW9uRW50cmllcyAKLS8vICAgICAgICBTdHJpbmcgVkFMSURBVElPTl9TRVFVRU5DRSA9ICJWYWxpZGF0aW9uU2VxdWVuY2UiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJTkZPOiBjYWNoZWQgQmVhbkRlc2NyaXB0b3JJbXBsIG9mIHRoZSBiZWFuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgQkVBTl9ERVNDUklQVE9SID0gIkJlYW5EZXNjcmlwdG9yIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvSnNyMzAzTWV0YUJlYW5GYWN0b3J5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvSnNyMzAzTWV0YUJlYW5GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmU4YjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0pzcjMwM01ldGFCZWFuRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLkNsYXNzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5TZWN1cmVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMueG1sLk1ldGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLk1ldGhvZEFjY2VzczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogcHJvY2VzcyB0aGUgY2xhc3MgYW5ub3RhdGlvbnMgZm9yIEpTUjMwMyBjb25zdHJhaW50IHZhbGlkYXRpb25zIHRvIGJ1aWxkIHRoZSBNZXRhQmVhbiB3aXRoIGluZm9ybWF0aW9uCi0gKiBmcm9tIGFubm90YXRpb25zIGFuZCBKU1IzMDMgY29uc3RyYWludCBtYXBwaW5ncyAoZGVmaW5lZCBpbiB4bWwpPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEpzcjMwM01ldGFCZWFuRmFjdG9yeSBpbXBsZW1lbnRzIE1ldGFCZWFuRmFjdG9yeSB7Ci0gICAgLyoqIFNoYXJlZCBsb2cgaW5zdGFuY2UgKi8KLSAgICAvLyBvZiBkdWJpb3VzIHV0aWxpdHkgYXMgaXQncyBzdGF0aWMgOi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpzcjMwM01ldGFCZWFuRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLyoqIHtAbGluayBBcGFjaGVGYWN0b3J5Q29udGV4dH0gdXNlZCAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dDsKLQotICAgIC8qKgotICAgICAqIHtAbGluayBBbm5vdGF0aW9uUHJvY2Vzc29yfSB1c2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uUHJvY2Vzc29yIGFubm90YXRpb25Qcm9jZXNzb3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgSnNyMzAzTWV0YUJlYW5GYWN0b3J5IGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5Q29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBKc3IzMDNNZXRhQmVhbkZhY3RvcnkoQXBhY2hlRmFjdG9yeUNvbnRleHQgZmFjdG9yeUNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5Q29udGV4dCA9IGZhY3RvcnlDb250ZXh0OwotICAgICAgICB0aGlzLmFubm90YXRpb25Qcm9jZXNzb3IgPSBuZXcgQW5ub3RhdGlvblByb2Nlc3NvcihmYWN0b3J5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfSBBZGQgdGhlIHZhbGlkYXRpb24gZmVhdHVyZXMgdG8gdGhlIG1ldGFiZWFuIHRoYXQgY29tZSBmcm9tIEpTUjMwMyBhbm5vdGF0aW9ucyBpbiB0aGUgYmVhbkNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTWV0YUJlYW4oTWV0YUJlYW4gbWV0YWJlYW4pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGJlYW5DbGFzcyA9IG1ldGFiZWFuLmdldEJlYW5DbGFzcygpOwotICAgICAgICAgICAgcHJvY2Vzc0dyb3VwU2VxdWVuY2UoYmVhbkNsYXNzLCBtZXRhYmVhbik7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgY2xhc3MsIHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcwotICAgICAgICAgICAgTGlzdDxDbGFzczw/Pj4gY2xhc3NTZXF1ZW5jZSA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgICAgICBDbGFzc0hlbHBlci5maWxsRnVsbENsYXNzSGllcmFyY2h5QXNMaXN0KGNsYXNzU2VxdWVuY2UsIGJlYW5DbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIHN0YXJ0IHdpdGggc3VwZXJjbGFzc2VzIGFuZCBnbyBkb3duIHRoZSBoaWVyYXJjaHkgc28gdGhhdAotICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGNsYXNzZXMgYXJlIHByb2Nlc3NlZCBsYXN0IHRvIGhhdmUgdGhlIGNoYW5jZSB0bwotICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHNvbWUgZGVjbGFyYXRpb25zCi0gICAgICAgICAgICAvLyBvZiB0aGVpciBzdXBlcmNsYXNzZXMgYW5kIHRoYXQgdGhleSBzZWUgd2hhdCB0aGV5IGluaGVyaXQgYXQgdGhlCi0gICAgICAgICAgICAvLyB0aW1lIG9mIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBjbGFzc1NlcXVlbmNlLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZWFjaENsYXNzID0gY2xhc3NTZXF1ZW5jZS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzKGVhY2hDbGFzcywgbWV0YWJlYW4pOwotICAgICAgICAgICAgICAgIHByb2Nlc3NHcm91cFNlcXVlbmNlKGVhY2hDbGFzcywgbWV0YWJlYW4sICJ7R3JvdXBTZXF1ZW5jZToiICsgZWFjaENsYXNzLmdldENhbm9uaWNhbE5hbWUoKSArICJ9Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGNsYXNzIGFubm90YXRpb25zLCBmaWVsZCBhbmQgbWV0aG9kIGFubm90YXRpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcGFyYW0gbWV0YWJlYW4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NsYXNzKENsYXNzPD8+IGJlYW5DbGFzcywgTWV0YUJlYW4gbWV0YWJlYW4pIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBpZiBOT1QgaWdub3JlIGNsYXNzIGxldmVsIGFubm90YXRpb25zCi0gICAgICAgIGlmICghZmFjdG9yeUNvbnRleHQuZ2V0RmFjdG9yeSgpLmdldEFubm90YXRpb25JZ25vcmVzKCkuaXNJZ25vcmVBbm5vdGF0aW9ucyhiZWFuQ2xhc3MpKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29yLnByb2Nlc3NBbm5vdGF0aW9ucyhudWxsLCBiZWFuQ2xhc3MsIGJlYW5DbGFzcywgbnVsbCwgbmV3IEFwcGVuZFZhbGlkYXRpb25Ub01ldGEoCi0gICAgICAgICAgICAgICAgbWV0YWJlYW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gZG9Qcml2aWxlZ2VkKFNlY3VyZUFjdGlvbnMuZ2V0RGVjbGFyZWRGaWVsZHMoYmVhbkNsYXNzKSk7Ci0gICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLSAgICAgICAgICAgIE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHkgPSBtZXRhYmVhbi5nZXRQcm9wZXJ0eShmaWVsZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvcGVydHkgZm9yIHRob3NlIGZpZWxkcyBmb3Igd2hpY2ggdGhlcmUgaXMgbm90IHlldCBhCi0gICAgICAgICAgICAvLyBNZXRhUHJvcGVydHkKLSAgICAgICAgICAgIGlmICghZmFjdG9yeUNvbnRleHQuZ2V0RmFjdG9yeSgpLmdldEFubm90YXRpb25JZ25vcmVzKCkuaXNJZ25vcmVBbm5vdGF0aW9ucyhmaWVsZCkpIHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MgPSBuZXcgRmllbGRBY2Nlc3MoZmllbGQpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gY3JlYXRlID0gbWV0YVByb3BlcnR5ID09IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGNyZWF0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhUHJvcGVydHkgPSBhZGRNZXRhUHJvcGVydHkobWV0YWJlYW4sIGFjY2Vzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghYW5ub3RhdGlvblByb2Nlc3Nvci5wcm9jZXNzQW5ub3RhdGlvbnMobWV0YVByb3BlcnR5LCBiZWFuQ2xhc3MsIGZpZWxkLCBhY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBcHBlbmRWYWxpZGF0aW9uVG9NZXRhKG1ldGFQcm9wZXJ0eSkpICYmIGNyZWF0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhYmVhbi5wdXRQcm9wZXJ0eShtZXRhUHJvcGVydHkuZ2V0TmFtZSgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWV0aG9kW10gbWV0aG9kcyA9IGRvUHJpdmlsZWdlZChTZWN1cmVBY3Rpb25zLmdldERlY2xhcmVkTWV0aG9kcyhiZWFuQ2xhc3MpKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIHByb3BOYW1lID0gTWV0aG9kQWNjZXNzLmdldFByb3BlcnR5TmFtZShtZXRob2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXRBbm5vdGF0aW9uSWdub3JlcygpLmlzSWdub3JlQW5ub3RhdGlvbnMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MgPSBuZXcgTWV0aG9kQWNjZXNzKHByb3BOYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBNZXRhUHJvcGVydHkgbWV0YVByb3BlcnR5ID0gbWV0YWJlYW4uZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNyZWF0ZSA9IG1ldGFQcm9wZXJ0eSA9PSBudWxsOwotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBwcm9wZXJ0eSBmb3IgdGhvc2UgbWV0aG9kcyBmb3Igd2hpY2ggdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHlldCBhIE1ldGFQcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhUHJvcGVydHkgPSBhZGRNZXRhUHJvcGVydHkobWV0YWJlYW4sIGFjY2Vzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhbm5vdGF0aW9uUHJvY2Vzc29yLnByb2Nlc3NBbm5vdGF0aW9ucyhtZXRhUHJvcGVydHksIGJlYW5DbGFzcywgbWV0aG9kLCBhY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXBwZW5kVmFsaWRhdGlvblRvTWV0YShtZXRhUHJvcGVydHkpKSAmJiBjcmVhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFiZWFuLnB1dFByb3BlcnR5KHByb3BOYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzVmFsaWRhdGlvbkNvbnN0cmFpbnRzRGVmaW5lZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIlByb3BlcnR5ICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBmb2xsb3cgamF2YWJlYW4gY29udmVudGlvbnMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRYbWxDb25zdHJhaW50cyhiZWFuQ2xhc3MsIG1ldGFiZWFuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIGEgZ2l2ZW4gTWV0aG9kIGhhcyB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzIGRlZmluZWQgdmlhIEpTUjMwMyBhbm5vdGF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb25zdHJhaW50cyBkZXRlY3RlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1ZhbGlkYXRpb25Db25zdHJhaW50c0RlZmluZWQoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3QgOiBtZXRob2QuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAoaGFzVmFsaWRhdGlvbkNvbnN0cmFpbnRzRGVmaW5lZChhbm5vdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkYXRpb25Db25zdHJhaW50c0RlZmluZWQoQW5ub3RhdGlvbiBhbm5vdCkgewotICAgICAgICAvLyBJZiBpdCBpcyBhbm5vdGF0ZWQgd2l0aCBAQ29uc3RyYWludAotICAgICAgICBpZiAoYW5ub3QuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKENvbnN0cmFpbnQuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCBpcyBhIG11bHRpdmFsdWVkIGNvbnN0cmFpbnQ6Ci0gICAgICAgIGlmIChDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuVkFMVUUuaXNEZWNsYXJlZE9uKGFubm90LmFubm90YXRpb25UeXBlKCkpKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gY2hpbGRyZW4gPSBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuVkFMVUUuZ2V0VmFsdWUoYW5ub3QpOwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRhdGlvbkNvbnN0cmFpbnRzRGVmaW5lZChjaGlsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBjYXNjYWRlIHZhbGlkYXRpb24gYW5kIGNvbnN0cmFpbnRzIGZyb20geG1sIG1hcHBpbmdzCi0gICAgICogCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEBwYXJhbSBtZXRhYmVhbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRYbWxDb25zdHJhaW50cyhDbGFzczw/PiBiZWFuQ2xhc3MsIE1ldGFCZWFuIG1ldGFiZWFuKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoTWV0YUNvbnN0cmFpbnQ8PywgPyBleHRlbmRzIEFubm90YXRpb24+IG1ldGEgOiBmYWN0b3J5Q29udGV4dC5nZXRGYWN0b3J5KCkuZ2V0TWV0YUNvbnN0cmFpbnRzKGJlYW5DbGFzcykpIHsKLSAgICAgICAgICAgIE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHk7Ci0gICAgICAgICAgICBBY2Nlc3NTdHJhdGVneSBhY2Nlc3MgPSBtZXRhLmdldEFjY2Vzc1N0cmF0ZWd5KCk7Ci0gICAgICAgICAgICBib29sZWFuIGNyZWF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFjY2VzcyA9PSBudWxsKSB7IC8vIGNsYXNzIGxldmVsCi0gICAgICAgICAgICAgICAgbWV0YVByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIHByb3BlcnR5IGxldmVsCi0gICAgICAgICAgICAgICAgbWV0YVByb3BlcnR5ID0gbWV0YWJlYW4uZ2V0UHJvcGVydHkoYWNjZXNzLmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGUgPSBtZXRhUHJvcGVydHkgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoY3JlYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFQcm9wZXJ0eSA9IGFkZE1ldGFQcm9wZXJ0eShtZXRhYmVhbiwgYWNjZXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFubm90YXRpb25Qcm9jZXNzb3IucHJvY2Vzc0Fubm90YXRpb24obWV0YS5nZXRBbm5vdGF0aW9uKCksIG1ldGFQcm9wZXJ0eSwgYmVhbkNsYXNzLAotICAgICAgICAgICAgICAgIG1ldGEuZ2V0QWNjZXNzU3RyYXRlZ3koKSwgbmV3IEFwcGVuZFZhbGlkYXRpb25Ub01ldGEobWV0YVByb3BlcnR5ID09IG51bGwgPyBtZXRhYmVhbiA6IG1ldGFQcm9wZXJ0eSkpCi0gICAgICAgICAgICAgICAgJiYgY3JlYXRlKSB7Ci0gICAgICAgICAgICAgICAgbWV0YWJlYW4ucHV0UHJvcGVydHkoYWNjZXNzLmdldFByb3BlcnR5TmFtZSgpLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcyA6IGZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXRWYWxpZEFjY2Vzc2VzKGJlYW5DbGFzcykpIHsKLSAgICAgICAgICAgIE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHkgPSBtZXRhYmVhbi5nZXRQcm9wZXJ0eShhY2Nlc3MuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGUgPSBtZXRhUHJvcGVydHkgPT0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjcmVhdGUpIHsKLSAgICAgICAgICAgICAgICBtZXRhUHJvcGVydHkgPSBhZGRNZXRhUHJvcGVydHkobWV0YWJlYW4sIGFjY2Vzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFubm90YXRpb25Qcm9jZXNzb3IuYWRkQWNjZXNzU3RyYXRlZ3kobWV0YVByb3BlcnR5LCBhY2Nlc3MpICYmIGNyZWF0ZSkgewotICAgICAgICAgICAgICAgIG1ldGFiZWFuLnB1dFByb3BlcnR5KGFjY2Vzcy5nZXRQcm9wZXJ0eU5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwU2VxdWVuY2UoQ2xhc3M8Pz4gYmVhbkNsYXNzLCBNZXRhQmVhbiBtZXRhYmVhbikgewotICAgICAgICBwcm9jZXNzR3JvdXBTZXF1ZW5jZShiZWFuQ2xhc3MsIG1ldGFiZWFuLCBKc3IzMDNGZWF0dXJlcy5CZWFuLkdST1VQX1NFUVVFTkNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwU2VxdWVuY2UoQ2xhc3M8Pz4gYmVhbkNsYXNzLCBNZXRhQmVhbiBtZXRhYmVhbiwgU3RyaW5nIGtleSkgewotICAgICAgICBHcm91cFNlcXVlbmNlIGFubm90YXRpb24gPSBiZWFuQ2xhc3MuZ2V0QW5ub3RhdGlvbihHcm91cFNlcXVlbmNlLmNsYXNzKTsKLSAgICAgICAgTGlzdDxHcm91cD4gZ3JvdXBTZXEgPSBtZXRhYmVhbi5nZXRGZWF0dXJlKGtleSk7Ci0gICAgICAgIGlmIChncm91cFNlcSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBncm91cFNlcSA9IG5ldyBBcnJheUxpc3Q8R3JvdXA+KGFubm90YXRpb24gPT0gbnVsbCA/IDEgOiBhbm5vdGF0aW9uLnZhbHVlKCkubGVuZ3RoKTsKLSAgICAgICAgICAgIG1ldGFiZWFuLnB1dEZlYXR1cmUoa2V5LCBncm91cFNlcSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xhc3M8Pz5bXSBncm91cENsYXNzZXMgPSBmYWN0b3J5Q29udGV4dC5nZXRGYWN0b3J5KCkuZ2V0RGVmYXVsdFNlcXVlbmNlKGJlYW5DbGFzcyk7Ci0gICAgICAgIGlmIChncm91cENsYXNzZXMgPT0gbnVsbCB8fCBncm91cENsYXNzZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBncm91cFNlcS5hZGQoR3JvdXAuREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBncm91cENsYXNzZXMgPSBhbm5vdGF0aW9uLnZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBjb250YWluc0RlZmF1bHQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChDbGFzczw/PiBncm91cENsYXNzIDogZ3JvdXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGJlYW5DbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBTZXEuYWRkKEdyb3VwLkRFRkFVTFQpOwotICAgICAgICAgICAgICAgIGNvbnRhaW5zRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3VwQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhEZWZhdWx0LmNsYXNzLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uKCInRGVmYXVsdC5jbGFzcycgbXVzdCBub3QgYXBwZWFyIGluIEBHcm91cFNlcXVlbmNlISBVc2UgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBiZWFuQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5jbGFzcycgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXBTZXEuYWRkKG5ldyBHcm91cChncm91cENsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjb250YWluc0RlZmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHcm91cERlZmluaXRpb25FeGNlcHRpb24oIlJlZGVmaW5lZCBkZWZhdWx0IGdyb3VwIHNlcXVlbmNlIG11c3QgY29udGFpbiAiICsgYmVhbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FU1QsIFN0cmluZy5mb3JtYXQoIkRlZmF1bHQgZ3JvdXAgc2VxdWVuY2UgZm9yIGJlYW4gJXMgaXM6ICVzIiwgYmVhbkNsYXNzLmdldE5hbWUoKSwgZ3JvdXBTZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSB7QGxpbmsgTWV0YVByb3BlcnR5fSB0byBhIHtAbGluayBNZXRhQmVhbn0uCi0gICAgICogQHBhcmFtIHBhcmVudE1ldGFCZWFuCi0gICAgICogQHBhcmFtIGFjY2VzcwotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIE1ldGFQcm9wZXJ0eX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1ldGFQcm9wZXJ0eSBhZGRNZXRhUHJvcGVydHkoTWV0YUJlYW4gcGFyZW50TWV0YUJlYW4sIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcykgewotICAgICAgICBmaW5hbCBNZXRhUHJvcGVydHkgcmVzdWx0ID0gbmV3IE1ldGFQcm9wZXJ0eSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGFjY2Vzcy5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgcmVzdWx0LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRUeXBlKGFjY2Vzcy5nZXRKYXZhVHlwZSgpKTsKLSAgICAgICAgcGFyZW50TWV0YUJlYW4ucHV0UHJvcGVydHkobmFtZSwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotCi0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFjdGlvbiB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCkgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIGluc3RhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKiAgdGhlIGFjdGlvbiB0byBydW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogIHJlc3VsdCBvZiB0aGUgYWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZG9Qcml2aWxlZ2VkKGZpbmFsIFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1Byb3BlcnR5RGVzY3JpcHRvckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Qcm9wZXJ0eURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTk3ZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1Byb3BlcnR5RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjoge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvcn0gaW1wbGVtZW50YXRpb24uPGJyLz4KLSAqLwotY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5RGVzY3JpcHRvciB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhc2NhZGVkOwotICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5UGF0aDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3JJbXBsIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqLwotICAgIFByb3BlcnR5RGVzY3JpcHRvckltcGwoTWV0YVByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIHN1cGVyKHByb3BlcnR5LmdldFBhcmVudE1ldGFCZWFuKCksIHByb3BlcnR5LmdldFR5cGVDbGFzcygpLCBwcm9wZXJ0eS5nZXRWYWxpZGF0aW9ucygpKTsKLSAgICAgICAgc2V0Q2FzY2FkZWQocHJvcGVydHkuZ2V0TWV0YUJlYW4oKSAhPSBudWxsIHx8IHByb3BlcnR5LmdldEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuUkVGX0NBU0NBREUpICE9IG51bGwpOwotICAgICAgICBzZXRQcm9wZXJ0eVBhdGgocHJvcGVydHkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBpcyBjYXNjYWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FzY2FkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXNjYWRlZChib29sZWFuIGNhc2NhZGVkKSB7Ci0gICAgICAgIHRoaXMuY2FzY2FkZWQgPSBjYXNjYWRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNhc2NhZGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eVBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVBhdGgoU3RyaW5nIHByb3BlcnR5UGF0aCkgewotICAgICAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eVBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJvcGVydHlEZXNjcmlwdG9ySW1wbHsiICsgInJldHVyblR5cGU9IiArIGVsZW1lbnRDbGFzcyArICIsIHByb3BlcnR5UGF0aD0nIiArIHByb3BlcnR5UGF0aCArICdcJycKLSAgICAgICAgICAgICsgJ30nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Vbmtub3duUHJvcGVydHlFeGNlcHRpb24uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Vbmtub3duUHJvcGVydHlFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiY2Y2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVW5rbm93blByb3BlcnR5RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgZXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IGRvZXNuJ3QgZXhpc3QKLSAqIGluIGEgYmVhbi4KLSAqIAotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKiAKLSAqIEBhdXRob3IgQ2FybG9zIFZhcmEKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbiBleHRlbmRzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBVbmtub3duUHJvcGVydHlFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBVbmtub3duUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5rbm93blByb3BlcnR5RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9BcHBlbmRWYWxpZGF0aW9uVG9MaXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9BcHBlbmRWYWxpZGF0aW9uVG9MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmYyN2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvQXBwZW5kVmFsaWRhdGlvblRvTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leHRlbnNpb25zOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwcGVuZFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5CYXNlQXBwZW5kVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNvbnN0cmFpbnRWYWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB7QGxpbmsgQXBwZW5kVmFsaWRhdGlvbn0gaW1wbGVtZW50YXRpb24gdGhhdCBhY3RzIGFzIGFuIGludGVybWVkaWF0ZQotICogY2FjaGUgb2YgdmFsaWRhdGlvbnMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy48YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQXBwZW5kVmFsaWRhdGlvblRvTGlzdCBleHRlbmRzIEJhc2VBcHBlbmRWYWxpZGF0aW9uIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IHZhbGlkYXRpb25zID0gbmV3IEFycmF5TGlzdDxDb25zdHJhaW50VmFsaWRhdGlvbjw/Pj4oKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBBcHBlbmRWYWxpZGF0aW9uVG9MaXN0IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBBcHBlbmRWYWxpZGF0aW9uVG9MaXN0KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiB2b2lkIHBlcmZvcm1BcHBlbmQoQ29uc3RyYWludFZhbGlkYXRpb248VD4gdmFsaWRhdGlvbikgewotICAgICAgICB2YWxpZGF0aW9ucy5hZGQodmFsaWRhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGNhY2hlZCB2YWxpZGF0aW9ucy4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRpb259Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IGdldFZhbGlkYXRpb25zKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvQ29uc3RydWN0b3JEZXNjcmlwdG9yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9Db25zdHJ1Y3RvckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNzNmZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9Db25zdHJ1Y3RvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuRWxlbWVudERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IFRoaXMgY2xhc3Mgd2lsbCBkaXNhcHBlYXIgd2hlbiBzdWNoCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHBhcnQgb2YgdGhlIEpTUjMwMyBzcGVjaWZpY2F0aW9uLjxici8+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RydWN0b3JEZXNjcmlwdG9yIGV4dGVuZHMgRWxlbWVudERlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiB7QGxpbmsgUGFyYW1ldGVyRGVzY3JpcHRvcn1zLgotICAgICAqIEByZXR1cm4ge0BsaW5rIExpc3R9IG9mIHtAbGluayBQYXJhbWV0ZXJEZXNjcmlwdG9yfQotICAgICAqLwotICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRvcj4gZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsgLy9pbmRleCBhbGlnbmVkCi0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIHRoZSByZWZlcmVuY2VkIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGJvb2xlYW4gaXNDYXNjYWRlZCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVjODNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL0NvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXh0ZW5zaW9uczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5FbGVtZW50RGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjoge0BsaW5rIENvbnN0cnVjdG9yRGVzY3JpcHRvcn0gaW1wbGVtZW50YXRpb24uPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBFbGVtZW50RGVzY3JpcHRvckltcGwKLSAgICAgIGltcGxlbWVudHMgQ29uc3RydWN0b3JEZXNjcmlwdG9yLCBQcm9jZWR1cmVEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRvcj4gcGFyYW1ldGVyRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhc2NhZGVkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwoTWV0YUJlYW4gbWV0YUJlYW4sIFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucykgewotICAgICAgICBzdXBlcihtZXRhQmVhbiwgbWV0YUJlYW4uZ2V0QmVhbkNsYXNzKCksIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbCBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudENsYXNzCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwoQ2xhc3M8Pz4gZWxlbWVudENsYXNzLCBWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgc3VwZXIoZWxlbWVudENsYXNzLCB2YWxpZGF0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZWQoKSB7Ci0gICAgICAgIHJldHVybiBjYXNjYWRlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZWQoYm9vbGVhbiBjYXNjYWRlZCkgewotICAgICAgICB0aGlzLmNhc2NhZGVkID0gY2FzY2FkZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlckRlc2NyaXB0b3I+IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkgLy9pbmRleCBhbGlnbmVkCi0gICAgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRGVzY3JpcHRvcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kQmVhbkRlc2NyaXB0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZEJlYW5EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWM1MmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kQmVhbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IFByb3ZpZGVzIG1ldGhvZC9jb25zdHJ1Y3Rvci1yZWxhdGVkIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24KLSAqIGZvciBhIHR5cGUuICBUaGlzIGNsYXNzIHdpbGwgZGlzYXBwZWFyIHdoZW4gc3VjaAotICogZnVuY3Rpb25hbGl0eSBpcyBwYXJ0IG9mIHRoZSBKU1IzMDMgc3BlY2lmaWNhdGlvbi48YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEJlYW5EZXNjcmlwdG9yIGV4dGVuZHMgQmVhbkRlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uc3RyYWludHMgdGhhdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgbWV0aG9kLgotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIHtAbGluayBNZXRob2REZXNjcmlwdG9yfQotICAgICAqLwotICAgIE1ldGhvZERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludHNGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbnN0cmFpbnRzIHRoYXQgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvcgotICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN0cnVjdG9yRGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBDb25zdHJ1Y3RvckRlc2NyaXB0b3IgZ2V0Q29uc3RyYWludHNGb3JDb25zdHJ1Y3RvcihDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3Rvcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNldCBvZiBjb25zdHJhaW5lZCBtZXRob2RzLgotICAgICAqIEByZXR1cm4ge0BsaW5rIFNldH0gb2Yge0BsaW5rIE1ldGhvZERlc2NyaXB0b3J9Ci0gICAgICovCi0gICAgU2V0PE1ldGhvZERlc2NyaXB0b3I+IGdldENvbnN0cmFpbmVkTWV0aG9kcygpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzZXQgb2YgY29uc3RyYWluZWQgY29uc3RydWN0b3JzLgotICAgICAqIEByZXR1cm4ge0BsaW5rIFNldH0gb2Yge0BsaW5rIENvbnN0cnVjdG9yRGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBTZXQ8Q29uc3RydWN0b3JEZXNjcmlwdG9yPiBnZXRDb25zdHJhaW5lZENvbnN0cnVjdG9ycygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RCZWFuRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNDgyZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RCZWFuRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwYWNoZUZhY3RvcnlDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQmVhbkRlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IHtAbGluayBNZXRob2RCZWFuRGVzY3JpcHRvcn0gaW1wbGVtZW50YXRpb24uPGJyLz4KLSAqLwotY2xhc3MgTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQmVhbkRlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgTWV0aG9kQmVhbkRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgTWFwPE1ldGhvZCwgTWV0aG9kRGVzY3JpcHRvcj4gbWV0aG9kQ29uc3RyYWludHM7Ci0gICAgcHJpdmF0ZSBNYXA8Q29uc3RydWN0b3I8Pz4sIENvbnN0cnVjdG9yRGVzY3JpcHRvcj4gY29uc3RydWN0b3JDb25zdHJhaW50czsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlDb250ZXh0Ci0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZEJlYW5EZXNjcmlwdG9ySW1wbChBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dCwgTWV0YUJlYW4gbWV0YUJlYW4pIHsKLSAgICAgICAgc3VwZXIoZmFjdG9yeUNvbnRleHQsIG1ldGFCZWFuKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1hcCBvZiBtZXRob2QgY29uc3RyYWludHMgZm9yIHRoaXMgYmVhbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kQ29uc3RyYWludHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25zdHJhaW50cyhNYXA8TWV0aG9kLCBNZXRob2REZXNjcmlwdG9yPiBtZXRob2RDb25zdHJhaW50cykgewotICAgICAgICB0aGlzLm1ldGhvZENvbnN0cmFpbnRzID0gbWV0aG9kQ29uc3RyYWludHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtYXAgb2YgY29uc3RydWN0b3IgY29uc3RyYWludHMgZm9yIHRoaXMgYmVhbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uc3RydWN0b3JDb25zdHJhaW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cnVjdG9yQ29uc3RyYWludHMoTWFwPENvbnN0cnVjdG9yPD8+LCBDb25zdHJ1Y3RvckRlc2NyaXB0b3I+IGNvbnN0cnVjdG9yQ29uc3RyYWludHMpIHsKLSAgICAgICAgdGhpcy5jb25zdHJ1Y3RvckNvbnN0cmFpbnRzID0gY29uc3RydWN0b3JDb25zdHJhaW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0b3IgZ2V0Q29uc3RyYWludHNGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICByZXR1cm4gbWV0aG9kQ29uc3RyYWludHMuZ2V0KG1ldGhvZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJ1Y3RvckRlc2NyaXB0b3IgZ2V0Q29uc3RyYWludHNGb3JDb25zdHJ1Y3RvcihDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvcikgewotICAgICAgICByZXR1cm4gY29uc3RydWN0b3JDb25zdHJhaW50cy5nZXQoY29uc3RydWN0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PE1ldGhvZERlc2NyaXB0b3I+IGdldENvbnN0cmFpbmVkTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PE1ldGhvZERlc2NyaXB0b3I+KG1ldGhvZENvbnN0cmFpbnRzLnZhbHVlcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSB7QGxpbmsgTWV0aG9kRGVzY3JpcHRvcn0gdG8gdGhpcyB7QGxpbmsgTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHBhcmFtIGRlc2MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRNZXRob2REZXNjcmlwdG9yKE1ldGhvZCBtZXRob2QsIE1ldGhvZERlc2NyaXB0b3IgZGVzYykgewotICAgICAgICBtZXRob2RDb25zdHJhaW50cy5wdXQobWV0aG9kLCBkZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFNldDxDb25zdHJ1Y3RvckRlc2NyaXB0b3I+IGdldENvbnN0cmFpbmVkQ29uc3RydWN0b3JzKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q29uc3RydWN0b3JEZXNjcmlwdG9yPih0aGlzLmNvbnN0cnVjdG9yQ29uc3RyYWludHMudmFsdWVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHtAbGluayBDb25zdHJ1Y3RvckRlc2NyaXB0b3J9IHRvIHRoaXMKLSAgICAgKiB7QGxpbmsgTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29ucwotICAgICAqIEBwYXJhbSBkZXNjCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0Q29uc3RydWN0b3JEZXNjcmlwdG9yKENvbnN0cnVjdG9yPD8+IGNvbnMsIENvbnN0cnVjdG9yRGVzY3JpcHRvciBkZXNjKSB7Ci0gICAgICAgIGNvbnN0cnVjdG9yQ29uc3RyYWludHMucHV0KGNvbnMsIGRlc2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uZmlndXJlZCBtZXRob2QgY29uc3RyYWludHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGxpbmsgTWFwfSBvZiB7QGxpbmsgTWV0aG9kfSA6IHtAbGluayBNZXRob2REZXNjcmlwdG9yfQotICAgICAqLwotICAgIHB1YmxpYyBNYXA8TWV0aG9kLCBNZXRob2REZXNjcmlwdG9yPiBnZXRNZXRob2RDb25zdHJhaW50cygpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZENvbnN0cmFpbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uZmlndXJlZCBjb25zdHJ1Y3RvciBjb25zdHJhaW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAbGluayBNYXB9IG9mIHtAbGluayBDb25zdHJ1Y3Rvcn0gOgotICAgICAqICAgICAgICAge0BsaW5rIENvbnN0cnVjdG9yRGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPENvbnN0cnVjdG9yPD8+LCBDb25zdHJ1Y3RvckRlc2NyaXB0b3I+IGdldENvbnN0cnVjdG9yQ29uc3RyYWludHMoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdHJ1Y3RvckNvbnN0cmFpbnRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZERlc2NyaXB0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhNDI4OS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGNsYXNzIHdpbGwgZGlzYXBwZWFyIHdoZW4gc3VjaAotICogZnVuY3Rpb25hbGl0eSBpcyBwYXJ0IG9mIHRoZSBKU1IzMDMgc3BlY2lmaWNhdGlvbi48YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZERlc2NyaXB0b3IgZXh0ZW5kcyBFbGVtZW50RGVzY3JpcHRvciB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgUGFyYW1ldGVyRGVzY3JpcHRvcn1zIGZvciB0aGlzIHtAbGluayBNZXRob2REZXNjcmlwdG9yfS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUGFyYW1ldGVyRGVzY3JpcHRvcn0KLSAgICAgKi8KLSAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0b3I+IGdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7IC8vaW5kZXggYWxpZ25lZAotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGUgcmVmZXJlbmNlZCBtZXRob2Qgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2FzY2FkZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kRGVzY3JpcHRvckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODE0MTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5FbGVtZW50RGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjoge0BsaW5rIE1ldGhvZERlc2NyaXB0b3J9IGltcGxlbWVudGF0aW9uLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2REZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzIE1ldGhvZERlc2NyaXB0b3IsIFByb2NlZHVyZURlc2NyaXB0b3IgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdG9yPiBwYXJhbWV0ZXJEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRvcj4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FzY2FkZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0aG9kRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZERlc2NyaXB0b3JJbXBsKE1ldGFCZWFuIG1ldGFCZWFuLCBWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgc3VwZXIobWV0YUJlYW4sIG1ldGFCZWFuLmdldENsYXNzKCksIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTWV0aG9kRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnRDbGFzcwotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9ucwotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRob2REZXNjcmlwdG9ySW1wbChDbGFzczw/PiBlbGVtZW50Q2xhc3MsIFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucykgewotICAgICAgICBzdXBlcihlbGVtZW50Q2xhc3MsIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRvcj4gZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIC8vIGluZGV4IGFsaWduZWQKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVkKCkgewotICAgICAgICByZXR1cm4gY2FzY2FkZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhc2NhZGVkKGJvb2xlYW4gY2FzY2FkZWQpIHsKLSAgICAgICAgdGhpcy5jYXNjYWRlZCA9IGNhc2NhZGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIHZhbGlkYXRpb25zIHRvIHRoaXMge0BsaW5rIE1ldGhvZERlc2NyaXB0b3JJbXBsfS4KLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbnMKLSAgICAgKi8KLSAgICB2b2lkIGFkZFZhbGlkYXRpb25zKENvbGxlY3Rpb248Q29uc3RyYWludFZhbGlkYXRpb248Pz4+IHZhbGlkYXRpb25zKSB7Ci0gICAgICAgIGdldE11dGFibGVDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5hZGRBbGwodmFsaWRhdGlvbnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZFZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzU2NDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBBcHBlbmRpeCBDLiBQcm9wb3NhbCBmb3IgbWV0aG9kLWxldmVsIHZhbGlkYXRpb24uCi0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyB0aGUgQVBJcyBhZGRlZCB0byBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvci4KLSAqIEl0IGNhbiBiZSByZW1vdmVkIGFzIHNvb24gYXMgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgY29udGFpbnMgdGhlc2UgbWV0aG9kcy4KLSAqIFRoZSBleHRlbnNpb24gaXMgbm90IGEgcGFydCBvZiB0aGUgSlNSMzAzIGNvcmUgc3BlY2lmaWNhdGlvbiB5ZXQsIGJ1dCBjb3VsZAotICogYmUgaW4gYSBmdXR1cmUgcmV2aXNpb24uPGJyLz4KLSAqIFlvdSBjYW4gYWNjZXNzIHRoZSBleHRlbnNpb24gdmlhIHRoZSB1c2Ugb2YgdGhlIFZhbGlkYXRvci51bndyYXAoKSBtZXRob2QuPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgewotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGVhY2ggcGFyYW1ldGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBkZXNjcmliZWQgb24KLSAgICAgKiB0aGUgcGFyYW1ldGVycyBvZiA8Y29kZT5tZXRob2Q8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6ICAgICAgICAgICBjbGFzcyBob3N0aW5nIHRoZSBtZXRob2QKLSAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAgICAgIHRoZSBtZXRob2Qgd2hvc2UgcGFyYW1ldGVycyBhcmUgY3VycmVjdGx5IHZhbGlkYXRlZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJWYWx1ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBtZXRob2QgZm9yIGludm9jYXRpb24KLSAgICAgKiBAcGFyYW0gZ3JvdXBzICAgICAgICAgIGdyb3VwcyB0YXJnZXRlZCBmb3IgdmFsaWRhdGlvbgotICAgICAqIEByZXR1cm4gc2V0IG9mIGNvbnN0cmFpbnQgdmlvbGF0aW9ucwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZG9lcyBub3QgYmVsb25nIHRvIDxjb2RlPlQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIE9iamVjdFtdIGRvZXMgbm90IG1hdGNoIHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0gICAgICovCi0gICAgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVBhcmFtZXRlcnMoQ2xhc3M8VD4gY2xhenosIE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+Li4uIGdyb3Vwcyk7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBkZXNjcmliZWQgb24KLSAgICAgKiB0aGUgcGFyYW1ldGVySW5kZXgtdGggcGFyYW1ldGVyIG9mIDxjb2RlPm1ldGhvZDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogICAgICAgICAgY2xhc3MgaG9zdGluZyB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIG1ldGhvZCAgICAgICAgIHRoZSBtZXRob2Qgd2hvc2UgcGFyYW1ldGVycyBhcmUgY3VycmVjdGx5IHZhbGlkYXRlZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJWYWx1ZSB0aGUgcGFyYW1ldGVyIHZhbHVlIHBhc3NlZCB0byB0aGUgcGFyYW1ldGVySW5kZXgtdCBwYXJhbWV0ZXIgb2YgbWV0aG9kCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4IHBhcmFtZXRlciBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHZhbGlkYXRlZCBpbiBtZXRob2QKLSAgICAgKiBAcGFyYW0gZ3JvdXBzICAgICAgICAgZ3JvdXBzIHRhcmdldGVkIGZvciB2YWxpZGF0aW9uCi0gICAgICogQHJldHVybiBzZXQgb2YgY29uc3RyYWludCB2aW9sYXRpb25zCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG1ldGhvZCBkb2VzIG5vdCBiZWxvbmcgdG8gPGNvZGU+VDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBwYXJhbWV0ZXJJbmRleCBpcyBvdXQgb2YgYm91bmQKLSAgICAgKi8KLSAgICA8VD4gU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+IHZhbGlkYXRlUGFyYW1ldGVyKENsYXNzPFQ+IGNsYXp6LCBNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlclZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtZXRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4uLi4gZ3JvdXBzKTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGVhY2ggcGFyYW1ldGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBkZXNjcmliZWQgb24KLSAgICAgKiA8Y29kZT5tZXRob2Q8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6ICAgICAgICAgY2xhc3MgaG9zdGluZyB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIG1ldGhvZCAgICAgICAgdGhlIG1ldGhvZCB3aG9zZSByZXN1bHQgaXMgdmFsaWRhdGVkCi0gICAgICogQHBhcmFtIHJldHVybmVkVmFsdWUgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgaW52b2NhdGlvbgotICAgICAqIEBwYXJhbSBncm91cHMgICAgICAgIGdyb3VwcyB0YXJnZXRlZCBmb3IgdmFsaWRhdGlvbgotICAgICAqIEByZXR1cm4gc2V0IG9mIGNvbnN0cmFpbnQgdmlvbGF0aW9ucwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZG9lcyBub3QgYmVsb25nIHRvIDxjb2RlPlQ8L2NvZGU+Ci0gICAgICovCi0gICAgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVJldHVybmVkVmFsdWUoQ2xhc3M8VD4gY2xhenosIE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJldHVybmVkVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4uLi4gZ3JvdXBzKTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGVhY2ggcGFyYW1ldGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBkZXNjcmliZWQgb24KLSAgICAgKiB0aGUgcGFyYW1ldGVycyBvZiA8Y29kZT5jb25zdHJ1Y3RvcjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogICAgICAgICAgIGNsYXNzIGhvc3RpbmcgdGhlIGNvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIGNvbnN0cnVjdG9yICAgICB0aGUgY29uc3RydWN0b3Igd2hvc2UgcGFyYW1ldGVycyBhcmUgY29ycmVjdGx5IHZhbGlkYXRlZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJWYWx1ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3IgaW52b2NhdGlvbgotICAgICAqIEBwYXJhbSBncm91cHMgICAgICAgICAgZ3JvdXBzIHRhcmdldGVkIGZvciB2YWxpZGF0aW9uCi0gICAgICogQHJldHVybiBzZXQgb2YgY29uc3RyYWludCB2aW9sYXRpb25zCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IGJlbG9uZyB0byA8Y29kZT5UPC9jb2RlPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBPYmplY3RbXSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlCi0gICAgICovCi0gICAgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVBhcmFtZXRlcnMoQ2xhc3M8VD4gY2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+Li4uIGdyb3Vwcyk7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVyIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBkZXNjcmliZWQgb24KLSAgICAgKiB0aGUgcGFyYW1ldGVySW5kZXgtdGggcGFyYW1ldGVyIG9mIDxjb2RlPmNvbnN0cnVjdG9yPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiAgICAgICAgICBjbGFzcyBob3N0aW5nIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvciAgICB0aGUgbWV0aG9kIHdob3NlIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RseSB2YWxpZGF0ZWQKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyVmFsdWUgdGhlIHBhcmFtZXRlciB2YWx1ZSBwYXNzZWQgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckluZGV4LXRoIHBhcmFtZXRlciBvZiBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCBwYXJhbWV0ZXIgaW5kZXggb2YgdGhlIHBhcmFtZXRlciB2YWxpZGF0ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gZ3JvdXBzICAgICAgICAgZ3JvdXBzIHRhcmdldGVkIGZvciB2YWxpZGF0aW9uCi0gICAgICogQHJldHVybiBzZXQgb2YgY29uc3RyYWludCB2aW9sYXRpb25zCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGRvZXMgbm90IGJlbG9uZyB0byA8Y29kZT5UPC9jb2RlPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHByYW1ldGVySW5kZXggaXMgb3V0IG9mIGJvdW5kCi0gICAgICovCi0gICAgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVBhcmFtZXRlcihDbGFzczxUPiBjbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlclZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtZXRlckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4uLi4gZ3JvdXBzKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZFZhbGlkYXRvckltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZFZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiNWIyZi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVGYWN0b3J5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkJlYW5EZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Db25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuR3JvdXBWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5Hcm91cHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlZhbGlkYXRpb25IZWxwZXI7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QtbGV2ZWwtdmFsaWRhdGlvbiA8YnIvPgotICovCi1jbGFzcyBNZXRob2RWYWxpZGF0b3JJbXBsIGV4dGVuZHMgQ2xhc3NWYWxpZGF0b3IgaW1wbGVtZW50cyBNZXRob2RWYWxpZGF0b3IgewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRob2RWYWxpZGF0b3JJbXBsIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5Q29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RWYWxpZGF0b3JJbXBsKEFwYWNoZUZhY3RvcnlDb250ZXh0IGZhY3RvcnlDb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGZhY3RvcnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJlYW5EZXNjcmlwdG9ySW1wbCBjcmVhdGVCZWFuRGVzY3JpcHRvcihNZXRhQmVhbiBtZXRhQmVhbikgewotICAgICAgICBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgZGVzY3JpcHRvciA9IG5ldyBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwoZmFjdG9yeUNvbnRleHQsIG1ldGFCZWFuKTsKLSAgICAgICAgTWV0aG9kVmFsaWRhdG9yTWV0YUJlYW5GYWN0b3J5IGZhY3RvcnkgPSBuZXcgTWV0aG9kVmFsaWRhdG9yTWV0YUJlYW5GYWN0b3J5KGZhY3RvcnlDb250ZXh0KTsKLSAgICAgICAgZmFjdG9yeS5idWlsZE1ldGhvZERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30gZW5oYW5jZW1lbnQ6IG1ldGhvZC1sZXZlbC12YWxpZGF0aW9uIG5vdCB5ZXQgY29tcGxldGx5Ci0gICAgICogaW1wbGVtZW50ZWQKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIGV4YW1wbGU6Ci0gICAgICogPGNvZGU+Ci0gICAgICogcHVibGljIEBOb3ROdWxsIFN0cmluZyBzYXZlSXRlbShAVmFsaWQgQE5vdE51bGwgSXRlbSBpdGVtLCBATWF4KDIzKSBCaWdEZWNpbWFsCi0gICAgICogPC9jb2RlPgotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIHNwZWM6IFRoZSBjb25zdHJhaW50cyBkZWNsYXJhdGlvbnMgZXZhbHVhdGVkIGFyZSB0aGUgY29uc3RyYWludHMgaG9zdGVkCi0gICAgICogb24gdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1ldGhvZCBvciBjb25zdHJ1Y3Rvci4gSWYgQFZhbGlkIGlzIHBsYWNlZCBvbiBhCi0gICAgICogcGFyYW1ldGVyLCBjb25zdHJhaW50cyBkZWNsYXJlZCBvbiB0aGUgb2JqZWN0IGl0c2VsZiBhcmUgY29uc2lkZXJlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGVuaGFuY2VtZW50OiBpZiB0aGUgbWV0aG9kIGRvZXMgbm90IGJlbG9uZyB0byA8Y29kZT5UPC9jb2RlPgotICAgICAqICAgICAgICAgICAgIG9yIGlmIHRoZSBPYmplY3RbXSBkb2VzIG5vdCBtYXRjaCB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICAgICAqLwotICAgIHB1YmxpYyA8VD4gU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+IHZhbGlkYXRlUGFyYW1ldGVycyhDbGFzczxUPiBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gcGFyYW1ldGVycywKLSAgICAgICAgQ2xhc3M8Pz4uLi4gZ3JvdXBBcnJheSkgewotICAgICAgICBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgYmVhbkRlc2MgPSAoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsKSBnZXRDb25zdHJhaW50c0ZvckNsYXNzKGNsYXp6KTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRvckltcGwgbWV0aG9kRGVzY3JpcHRvciA9IChNZXRob2REZXNjcmlwdG9ySW1wbCkgYmVhbkRlc2MuZ2V0Q29uc3RyYWludHNGb3JNZXRob2QobWV0aG9kKTsKLSAgICAgICAgaWYgKG1ldGhvZERlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiICsgbWV0aG9kICsgIiBkb2Vzbid0IGJlbG9uZyB0byBjbGFzcyAiICsgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZVBhcmFtZXRlcnMobWV0aG9kRGVzY3JpcHRvci5nZXRNZXRhQmVhbigpLCBtZXRob2REZXNjcmlwdG9yLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCksCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLCBncm91cEFycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVQYXJhbWV0ZXIoQ2xhc3M8VD4gY2xhenosIE1ldGhvZCBtZXRob2QsIE9iamVjdCBwYXJhbWV0ZXIsCi0gICAgICAgIGludCBwYXJhbWV0ZXJJbmRleCwgQ2xhc3M8Pz4uLi4gZ3JvdXBBcnJheSkgewotICAgICAgICBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgYmVhbkRlc2MgPSAoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsKSBnZXRDb25zdHJhaW50c0ZvckNsYXNzKGNsYXp6KTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRvckltcGwgbWV0aG9kRGVzY3JpcHRvciA9IChNZXRob2REZXNjcmlwdG9ySW1wbCkgYmVhbkRlc2MuZ2V0Q29uc3RyYWludHNGb3JNZXRob2QobWV0aG9kKTsKLSAgICAgICAgaWYgKG1ldGhvZERlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiICsgbWV0aG9kICsgIiBkb2Vzbid0IGJlbG9uZyB0byBjbGFzcyAiICsgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0b3JJbXBsIHBhcmFtRGVzYyA9Ci0gICAgICAgICAgICAoUGFyYW1ldGVyRGVzY3JpcHRvckltcGwpIG1ldGhvZERlc2NyaXB0b3IuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKS5nZXQocGFyYW1ldGVySW5kZXgpOwotICAgICAgICByZXR1cm4gdmFsaWRhdGVQYXJhbWV0ZXIocGFyYW1EZXNjLCBwYXJhbWV0ZXIsIGdyb3VwQXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVBhcmFtZXRlcnMoQ2xhc3M8VD4gY2xhenosIENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yLAotICAgICAgICBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzczw/Pi4uLiBncm91cEFycmF5KSB7Ci0gICAgICAgIE1ldGhvZEJlYW5EZXNjcmlwdG9ySW1wbCBiZWFuRGVzYyA9IChNZXRob2RCZWFuRGVzY3JpcHRvckltcGwpIGdldENvbnN0cmFpbnRzRm9yQ2xhc3MoY2xhenopOwotICAgICAgICBDb25zdHJ1Y3RvckRlc2NyaXB0b3JJbXBsIGNvbnN0cnVjdG9yRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAoQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbCkgYmVhbkRlc2MuZ2V0Q29uc3RyYWludHNGb3JDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7Ci0gICAgICAgIGlmIChjb25zdHJ1Y3RvckRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNvbnN0cnVjdG9yICIgKyBjb25zdHJ1Y3RvciArICIgZG9lc24ndCBiZWxvbmcgdG8gY2xhc3MgIiArIGNsYXp6KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdGVQYXJhbWV0ZXJzKGNvbnN0cnVjdG9yRGVzY3JpcHRvci5nZXRNZXRhQmVhbigpLCBjb25zdHJ1Y3RvckRlc2NyaXB0b3IuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKSwKLSAgICAgICAgICAgIHBhcmFtZXRlcnMsIGdyb3VwQXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVBhcmFtZXRlcihDbGFzczxUPiBjbGF6eiwgQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IsCi0gICAgICAgIE9iamVjdCBwYXJhbWV0ZXIsIGludCBwYXJhbWV0ZXJJbmRleCwgQ2xhc3M8Pz4uLi4gZ3JvdXBBcnJheSkgewotICAgICAgICBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgYmVhbkRlc2MgPSAoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsKSBnZXRDb25zdHJhaW50c0ZvckNsYXNzKGNsYXp6KTsKLSAgICAgICAgQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbCBjb25zdHJ1Y3RvckRlc2NyaXB0b3IgPQotICAgICAgICAgICAgKENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwpIGJlYW5EZXNjLmdldENvbnN0cmFpbnRzRm9yQ29uc3RydWN0b3IoY29uc3RydWN0b3IpOwotICAgICAgICBpZiAoY29uc3RydWN0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciAiICsgY29uc3RydWN0b3IgKyAiIGRvZXNuJ3QgYmVsb25nIHRvIGNsYXNzICIgKyBjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRvckltcGwgcGFyYW1EZXNjID0KLSAgICAgICAgICAgIChQYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbCkgY29uc3RydWN0b3JEZXNjcmlwdG9yLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkuZ2V0KHBhcmFtZXRlckluZGV4KTsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlUGFyYW1ldGVyKHBhcmFtRGVzYywgcGFyYW1ldGVyLCBncm91cEFycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9IElmIEBWYWxpZCBpcyBwbGFjZWQgb24gdGhlIG1ldGhvZCwgdGhlIGNvbnN0cmFpbnRzIGRlY2xhcmVkCi0gICAgICogb24gdGhlIG9iamVjdCBpdHNlbGYgYXJlIGNvbnNpZGVyZWQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVSZXR1cm5lZFZhbHVlKENsYXNzPFQ+IGNsYXp6LCBNZXRob2QgbWV0aG9kLCBPYmplY3QgcmV0dXJuZWRWYWx1ZSwKLSAgICAgICAgQ2xhc3M8Pz4uLi4gZ3JvdXBBcnJheSkgewotICAgICAgICBNZXRob2RCZWFuRGVzY3JpcHRvckltcGwgYmVhbkRlc2MgPSAoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsKSBnZXRDb25zdHJhaW50c0ZvckNsYXNzKGNsYXp6KTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRvckltcGwgbWV0aG9kRGVzY3JpcHRvciA9IChNZXRob2REZXNjcmlwdG9ySW1wbCkgYmVhbkRlc2MuZ2V0Q29uc3RyYWludHNGb3JNZXRob2QobWV0aG9kKTsKLSAgICAgICAgaWYgKG1ldGhvZERlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIk1ldGhvZCAiICsgbWV0aG9kICsgIiBkb2Vzbid0IGJlbG9uZyB0byBjbGFzcyAiICsgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8T2JqZWN0PiBjb250ZXh0ID0KLSAgICAgICAgICAgIGNyZWF0ZUNvbnRleHQobWV0aG9kRGVzY3JpcHRvci5nZXRNZXRhQmVhbigpLCByZXR1cm5lZFZhbHVlLCBudWxsLCBncm91cEFycmF5KTsKLSAgICAgICAgdmFsaWRhdGVSZXR1cm5lZFZhbHVlSW5Db250ZXh0KGNvbnRleHQsIG1ldGhvZERlc2NyaXB0b3IpOwotICAgICAgICBDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPFQ+IHJlc3VsdCA9IChDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPFQ+KSBjb250ZXh0LmdldExpc3RlbmVyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQuZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVQYXJhbWV0ZXJzKE1ldGFCZWFuIG1ldGFCZWFuLAotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0b3I+IHBhcmFtRGVzY3JpcHRvcnMsIE9iamVjdFtdIHBhcmFtZXRlcnMsIENsYXNzPD8+Li4uIGdyb3VwQXJyYXkpIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCB2YWxpZGF0ZSBudWxsIik7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgR3JvdXBWYWxpZGF0aW9uQ29udGV4dDxDb25zdHJhaW50VmFsaWRhdGlvbkxpc3RlbmVyPE9iamVjdFtdPj4gY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRleHQobWV0YUJlYW4sIG51bGwsIG51bGwsIGdyb3VwQXJyYXkpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbCBwYXJhbURlc2MgPSAoUGFyYW1ldGVyRGVzY3JpcHRvckltcGwpIHBhcmFtRGVzY3JpcHRvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEJlYW4ocGFyYW1ldGVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVySW5Db250ZXh0KGNvbnRleHQsIHBhcmFtRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4gcmVzdWx0ID0gKENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4pIGNvbnRleHQuZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWNvdmVyYWJsZVZhbGlkYXRpb25FcnJvcihleCwgcGFyYW1ldGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbnN0cmFpbnRWaW9sYXRpb248VD4+IGVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVQYXJhbWV0ZXIoUGFyYW1ldGVyRGVzY3JpcHRvckltcGwgcGFyYW1EZXNjLCBPYmplY3QgcGFyYW1ldGVyLAotICAgICAgICBDbGFzczw/Pi4uLiBncm91cEFycmF5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBHcm91cFZhbGlkYXRpb25Db250ZXh0PE9iamVjdD4gY29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ29udGV4dChwYXJhbURlc2MuZ2V0TWV0YUJlYW4oKSwgcGFyYW1ldGVyLCBudWxsLCBncm91cEFycmF5KTsKLSAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4gcmVzdWx0ID0gKENvbnN0cmFpbnRWYWxpZGF0aW9uTGlzdGVuZXI8VD4pIGNvbnRleHQuZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVySW5Db250ZXh0KGNvbnRleHQsIHBhcmFtRGVzYyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IHVucmVjb3ZlcmFibGVWYWxpZGF0aW9uRXJyb3IoZXgsIHBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSBjb25zdHJhaW50cyBob3N0ZWQgb24gcGFyYW1ldGVycyBvZiBhIG1ldGhvZAotICAgICAqLwotICAgIHByaXZhdGUgPFQ+IHZvaWQgdmFsaWRhdGVQYXJhbWV0ZXJJbkNvbnRleHQoR3JvdXBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0LCBQYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbCBwYXJhbURlc2MpIHsKLQotICAgICAgICBmaW5hbCBHcm91cHMgZ3JvdXBzID0gY29udGV4dC5nZXRHcm91cHMoKTsKLQotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbnNEZXNjIDogcGFyYW1EZXNjLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpKSB7Ci0gICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdGlvbjw/PiB2YWxpZGF0aW9uID0gKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+KSBjb25zRGVzYzsKLSAgICAgICAgICAgIC8vIDEuIHByb2Nlc3MgZ3JvdXBzCi0gICAgICAgICAgICBmb3IgKEdyb3VwIGN1cnJlbnQgOiBncm91cHMuZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlKGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gMi4gcHJvY2VzcyBzZXF1ZW5jZXMKLSAgICAgICAgICAgIGZvciAoTGlzdDxHcm91cD4gZWFjaFNlcSA6IGdyb3Vwcy5nZXRTZXF1ZW5jZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgY3VycmVudCA6IGVhY2hTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBpZiBvbmUgb2YgdGhlIGdyb3VwIHByb2Nlc3MgaW4gdGhlIHNlcXVlbmNlIGxlYWRzIHRvIG9uZQotICAgICAgICAgICAgICAgICAgICAgKiBvciBtb3JlIHZhbGlkYXRpb24gZmFpbHVyZSwgdGhlIGdyb3VwcyBmb2xsb3dpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHNlcXVlbmNlIG11c3Qgbm90IGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldExpc3RlbmVyKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbURlc2MuaXNDYXNjYWRlZCgpICYmIGNvbnRleHQuZ2V0VmFsaWRhdGVkVmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0Ci0gICAgICAgICAgICAgICAgLnNldE1ldGFCZWFuKGZhY3RvcnlDb250ZXh0LmdldE1ldGFCZWFuRmluZGVyKCkuZmluZEZvckNsYXNzKGNvbnRleHQuZ2V0VmFsaWRhdGVkVmFsdWUoKS5nZXRDbGFzcygpKSk7Ci0gICAgICAgICAgICAvLyAxLiBwcm9jZXNzIGdyb3VwcwotICAgICAgICAgICAgZm9yIChHcm91cCBjdXJyZW50IDogZ3JvdXBzLmdldEdyb3VwcygpKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIG5ldyBKc3IzMDNWYWxpZGF0aW9uQ2FsbGJhY2soY29udGV4dCksIGlzVHJlYXRNYXBzTGlrZUJlYW5zKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gMi4gcHJvY2VzcyBzZXF1ZW5jZXMKLSAgICAgICAgICAgIGZvciAoTGlzdDxHcm91cD4gZWFjaFNlcSA6IGdyb3Vwcy5nZXRTZXF1ZW5jZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgY3VycmVudCA6IGVhY2hTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25IZWxwZXIudmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIG5ldyBKc3IzMDNWYWxpZGF0aW9uQ2FsbGJhY2soY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1RyZWF0TWFwc0xpa2VCZWFucygpKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIGlmIG9uZSBvZiB0aGUgZ3JvdXAgcHJvY2VzcyBpbiB0aGUgc2VxdWVuY2UgbGVhZHMgdG8gb25lCi0gICAgICAgICAgICAgICAgICAgICAqIG9yIG1vcmUgdmFsaWRhdGlvbiBmYWlsdXJlLCB0aGUgZ3JvdXBzIGZvbGxvd2luZyBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogc2VxdWVuY2UgbXVzdCBub3QgYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuZ2V0TGlzdGVuZXIoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSBjb25zdHJhaW50cyBob3N0ZWQgb24gcGFyYW1ldGVycyBvZiBhIG1ldGhvZAotICAgICAqLwotICAgIHByaXZhdGUgPFQ+IHZvaWQgdmFsaWRhdGVSZXR1cm5lZFZhbHVlSW5Db250ZXh0KEdyb3VwVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCwKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRvckltcGwgbWV0aG9kRGVzY3JpcHRvcikgewotCi0gICAgICAgIGZpbmFsIEdyb3VwcyBncm91cHMgPSBjb250ZXh0LmdldEdyb3VwcygpOwotCi0gICAgICAgIGZvciAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gY29uc0Rlc2MgOiBtZXRob2REZXNjcmlwdG9yLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpKSB7Ci0gICAgICAgICAgICBDb25zdHJhaW50VmFsaWRhdGlvbjw/PiB2YWxpZGF0aW9uID0gKENvbnN0cmFpbnRWYWxpZGF0aW9uPD8+KSBjb25zRGVzYzsKLSAgICAgICAgICAgIC8vIDEuIHByb2Nlc3MgZ3JvdXBzCi0gICAgICAgICAgICBmb3IgKEdyb3VwIGN1cnJlbnQgOiBncm91cHMuZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRHcm91cChjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlKGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gMi4gcHJvY2VzcyBzZXF1ZW5jZXMKLSAgICAgICAgICAgIGZvciAoTGlzdDxHcm91cD4gZWFjaFNlcSA6IGdyb3Vwcy5nZXRTZXF1ZW5jZXMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoR3JvdXAgY3VycmVudCA6IGVhY2hTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50R3JvdXAoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGUoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBpZiBvbmUgb2YgdGhlIGdyb3VwIHByb2Nlc3MgaW4gdGhlIHNlcXVlbmNlIGxlYWRzIHRvIG9uZQotICAgICAgICAgICAgICAgICAgICAgKiBvciBtb3JlIHZhbGlkYXRpb24gZmFpbHVyZSwgdGhlIGdyb3VwcyBmb2xsb3dpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHNlcXVlbmNlIG11c3Qgbm90IGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldExpc3RlbmVyKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRob2REZXNjcmlwdG9yLmlzQ2FzY2FkZWQoKSAmJiBjb250ZXh0LmdldFZhbGlkYXRlZFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dAotICAgICAgICAgICAgICAgIC5zZXRNZXRhQmVhbihmYWN0b3J5Q29udGV4dC5nZXRNZXRhQmVhbkZpbmRlcigpLmZpbmRGb3JDbGFzcyhjb250ZXh0LmdldFZhbGlkYXRlZFZhbHVlKCkuZ2V0Q2xhc3MoKSkpOwotICAgICAgICAgICAgLy8gMS4gcHJvY2VzcyBncm91cHMKLSAgICAgICAgICAgIGZvciAoR3JvdXAgY3VycmVudCA6IGdyb3Vwcy5nZXRHcm91cHMoKSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnZhbGlkYXRlQ29udGV4dChjb250ZXh0LCBuZXcgSnNyMzAzVmFsaWRhdGlvbkNhbGxiYWNrKGNvbnRleHQpLCBpc1RyZWF0TWFwc0xpa2VCZWFucygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIDIuIHByb2Nlc3Mgc2VxdWVuY2VzCi0gICAgICAgICAgICBmb3IgKExpc3Q8R3JvdXA+IGVhY2hTZXEgOiBncm91cHMuZ2V0U2VxdWVuY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEdyb3VwIGN1cnJlbnQgOiBlYWNoU2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudEdyb3VwKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uSGVscGVyLnZhbGlkYXRlQ29udGV4dChjb250ZXh0LCBuZXcgSnNyMzAzVmFsaWRhdGlvbkNhbGxiYWNrKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmVhdE1hcHNMaWtlQmVhbnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBpZiBvbmUgb2YgdGhlIGdyb3VwIHByb2Nlc3MgaW4gdGhlIHNlcXVlbmNlIGxlYWRzIHRvIG9uZQotICAgICAgICAgICAgICAgICAgICAgKiBvciBtb3JlIHZhbGlkYXRpb24gZmFpbHVyZSwgdGhlIGdyb3VwcyBmb2xsb3dpbmcgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHNlcXVlbmNlIG11c3Qgbm90IGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldExpc3RlbmVyKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvTWV0aG9kVmFsaWRhdG9yTWV0YUJlYW5GYWN0b3J5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RWYWxpZGF0b3JNZXRhQmVhbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiYjJiMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RWYWxpZGF0b3JNZXRhQmVhbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuVmFsaWRhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVGYWN0b3J5Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwcGVuZFZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Db25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Kc3IzMDNNZXRhQmVhbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuQWNjZXNzU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkNsYXNzVXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBleHRlbnNpb24gdG8gdmFsaWRhdGUgcGFyYW1ldGVycy9yZXR1cm4gdmFsdWVzIG9mCi0gKiBtZXRob2RzL2NvbnN0cnVjdG9ycy48YnIvPgotICovCi0vLyBUT0RPIFJTdCAtIG1vdmUuIHRoaXMgaXMgYW4gb3B0aW9uYWwgbW9kdWxlOiBtb3ZlIHRoZSB3aG9sZSBwYWNrYWdlLiBjb3JlCi0vLyBjb2RlIGhhcyBubyBkZXBlbmRlbmNpZXMgb24gaXQKLXB1YmxpYyBjbGFzcyBNZXRob2RWYWxpZGF0b3JNZXRhQmVhbkZhY3RvcnkgZXh0ZW5kcyBKc3IzMDNNZXRhQmVhbkZhY3RvcnkgewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRob2RWYWxpZGF0b3JNZXRhQmVhbkZhY3RvcnkgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIE1ldGhvZFZhbGlkYXRvck1ldGFCZWFuRmFjdG9yeShBcGFjaGVGYWN0b3J5Q29udGV4dCBmYWN0b3J5Q29udGV4dCkgewotICAgICAgICBzdXBlcihmYWN0b3J5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1ZhbGlkYXRpb25Db25zdHJhaW50c0RlZmluZWQoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluaXNoIGJ1aWxkaW5nIHRoZSBzcGVjaWZpZWQge0BsaW5rIE1ldGhvZEJlYW5EZXNjcmlwdG9ySW1wbH0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1ldGhvZERlc2NyaXB0b3IoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkTWV0aG9kQ29uc3RyYWludHMoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBidWlsZENvbnN0cnVjdG9yQ29uc3RyYWludHMoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZENvbnN0cnVjdG9yQ29uc3RyYWludHMoTWV0aG9kQmVhbkRlc2NyaXB0b3JJbXBsIGJlYW5EZXNjKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJlYW5EZXNjLnNldENvbnN0cnVjdG9yQ29uc3RyYWludHMobmV3IEhhc2hNYXA8Q29uc3RydWN0b3I8Pz4sIENvbnN0cnVjdG9yRGVzY3JpcHRvcj4oKSk7Ci0KLSAgICAgICAgZm9yIChDb25zdHJ1Y3Rvcjw/PiBjb25zIDogYmVhbkRlc2MuZ2V0TWV0YUJlYW4oKS5nZXRCZWFuQ2xhc3MoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpKSB7Ci0gICAgICAgICAgICBpZiAoIWZhY3RvcnlDb250ZXh0LmdldEZhY3RvcnkoKS5nZXRBbm5vdGF0aW9uSWdub3JlcygpLmlzSWdub3JlQW5ub3RhdGlvbnMoY29ucykpIHsKLQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yRGVzY3JpcHRvckltcGwgY29uc0Rlc2MgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RydWN0b3JEZXNjcmlwdG9ySW1wbChiZWFuRGVzYy5nZXRNZXRhQmVhbigpLCBuZXcgVmFsaWRhdGlvblswXSk7Ci0gICAgICAgICAgICAgICAgYmVhbkRlc2MucHV0Q29uc3RydWN0b3JEZXNjcmlwdG9yKGNvbnMsIGNvbnNEZXNjKTsKLQotICAgICAgICAgICAgICAgIEFubm90YXRpb25bXVtdIHBhcmFtc0Fubm9zID0gY29ucy5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgICAgIGludCBpZHggPSAwOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbltdIHBhcmFtQW5ub3MgOiBwYXJhbXNBbm5vcykgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJBY2Nlc3MgYWNjZXNzID0gbmV3IFBhcmFtZXRlckFjY2Vzcyhjb25zLmdldFBhcmFtZXRlclR5cGVzKClbaWR4XSwgaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb25zKGNvbnNEZXNjLCBwYXJhbUFubm9zLCBhY2Nlc3MsIGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZE1ldGhvZENvbnN0cmFpbnRzKE1ldGhvZEJlYW5EZXNjcmlwdG9ySW1wbCBiZWFuRGVzYykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBiZWFuRGVzYy5zZXRNZXRob2RDb25zdHJhaW50cyhuZXcgSGFzaE1hcDxNZXRob2QsIE1ldGhvZERlc2NyaXB0b3I+KCkpOwotCi0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGJlYW5EZXNjLmdldE1ldGFCZWFuKCkuZ2V0QmVhbkNsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmICghZmFjdG9yeUNvbnRleHQuZ2V0RmFjdG9yeSgpLmdldEFubm90YXRpb25JZ25vcmVzKCkuaXNJZ25vcmVBbm5vdGF0aW9ucyhtZXRob2QpKSB7Ci0KLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9ySW1wbCBtZXRob2REZXNjID0gbmV3IE1ldGhvZERlc2NyaXB0b3JJbXBsKGJlYW5EZXNjLmdldE1ldGFCZWFuKCksIG5ldyBWYWxpZGF0aW9uWzBdKTsKLSAgICAgICAgICAgICAgICBiZWFuRGVzYy5wdXRNZXRob2REZXNjcmlwdG9yKG1ldGhvZCwgbWV0aG9kRGVzYyk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgdmFsaWRhdGlvbnMKLSAgICAgICAgICAgICAgICBBcHBlbmRWYWxpZGF0aW9uVG9MaXN0IHZhbGlkYXRpb25zID0gbmV3IEFwcGVuZFZhbGlkYXRpb25Ub0xpc3QoKTsKLSAgICAgICAgICAgICAgICBSZXR1cm5BY2Nlc3MgcmV0dXJuQWNjZXNzID0gbmV3IFJldHVybkFjY2VzcyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ubyA6IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vIGluc3RhbmNlb2YgVmFsaWQgfHwgYW5ubyBpbnN0YW5jZW9mIFZhbGlkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZXNjLnNldENhc2NhZGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb24oYW5ubywgbWV0aG9kRGVzYywgcmV0dXJuQWNjZXNzLCB2YWxpZGF0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0aG9kRGVzYy5hZGRWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucy5nZXRWYWxpZGF0aW9ucygpKTsKLQotICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciB2YWxpZGF0aW9ucwotICAgICAgICAgICAgICAgIEFubm90YXRpb25bXVtdIHBhcmFtc0Fubm9zID0gbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uW10gcGFyYW1Bbm5vcyA6IHBhcmFtc0Fubm9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckFjY2VzcyBhY2Nlc3MgPSBuZXcgUGFyYW1ldGVyQWNjZXNzKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpW2lkeF0sIGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBbm5vdGF0aW9ucyhtZXRob2REZXNjLCBwYXJhbUFubm9zLCBhY2Nlc3MsIGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQW5ub3RhdGlvbnMoUHJvY2VkdXJlRGVzY3JpcHRvciBtZXRob2REZXNjLCBBbm5vdGF0aW9uW10gcGFyYW1Bbm5vcywgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzLAotICAgICAgICBpbnQgaWR4KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFwcGVuZFZhbGlkYXRpb25Ub0xpc3QgdmFsaWRhdGlvbnMgPSBuZXcgQXBwZW5kVmFsaWRhdGlvblRvTGlzdCgpOwotICAgICAgICBib29sZWFuIGNhc2NhZGVkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vIDogcGFyYW1Bbm5vcykgewotICAgICAgICAgICAgaWYgKGFubm8gaW5zdGFuY2VvZiBWYWxpZCB8fCBhbm5vIGluc3RhbmNlb2YgVmFsaWRhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNjYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb2Nlc3NBbm5vdGF0aW9uKGFubm8sIG1ldGhvZERlc2MsIGFjY2VzcywgdmFsaWRhdGlvbnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0b3JJbXBsIHBhcmFtRGVzYyA9Ci0gICAgICAgICAgICBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckltcGwobWV0aG9kRGVzYy5nZXRNZXRhQmVhbigpLCB2YWxpZGF0aW9ucy5nZXRWYWxpZGF0aW9ucygpLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRpb25bdmFsaWRhdGlvbnMuZ2V0VmFsaWRhdGlvbnMoKS5zaXplKCldKSk7Ci0gICAgICAgIHBhcmFtRGVzYy5zZXRJbmRleChpZHgpOwotICAgICAgICBwYXJhbURlc2Muc2V0Q2FzY2FkZWQoY2FzY2FkZWQpOwotICAgICAgICBtZXRob2REZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCkuYWRkKHBhcmFtRGVzYyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8QSBleHRlbmRzIEFubm90YXRpb24+IHZvaWQgcHJvY2Vzc0Fubm90YXRpb24oQSBhbm5vdGF0aW9uLCBQcm9jZWR1cmVEZXNjcmlwdG9yIGRlc2MsCi0gICAgICAgIEFjY2Vzc1N0cmF0ZWd5IGFjY2VzcywgQXBwZW5kVmFsaWRhdGlvbiB2YWxpZGF0aW9ucykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVmFsaWQgfHwgYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFZhbGlkYXRlKSB7Ci0gICAgICAgICAgICBkZXNjLnNldENhc2NhZGVkKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29uc3RyYWludCB2Y0Fubm8gPSBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbihDb25zdHJhaW50LmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh2Y0Fubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3IucHJvY2Vzc0Fubm90YXRpb24oYW5ub3RhdGlvbiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5wcmltaXRpdmVUb1dyYXBwZXIoKENsYXNzPD8+KSBhY2Nlc3MuZ2V0SmF2YVR5cGUoKSksIGFjY2VzcywgdmFsaWRhdGlvbnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBNdWx0aS12YWx1ZWQgY29uc3RyYWludHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzLlZBTFVFLmlzRGVjbGFyZWRPbihhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBjaGlsZHJlbiA9IENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5WQUxVRS5nZXRWYWx1ZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Fubm90YXRpb24oY2hpbGQsIGRlc2MsIGFjY2VzcywgdmFsaWRhdGlvbnMpOyAvLyByZWN1cnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvUGFyYW1ldGVyQWNjZXNzLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9QYXJhbWV0ZXJBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmNWJjMC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9QYXJhbWV0ZXJBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5BY2Nlc3NTdHJhdGVneTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQWNjZXNzU3RyYXRlZ3l9IGZvciBtZXRob2QgcGFyYW1ldGVycy4KLSAqCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJBY2Nlc3MgZXh0ZW5kcyBBY2Nlc3NTdHJhdGVneSB7Ci0KLSAgICBwcml2YXRlIFR5cGUgcGFyYW1UeXBlOwotICAgIHByaXZhdGUgaW50IHBhcmFtSWR4OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFBhcmFtZXRlckFjY2VzcyBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICogQHBhcmFtIHBhcmFtSWR4Ci0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlckFjY2VzcyhUeXBlIHBhcmFtVHlwZSwgaW50IHBhcmFtSWR4ICkgewotICAgICAgICB0aGlzLnBhcmFtVHlwZSA9IHBhcmFtVHlwZTsKLSAgICAgICAgdGhpcy5wYXJhbUlkeCA9IHBhcmFtSWR4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3QgaW5zdGFuY2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPYnRhaW5pbmcgYSBwYXJhbWV0ZXIgdmFsdWUgbm90IHlldCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBFbGVtZW50VHlwZS5QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlIGdldEphdmFUeXBlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJhbVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gIiIgKyBwYXJhbUlkeDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1BhcmFtZXRlckRlc2NyaXB0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1BhcmFtZXRlckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNTc1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9QYXJhbWV0ZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGNsYXNzIHdpbGwgZGlzYXBwZWFyIHdoZW4gc3VjaAotICogZnVuY3Rpb25hbGl0eSBpcyBwYXJ0IG9mIHRoZSBKU1IzMDMgc3BlY2lmaWNhdGlvbi48YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFtZXRlckRlc2NyaXB0b3IgZXh0ZW5kcyBFbGVtZW50RGVzY3JpcHRvciB7Ci0gICAgLyoqCi0gICAgICogSXMgdGhlIHBhcmFtZXRlciBtYXJrZWQgYnkgdGhlIDxjb2RlPkBWYWxpZDwvY29kZT4gYW5ub3RhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2FzY2FkZWQoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIHJlZmVyZW5jZWQgcGFyYW1ldGVyLgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgaW50IGdldEluZGV4KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1BhcmFtZXRlckRlc2NyaXB0b3JJbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9QYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2E5YmYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1BhcmFtZXRlckRlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkVsZW1lbnREZXNjcmlwdG9ySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci0KLQotLyoqCi0gKiBEZXNjcmlwdGlvbjoge0BsaW5rIFBhcmFtZXRlckRlc2NyaXB0b3J9IGltcGxlbWVudGF0aW9uLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVsZW1lbnREZXNjcmlwdG9ySW1wbAotICAgICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FzY2FkZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIG1ldGFCZWFuCi0gICAgICogQHBhcmFtIHZhbGlkYXRpb25zCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0b3JJbXBsKE1ldGFCZWFuIG1ldGFCZWFuLCBWYWxpZGF0aW9uW10gdmFsaWRhdGlvbnMpIHsKLSAgICAgICAgc3VwZXIobWV0YUJlYW4sIG1ldGFCZWFuLmdldENsYXNzKCksIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRvckltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGVsZW1lbnRDbGFzcwotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdG9ySW1wbChDbGFzczw/PiBlbGVtZW50Q2xhc3MsIFZhbGlkYXRpb25bXSB2YWxpZGF0aW9ucykgewotICAgICAgICBzdXBlcihlbGVtZW50Q2xhc3MsIHZhbGlkYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNhc2NhZGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIHRoZSByZWZlcmVuY2VkIHBhcmFtZXRlciBkZXNjcmlwdG9yIHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0gICAgICogQHBhcmFtIGNhc2NhZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FzY2FkZWQoYm9vbGVhbiBjYXNjYWRlZCkgewotICAgICAgICB0aGlzLmNhc2NhZGVkID0gY2FzY2FkZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluZGV4IG9mIHRoZSByZWZlcmVuY2VkIHBhcmFtZXRlci4KLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLSAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1Byb2NlZHVyZURlc2NyaXB0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL1Byb2NlZHVyZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlZjY3NC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9Qcm9jZWR1cmVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBzdXBlcmludGVyZmFjZSBvZiB7QGxpbmsgQ29uc3RydWN0b3JEZXNjcmlwdG9yfSBhbmQge0BsaW5rIE1ldGhvZERlc2NyaXB0b3J9Ljxici8+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2VkdXJlRGVzY3JpcHRvciB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvd25pbmcgbWV0YWJlYW4uCi0gICAgICogQHJldHVybiBNZXRhQmVhbgotICAgICAqLwotICAgIE1ldGFCZWFuIGdldE1ldGFCZWFuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGlzIHByb2NlZHVyZSBzaG91bGQgYmUgdmFsaWRhdGVkLgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgdm9pZCBzZXRDYXNjYWRlZChib29sZWFuIGIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgb2YgdGhpcyBwcm9jZWR1cmUuCi0gICAgICogQHJldHVybiB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFBhcmFtZXRlckRlc2NyaXB0b3J9Ci0gICAgICovCi0gICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdG9yPiBnZXRQYXJhbWV0ZXJEZXNjcmlwdG9ycygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvUmV0dXJuQWNjZXNzLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9SZXR1cm5BY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxYjUyYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9SZXR1cm5BY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5BY2Nlc3NTdHJhdGVneTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEFjY2Vzc1N0cmF0ZWd5fSBmb3IgbWV0aG9kIHJldHVybiB2YWx1ZXMuCi0gKgotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgUmV0dXJuQWNjZXNzIGV4dGVuZHMgQWNjZXNzU3RyYXRlZ3kgewotCi0gICAgcHJpdmF0ZSBUeXBlIHJldHVyblR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgUmV0dXJuQWNjZXNzIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSByZXR1cm5UeXBlCi0gICAgICovCi0gICAgcHVibGljIFJldHVybkFjY2VzcyhUeXBlIHJldHVyblR5cGUpIHsKLSAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGluc3RhbmNlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT2J0YWluaW5nIGEgbWV0aG9kIHJldHVybiB2YWx1ZSBub3QgeWV0IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlLk1FVEhPRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotICAgICAgICByZXR1cm4gIlJldHVybiB2YWx1ZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYTQ4ZWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuT2JqZWN0VXRpbHM7Ci0KLS8qKgotICogSW1tdXRhYmxlIG9iamVjdCB0aGF0IHdyYXBzIGFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBzaW5nbGUgZ3JvdXAuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHcm91cCB7Ci0gICAgLyoqCi0gICAgICogdGhlIERlZmF1bHQgR3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyb3VwIERFRkFVTFQgPSBuZXcgR3JvdXAoRGVmYXVsdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGdyb3VwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEdyb3VwIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBncm91cAotICAgICAqLwotICAgIHB1YmxpYyBHcm91cChDbGFzczw/PiBncm91cCkgewotICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhY3R1YWwgZ3JvdXAgY2xhc3MuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczw/PiBnZXRHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkdyb3VweyIgKyAiZ3JvdXA9IiArIGdyb3VwICsgJ30nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIGdyb3VwIHJlcHJlc2VudGVkIGlzIHRoZSBkZWZhdWx0IGdyb3VwLgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERlZmF1bHQuY2xhc3MuZXF1YWxzKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEdyb3VwID09IGZhbHNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPYmplY3RVdGlscy5lcXVhbHMoZ3JvdXAsICgoR3JvdXApIG8pLmdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChncm91cCAhPSBudWxsID8gZ3JvdXAuaGFzaENvZGUoKSA6IDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBzLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3Vwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUyNTI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cERlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgb3JkZXIgdG8gdmFsaWRhdGUgZ3JvdXBzIGR1cmluZyB2YWxpZGF0aW9uLgotICogd2l0aCBzb21lIGluc3BpcmF0aW9uIGZyb20gcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uCi0gKgotICogQGF1dGhvciBSb21hbiBTdHVtbQotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBzIHsKLSAgICAvKiogVGhlIGxpc3Qgb2Ygc2luZ2xlIGdyb3Vwcy4gKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxHcm91cD4gZ3JvdXBzID0gbmV3IExpbmtlZExpc3Q8R3JvdXA+KCk7Ci0KLSAgICAvKiogVGhlIGxpc3Qgb2Ygc2VxdWVuY2VzLiAqLwotICAgIHByb3RlY3RlZCBMaXN0PExpc3Q8R3JvdXA+PiBzZXF1ZW5jZXMgPSBuZXcgTGlua2VkTGlzdDxMaXN0PEdyb3VwPj4oKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgR3JvdXBzLgotICAgICAqIEByZXR1cm4ge0BsaW5rIExpc3R9IG9mIHtAbGluayBHcm91cH0uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEdyb3VwIHNlcXVlbmNlcy4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIEdyb3VwfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PExpc3Q8R3JvdXA+PiBnZXRTZXF1ZW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBzZXF1ZW5jZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEge0BsaW5rIEdyb3VwfS4KLSAgICAgKiBAcGFyYW0gZ3JvdXAgdG8gaW5zZXJ0Ci0gICAgICovCi0gICAgdm9pZCBpbnNlcnRHcm91cChHcm91cCBncm91cCkgewotICAgICAgICBpZiAoIWdyb3Vwcy5jb250YWlucyhncm91cCkpIHsKLSAgICAgICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEgc2VxdWVuY2UuCi0gICAgICogQHBhcmFtIGdyb3VwcyB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIEdyb3VwfSB0byBpbnNlcnQKLSAgICAgKi8KLSAgICB2b2lkIGluc2VydFNlcXVlbmNlKExpc3Q8R3JvdXA+IGdyb3VwcykgewotICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwgfHwgZ3JvdXBzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzZXF1ZW5jZXMuY29udGFpbnMoZ3JvdXBzKSkgewotICAgICAgICAgICAgc2VxdWVuY2VzLmFkZChncm91cHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzZXJ0IHRoYXQgdGhlIGRlZmF1bHQgZ3JvdXAgY2FuIGJlIGV4cGFuZGVkIHRvIDxjb2RlPmRlZmF1bHRHcm91cHM8L2NvZGU+LgotICAgICAqIEBwYXJhbSBkZWZhdWx0R3JvdXBzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGUoTGlzdDxHcm91cD4gZGVmYXVsdEdyb3VwcykgewotICAgICAgICBmb3IgKExpc3Q8R3JvdXA+IGdyb3VwTGlzdCA6IHNlcXVlbmNlcykgewotICAgICAgICAgICAgaW50IGlkeCA9IGdyb3VwTGlzdC5pbmRleE9mKEdyb3VwLkRFRkFVTFQpOwotICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGVuc3VyZUV4cGFuZGFibGUoZ3JvdXBMaXN0LCBkZWZhdWx0R3JvdXBzLCBpZHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4cGFuZGFibGUoTGlzdDxHcm91cD4gZ3JvdXBMaXN0LCBMaXN0PEdyb3VwPiBkZWZhdWx0R3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0R3JvdXBJbmRleCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRHcm91cExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gZGVmYXVsdEdyb3VwTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAuaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdGhlIGRlZmF1bHQgZ3JvdXAgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlcGxhY2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGdyb3VwTGlzdAotICAgICAgICAgICAgICAgICAgLmluZGV4T2YoZ3JvdXApOyAvLyBzZXF1ZW5jZSBjb250YWlucyBncm91cCBvZiBkZWZhdWx0IGdyb3VwIHNlcXVlbmNlCi0gICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWYgZ3JvdXAgaXMgbm90IGluIHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBpbmRleCA9PSBkZWZhdWx0R3JvdXBJbmRleCAtIDEpIHx8Ci0gICAgICAgICAgICAgICAgICAoaSA9PSBkZWZhdWx0R3JvdXBMaXN0LnNpemUoKSAtIDEgJiYgaW5kZXggPT0gZGVmYXVsdEdyb3VwSW5kZXggKyAxKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBoZSBkZWZhdWx0R3JvdXBTZXF1ZW5jZSBhbmQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyBhcmUgZWl0aGVyIGRpcmVjdGx5IGJlZm9yZSBvciBhZnRlciB3ZSBjYW4gY29udGludWUsCi0gICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYmFzaWNhbGx5IGhhdmUgdHdvIGdyb3VwcwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEdyb3VwRGVmaW5pdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGV4cGFuZCBkZWZhdWx0IGdyb3VwIGxpc3QiICsKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHRHcm91cExpc3QgKyAiIGludG8gc2VxdWVuY2UgIiArIGdyb3VwTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3Vwc0NvbXB1dGVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3Vwc0NvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yjg4MDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9Hcm91cHNDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogY29tcHV0ZSBncm91cCBvcmRlciwgYmFzZWQgb24gdGhlIFJJIGJlaGF2aW9yIGFzIHRvIGd1YXJhbnRlZQotICogY29tcGF0aWJpbGl0eSB3aXRoIGludGVycHJldGF0aW9ucyBvZiB0aGUgc3BlYy48YnIvPgotICogSW1wbGVtZW50YXRpb24gaXMgdGhyZWFkLXNhZmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cHNDb21wdXRlciB7Ci0gICAgLyoqIFRoZSBkZWZhdWx0IGdyb3VwIGFycmF5IHVzZWQgaW4gY2FzZSBhbnkgb2YgdGhlIHZhbGlkYXRlIG1ldGhvZHMgaXMgY2FsbGVkIHdpdGhvdXQgYSBncm91cC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm91cHMgREVGQVVMVF9HUk9VUFM7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBERUZBVUxUX0dST1VQUyA9IG5ldyBHcm91cHNDb21wdXRlcigpLmNvbXB1dGVHcm91cHMoQXJyYXlzLmFzTGlzdChnZXREZWZhdWx0R3JvdXBBcnJheSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IGdyb3VwIGFycmF5LgotICAgICAqIEByZXR1cm4gPGNvZGU+e0BsaW5rIERlZmF1bHR9LmNsYXNzPC9jb2RlPiBvbmx5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzczw/PltdIGdldERlZmF1bHRHcm91cEFycmF5KCkgewotICAgICAgICByZXR1cm4gbmV3IENsYXNzPD8+W10geyBEZWZhdWx0LmNsYXNzIH07Ci0gICAgfQotCi0gICAgLyoqIGNhY2hpbmcgcmVzb2x2ZWQgZ3JvdXBzIGluIGEgdGhyZWFkLXNhZmUgbWFwLiAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBMaXN0PEdyb3VwPj4gcmVzb2x2ZWRTZXF1ZW5jZXMgPSBDb2xsZWN0aW9ucwotICAgICAgICAuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPENsYXNzPD8+LCBMaXN0PEdyb3VwPj4oKSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21wdXRlIGdyb3VwcyBmcm9tIGFuIGFycmF5IG9mIGdyb3VwIGNsYXNzZXMuCi0gICAgICogQHBhcmFtIGdyb3VwcwotICAgICAqIEByZXR1cm4ge0BsaW5rIEdyb3Vwc30KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBzIGNvbXB1dGVHcm91cHMoQ2xhc3M8Pz5bXSBncm91cHMpIHsKLSAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIHBhc3NlZCBhcyBncm91cCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gZ3JvdXBzIGlzIHNwZWNpZmllZCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfR1JPVVBTOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbXB1dGVHcm91cHMoQXJyYXlzLmFzTGlzdChncm91cHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWluIGNvbXB1dGUgaW1wbGVtZW50YXRpb24uCi0gICAgICogQHBhcmFtIGdyb3VwcwotICAgICAqIEByZXR1cm4ge0BsaW5rIEdyb3Vwc30KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgR3JvdXBzIGNvbXB1dGVHcm91cHMoQ29sbGVjdGlvbjxDbGFzczw/Pj4gZ3JvdXBzKSB7Ci0gICAgICAgIGlmIChncm91cHMgPT0gbnVsbCB8fCBncm91cHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBncm91cCBoYXMgdG8gYmUgc3BlY2lmaWVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IGdyb3VwcykgewotICAgICAgICAgICAgaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgIkEgZ3JvdXAgaGFzIHRvIGJlIGFuIGludGVyZmFjZS4gIiArIGNsYXp6LmdldE5hbWUoKSArICIgaXMgbm90LiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXBzIGNoYWluID0gbmV3IEdyb3VwcygpOwotICAgICAgICBmb3IgKENsYXNzPD8+IGNsYXp6IDogZ3JvdXBzKSB7Ci0gICAgICAgICAgICBHcm91cFNlcXVlbmNlIGFubm8gPSBjbGF6ei5nZXRBbm5vdGF0aW9uKEdyb3VwU2VxdWVuY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNsYXp6KTsKLSAgICAgICAgICAgICAgICBjaGFpbi5pbnNlcnRHcm91cChncm91cCk7Ci0gICAgICAgICAgICAgICAgaW5zZXJ0SW5oZXJpdGVkR3JvdXBzKGNsYXp6LCBjaGFpbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluc2VydFNlcXVlbmNlKGNsYXp6LCBhbm5vLCBjaGFpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hhaW47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydEluaGVyaXRlZEdyb3VwcyhDbGFzczw/PiBjbGF6eiwgR3JvdXBzIGNoYWluKSB7Ci0gICAgICAgIGZvciAoQ2xhc3M8Pz4gZXh0ZW5kZWRJbnRlcmZhY2UgOiBjbGF6ei5nZXRJbnRlcmZhY2VzKCkpIHsKLSAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGV4dGVuZGVkSW50ZXJmYWNlKTsKLSAgICAgICAgICAgIGNoYWluLmluc2VydEdyb3VwKGdyb3VwKTsKLSAgICAgICAgICAgIGluc2VydEluaGVyaXRlZEdyb3VwcyhleHRlbmRlZEludGVyZmFjZSwgY2hhaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluc2VydFNlcXVlbmNlKENsYXNzPD8+IGNsYXp6LCBHcm91cFNlcXVlbmNlIGFubm8sIEdyb3VwcyBjaGFpbikgewotICAgICAgICBMaXN0PEdyb3VwPiBzZXF1ZW5jZTsKLSAgICAgICAgaWYgKHJlc29sdmVkU2VxdWVuY2VzLmNvbnRhaW5zS2V5KGNsYXp6KSkgewotICAgICAgICAgICAgc2VxdWVuY2UgPSByZXNvbHZlZFNlcXVlbmNlcy5nZXQoY2xhenopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VxdWVuY2UgPSByZXNvbHZlU2VxdWVuY2UoY2xhenosIGFubm8sIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpKTsKLSAgICAgICAgfQotICAgICAgICBjaGFpbi5pbnNlcnRTZXF1ZW5jZShzZXF1ZW5jZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PEdyb3VwPiByZXNvbHZlU2VxdWVuY2UoQ2xhc3M8Pz4gZ3JvdXAsIEdyb3VwU2VxdWVuY2Ugc2VxdWVuY2VBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDbGFzczw/Pj4gcHJvY2Vzc2VkU2VxdWVuY2VzKSB7Ci0gICAgICAgIGlmIChwcm9jZXNzZWRTZXF1ZW5jZXMuY29udGFpbnMoZ3JvdXApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uKCJDeWNsaWMgZGVwZW5kZW5jeSBpbiBncm91cHMgZGVmaW5pdGlvbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvY2Vzc2VkU2VxdWVuY2VzLmFkZChncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxHcm91cD4gcmVzb2x2ZWRHcm91cFNlcXVlbmNlID0gbmV3IExpbmtlZExpc3Q8R3JvdXA+KCk7Ci0gICAgICAgIENsYXNzPD8+W10gc2VxdWVuY2VBcnJheSA9IHNlcXVlbmNlQW5ub3RhdGlvbi52YWx1ZSgpOwotICAgICAgICBmb3IgKENsYXNzPD8+IGNsYXp6IDogc2VxdWVuY2VBcnJheSkgewotICAgICAgICAgICAgR3JvdXBTZXF1ZW5jZSBhbm5vID0gY2xhenouZ2V0QW5ub3RhdGlvbihHcm91cFNlcXVlbmNlLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlZEdyb3VwU2VxdWVuY2UuYWRkKG5ldyBHcm91cChjbGF6eikpOyAvLyBncm91cCBwYXJ0IG9mIHNlcXVlbmNlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExpc3Q8R3JvdXA+IHRtcFNlcXVlbmNlID0KLSAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU2VxdWVuY2UoY2xhenosIGFubm8sIHByb2Nlc3NlZFNlcXVlbmNlcyk7ICAvLyByZWN1cnNpb24hCi0gICAgICAgICAgICAgICAgcmVzb2x2ZWRHcm91cFNlcXVlbmNlLmFkZEFsbCh0bXBTZXF1ZW5jZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzb2x2ZWRTZXF1ZW5jZXMucHV0KGdyb3VwLCByZXNvbHZlZEdyb3VwU2VxdWVuY2UpOwotICAgICAgICByZXR1cm4gcmVzb2x2ZWRHcm91cFNlcXVlbmNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9DYWNoaW5nUmVsZXZhbnQuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9DYWNoaW5nUmVsZXZhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5NTAyZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvcmVzb2x2ZXIvQ2FjaGluZ1JlbGV2YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogaW5kaWNhdG9yIGludGVyZmFjZSB0byBsZXQgdGhlIGltcGxlbWVudGF0aW9uIGNob29zZQotICogd2hldGhlciByZXN1bHRzIG9mIHRyYXZlcnNhYmxlIHJlc29sdmVyIHNob3VsZCBiZSBjYWNoZWQuPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoaW5nUmVsZXZhbnQgewotICAgIC8qKgotICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIHJlc3VsdHMgb2YgdGhlIHtAbGluayBUcmF2ZXJzYWJsZVJlc29sdmVyfSBzaG91bGQgYmUgY2FjaGVkLgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIGJvb2xlYW4gbmVlZHNDYWNoaW5nKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvcmVzb2x2ZXIvQ2FjaGluZ1RyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9DYWNoaW5nVHJhdmVyc2FibGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU2NjgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9DYWNoaW5nVHJhdmVyc2FibGVSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENhY2hlIHJlc3VsdHMgb2YgYSBkZWxlZ2F0ZWQgdHJhdmVyc2FibGUgcmVzb3ZsZXIgdG8gb3B0aW1pemUgY2FsbHMKLSAqIEl0IHdvcmtzIG9ubHkgZm9yIGEgc2luZ2xlIHZhbGlkYXRlKiBjYWxsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaWYKLSAqIHRoZSBUcmF2ZXJzYWJsZVJlc29sdmVyIGlzIGFjY2Vzc2VkIGNvbmN1cnJlbnRseQotICogPHAvPgotICogRGF0ZTogMjUuMTEuMjAwOSA8YnIvPgotICogVGltZTogMTM6NTY6MTggPGJyLz4KLSAqCi0gKiBAYXV0aG9yIFJvbWFuIFN0dW1tIChiYXNlZCBvbiB0aGUgY29kZSBvZiBFbW1hbnVlbCBCZXJuYXJkKQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYXZlcnNhYmxlUmVzb2x2ZXIgaW1wbGVtZW50cyBUcmF2ZXJzYWJsZVJlc29sdmVyLCBDYWNoaW5nUmVsZXZhbnQgewotICAgIHByaXZhdGUgVHJhdmVyc2FibGVSZXNvbHZlciBkZWxlZ2F0ZTsKLSAgICBwcml2YXRlIE1hcDxDYWNoZUVudHJ5LCBDYWNoZUVudHJ5PiBjYWNoZSA9IG5ldyBIYXNoTWFwPENhY2hlRW50cnksIENhY2hlRW50cnk+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2hlY2sgd2hldGhlciBjYWNoaW5nIGlzIG5lY2Vzc2FyeSBvbiBhIGdpdmVuIHtAbGluayBUcmF2ZXJzYWJsZVJlc29sdmVyfS4KLSAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBhIENhY2hpbmdUcmF2ZXJzYWJsZVJlc29sdmVyIGlzIHRvIGJlIHVzZWQgZHVyaW5nIHZhbGlkYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZHNDYWNoaW5nKFRyYXZlcnNhYmxlUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgLy8gY2FjaGluZywgaWYgd2UgZG8gbm90IGtub3cgZXhhY3RseQotICAgICAgICByZXR1cm4gIShyZXNvbHZlciBpbnN0YW5jZW9mIENhY2hpbmdSZWxldmFudCkgfHwKLSAgICAgICAgICAgICAgKChDYWNoaW5nUmVsZXZhbnQpIHJlc29sdmVyKS5uZWVkc0NhY2hpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQ2FjaGluZ1RyYXZlcnNhYmxlUmVzb2x2ZXIgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGRlbGVnYXRlCi0gICAgICovCi0gICAgcHVibGljIENhY2hpbmdUcmF2ZXJzYWJsZVJlc29sdmVyKFRyYXZlcnNhYmxlUmVzb2x2ZXIgZGVsZWdhdGUpIHsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIG5lY2Vzc2FyeSwgcmV0dXJuIGEgY2FjaGluZyB3cmFwcGVyIGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBUcmF2ZXJzYWJsZVJlc29sdmVyfS4KLSAgICAgKiBAcGFyYW0gdHJhdmVyc2FibGVSZXNvbHZlcgotICAgICAqIEByZXR1cm4ge0BsaW5rIFRyYXZlcnNhYmxlUmVzb2x2ZXJ9Ci0gICAgICogQHNlZSAjbmVlZHNDYWNoaW5nKFRyYXZlcnNhYmxlUmVzb2x2ZXIpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGNhY2hlRm9yKFRyYXZlcnNhYmxlUmVzb2x2ZXIgdHJhdmVyc2FibGVSZXNvbHZlcikgewotICAgICAgICBpZiAobmVlZHNDYWNoaW5nKHRyYXZlcnNhYmxlUmVzb2x2ZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENhY2hpbmdUcmF2ZXJzYWJsZVJlc29sdmVyKHRyYXZlcnNhYmxlUmVzb2x2ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRyYXZlcnNhYmxlUmVzb2x2ZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByb290QmVhblR5cGUsIFBhdGggcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgQ2FjaGVFbnRyeSBjdXJyZW50TEggPSBuZXcgQ2FjaGVFbnRyeSh0cmF2ZXJzYWJsZU9iamVjdCwgdHJhdmVyc2FibGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgcm9vdEJlYW5UeXBlLCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwgZWxlbWVudFR5cGUpOwotICAgICAgICBDYWNoZUVudHJ5IGNhY2hlZExIID0gY2FjaGUuZ2V0KGN1cnJlbnRMSCk7Ci0gICAgICAgIGlmIChjYWNoZWRMSCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50TEgucmVhY2hhYmxlID0gZGVsZWdhdGUuaXNSZWFjaGFibGUodHJhdmVyc2FibGVPYmplY3QsIHRyYXZlcnNhYmxlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICByb290QmVhblR5cGUsIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LCBlbGVtZW50VHlwZSk7Ci0gICAgICAgICAgICBjYWNoZS5wdXQoY3VycmVudExILCBjdXJyZW50TEgpOwotICAgICAgICAgICAgY2FjaGVkTEggPSBjdXJyZW50TEg7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkTEgucmVhY2hhYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZExILnJlYWNoYWJsZSA9IGRlbGVnYXRlLmlzUmVhY2hhYmxlKHRyYXZlcnNhYmxlT2JqZWN0LCB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgcm9vdEJlYW5UeXBlLCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwgZWxlbWVudFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWRMSC5yZWFjaGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzY2FkYWJsZShPYmplY3QgdHJhdmVyc2FibGVPYmplY3QsIFBhdGguTm9kZSB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByb290QmVhblR5cGUsIFBhdGggcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgIENhY2hlRW50cnkgY3VycmVudExIID0gbmV3IENhY2hlRW50cnkodHJhdmVyc2FibGVPYmplY3QsIHRyYXZlcnNhYmxlUHJvcGVydHksCi0gICAgICAgICAgICAgIHJvb3RCZWFuVHlwZSwgcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsIGVsZW1lbnRUeXBlKTsKLSAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZWRMSCA9IGNhY2hlLmdldChjdXJyZW50TEgpOwotICAgICAgICBpZiAoY2FjaGVkTEggPT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudExILmNhc2NhZGFibGUgPSBkZWxlZ2F0ZS5pc0Nhc2NhZGFibGUodHJhdmVyc2FibGVPYmplY3QsCi0gICAgICAgICAgICAgICAgICB0cmF2ZXJzYWJsZVByb3BlcnR5LCByb290QmVhblR5cGUsIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LCBlbGVtZW50VHlwZSk7Ci0gICAgICAgICAgICBjYWNoZS5wdXQoY3VycmVudExILCBjdXJyZW50TEgpOwotICAgICAgICAgICAgY2FjaGVkTEggPSBjdXJyZW50TEg7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2FjaGVkTEguY2FzY2FkYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWRMSC5jYXNjYWRhYmxlID0gZGVsZWdhdGUuaXNDYXNjYWRhYmxlKHRyYXZlcnNhYmxlT2JqZWN0LCB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgcm9vdEJlYW5UeXBlLCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwgZWxlbWVudFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWRMSC5jYXNjYWRhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NhY2hpbmcoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgIC8vIEkgYW0gdGhlIGNhY2hlLiBEbyBub3QgbmVlZCBjYWNoZSBmb3IgY2FjaGUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRyeSBpbiB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FjaGVFbnRyeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG9iamVjdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXRoLk5vZGUgbm9kZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiB0eXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggcGF0aDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaGFzaENvZGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBCb29sZWFuIHJlYWNoYWJsZTsKLSAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGNhc2NhZGFibGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyBDYWNoZUVudHJ5IGluc3RhbmNlLgotICAgICAgICAgKiBAcGFyYW0gdHJhdmVyc2FibGVPYmplY3QKLSAgICAgICAgICogQHBhcmFtIHRyYXZlcnNhYmxlUHJvcGVydHkKLSAgICAgICAgICogQHBhcmFtIHJvb3RCZWFuVHlwZQotICAgICAgICAgKiBAcGFyYW0gcGF0aFRvVHJhdmVyc2FibGVPYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVsZW1lbnRUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIENhY2hlRW50cnkoT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHJvb3RCZWFuVHlwZSwgUGF0aCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgICAgICB0aGlzLm9iamVjdCA9IHRyYXZlcnNhYmxlT2JqZWN0OwotICAgICAgICAgICAgdGhpcy5ub2RlID0gdHJhdmVyc2FibGVQcm9wZXJ0eTsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHJvb3RCZWFuVHlwZTsKLSAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0OwotICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgICAgICAgICAgdGhpcy5oYXNoQ29kZSA9IGJ1aWxkSGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDYWNoZUVudHJ5IHRoYXQgPSAoQ2FjaGVFbnRyeSkgbzsKLQotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlID09IHRoYXQuZWxlbWVudFR5cGUgJiYgcGF0aC5lcXVhbHModGhhdC5wYXRoKSAmJgotICAgICAgICAgICAgICAgICAgdHlwZS5lcXVhbHModGhhdC50eXBlKSAmJgotICAgICAgICAgICAgICAgICAgIShvYmplY3QgIT0gbnVsbCA/ICFvYmplY3QuZXF1YWxzKHRoYXQub2JqZWN0KSA6IHRoYXQub2JqZWN0ICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICBub2RlLmVxdWFscyh0aGF0Lm5vZGUpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBidWlsZEhhc2hDb2RlKCkgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmhhc2hDb2RlKCkgOiAwOwotICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBub2RlLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHR5cGUuaGFzaENvZGUoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgcGF0aC5oYXNoQ29kZSgpOwotICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBlbGVtZW50VHlwZS5oYXNoQ29kZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvcmVzb2x2ZXIvRGVmYXVsdFRyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9EZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZjMDAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9EZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLkNsYXNzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlByaXZpbGVnZWRBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotCi0vKiogQHNlZSBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXIgKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlciBpbXBsZW1lbnRzIFRyYXZlcnNhYmxlUmVzb2x2ZXIsIENhY2hpbmdSZWxldmFudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoRGVmYXVsdFRyYXZlcnNhYmxlUmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8qKiBDbGFzcyB0byBsb2FkIHRvIGNoZWNrIHdoZXRoZXIgSlBBIDIgaXMgb24gdGhlIGNsYXNzcGF0aC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVVRJTF9DTEFTU05BTUUgPQotICAgICAgICAgICJqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVV0aWwiOwotCi0gICAgLyoqIENsYXNzIHRvIGluc3RhbnRpYXRlIGluIGNhc2UgSlBBIDIgaXMgb24gdGhlIGNsYXNzcGF0aC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0FXQVJFX1RSQVZFUlNBQkxFX1JFU09MVkVSX0NMQVNTTkFNRSA9Ci0gICAgICAgICAgIm9yZy5hcGFjaGUuYnZhbC5qc3IzMDMucmVzb2x2ZXIuSlBBVHJhdmVyc2FibGVSZXNvbHZlciI7Ci0KLQotICAgIHByaXZhdGUgVHJhdmVyc2FibGVSZXNvbHZlciBqcGFUUjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB7Ci0gICAgICAgIGluaXRKcGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByb290QmVhblR5cGUsIFBhdGggcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGpwYVRSID09IG51bGwgfHwganBhVFIuaXNSZWFjaGFibGUodHJhdmVyc2FibGVPYmplY3QsIHRyYXZlcnNhYmxlUHJvcGVydHksCi0gICAgICAgICAgICAgIHJvb3RCZWFuVHlwZSwgcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsIGVsZW1lbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYXNjYWRhYmxlKE9iamVjdCB0cmF2ZXJzYWJsZU9iamVjdCwgUGF0aC5Ob2RlIHRyYXZlcnNhYmxlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHJvb3RCZWFuVHlwZSwgUGF0aCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGpwYVRSID09IG51bGwgfHwganBhVFIuaXNDYXNjYWRhYmxlKHRyYXZlcnNhYmxlT2JqZWN0LCB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICByb290QmVhblR5cGUsIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LCBlbGVtZW50VHlwZSk7Ci0gICAgfQotCi0gICAgLyoqIFRyaWVzIHRvIGxvYWQgZGV0ZWN0IGFuZCBsb2FkIEpQQS4gKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHZvaWQgaW5pdEpwYSgpIHsKLSAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbnMuZ2V0Q2xhc3MoY2xhc3NMb2FkZXIsIFBFUlNJU1RFTkNFX1VUSUxfQ0xBU1NOQU1FKTsKLSAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORVNULCBTdHJpbmcuZm9ybWF0KCJGb3VuZCAlcyBvbiBjbGFzc3BhdGguIiwgUEVSU0lTVEVOQ0VfVVRJTF9DTEFTU05BTUUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORVNULCBTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZmluZCAlcyBvbiBjbGFzc3BhdGguIEFsbCBwcm9wZXJ0aWVzIHdpbGwgcGVyIGRlZmF1bHQgYmUgdHJhdmVyc2FibGUuIiwgUEVSU0lTVEVOQ0VfVVRJTF9DTEFTU05BTUUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVHJhdmVyc2FibGVSZXNvbHZlcj4ganBhQXdhcmVSZXNvbHZlckNsYXNzID0KLSAgICAgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBUcmF2ZXJzYWJsZVJlc29sdmVyPikKLSAgICAgICAgICAgICAgICBDbGFzc1V0aWxzLmdldENsYXNzKGNsYXNzTG9hZGVyLCBKUEFfQVdBUkVfVFJBVkVSU0FCTEVfUkVTT0xWRVJfQ0xBU1NOQU1FLCB0cnVlKTsKLSAgICAgICAgICAgIGpwYVRSID0ganBhQXdhcmVSZXNvbHZlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiSW5zdGFudGlhdGVkIGFuIGluc3RhbmNlIG9mICVzLiIsIEpQQV9BV0FSRV9UUkFWRVJTQUJMRV9SRVNPTFZFUl9DTEFTU05BTUUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5sb2coTGV2ZWwuV0FSTklORywKLQkJCQkJU3RyaW5nLmZvcm1hdCgKLQkJCQkJCQkiVW5hYmxlIHRvIGxvYWQgb3IgaW5zdGFudGlhdGUgSlBBIGF3YXJlIHJlc29sdmVyICVzLiBBbGwgcHJvcGVydGllcyB3aWxsIHBlciBkZWZhdWx0IGJlIHRyYXZlcnNhYmxlLiIsCi0JCQkJCQkJSlBBX0FXQVJFX1RSQVZFUlNBQkxFX1JFU09MVkVSX0NMQVNTTkFNRSwgZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzQ2FjaGluZygpIHsKLSAgICAgICAgcmV0dXJuIGpwYVRSICE9IG51bGwgJiYgQ2FjaGluZ1RyYXZlcnNhYmxlUmVzb2x2ZXIubmVlZHNDYWNoaW5nKGpwYVRSKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCi0gICAgewotICAgICAgcmV0dXJuIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkKLSAgICAgICAgPyBnZXRDbGFzc0xvYWRlcjAoKQotICAgICAgICA6IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXIwKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcjAoKQotICAgIHsKLSAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICByZXR1cm4gKGxvYWRlciAhPSBudWxsKSA/IGxvYWRlciA6IENsYXNzSGVscGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3Jlc29sdmVyL0pQQVRyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9KUEFUcmF2ZXJzYWJsZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOWFjNTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3Jlc29sdmVyL0pQQVRyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotCi0KLS8qKiBAc2VlIGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlciAqLwotcHVibGljIGNsYXNzIEpQQVRyYXZlcnNhYmxlUmVzb2x2ZXIgaW1wbGVtZW50cyBUcmF2ZXJzYWJsZVJlc29sdmVyLCBDYWNoaW5nUmVsZXZhbnQgewotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKE9iamVjdCB0cmF2ZXJzYWJsZU9iamVjdCwgUGF0aC5Ob2RlIHRyYXZlcnNhYmxlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcm9vdEJlYW5UeXBlLCBQYXRoIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB0cmF2ZXJzYWJsZU9iamVjdCA9PSBudWxsIHx8IFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVXRpbCgpCi0gICAgICAgICAgICAgIC5pc0xvYWRlZCh0cmF2ZXJzYWJsZU9iamVjdCwgdHJhdmVyc2FibGVQcm9wZXJ0eS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGFibGUoT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcm9vdEJlYW5UeXBlLCBQYXRoIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNDYWNoaW5nKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8geWVzCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3Jlc29sdmVyL1NpbXBsZVRyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9yZXNvbHZlci9TaW1wbGVUcmF2ZXJzYWJsZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWEzYTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3Jlc29sdmVyL1NpbXBsZVRyYXZlcnNhYmxlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnJlc29sdmVyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdHJhdmVyc2FibGUgcmVzb2x2ZXIgdGhhdCBkb2VzIGFsd2F5cyByZXNvbHZlLjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUcmF2ZXJzYWJsZVJlc29sdmVyIGltcGxlbWVudHMgVHJhdmVyc2FibGVSZXNvbHZlciwgQ2FjaGluZ1JlbGV2YW50IHsKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWNoYWJsZShPYmplY3QgdHJhdmVyc2FibGVPYmplY3QsIFBhdGguTm9kZSB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHJvb3RCZWFuVHlwZSwgUGF0aCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzY2FkYWJsZShPYmplY3QgdHJhdmVyc2FibGVPYmplY3QsIFBhdGguTm9kZSB0cmF2ZXJzYWJsZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByb290QmVhblR5cGUsIFBhdGggcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzQ2FjaGluZygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9DbGFzc0hlbHBlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvQ2xhc3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhZjMwMS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9DbGFzc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQ2xhc3NVdGlsczsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBDb21tb24gb3BlcmF0aW9ucyBvbiBjbGFzc2VzIHRoYXQgZG8gbm90IHJlcXVpcmUgYW4ge0BsaW5rIEFjY2Vzc0NvbnRyb2xsZXJ9LgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0hlbHBlciB7Ci0KLSAgICBwcml2YXRlIENsYXNzSGVscGVyKCkgewotICAgICAgICAvLyBObyBpbnN0YW5jZXMgcGxlYXNlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCB0aGUgbGlzdCB3aXRoIHRoZSBmdWxsIGNsYXNzL2ludGVyZmFjZSBoaWVyYXJjaHkgb2YgdGhlIGdpdmVuIGNsYXNzLgotICAgICAqIExpc3QgaXMgb3JkZXJlZCBmcm9tIHRoZSBtb3N0IHRvIGxlc3Mgc3BlY2lmaWMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFsbENsYXNzZXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGxpc3Qgb2YgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5LgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY2xhc3MsIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSB0byB0cmF2ZXJzZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgZmlsbEZ1bGxDbGFzc0hpZXJhcmNoeUFzTGlzdChMaXN0PENsYXNzPD8+PiBhbGxDbGFzc2VzLCBDbGFzczw/PiBjbGF6eikgewotICAgICAgICBpZiAoY2xhenogPT0gbnVsbCB8fCBjbGF6eiA9PSBPYmplY3QuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWxsQ2xhc3Nlcy5jb250YWlucyhjbGF6eikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhbGxDbGFzc2VzLmFkZChjbGF6eik7Ci0gICAgICAgIGZpbGxGdWxsQ2xhc3NIaWVyYXJjaHlBc0xpc3QoYWxsQ2xhc3NlcywgY2xhenouZ2V0U3VwZXJjbGFzcygpKTsKLSAgICAgICAgZm9yIChDbGFzczw/PiBzdWJDbGFzcyA6IGNsYXp6LmdldEludGVyZmFjZXMoKSkgewotICAgICAgICAgICAgZmlsbEZ1bGxDbGFzc0hpZXJhcmNoeUFzTGlzdChhbGxDbGFzc2VzLCBzdWJDbGFzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi0gICAgICoKLSAgICAgKiBQZXJmb3JtIENsYXNzVXRpbHMuZ2V0Q2xhc3MgZnVuY3Rpb25zIHdpdGggSmF2YSAyIFNlY3VyaXR5IGVuYWJsZWQuCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENsYXNzKGNsYXNzTmFtZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGZvciBzZWN1cml0eSByZWFzb25zLgotICAgICAqCi0gICAgICogUGVyZm9ybSBDbGFzc1V0aWxzLmdldENsYXNzIGZ1bmN0aW9ucyB3aXRoIEphdmEgMiBTZWN1cml0eSBlbmFibGVkLgotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIGluaXRpYWxpemUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQotICAgICAgICAgIGxvYWRlciA9IENsYXNzSGVscGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHJldHVybiBDbGFzc1V0aWxzLmdldENsYXNzKGxvYWRlciwgY2xhc3NOYW1lLCBpbml0aWFsaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Db25zdHJhaW50RGVmaW5pdGlvblZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvQ29uc3RyYWludERlZmluaXRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3YjQ4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Db25zdHJhaW50RGVmaW5pdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWw7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIEludGVybmFsIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbiBvZiBjb25zdHJhaW50Ci0gKiBhbm5vdGF0aW9ucy4KLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludERlZmluaXRpb25WYWxpZGF0b3IgewotCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IHRoZSBjb25zdHJhaW50IGRlZmluaXRpb24gaXMgdmFsaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKiAgICAgICAgICAgIEFuIGFubm90YXRpb24gd2hpY2ggaXMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIENvbnN0cmFpbnR9LgotICAgICAqIEB0aHJvd3MgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJbiBjYXNlIHRoZSBjb25zdHJhaW50IGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ29uc3RyYWludERlZmluaXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5HUk9VUFMudmFsaWRhdGVPbihhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpOwotICAgICAgICBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuUEFZTE9BRC52YWxpZGF0ZU9uKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSk7Ci0gICAgICAgIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5NRVNTQUdFLnZhbGlkYXRlT24oYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKTsKLSAgICAgICAgdmFsaWRBdHRyaWJ1dGVzKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoYXQgdGhlIGFubm90YXRpb24gaGFzIG5vIG1ldGhvZHMgdGhhdCBzdGFydCB3aXRoICJ2YWxpZCIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKiAgICAgICAgICAgIFRoZSBhbm5vdGF0aW9uIHRvIGNoZWNrLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRBdHRyaWJ1dGVzKGZpbmFsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBmaW5hbCBNZXRob2RbXSBtZXRob2RzID0gcnVuKFNlY3VyZUFjdGlvbnMuZ2V0RGVjbGFyZWRNZXRob2RzKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSkpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzICl7Ci0gICAgICAgICAgICAvLyBDdXJyZW50bHkgY2FzZSBpbnNlbnNpdGl2ZSwgdGhlIHNwZWMgaXMgdW5jbGVhciBhYm91dCB0aGlzCi0gICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuc3RhcnRzV2l0aCgidmFsaWQiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkEgY29uc3RyYWludCBhbm5vdGF0aW9uIGNhbm5vdCBoYXZlIG1ldGhvZHMgd2hpY2ggc3RhcnQgd2l0aCAndmFsaWQnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBydW4oUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9FbnVtZXJhdGlvbkNvbnZlcnRlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvRW51bWVyYXRpb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMzk0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9FbnVtZXJhdGlvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi0vKioKLSAqIEEge0Bjb2RlIG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyfSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUKLSAqIEVudW1lcmF0aW9uIHR5cGUuCi0gKgotICogJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW51bWVyYXRpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBDb252ZXJ0ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIHN0YXRpYyBjb252ZXJ0ZXIgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bWVyYXRpb25Db252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRW51bWVyYXRpb25Db252ZXJ0ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBjb252ZXJ0ZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMgY29udmVydGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb25Db252ZXJ0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBJTlNUQU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGNhbid0IGJlIGluc3RhbnRpYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVudW1lcmF0aW9uQ29udmVydGVyKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoQ2xhc3MgdHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICghdHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk9ubHkgZW51bSB0eXBlcyBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOdWxsIHZhbHVlcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTdHJpbmcuY2xhc3MgIT0gdmFsdWUuZ2V0Q2xhc3MoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk9ubHkgamF2YS5sYW5nLlN0cmluZyB2YWx1ZXMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotCi0gICAgICAgIGZpbmFsIENsYXNzPEVudW0+IGVudW1DbGFzcyA9IChDbGFzczxFbnVtPikgdHlwZTsKLSAgICAgICAgcmV0dXJuIEVudW0udmFsdWVPZihlbnVtQ2xhc3MsIHN0cmluZ1ZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL0lPVXRpbHMuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL0lPVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwNjUzYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9JT1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb21tb25zIElPIHV0aWxpdGllcy4KLSAqCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJT1V0aWxzIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgY2FuJ3QgYmUgaW5zdGFudGlhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBJT1V0aWxzKCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgcXVpZXRseSBhIHtAbGluayBDbG9zZWFibGV9IHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbG9zZWFibGUgdGhlIHtAbGluayBDbG9zZWFibGV9IGhhcyB0byBiZSBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShDbG9zZWFibGUgY2xvc2VhYmxlKSB7Ci0gICAgICAgIGlmIChjbG9zZWFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbG9zZWFibGUuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL05vZGVCdWlsZGVyQ3VzdG9taXphYmxlQ29udGV4dEltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL05vZGVCdWlsZGVyQ3VzdG9taXphYmxlQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0MTA0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Ob2RlQnVpbGRlckN1c3RvbWl6YWJsZUNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGw7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTm9kZUJ1aWxkZXJDdXN0b21pemFibGVDb250ZXh0fS48YnIvPgotICovCi1maW5hbCBjbGFzcyBOb2RlQnVpbGRlckN1c3RvbWl6YWJsZUNvbnRleHRJbXBsCi0gICAgICBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVCdWlsZGVyQ3VzdG9taXphYmxlQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwgcGFyZW50OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZTsKLSAgICBwcml2YXRlIGZpbmFsIFBhdGhJbXBsIHByb3BlcnR5UGF0aDsKLSAgICBwcml2YXRlIE5vZGVJbXBsIG5vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTm9kZUJ1aWxkZXJDdXN0b21pemFibGVDb250ZXh0SW1wbCBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gY29udGV4dEltcGwKLSAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgTm9kZUJ1aWxkZXJDdXN0b21pemFibGVDb250ZXh0SW1wbChDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGwgY29udGV4dEltcGwsIFN0cmluZyB0ZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhJbXBsIHBhdGgsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHBhcmVudCA9IGNvbnRleHRJbXBsOwotICAgICAgICBtZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICAgICAgcHJvcGVydHlQYXRoID0gcGF0aDsKLSAgICAgICAgbm9kZSA9IG5ldyBOb2RlSW1wbChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVDb250ZXh0QnVpbGRlciBpbkl0ZXJhYmxlKCkgewotICAgICAgICAvLyBNb2RpZmllcyB0aGUgInByZXZpb3VzIiBub2RlIGluIHRoZSBwYXRoCi0gICAgICAgIG5vZGUuc2V0SW5JdGVyYWJsZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlQ29udGV4dEJ1aWxkZXJJbXBsKHBhcmVudCwgbWVzc2FnZVRlbXBsYXRlLCBwcm9wZXJ0eVBhdGgsIG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQuQ29uc3RyYWludFZpb2xhdGlvbkJ1aWxkZXIuTm9kZUJ1aWxkZXJDdXN0b21pemFibGVDb250ZXh0IGFkZE5vZGUoCi0gICAgICAgICAgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcHJvcGVydHlQYXRoLmFkZE5vZGUobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBuZXcgTm9kZUltcGwobmFtZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOyAvLyBSZS11c2UgdGhpcyBpbnN0YW5jZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgYWRkQ29uc3RyYWludFZpb2xhdGlvbigpIHsKLSAgICAgICAgcHJvcGVydHlQYXRoLmFkZE5vZGUobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBudWxsOwotICAgICAgICBwYXJlbnQuYWRkRXJyb3IobWVzc2FnZVRlbXBsYXRlLCBwcm9wZXJ0eVBhdGgpOwotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL05vZGVCdWlsZGVyRGVmaW5lZENvbnRleHRJbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Ob2RlQnVpbGRlckRlZmluZWRDb250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY2NmMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL05vZGVCdWlsZGVyRGVmaW5lZENvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEltcGw7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTm9kZUJ1aWxkZXJEZWZpbmVkQ29udGV4dH0uPGJyLz4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vZGVCdWlsZGVyRGVmaW5lZENvbnRleHRJbXBsCi0gICAgICBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVCdWlsZGVyRGVmaW5lZENvbnRleHQgewotICAgIHByaXZhdGUgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIHBhcmVudDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXRoSW1wbCBwcm9wZXJ0eVBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTm9kZUJ1aWxkZXJEZWZpbmVkQ29udGV4dEltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGNvbnRleHRJbXBsCi0gICAgICogQHBhcmFtIHRlbXBsYXRlCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUJ1aWxkZXJEZWZpbmVkQ29udGV4dEltcGwoQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIGNvbnRleHRJbXBsLCBTdHJpbmcgdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgIFBhdGhJbXBsIHBhdGgpIHsKLSAgICAgICAgcGFyZW50ID0gY29udGV4dEltcGw7Ci0gICAgICAgIG1lc3NhZ2VUZW1wbGF0ZSA9IHRlbXBsYXRlOwotICAgICAgICBwcm9wZXJ0eVBhdGggPSBwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQuQ29uc3RyYWludFZpb2xhdGlvbkJ1aWxkZXIuTm9kZUJ1aWxkZXJDdXN0b21pemFibGVDb250ZXh0IGFkZE5vZGUoCi0gICAgICAgICAgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gTm9kZSBub3QgeWV0IGFkZGVkLCB3YWl0IHVudGlsIG1vcmUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVpbGRlckN1c3RvbWl6YWJsZUNvbnRleHRJbXBsKHBhcmVudCwgbWVzc2FnZVRlbXBsYXRlLCBwcm9wZXJ0eVBhdGgsIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgYWRkQ29uc3RyYWludFZpb2xhdGlvbigpIHsKLSAgICAgICAgcGFyZW50LmFkZEVycm9yKG1lc3NhZ2VUZW1wbGF0ZSwgcHJvcGVydHlQYXRoKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Ob2RlQ29udGV4dEJ1aWxkZXJJbXBsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9Ob2RlQ29udGV4dEJ1aWxkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWI2YWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvTm9kZUNvbnRleHRCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVDb250ZXh0QnVpbGRlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE5vZGVDb250ZXh0QnVpbGRlcn0uPGJyLz4KLSAqLwotZmluYWwgY2xhc3MgTm9kZUNvbnRleHRCdWlsZGVySW1wbAotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dC5Db25zdHJhaW50VmlvbGF0aW9uQnVpbGRlci5Ob2RlQ29udGV4dEJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIHBhcmVudDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXRoSW1wbCBwcm9wZXJ0eVBhdGg7Ci0gICAgLy8gVGhlIG5hbWUgb2YgdGhlIGxhc3QgImFkZGVkIiBub2RlLCBpdCB3aWxsIG9ubHkgYmUgYWRkZWQgaWYgaXQgaGFzIGEgbm9uLW51bGwgbmFtZQotICAgIC8vIFRoZSBhY3R1YWwgaW5jb3Jwb3JhdGlvbiBpbiB0aGUgcGF0aCB3aWxsIHRha2UgcGxhY2Ugd2hlbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY3VycmVudCBsZWFmIG5vZGUgaXMgY29tcGxldGUKLSAgICBwcml2YXRlIGZpbmFsIE5vZGVJbXBsIG5vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTm9kZUNvbnRleHRCdWlsZGVySW1wbCBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gY29udGV4dEltcGwKLSAgICAgKiBAcGFyYW0gdGVtcGxhdGUKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqLwotICAgIE5vZGVDb250ZXh0QnVpbGRlckltcGwoQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsIGNvbnRleHRJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBsYXRlLCBQYXRoSW1wbCBwYXRoLCBOb2RlSW1wbCBub2RlKSB7Ci0gICAgICAgIHBhcmVudCA9IGNvbnRleHRJbXBsOwotICAgICAgICBtZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZTsKLSAgICAgICAgcHJvcGVydHlQYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVCdWlsZGVyRGVmaW5lZENvbnRleHQgYXRLZXkoCi0gICAgICAgICAgT2JqZWN0IGtleSkgewotICAgICAgICBub2RlLnNldEtleShrZXkpOwotICAgICAgICBwcm9wZXJ0eVBhdGguYWRkTm9kZShub2RlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVpbGRlckRlZmluZWRDb250ZXh0SW1wbChwYXJlbnQsIG1lc3NhZ2VUZW1wbGF0ZSwgcHJvcGVydHlQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVCdWlsZGVyRGVmaW5lZENvbnRleHQgYXRJbmRleCgKLSAgICAgICAgICBJbnRlZ2VyIGluZGV4KSB7Ci0gICAgICAgIG5vZGUuc2V0SW5kZXgoaW5kZXgpOwotICAgICAgICBwcm9wZXJ0eVBhdGguYWRkTm9kZShub2RlKTsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVpbGRlckRlZmluZWRDb250ZXh0SW1wbChwYXJlbnQsIG1lc3NhZ2VUZW1wbGF0ZSwgcHJvcGVydHlQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyLk5vZGVCdWlsZGVyQ3VzdG9taXphYmxlQ29udGV4dCBhZGROb2RlKAotICAgICAgICAgIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHByb3BlcnR5UGF0aC5hZGROb2RlKG5vZGUpOwotICAgICAgICByZXR1cm4gbmV3IE5vZGVCdWlsZGVyQ3VzdG9taXphYmxlQ29udGV4dEltcGwocGFyZW50LCBtZXNzYWdlVGVtcGxhdGUsIHByb3BlcnR5UGF0aCwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBhZGRDb25zdHJhaW50VmlvbGF0aW9uKCkgewotICAgICAgICBwcm9wZXJ0eVBhdGguYWRkTm9kZShub2RlKTsKLSAgICAgICAgcGFyZW50LmFkZEVycm9yKG1lc3NhZ2VUZW1wbGF0ZSwgcHJvcGVydHlQYXRoKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvTm9kZUltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkODUxYWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aC5Ob2RlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogYSBub2RlIChwcm9wZXJ0eSkgYXMgcGFydCBvZiBhIFBhdGguCi0gKiAoSW1wbGVtZW50YXRpb24gYmFzZWQgb24gcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKSA8YnIvPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9kZUltcGwgaW1wbGVtZW50cyBQYXRoLk5vZGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfT1BFTiA9ICJbIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQ0xPU0UgPSAiXSI7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgYSBOb2RlIHRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVpbGRlci4KLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSB0bwotICAgICAqIEByZXR1cm4gdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kTm9kZShOb2RlIG5vZGUsIFN0cmluZ0J1aWxkZXIgdG8pIHsKLSAgICAgICAgaWYgKG5vZGUuaXNJbkl0ZXJhYmxlKCkpIHsKLSAgICAgICAgICAgIHRvLmFwcGVuZChJTkRFWF9PUEVOKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldEluZGV4KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvLmFwcGVuZChub2RlLmdldEluZGV4KCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEtleSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0by5hcHBlbmQobm9kZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0by5hcHBlbmQoSU5ERVhfQ0xPU0UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodG8ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdG8uYXBwZW5kKFBhdGhJbXBsLlBST1BFUlRZX1BBVEhfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvLmFwcGVuZChub2RlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIE5vZGVJbXBsIGluZGV4ZWQgZnJvbSB0aGUgcHJlY2VkaW5nIG5vZGUgKG9yIHJvb3QpLgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gTm9kZUltcGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vZGVJbXBsIGF0SW5kZXgoSW50ZWdlciBpbmRleCkgewotICAgICAgICBOb2RlSW1wbCByZXN1bHQgPSBuZXcgTm9kZUltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldEluZGV4KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBOb2RlSW1wbCBrZXllZCBmcm9tIHRoZSBwcmVjZWRpbmcgbm9kZSAob3Igcm9vdCkuCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEByZXR1cm4gTm9kZUltcGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vZGVJbXBsIGF0S2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgTm9kZUltcGwgcmVzdWx0ID0gbmV3IE5vZGVJbXBsKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRLZXkoa2V5KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbkl0ZXJhYmxlOwotICAgIHByaXZhdGUgSW50ZWdlciBpbmRleDsKLSAgICBwcml2YXRlIE9iamVjdCBrZXk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTm9kZUltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUltcGwoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgTm9kZUltcGwgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKi8KLSAgICBOb2RlSW1wbChQYXRoLk5vZGUgbm9kZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBub2RlLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5pbkl0ZXJhYmxlID0gbm9kZS5pc0luSXRlcmFibGUoKTsKLSAgICAgICAgdGhpcy5pbmRleCA9IG5vZGUuZ2V0SW5kZXgoKTsKLSAgICAgICAgdGhpcy5rZXkgPSBub2RlLmdldEtleSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTm9kZUltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luSXRlcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBpbkl0ZXJhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIHRoaXMgbm9kZSByZXByZXNlbnRzIGEgY29udGFpbmVkIHZhbHVlIG9mIGFuIHtAbGluayBJdGVyYWJsZX0gb3Ige0BsaW5rIE1hcH0uCi0gICAgICogQHBhcmFtIGluSXRlcmFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbkl0ZXJhYmxlKGJvb2xlYW4gaW5JdGVyYWJsZSkgewotICAgICAgICB0aGlzLmluSXRlcmFibGUgPSBpbkl0ZXJhYmxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5kZXggb2YgdGhpcyBub2RlLCBpbXBseWluZyA8Y29kZT5pbkl0ZXJhYmxlPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChJbnRlZ2VyIGluZGV4KSB7Ci0gICAgICAgIGluSXRlcmFibGUgPSB0cnVlOwotICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgICAgIHRoaXMua2V5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtYXAga2V5IG9mIHRoaXMgbm9kZSwgaW1wbHlpbmcgPGNvZGU+aW5JdGVyYWJsZTwvY29kZT4uCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGluSXRlcmFibGUgPSB0cnVlOwotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5pbmRleCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBhcHBlbmROb2RlKHRoaXMsIG5ldyBTdHJpbmdCdWlsZGVyKCkpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBvOwotCi0gICAgICAgIGlmIChpbkl0ZXJhYmxlICE9IG5vZGUuaW5JdGVyYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCAhPSBudWxsID8gIWluZGV4LmVxdWFscyhub2RlLmluZGV4KSA6IG5vZGUuaW5kZXggIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZXkgIT0gbnVsbCA/ICFrZXkuZXF1YWxzKG5vZGUua2V5KSA6IG5vZGUua2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSAhPSBudWxsID8gIW5hbWUuZXF1YWxzKG5vZGUubmFtZSkgOiBub2RlLm5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSBuYW1lICE9IG51bGwgPyBuYW1lLmhhc2hDb2RlKCkgOiAwOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChpbkl0ZXJhYmxlID8gMSA6IDApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChpbmRleCAhPSBudWxsID8gaW5kZXguaGFzaENvZGUoKSA6IDApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChrZXkgIT0gbnVsbCA/IGtleS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvUGF0aEltcGwuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1BhdGhJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODI5ZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvUGF0aEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IG9iamVjdCBob2xkaW5nIHRoZSBwcm9wZXJ0eSBwYXRoIGFzIGEgbGlzdCBvZiBub2Rlcy4KLSAqIChJbXBsZW1lbnRhdGlvbiBwYXJ0aWFsbHkgYmFzZWQgb24gcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKQotICogPGJyLz4KLSAqIFRoaXMgY2xhc3MgaXMgbm90IHN5bmNocm9uaXplZC4KLSAqIAotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoSW1wbCBpbXBsZW1lbnRzIFBhdGgsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEFUSF9TRVBBUkFUT1IgPSAiLiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgbm9uLXJvb3QgcGF0aHMgZnJvbSBleHByZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXRoSW1wbEJ1aWxkZXIgaW1wbGVtZW50cyBQYXRoTmF2aWdhdGlvbi5DYWxsYmFjazxQYXRoSW1wbD4gewotICAgICAgICBQYXRoSW1wbCByZXN1bHQgPSBuZXcgUGF0aEltcGwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVJbmRleE9yS2V5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgLy8gd2l0aCBubyBjb250ZXh0IHRvIGd1aWRlIHVzLCB3ZSBjYW4gb25seSBwYXJzZSBpbnRzIGFuZCBmYWxsIGJhY2sgdG8gU3RyaW5nIGtleXM6Ci0gICAgICAgICAgICBOb2RlSW1wbCBub2RlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub2RlID0gTm9kZUltcGwuYXRJbmRleChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG5vZGUgPSBOb2RlSW1wbC5hdEtleSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkTm9kZShub2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUGF0aEltcGwgcmVzdWx0KCkgewotICAgICAgICAgICAgaWYgKHJlc3VsdC5ub2RlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUdlbmVyaWNJbkl0ZXJhYmxlKCkgewotICAgICAgICAgICAgcmVzdWx0LmFkZE5vZGUoTm9kZUltcGwuYXRJbmRleChudWxsKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxOb2RlPiBub2RlTGlzdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGNvZGUgUGF0aH0gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBwYXRoIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gc3RyaW5nLiBUbyBjcmVhdGUgYSByb290IG5vZGUgdGhlCi0gICAgICogZW1wdHkgc3RyaW5nIHNob3VsZCBiZSBwYXNzZWQuIE5vdGU6IFRoaXMgc2lnbmF0dXJlIGlzIHRvIG1haW50YWluIHBsdWdnYWJpbGl0eSB3aXRoIHRoZSBSSSBpbXBsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eVBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIGFzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFBhdGh9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgcGF0aCBkZXNjcmliZWQgYnkgdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhdGhJbXBsIGNyZWF0ZVBhdGhGcm9tU3RyaW5nKFN0cmluZyBwcm9wZXJ0eVBhdGgpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5UGF0aCA9PSBudWxsIHx8IHByb3BlcnR5UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYXRoTmF2aWdhdGlvbi5uYXZpZ2F0ZUFuZFJldHVybihwcm9wZXJ0eVBhdGgsIG5ldyBQYXRoSW1wbEJ1aWxkZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEge0BsaW5rIFBhdGhJbXBsfSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBQYXRoSW1wbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUGF0aEltcGwgY3JlYXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBhdGhJbXBsIHBhdGggPSBuZXcgUGF0aEltcGwoKTsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9IG5ldyBOb2RlSW1wbChuYW1lKTsKLSAgICAgICAgcGF0aC5hZGROb2RlKG5vZGUpOwotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IGFub3RoZXIgUGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqIEByZXR1cm4gbmV3IHtAbGluayBQYXRoSW1wbH0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhdGhJbXBsIGNvcHkoUGF0aCBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBwYXRoID09IG51bGwgPyBudWxsIDogbmV3IFBhdGhJbXBsKHBhdGgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUGF0aEltcGwoUGF0aCBwYXRoKSB7Ci0gICAgICAgIHRoaXMubm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IGFQYXRoIDogcGF0aCkgewotICAgICAgICAgICAgbm9kZUxpc3QuYWRkKG5ldyBOb2RlSW1wbCgoTm9kZSkgYVBhdGgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUGF0aEltcGwoKSB7Ci0gICAgICAgIG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwotICAgIH0KLQotICAgIHByaXZhdGUgUGF0aEltcGwoTGlzdDxOb2RlPiBub2RlTGlzdCkgewotICAgICAgICB0aGlzLm5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwotICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVMaXN0KSB7Ci0gICAgICAgICAgICB0aGlzLm5vZGVMaXN0LmFkZChuZXcgTm9kZUltcGwobm9kZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGlzIHtAbGluayBQYXRoSW1wbH0gcG9pbnRzIHRvIHRoZSByb290IG9mIGl0cyBncmFwaC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm8gY2hpbGQgbm9kZXMKLSAgICAgKi8KLSAgICAvLyBvdXIgaW1wbGVtZW50YXRpb24gc3RvcmVzIGEgbmFtZWxlc3Mgcm9vdCBub2RlLgotICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdFBhdGgoKSB7Ci0gICAgICAgIGlmIChub2RlTGlzdC5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFBhdGguTm9kZSBmaXJzdCA9IG5vZGVMaXN0LmdldCgwKTsKLSAgICAgICAgcmV0dXJuICFmaXJzdC5pc0luSXRlcmFibGUoKSAmJiBmaXJzdC5nZXROYW1lKCkgPT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBuZXcge0BsaW5rIFBhdGhJbXBsfSB0aGF0IHJlcHJlc2VudHMgPGNvZGU+dGhpczwvY29kZT4gbWludXMgaXRzIGxlYWYgbm9kZSAoaWYgcHJlc2VudCkuCi0gICAgICogCi0gICAgICogQHJldHVybiBQYXRoSW1wbAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoSW1wbCBnZXRQYXRoV2l0aG91dExlYWZOb2RlKCkgewotICAgICAgICBMaXN0PE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPihub2RlTGlzdCk7Ci0gICAgICAgIFBhdGhJbXBsIHBhdGggPSBudWxsOwotICAgICAgICBpZiAobm9kZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgbm9kZXMucmVtb3ZlKG5vZGVzLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoSW1wbChub2Rlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgbm9kZSB0byB0aGlzIHtAbGluayBQYXRoSW1wbH0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE5vZGUoTm9kZSBub2RlKSB7Ci0gICAgICAgIGlmIChpc1Jvb3RQYXRoKCkpIHsKLSAgICAgICAgICAgIG5vZGVMaXN0LnNldCgwLCBub2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vZGVMaXN0LmFkZChub2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuY2Fwc3VsYXRlIHRoZSBub2RlIG1hbmlwdWxhdGlvbnMgbmVlZGVkIHRvIGFkZCBhIG5hbWVkIHByb3BlcnR5IHRvIHRoaXMgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmICghbm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBOb2RlSW1wbCBsZWFmID0gZ2V0TGVhZk5vZGUoKTsKLSAgICAgICAgICAgIGlmIChsZWFmICE9IG51bGwgJiYgbGVhZi5pc0luSXRlcmFibGUoKSAmJiBsZWFmLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGVhZi5zZXROYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGROb2RlKG5ldyBOb2RlSW1wbChuYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpbSB0aGUgbGVhZiBub2RlIGZyb20gdGhpcyB7QGxpbmsgUGF0aEltcGx9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5vZGUgcmVtb3ZlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbm8gbm9kZXMgYXJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlTGVhZk5vZGUoKSB7Ci0gICAgICAgIGlmIChpc1Jvb3RQYXRoKCkgfHwgbm9kZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIG5vZGVzIGluIHBhdGghIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBub2RlTGlzdC5yZW1vdmUobm9kZUxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbm9kZUxpc3QuYWRkKG5ldyBOb2RlSW1wbCgoU3RyaW5nKSBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxlYWYgbm9kZSAoaWYgYW55KSBmcm9tIHRoaXMge0BsaW5rIFBhdGhJbXBsfQotICAgICAqIAotICAgICAqIEByZXR1cm4ge0BsaW5rIE5vZGVJbXBsfQotICAgICAqLwotICAgIHB1YmxpYyBOb2RlSW1wbCBnZXRMZWFmTm9kZSgpIHsKLSAgICAgICAgaWYgKG5vZGVMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE5vZGVJbXBsKSBub2RlTGlzdC5nZXQobm9kZUxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvcjxQYXRoLk5vZGU+IGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbm9kZUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIDxjb2RlPnBhdGg8L2NvZGU+IGlzIGEgcGFyZW50IHRvIDxjb2RlPnRoaXM8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvdXIgbm9kZXMgYmVnaW4gd2l0aCBub2RlcyBlcXVhbCB0byB0aG9zZSBmb3VuZCBpbiA8Y29kZT5wYXRoPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3ViUGF0aE9mKFBhdGggcGF0aCkgewotICAgICAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFBhdGhJbXBsICYmICgoUGF0aEltcGwpIHBhdGgpLmlzUm9vdFBhdGgoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3I8Tm9kZT4gcGF0aEl0ZXIgPSBwYXRoLml0ZXJhdG9yKCk7Ci0gICAgICAgIEl0ZXJhdG9yPE5vZGU+IHRoaXNJdGVyID0gaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBhdGhJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgTm9kZSBwYXRoTm9kZSA9IHBhdGhJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghdGhpc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTm9kZSB0aGlzTm9kZSA9IHRoaXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwYXRoTm9kZS5pc0luSXRlcmFibGUoKSkgewotICAgICAgICAgICAgICAgIGlmICghdGhpc05vZGUuaXNJbkl0ZXJhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGF0aE5vZGUuZ2V0SW5kZXgoKSAhPSBudWxsICYmICFwYXRoTm9kZS5nZXRJbmRleCgpLmVxdWFscyh0aGlzTm9kZS5nZXRJbmRleCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwYXRoTm9kZS5nZXRLZXkoKSAhPSBudWxsICYmICFwYXRoTm9kZS5nZXRLZXkoKS5lcXVhbHModGhpc05vZGUuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNOb2RlLmlzSW5JdGVyYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIGhhdmUgc2hvd24gdGhhdCB0aGUgcHJvcG9zZWQgcGFyZW50IGlzIG5vdAotICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQsIGFuZCB3ZSBhcmUsIHRodXMgdGhlIHBhdGhzIGNhbm5vdCBtYXRjaAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRoTm9kZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBwYXRoTm9kZS5nZXROYW1lKCkuZXF1YWxzKHRoaXNOb2RlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChQYXRoLk5vZGUgbm9kZSA6IHRoaXMpIHsKLSAgICAgICAgICAgIE5vZGVJbXBsLmFwcGVuZE5vZGUobm9kZSwgYnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhdGhJbXBsIHBhdGggPSAoUGF0aEltcGwpIG87Ci0gICAgICAgIHJldHVybiAhKG5vZGVMaXN0ICE9IG51bGwgJiYgIW5vZGVMaXN0LmVxdWFscyhwYXRoLm5vZGVMaXN0KSkgJiYgIShub2RlTGlzdCA9PSBudWxsICYmIHBhdGgubm9kZUxpc3QgIT0gbnVsbCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVMaXN0ICE9IG51bGwgPyBub2RlTGlzdC5oYXNoQ29kZSgpIDogMDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1BhdGhOYXZpZ2F0aW9uLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9QYXRoTmF2aWdhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTFhNDcyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1BhdGhOYXZpZ2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nRXNjYXBlVXRpbHM7Ci0KLS8qKgotICogRGVmaW5lcyBhIHBhdGggbmF2aWdhdGlvbiBhbGdvcml0aG0gYW5kIGEgbWVhbnMgb2YgaW50ZXJhY3Rpbmcgd2l0aCBzYW1lLgotICogCi0gKiBAdmVyc2lvbiAkUmV2OiAxMTM2MjMzICQgJERhdGU6IDIwMTEtMDYtMTUgMTc6NDk6MjcgLTA1MDAgKFdlZCwgMTUgSnVuIDIwMTEpICQKLSAqLwotcHVibGljIGNsYXNzIFBhdGhOYXZpZ2F0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFBhdGggdHJhdmVyc2FsIGNhbGxiYWNrIGZ1bmN0aW9uIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrPFQ+IHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZSBhIC4tZGVsaW1pdGVkIHByb3BlcnR5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgaGFuZGxlUHJvcGVydHkoU3RyaW5nIG5hbWUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIYW5kbGUgYW4gaW5kZXggb3Iga2V5IGVtYmVkZGVkIGluIFtdLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGhhbmRsZUluZGV4T3JLZXkoU3RyaW5nIHZhbHVlKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIGNvbnRpZ3VvdXMgW10uCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGhhbmRsZUdlbmVyaWNJbkl0ZXJhYmxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybiBhIHJlc3VsdC4gQ2FsbGVkIGFmdGVyIG5hdmlnYXRpb24gaXMgY29tcGxldGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHJlc3VsdAotICAgICAgICAgKi8KLSAgICAgICAgVCByZXN1bHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayAicHJvY2VkdXJlIiB0aGF0IGFsd2F5cyByZXR1cm5zIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFja1Byb2NlZHVyZSBpbXBsZW1lbnRzIENhbGxiYWNrPE9iamVjdD4gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IHJlc3VsdCgpIHsKLSAgICAgICAgICAgIGNvbXBsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wbGV0ZSB0aGlzIENhbGxiYWNrUHJvY2VkdXJlLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vb3AuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wbGV0ZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBQYXRoTmF2aWdhdGlvbiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhdGhOYXZpZ2F0aW9uKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5hdmlnYXRlIGEgcGF0aCB1c2luZyB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLCByZXR1cm5pbmcgaXRzIHJlc3VsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIHByb3BlcnR5UGF0aAotICAgICAqICAgICAgICAgICAgLCBudWxsIGlzIGFzc3VtZWQgZW1wdHkvcm9vdAotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqIEByZXR1cm4gVCByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIG5hdmlnYXRlQW5kUmV0dXJuKENoYXJTZXF1ZW5jZSBwcm9wZXJ0eVBhdGgsIENhbGxiYWNrPD8gZXh0ZW5kcyBUPiBjYWxsYmFjaykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2UocHJvcGVydHlQYXRoID09IG51bGwgPyAiIiA6IHByb3BlcnR5UGF0aCwgbmV3IFBhdGhQb3NpdGlvbihjYWxsYmFjaykpOwotICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJpbnZhbGlkIHByb3BlcnR5OiAlcyIsIHByb3BlcnR5UGF0aCksIGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FsbGJhY2sucmVzdWx0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGUgYSBwYXRoIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5UGF0aAotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBuYXZpZ2F0ZShDaGFyU2VxdWVuY2UgcHJvcGVydHlQYXRoLCBDYWxsYmFjazw/PiBjYWxsYmFjaykgewotICAgICAgICBuYXZpZ2F0ZUFuZFJldHVybihwcm9wZXJ0eVBhdGgsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlKENoYXJTZXF1ZW5jZSBwYXRoLCBQYXRoUG9zaXRpb24gcG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxlbiA9IHBhdGgubGVuZ3RoKCk7Ci0gICAgICAgIGJvb2xlYW4gc2VwID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHBvcy5nZXRJbmRleCgpIDwgbGVuKSB7Ci0gICAgICAgICAgICBpbnQgaGVyZSA9IHBvcy5nZXRJbmRleCgpOwotICAgICAgICAgICAgY2hhciBjID0gcGF0aC5jaGFyQXQoaGVyZSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ10nOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiUG9zaXRpb24gJXM6IHVuZXhwZWN0ZWQgJyVzJyIsIGhlcmUsIGMpKTsKLSAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgIGhhbmRsZUluZGV4KHBhdGgsIHBvcy5uZXh0KCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnLic6Ci0gICAgICAgICAgICAgICAgaWYgKHNlcCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlBvc2l0aW9uICVzOiBleHBlY3RlZCBwcm9wZXJ0eSwgaW5kZXgva2V5LCBvciBlbmQgb2YgZXhwcmVzc2lvbiIsIGhlcmUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwb3MubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaDoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJQb3NpdGlvbiAlczogZXhwZWN0ZWQgcHJvcGVydHkgcGF0aCBzZXBhcmF0b3IsIGluZGV4L2tleSwgb3IgZW5kIG9mIGV4cHJlc3Npb24iLCBoZXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcy5oYW5kbGVQcm9wZXJ0eShwYXJzZVByb3BlcnR5KHBhdGgsIHBvcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VwID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm9wZXJ0eShDaGFyU2VxdWVuY2UgcGF0aCwgUGF0aFBvc2l0aW9uIHBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsZW4gPSBwYXRoLmxlbmd0aCgpOwotICAgICAgICBpbnQgc3RhcnQgPSBwb3MuZ2V0SW5kZXgoKTsKLSAgICAgICAgbG9vcDogd2hpbGUgKHBvcy5nZXRJbmRleCgpIDwgbGVuKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhdGguY2hhckF0KHBvcy5nZXRJbmRleCgpKSkgewotICAgICAgICAgICAgY2FzZSAnWyc6Ci0gICAgICAgICAgICBjYXNlICddJzoKLSAgICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MuZ2V0SW5kZXgoKSA+IHN0YXJ0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcGF0aC5zdWJTZXF1ZW5jZShzdGFydCwgcG9zLmdldEluZGV4KCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJQb3NpdGlvbiAlczogZXhwZWN0ZWQgcHJvcGVydHkiLCBzdGFydCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgYW4gaW5kZXgva2V5LiBJZiB0aGUgdGV4dCBjb250YWluZWQgYmV0d2VlbiBbXSBpcyBzdXJyb3VuZGVkIGJ5IGEgcGFpciBvZiAiIG9yICcsIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhCi0gICAgICogc3RyaW5nIHdoaWNoIG1heSBjb250YWluIEphdmEgZXNjYXBlIHNlcXVlbmNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqIEBwYXJhbSBwb3MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlSW5kZXgoQ2hhclNlcXVlbmNlIHBhdGgsIFBhdGhQb3NpdGlvbiBwb3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKLSAgICAgICAgaW50IHN0YXJ0ID0gcG9zLmdldEluZGV4KCk7Ci0gICAgICAgIGlmIChzdGFydCA8IGxlbikgewotICAgICAgICAgICAgY2hhciBmaXJzdCA9IHBhdGguY2hhckF0KHBvcy5nZXRJbmRleCgpKTsKLSAgICAgICAgICAgIGlmIChmaXJzdCA9PSAnIicgfHwgZmlyc3QgPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gcGFyc2VRdW90ZWRTdHJpbmcocGF0aCwgcG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIHBhdGguY2hhckF0KHBvcy5nZXRJbmRleCgpKSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zLmhhbmRsZUluZGV4T3JLZXkocyk7Ci0gICAgICAgICAgICAgICAgICAgIHBvcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBubyBxdW90ZWQgc3RyaW5nOyBtYXRjaCBdIGdyZWVkaWx5Ci0gICAgICAgICAgICB3aGlsZSAocG9zLmdldEluZGV4KCkgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBpbnQgaGVyZSA9IHBvcy5nZXRJbmRleCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmNoYXJBdChoZXJlKSA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmhhbmRsZUdlbmVyaWNJbkl0ZXJhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5oYW5kbGVJbmRleE9yS2V5KHBhdGguc3ViU2VxdWVuY2Uoc3RhcnQsIGhlcmUpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgcG9zLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJQb3NpdGlvbiAlczogdW5wYXJzYWJsZSBpbmRleCIsIHN0YXJ0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcnNlUXVvdGVkU3RyaW5nKENoYXJTZXF1ZW5jZSBwYXRoLCBQYXRoUG9zaXRpb24gcG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxlbiA9IHBhdGgubGVuZ3RoKCk7Ci0gICAgICAgIGludCBzdGFydCA9IHBvcy5nZXRJbmRleCgpOwotICAgICAgICBpZiAoc3RhcnQgPCBsZW4pIHsKLSAgICAgICAgICAgIGNoYXIgcXVvdGUgPSBwYXRoLmNoYXJBdChzdGFydCk7Ci0gICAgICAgICAgICBwb3MubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9zLmdldEluZGV4KCkgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBpbnQgaGVyZSA9IHBvcy5nZXRJbmRleCgpOwotICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIG1hdGNoaW5nIHF1b3RlCi0gICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KGhlcmUpID09IHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB3LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBjb2RlUG9pbnRzID0gU3RyaW5nRXNjYXBlVXRpbHMuVU5FU0NBUEVfSkFWQS50cmFuc2xhdGUocGF0aCwgaGVyZSwgdyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludHMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB3LndyaXRlKENoYXJhY3Rlci50b0NoYXJzKENoYXJhY3Rlci5jb2RlUG9pbnRBdChwYXRoLCBoZXJlKSkpOwotICAgICAgICAgICAgICAgICAgICBwb3MubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29kZVBvaW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3MucGx1cyhDaGFyYWN0ZXIuY2hhckNvdW50KENoYXJhY3Rlci5jb2RlUG9pbnRBdChwYXRoLCBwb3MuZ2V0SW5kZXgoKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHJlYWNoZWQsIHJlc2V0IGR1ZSB0byBubyBlbmRpbmcgcXVvdGUgZm91bmQKLSAgICAgICAgICAgIHBvcy5zZXRJbmRleChzdGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VQb3NpdGlvbi9DYWxsYmFjawotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhdGhQb3NpdGlvbiBleHRlbmRzIFBhcnNlUG9zaXRpb24gaW1wbGVtZW50cyBDYWxsYmFjazxPYmplY3Q+IHsKLSAgICAgICAgZmluYWwgQ2FsbGJhY2s8Pz4gZGVsZWdhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgUGF0aFBvc2l0aW9ufSBpbnN0YW5jZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBkZWxlZ2F0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBQYXRoUG9zaXRpb24oQ2FsbGJhY2s8Pz4gZGVsZWdhdGUpIHsKLSAgICAgICAgICAgIHN1cGVyKDApOwotICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluY3JlbWVudCBhbmQgcmV0dXJuIHRoaXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQYXRoUG9zaXRpb24gbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwbHVzKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluY3JlYXNlIHBvc2l0aW9uIGFuZCByZXR1cm4gdGhpcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBhZGRlbmQKLSAgICAgICAgICogQHJldHVybiB0aGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUGF0aFBvc2l0aW9uIHBsdXMoaW50IGFkZGVuZCkgewotICAgICAgICAgICAgc2V0SW5kZXgoZ2V0SW5kZXgoKSArIGFkZGVuZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgZGVsZWdhdGUuaGFuZGxlUHJvcGVydHkobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICoge0Bpbmhlcml0RG9jfQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlSW5kZXhPcktleShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLmhhbmRsZUluZGV4T3JLZXkodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUdlbmVyaWNJbkl0ZXJhYmxlKCkgewotICAgICAgICAgICAgZGVsZWdhdGUuaGFuZGxlR2VuZXJpY0luSXRlcmFibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlc3VsdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIC8qCi0gICAgICAgICAqIE92ZXJyaWRlIGVxdWFscyB0byBtYWtlIGZpbmRidWdzIGhhcHB5OwotICAgICAgICAgKiB3b3VsZCBzaW1wbHkgaWdub3JlIGJ1dCBkb2Vzbid0IHNlZW0gdG8gYmUgcG9zc2libGUgYXQgdGhlIGlubmVyIGNsYXNzIGxldmVsCi0gICAgICAgICAqIHdpdGhvdXQgYXR0YWNoaW5nIHRoZSBmaWx0ZXIgdG8gdGhlIGNvbnRhaW5pbmcgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIC8qCi0gICAgICAgICAqIE92ZXJyaWRlIGhhc2hDb2RlIHRvIG1ha2UgZmluZGJ1Z3MgaGFwcHkgaW4gdGhlIHByZXNlbmNlIG9mIG92ZXJyaWRkZW4gI2VxdWFscyA6UAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvU2VjdXJlQWN0aW9ucy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvU2VjdXJlQWN0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y1Y2U0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1NlY3VyZUFjdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5Db25maWd1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5Qcml2aWxlZ2VkQWN0aW9uczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdXRpbGl0eSBtZXRob2RzIHRvIHBlcmZvcm0gYWN0aW9ucyB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIgb3Igd2l0aG91dC48YnIvPgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJlQWN0aW9ucyBleHRlbmRzIFByaXZpbGVnZWRBY3Rpb25zIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByaXZpbGVnZWQgYWN0aW9uIHRvIGdldCB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBvZiB0aGUgY3VycmVudCB0aHJlYWQuCi0gICAgICoKLSAgICAgKiBAc2VlIFRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTZWN1cmVBY3Rpb25zLkdldENvbnRleHRDbGFzc0xvYWRlci5pbnN0YW5jZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByaXZpbGVnZWQgYWN0aW9uIHRvIGdldCB0aGUgbmFtZWQgZmllbGQgZGVjbGFyZWQgYnkgdGhlIHNwZWNpZmllZCBjbGFzcy4KLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBhY3Rpb24gd2lsbCBiZSB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXMgbm8gc3VjaCBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248RmllbGQ+IGdldERlY2xhcmVkRmllbGQoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPEZpZWxkPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBGaWVsZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRmllbGQgZiA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzaWJpbGl0eShmKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcml2aWxlZ2VkIGFjdGlvbiB0byBnZXQgYWxsIGZpZWxkcyBkZWNsYXJlZCBieSB0aGUgc3BlY2lmaWVkIGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxGaWVsZFtdPiBnZXREZWNsYXJlZEZpZWxkcyhmaW5hbCBDbGFzczw/PiBjbGF6eikgewotICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRBY3Rpb248RmllbGRbXT4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgRmllbGRbXSBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJsZU9iamVjdC5zZXRBY2Nlc3NpYmxlKGZpZWxkcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJpdmlsZWdlZCBhY3Rpb24gdG8gZ2V0IGFsbCBtZXRob2RzIGRlY2xhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZFtdPiBnZXREZWNsYXJlZE1ldGhvZHMoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKLSAgICAgIC8vIFhYWCAyMDExLTAzLTI3IGp3OiBJbmNvbnNpc3RlbnQgYmVoYXZpb3VyLgotICAgICAgLy8gZG9HZXREZWNsYXJlZEZpZWxkcygpIGlzIHNldHRpbmcgZmllbGRzIGFjY2Vzc2libGUsIGJ1dCBoZXJlIHdlIGRvbid0LgotICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZFtdPigpIHsKLSAgICAgICAgICBwdWJsaWMgTWV0aG9kW10gcnVuKCkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByaXZpbGVnZWQgYWN0aW9uIHRvIGdldCB0aGUgbmFtZWQgbWV0aG9kIGRlY2xhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgY2xhc3MKLSAgICAgKiBvciBieSBvbmUgb2YgaXRzIGFuY2VzdG9ycy4KLSAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBhY3Rpb24gd2lsbCBiZSB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXMgbm8gc3VjaCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZD4gZ2V0UHVibGljTWV0aG9kKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZD4oKSB7Ci0gICAgICAgICAgcHVibGljIE1ldGhvZCBydW4oKSB7Ci0gICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIChDbGFzc1tdKSBudWxsKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRBY2Nlc3NpYmlsaXR5KEZpZWxkIGZpZWxkKSB7Ci0gICAgICAvLyBGSVhNRSAyMDExLTAzLTI3IGp3OgotICAgICAgLy8gLSBXaHkgbm90IHNpbXBseSBjYWxsIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk/Ci0gICAgICAvLyAtIEZpZWxkcyBjYW4gbm90IGJlIGFic3RyYWN0LgotICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSB8fCAoCi0gICAgICAgICAgICAgIE1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSAmJgotICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5pc0Fic3RyYWN0KGZpZWxkLmdldE1vZGlmaWVycygpKSkpIHsKLSAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcml2aWxlZ2VkIGFjdGlvbiBmb3IgQ29uZmlndXJhdGlvbkltcGwuYnVpbGRWYWxpZGF0b3JGYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxWYWxpZGF0b3JGYWN0b3J5PiBkb1ByaXZCdWlsZFZhbGlkYXRvckZhY3RvcnkoZmluYWwgQ29uZmlndXJhdGlvbkltcGwgY29uZmlnKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxWYWxpZGF0b3JGYWN0b3J5PigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBWYWxpZGF0b3JGYWN0b3J5IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmRvUHJpdkJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdldENvbnRleHRDbGFzc0xvYWRlciBleHRlbmRzIE9iamVjdCBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+IHsKLQotICAgICAgc3RhdGljIGZpbmFsIEdldENvbnRleHRDbGFzc0xvYWRlciBpbnN0YW5jZSA9IG5ldyBHZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgcHJpdmF0ZSBHZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQotICAgICAgewotICAgICAgICBzdXBlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgZmluYWwgQ2xhc3NMb2FkZXIgcnVuKCkgewotICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9WYWxpZGF0aW9uQ29udGV4dFRyYXZlcnNhbC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvVmFsaWRhdGlvbkNvbnRleHRUcmF2ZXJzYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MTM5ZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9WYWxpZGF0aW9uQ29udGV4dFRyYXZlcnNhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKLSAqIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YKLSAqIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLkR5bmFtaWNNZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkpzcjMwM01ldGFCZWFuRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLlVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuUGF0aE5hdmlnYXRpb24uQ2FsbGJhY2tQcm9jZWR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkluZGV4ZWRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuS2V5ZWRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuUHJvcGVydHlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLk9iamVjdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5yZWZsZWN0LlR5cGVVdGlsczsKLQotLyoqCi0gKiB7QGxpbmsgVmFsaWRhdGlvbkNvbnRleHR9IHRyYXZlcnNhbCB7QGxpbmsgQ2FsbGJhY2tQcm9jZWR1cmV9LgotICogCi0gKiBAdmVyc2lvbiAkUmV2OiAxMTM3MDc0ICQgJERhdGU6IDIwMTEtMDYtMTcgMTg6MjA6MzAgLTA1MDAgKEZyaSwgMTcgSnVuIDIwMTEpICQKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db250ZXh0VHJhdmVyc2FsIGV4dGVuZHMgQ2FsbGJhY2tQcm9jZWR1cmUgewotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxTYWZlUHJvcGVydHlBY2Nlc3MgZXh0ZW5kcyBQcm9wZXJ0eUFjY2VzcyB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyBOdWxsU2FmZVByb3BlcnR5QWNjZXNzIGluc3RhbmNlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBOdWxsU2FmZVByb3BlcnR5QWNjZXNzKENsYXNzPD8+IGNsYXp6LCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgICAgICBzdXBlcihjbGF6eiwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGJlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiBiZWFuID09IG51bGwgPyBudWxsIDogc3VwZXIuZ2V0KGJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uQ29udGV4dDw/PiB2YWxpZGF0aW9uQ29udGV4dDsKLSAgICBwcml2YXRlIFR5cGUgdHlwZTsKLSAgICBwcml2YXRlIENsYXNzPD8+IHJhd1R5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIFZhbGlkYXRpb25Db250ZXh0VHJhdmVyc2FsfSBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbnRleHRUcmF2ZXJzYWwoVmFsaWRhdGlvbkNvbnRleHQ8Pz4gdmFsaWRhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uQ29udGV4dCA9IHZhbGlkYXRpb25Db250ZXh0OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBmcm9tIHtAbGluayBWYWxpZGF0aW9uQ29udGV4dH0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgdGhpcy5yYXdUeXBlID0gdmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKS5nZXRCZWFuQ2xhc3MoKTsKLSAgICAgICAgdGhpcy50eXBlID0gdGhpcy5yYXdUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVJbmRleE9yS2V5KFN0cmluZyB0b2tlbikgewotICAgICAgICBtb3ZlRG93bklmTmVjZXNzYXJ5KCk7Ci0KLSAgICAgICAgQWNjZXNzU3RyYXRlZ3kgYWNjZXNzOwotICAgICAgICBpZiAoSW5kZXhlZEFjY2Vzcy5nZXRKYXZhRWxlbWVudFR5cGUodHlwZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGluZGV4ID0gdG9rZW4gPT0gbnVsbCA/IG51bGwgOiBJbnRlZ2VyLnZhbHVlT2YodG9rZW4pOwotICAgICAgICAgICAgICAgIGFjY2VzcyA9IG5ldyBJbmRleGVkQWNjZXNzKHR5cGUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5zZXRDdXJyZW50SW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93blByb3BlcnR5RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBwYXJzZSAlcyBhcyBhbiBhcnJheS9pdGVyYWJsZSBpbmRleCIsIHRva2VuKSwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoS2V5ZWRBY2Nlc3MuZ2V0SmF2YUVsZW1lbnRUeXBlKHR5cGUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFjY2VzcyA9IG5ldyBLZXllZEFjY2Vzcyh0eXBlLCB0b2tlbik7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5zZXRDdXJyZW50S2V5KHRva2VuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGRldGVybWluZSBpbmRleC9rZXkgdHlwZSBmb3IgJXMiLCB0eXBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gdmFsaWRhdGlvbkNvbnRleHQuZ2V0QmVhbigpOwotICAgICAgICBPYmplY3QgY2hpbGQgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IGFjY2Vzcy5nZXQodmFsdWUpOwotICAgICAgICBzZXRUeXBlKGNoaWxkID09IG51bGwgPyBhY2Nlc3MuZ2V0SmF2YVR5cGUoKSA6IGNoaWxkLmdldENsYXNzKCkpOwotICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5zZXRCZWFuKGNoaWxkLAotICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKS5yZXNvbHZlTWV0YUJlYW4oY2hpbGQgPT0gbnVsbCA/IHJhd1R5cGUgOiBjaGlsZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVQcm9wZXJ0eShTdHJpbmcgdG9rZW4pIHsKLSAgICAgICAgbW92ZURvd25JZk5lY2Vzc2FyeSgpOwotCi0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0gdmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKTsKLQotICAgICAgICBpZiAobWV0YUJlYW4gaW5zdGFuY2VvZiBEeW5hbWljTWV0YUJlYW4pIHsKLSAgICAgICAgICAgIG1ldGFCZWFuID0gbWV0YUJlYW4ucmVzb2x2ZU1ldGFCZWFuKE9iamVjdFV0aWxzLmRlZmF1bHRJZk51bGwodmFsaWRhdGlvbkNvbnRleHQuZ2V0QmVhbigpLCByYXdUeXBlKSk7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5zZXRNZXRhQmVhbihtZXRhQmVhbik7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0YVByb3BlcnR5IG1wID0gbWV0YUJlYW4uZ2V0UHJvcGVydHkodG9rZW4pOwotICAgICAgICBpZiAobXAgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIGNvdWxkIGluZGljYXRlIGEgcHJvcGVydHkgaG9zdGVkIG9uIGEgc3VwZXJjbGFzczsgc2hvdWxkIHdlIHNodW50IHRoZSBjb250ZXh0IHRyYXZlcnNhbCBkb3duIGEgcGF0aCBiYXNlZCBvbiB0aGF0IHR5cGU/Ci0KLSAgICAgICAgICAgIFByb3BlcnR5QWNjZXNzIGFjY2VzcyA9IG5ldyBQcm9wZXJ0eUFjY2VzcyhyYXdUeXBlLCB0b2tlbik7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzLmlzS25vd24oKSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBoZXJldG9mb3JlIHVua25vd24sIGJ1dCB2YWxpZCwgcHJvcGVydHkgb24gdGhlIGZseToKLSAgICAgICAgICAgICAgICBtcCA9IEpzcjMwM01ldGFCZWFuRmFjdG9yeS5hZGRNZXRhUHJvcGVydHkobWV0YUJlYW4sIGFjY2Vzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duUHJvcGVydHlFeGNlcHRpb24oInVua25vd24gcHJvcGVydHkgJyIgKyB0b2tlbiArICInIGluICIgKyBtZXRhQmVhbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5zZXRNZXRhUHJvcGVydHkobXApOwotICAgICAgICBzZXRUeXBlKG1wLmdldFR5cGUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgd2UgY3VycmVudGx5IGhhdmUgYSBwcm9wZXJ0eSwgbmF2aWdhdGUgdGhlIGNvbnRleHQgc3VjaCB0aGF0IHRoZSBwcm9wZXJ0eSBiZWNvbWVzIHRoZSBiZWFuLCBpbiBwcmVwYXJhdGlvbiBmb3IKLSAgICAgKiBhbm90aGVyIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vdmVEb3duSWZOZWNlc3NhcnkoKSB7Ci0gICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IHZhbGlkYXRpb25Db250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpOwotICAgICAgICBpZiAobXAgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1wLmdldE1ldGFCZWFuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiUHJvcGVydHkgJXMuJXMgaXMgbm90IGNhc2NhZGVkIiwgbXAKLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmVudE1ldGFCZWFuKCkuZ2V0SWQoKSwgbXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxpZGF0aW9uQ29udGV4dC5tb3ZlRG93bihtcCwgbmV3IE51bGxTYWZlUHJvcGVydHlBY2Nlc3ModmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKS5nZXRCZWFuQ2xhc3MoKSwKLSAgICAgICAgICAgICAgICBtcC5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzZWQgdGh1cyBmYXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUeXBlKFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnJhd1R5cGUgPSBUeXBlVXRpbHMuZ2V0UmF3VHlwZSh0eXBlLCB0aGlzLnR5cGUpOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVHZW5lcmljSW5JdGVyYWJsZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgbmF2aWdhdGUgYSBWYWxpZGF0aW9uQ29udGV4dCB0byBbXSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSByYXdUeXBlCi0gICAgICovCi0gICAgcHVibGljIENsYXNzPD8+IGdldFJhd1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiByYXdUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wbGV0ZSgpIHsKLSAgICAgICAgc3VwZXIuY29tcGxldGUoKTsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25Db250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKSBpbnN0YW5jZW9mIER5bmFtaWNNZXRhQmVhbikgewotICAgICAgICAgICAgdmFsaWRhdGlvbkNvbnRleHQuc2V0TWV0YUJlYW4odmFsaWRhdGlvbkNvbnRleHQuZ2V0TWV0YUJlYW4oKS5yZXNvbHZlTWV0YUJlYW4oCi0gICAgICAgICAgICAgICAgT2JqZWN0VXRpbHMuZGVmYXVsdElmTnVsbCh2YWxpZGF0aW9uQ29udGV4dC5nZXRCZWFuKCksIHJhd1R5cGUpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9Bbm5vdGF0aW9uSWdub3Jlcy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9Bbm5vdGF0aW9uSWdub3Jlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTUwOGJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvQW5ub3RhdGlvbklnbm9yZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBjbGFzcyBpbnN0YW50aWF0ZWQgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIHRoZSBYTUwgY29uZmlndXJhdGlvbgotICogZGF0YSBhbmQga2VlcHMgdHJhY2sgb2YgdGhlIGFubm90YXRpb25zIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLjxici8+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uSWdub3JlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihBbm5vdGF0aW9uSWdub3Jlcy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLyoqCi0gICAgICogS2VlcHMgdHJhY2sgd2hldGhlciB0aGUgJ2lnbm9yZS1hbm5vdGF0aW9ucycgZmxhZyBpcyBzZXQgb24gYmVhbiBsZXZlbCBpbiB0aGUKLSAgICAgKiB4bWwgY29uZmlndXJhdGlvbi4gCi0gICAgICogSWYgJ2lnbm9yZS1hbm5vdGF0aW9ucycgaXMgbm90IHNwZWNpZmllZDogZGVmYXVsdCA9IHRydWUKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgQm9vbGVhbj4gaWdub3JlQW5ub3RhdGlvbkRlZmF1bHRzID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxDbGFzczw/PiwgQm9vbGVhbj4oKTsKLQotICAgIC8qKgotICAgICAqIEtlZXBzIHRyYWNrIG9mIGV4cGxpY2l0bHkgZXhjbHVkZWQgbWVtYmVycyAoZmllbGRzIGFuZCBwcm9wZXJ0aWVzKSBmb3IgYSBnaXZlbiBjbGFzcy4KLSAgICAgKiBJZiBhIG1lbWJlciBhcHBlYXJzIGluCi0gICAgICogdGhlIGxpc3QgbWFwcGVkIHRvIGEgZ2l2ZW4gY2xhc3MgJ2lnbm9yZS1hbm5vdGF0aW9ucycgd2FzIGV4cGxpY2l0bHkgc2V0IHRvCi0gICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaW4gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxNZW1iZXI+PiBpZ25vcmVBbm5vdGF0aW9uT25NZW1iZXIgPQotICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzPD8+LCBMaXN0PE1lbWJlcj4+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgQm9vbGVhbj4gaWdub3JlQW5ub3RhdGlvbk9uQ2xhc3MgPQotICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzPD8+LCBCb29sZWFuPigpOwotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBpZ25vcmUgc3RhdGUgZm9yIGEgcGFydGljdWxhciBhbm5vdGF0aW9uIHR5cGUuCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHBhcmFtIGIsIGRlZmF1bHQgdHJ1ZSBpZiBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdElnbm9yZUFubm90YXRpb24oQ2xhc3M8Pz4gY2xhenosIEJvb2xlYW4gYikgewotICAgICAgICBpZ25vcmVBbm5vdGF0aW9uRGVmYXVsdHMucHV0KGNsYXp6LCBiID09IG51bGwgfHwgYi5ib29sZWFuVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdHlwZSBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0SWdub3JlQW5ub3RhdGlvbihDbGFzczw/PiBjbGF6eikgewotICAgICAgICByZXR1cm4gaWdub3JlQW5ub3RhdGlvbkRlZmF1bHRzLmNvbnRhaW5zS2V5KGNsYXp6KQotICAgICAgICAgICAgICAgICYmIGlnbm9yZUFubm90YXRpb25EZWZhdWx0cy5nZXQoY2xhenopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElnbm9yZSBhbm5vdGF0aW9ucyBvbiBhIHBhcnRpY3VsYXIge0BsaW5rIE1lbWJlcn0gb2YgYSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gbWVtYmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlQW5ub3RhdGlvbnNPbk1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIENsYXNzPD8+IGJlYW5DbGFzcyA9IG1lbWJlci5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICBMaXN0PE1lbWJlcj4gbWVtYmVyTGlzdCA9IGlnbm9yZUFubm90YXRpb25Pbk1lbWJlci5nZXQoYmVhbkNsYXNzKTsKLSAgICAgICAgaWYgKG1lbWJlckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVtYmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpOwotICAgICAgICAgICAgaWdub3JlQW5ub3RhdGlvbk9uTWVtYmVyLnB1dChiZWFuQ2xhc3MsIG1lbWJlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWJlckxpc3QuYWRkKG1lbWJlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVhcm4gd2hldGhlciBhbm5vdGF0aW9ucyBzaG91bGQgYmUgaWdub3JlZCBvbiBhIHBhcnRpY3VsYXIge0BsaW5rIE1lbWJlcn0gb2YgYSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gbWVtYmVyCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVBbm5vdGF0aW9ucyhNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaWdub3JlQW5ub3RhdGlvbjsKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBtZW1iZXIuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgTGlzdDxNZW1iZXI+IGlnbm9yZUFubm90YXRpb25Gb3JNZW1iZXJzID0gaWdub3JlQW5ub3RhdGlvbk9uTWVtYmVyLmdldChjbGF6eik7Ci0gICAgICAgIGlmIChpZ25vcmVBbm5vdGF0aW9uRm9yTWVtYmVycyA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICFpZ25vcmVBbm5vdGF0aW9uRm9yTWVtYmVycy5jb250YWlucyhtZW1iZXIpKSB7Ci0gICAgICAgICAgICBpZ25vcmVBbm5vdGF0aW9uID0gZ2V0RGVmYXVsdElnbm9yZUFubm90YXRpb24oY2xhenopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWdub3JlQW5ub3RhdGlvbiA9IGlnbm9yZUFubm90YXRpb25Gb3JNZW1iZXJzLmNvbnRhaW5zKG1lbWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlnbm9yZUFubm90YXRpb24pIHsKLSAgICAgICAgICAgIGxvZ01lc3NhZ2UobWVtYmVyLCBjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlnbm9yZUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ01lc3NhZ2UoTWVtYmVyIG1lbWJlciwgQ2xhc3M8Pz4gY2xhenopIHsKLSAgICAgICAgU3RyaW5nIHR5cGU7Ci0gICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBGaWVsZCkgewotICAgICAgICAgICAgdHlwZSA9ICJGaWVsZCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlID0gIlByb3BlcnR5IjsKLSAgICAgICAgfQotICAgICAgICBsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiJXMgbGV2ZWwgYW5ub3RhdGlvbnMgYXJlIGdldHRpbmcgaWdub3JlZCBmb3IgJXMuJXMiLCB0eXBlLCBjbGF6ei5nZXROYW1lKCksIG1lbWJlci5nZXROYW1lKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGlnbm9yZSBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgY2xhc3MuIAotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlQW5ub3RhdGlvbnNPbkNsYXNzKENsYXNzPD8+IGNsYXp6LCBib29sZWFuIGIpIHsKLSAgICAgICAgaWdub3JlQW5ub3RhdGlvbk9uQ2xhc3MucHV0KGNsYXp6LCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIGFubm90YXRpb25zIHNob3VsZCBiZSBpZ25vcmVkIGZvciBhIGdpdmVuIGNsYXNzLgotICAgICAqIEBwYXJhbSBjbGF6eiB0byBjaGVjawotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlQW5ub3RhdGlvbnMoQ2xhc3M8Pz4gY2xhenopIHsKLSAgICAgICAgYm9vbGVhbiBpZ25vcmVBbm5vdGF0aW9uOwotICAgICAgICBpZiAoaWdub3JlQW5ub3RhdGlvbk9uQ2xhc3MuY29udGFpbnNLZXkoY2xhenopKSB7Ci0gICAgICAgICAgICBpZ25vcmVBbm5vdGF0aW9uID0gaWdub3JlQW5ub3RhdGlvbk9uQ2xhc3MuZ2V0KGNsYXp6KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlnbm9yZUFubm90YXRpb24gPSBnZXREZWZhdWx0SWdub3JlQW5ub3RhdGlvbihjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlnbm9yZUFubm90YXRpb24pIHsKLSAgICAgICAgCWxvZy5sb2coTGV2ZWwuRklORVNULCBTdHJpbmcuZm9ybWF0KCJDbGFzcyBsZXZlbCBhbm5vdGF0aW9uIGFyZSBnZXR0aW5nIGlnbm9yZWQgZm9yICVzIiwgY2xhenouZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlnbm9yZUFubm90YXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9Bbm5vdGF0aW9uUHJveHkuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvQW5ub3RhdGlvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTVmNzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9Bbm5vdGF0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlNlY3VyZUFjdGlvbnM7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKiBJbnZvY2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPiB0aGF0IHByZXRlbmRzIGl0Ci0gKiBpcyBhICJyZWFsIiBzb3VyY2UgY29kZSBhbm5vdGF0aW9uLgotICogPHAvPgotICovCi0vLyBUT0RPIG1vdmUgdGhpcyBndXkgdXAgdG8gb3JnLmFwYWNoZS5idmFsLmpzcjMwMyBvcgotLy8gb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5tb2RlbAotY2xhc3MgQW5ub3RhdGlvblByb3h5IGltcGxlbWVudHMgQW5ub3RhdGlvbiwgSW52b2NhdGlvbkhhbmRsZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEFubm90YXRpb25Qcm94eSBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gPEE+Ci0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBBbm5vdGF0aW9uUHJveHkoQW5ub3RhdGlvblByb3h5QnVpbGRlcjxBPiBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvblR5cGUgPSBkZXNjcmlwdG9yLmdldFR5cGUoKTsKLSAgICAgICAgdmFsdWVzID0gZ2V0QW5ub3RhdGlvblZhbHVlcyhkZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gTWFwPFN0cmluZywgT2JqZWN0PiBnZXRBbm5vdGF0aW9uVmFsdWVzKEFubm90YXRpb25Qcm94eUJ1aWxkZXI8QT4gZGVzY3JpcHRvcikgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBpbnQgcHJvY2Vzc2VkVmFsdWVzRnJvbURlc2NyaXB0b3IgPSAwOwotICAgICAgICBmaW5hbCBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMgPSBkb1ByaXZpbGVnZWQoCi0gICAgICAgICAgU2VjdXJlQWN0aW9ucy5nZXREZWNsYXJlZE1ldGhvZHMoYW5ub3RhdGlvblR5cGUpCi0gICAgICAgICk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG0gOiBkZWNsYXJlZE1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbnRhaW5zKG0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobS5nZXROYW1lKCksIGRlc2NyaXB0b3IuZ2V0VmFsdWUobS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRWYWx1ZXNGcm9tRGVzY3JpcHRvcisrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KG0uZ2V0TmFtZSgpLCBtLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdmFsdWUgcHJvdmlkZWQgZm9yICIgKyBtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2Nlc3NlZFZhbHVlc0Zyb21EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3Iuc2l6ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVHJ5aW5nIHRvIGluc3RhbmNpYXRlICIgKyBhbm5vdGF0aW9uVHlwZSArICIgd2l0aCB1bmtub3duIHBhcmFtdGVycy4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzLmdldChtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0aGlzLCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJ0AnKS5hcHBlbmQoYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpLmFwcGVuZCgnKCcpOwotICAgICAgICBib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0gICAgICAgIGZvciAoU3RyaW5nIG0gOiBnZXRNZXRob2RzU29ydGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChjb21tYSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChtKS5hcHBlbmQoJz0nKS5hcHBlbmQodmFsdWVzLmdldChtKSk7Ci0gICAgICAgICAgICBjb21tYSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3J0ZWRTZXQ8U3RyaW5nPiBnZXRNZXRob2RzU29ydGVkKCkgewotICAgICAgICBTb3J0ZWRTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwodmFsdWVzLmtleVNldCgpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZG9Qcml2aWxlZ2VkKGZpbmFsIFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9Bbm5vdGF0aW9uUHJveHlCdWlsZGVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL0Fubm90YXRpb25Qcm94eUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjYmY0YS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL0Fubm90YXRpb25Qcm94eUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbDsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5TZWN1cmVBY3Rpb25zOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZXMgYW4gYW5ub3RhdGlvbiBwcm94eSBkdXJpbmcgeG1sCi0gKiBwYXJzaW5nIG9mIHZhbGlkYXRpb24gbWFwcGluZyBjb25zdHJhaW50cy4gPGJyLz4KLSAqLwotLy8gVE9ETyBtb3ZlIHRoaXMgZ3V5IHVwIHRvIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMgb3IKLS8vIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMubW9kZWwKLWZpbmFsIHB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJveHlCdWlsZGVyPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxBPiB0eXBlOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBlbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEFubm90YXRpb25Qcm94eUJ1aWxkZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvblR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb3h5QnVpbGRlcihDbGFzczxBPiBhbm5vdGF0aW9uVHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSBhbm5vdGF0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgQW5ub3RhdGlvblByb3h5QnVpbGRlciBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uVHlwZQotICAgICAqIEBwYXJhbSBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJveHlCdWlsZGVyKENsYXNzPEE+IGFubm90YXRpb25UeXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMoYW5ub3RhdGlvblR5cGUpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBlbGVtZW50cy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBidWlsZGVyIGluaXRpYWxseSBjb25maWd1cmVkIHRvIGNyZWF0ZSBhbiBhbm5vdGF0aW9uIGVxdWl2YWxlbnQKLSAgICAgKiB0byA8Y29kZT5hbm5vdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90IEFubm90YXRpb24gdG8gYmUgcmVwbGljYXRlZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb3h5QnVpbGRlcihBIGFubm90KSB7Ci0gICAgICAgIHRoaXMoKENsYXNzPEE+KSBhbm5vdC5hbm5vdGF0aW9uVHlwZSgpKTsKLSAgICAgICAgLy8gT2J0YWluIHRoZSAiZWxlbWVudHMiIG9mIHRoZSBhbm5vdGF0aW9uCi0gICAgICAgIGZpbmFsIE1ldGhvZFtdIG1ldGhvZHMgPSBkb1ByaXZpbGVnZWQoU2VjdXJlQWN0aW9ucy5nZXREZWNsYXJlZE1ldGhvZHMoYW5ub3QuYW5ub3RhdGlvblR5cGUoKSkpOwotICAgICAgICBmb3IgKE1ldGhvZCBtIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKCFtLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtLmludm9rZShhbm5vdCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5wdXQobS5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gYXJncywgc28gc2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBhbm5vdGF0aW9uICIgKyBhbm5vdCArICIgZWxlbWVudDogIiArIG0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgYWNjZXNzIGFubm90YXRpb24gIiArIGFubm90ICsgIiBlbGVtZW50OiAiICsgbS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNhbm5vdCBhY2Nlc3MgYW5ub3RhdGlvbiAiICsgYW5ub3QgKyAiIGVsZW1lbnQ6ICIgKyBtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gZWxlbWVudCB0byB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGVsZW1lbnRzLnB1dChlbGVtZW50TmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdmFsdWUgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lCi0gICAgICogQHJldHVybiBPYmplY3QgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudHMuZ2V0KGVsZW1lbnROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWFybiB3aGV0aGVyIGEgZ2l2ZW4gZWxlbWVudCBoYXMgYmVlbiBjb25maWd1cmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbiA8Y29kZT5lbGVtZW50TmFtZTwvY29kZT4gZWxlbWVudCBpcyBmb3VuZAotICAgICAqICAgICAgICAgb24gdGhpcyBhbm5vdGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy5jb250YWluc0tleShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29uZmlndXJlZCBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY29uZmlndXJlZCBBbm5vdGF0aW9uIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzPEE+Ci0gICAgICovCi0gICAgcHVibGljIENsYXNzPEE+IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGUgd2VsbC1rbm93biBKU1IzMDMgIm1lc3NhZ2UiIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzLk1FU1NBR0UucHV0KGVsZW1lbnRzLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIHdlbGwta25vd24gSlNSMzAzICJncm91cHMiIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZ3JvdXBzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R3JvdXBzKENsYXNzPD8+W10gZ3JvdXBzKSB7Ci0gICAgICAgIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5HUk9VUFMucHV0KGVsZW1lbnRzLCBncm91cHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGUgd2VsbC1rbm93biBKU1IzMDMgInBheWxvYWQiIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBheWxvYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXlsb2FkKENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQpIHsKLSAgICAgICAgQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzLlBBWUxPQUQucHV0KGVsZW1lbnRzLCBwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGFubm90YXRpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBidWlsZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB7QGxpbmsgQW5ub3RhdGlvbn0KLSAgICAgKi8KLSAgICBwdWJsaWMgQSBjcmVhdGVBbm5vdGF0aW9uKCkgewotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFNlY3VyZUFjdGlvbnMuZ2V0Q2xhc3NMb2FkZXIoZ2V0VHlwZSgpKTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIENsYXNzPEE+IHByb3h5Q2xhc3MgPSAoQ2xhc3M8QT4pIFByb3h5LmdldFByb3h5Q2xhc3MoY2xhc3NMb2FkZXIsIGdldFR5cGUoKSk7Ci0gICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQW5ub3RhdGlvblByb3h5KHRoaXMpOwotICAgICAgICByZXR1cm4gZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPEE+KCkgewotICAgICAgICAgICAgcHVibGljIEEgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPEE+IGNvbnN0cnVjdG9yID0gcHJveHlDbGFzcy5nZXRDb25zdHJ1Y3RvcihJbnZvY2F0aW9uSGFuZGxlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBhbm5vdGF0aW9uIGZvciBjb25maWd1cmVkIGNvbnN0cmFpbnQiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbikgewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvTWV0YUNvbnN0cmFpbnQuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvTWV0YUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhNjI4NS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL01ldGFDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWw7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkFjY2Vzc1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLkZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLk1ldGhvZEFjY2VzczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGhvbGQgcGFyc2VkIGluZm9ybWF0aW9uIGZyb20geG1sIHRvIGNvbXBsZXRlIE1ldGFCZWFuIGxhdGVyPGJyLz4KLSAqLwotLy9UT0RPIG1vdmUgdGhpcyBndXkgdXAgdG8gb3JnLmFwYWNoZS5idmFsLmpzcjMwMyBvciBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLm1vZGVsCi0vL3RvIGRlY291cGxlIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgZnJvbSB4bWwgcGFja2FnZSBhbmQgYWxsb3cgb3RoZXJzIHRvIGNvbnN1bWUgTWV0YUNvbnN0cmFpbnQKLXB1YmxpYyBjbGFzcyBNZXRhQ29uc3RyYWludDxULCBBIGV4dGVuZHMgQW5ub3RhdGlvbj4gewotCi0gICAgLyoqIFRoZSBtZW1iZXIgdGhlIGNvbnN0cmFpbnQgd2FzIGRlZmluZWQgb24uICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNZW1iZXIgbWVtYmVyOwotCi0gICAgLyoqIFRoZSBjbGFzcyBvZiB0aGUgYmVhbiBob3N0aW5nIHRoaXMgY29uc3RyYWludC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IGJlYW5DbGFzczsKLQotICAgIC8qKiBjb25zdHJhaW50IGFubm90YXRpb24gKHByb3h5KSAqLwotICAgIHByaXZhdGUgZmluYWwgQSBhbm5vdGF0aW9uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NTdHJhdGVneSBhY2Nlc3NTdHJhdGVneTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBNZXRhQ29uc3RyYWludCBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzIFRoZSBjbGFzcyBpbiB3aGljaCB0aGUgY29uc3RyYWludCBpcyBkZWZpbmVkIG9uCi0gICAgICogQHBhcmFtIG1lbWJlciAgICBUaGUgbWVtYmVyIG9uIHdoaWNoIHRoZSBjb25zdHJhaW50IGlzIGRlZmluZWQgb24sIHtAY29kZSBudWxsfSBpZiBpdCBpcyBhIGNsYXNzIGNvbnN0cmFpbnR9Ci0gICAgICogQHBhcmFtIGFubm90YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YUNvbnN0cmFpbnQoQ2xhc3M8VD4gYmVhbkNsYXNzLCBNZW1iZXIgbWVtYmVyLCBBIGFubm90YXRpb24pIHsKLSAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7Ci0gICAgICAgIHRoaXMuYmVhbkNsYXNzID0gYmVhbkNsYXNzOwotICAgICAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotICAgICAgICBpZiAobWVtYmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFjY2Vzc1N0cmF0ZWd5ID0gY3JlYXRlQWNjZXNzU3RyYXRlZ3kobWVtYmVyKTsKLSAgICAgICAgICAgIGlmIChhY2Nlc3NTdHJhdGVneSA9PSBudWxsIHx8IGFjY2Vzc1N0cmF0ZWd5LmdldFByb3BlcnR5TmFtZSgpID09Ci0gICAgICAgICAgICAgICAgICBudWxsKSB7IC8vIGNhbiBoYXBwZW4gaWYgbWV0aG9kIGRvZXMgbm90IGZvbGxvdyB0aGUgYmVhbiBjb252ZW50aW9uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgIkFubm90YXRlZCBtZXRob2QgZG9lcyBub3QgZm9sbG93IHRoZSBKYXZhQmVhbnMgbmFtaW5nIGNvbnZlbnRpb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmFjY2Vzc1N0cmF0ZWd5ID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc1N0cmF0ZWd5IGNyZWF0ZUFjY2Vzc1N0cmF0ZWd5KE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIE1ldGhvZCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RBY2Nlc3MoKE1ldGhvZCkgbWVtYmVyKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBGaWVsZCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZEFjY2VzcygoRmllbGQpIG1lbWJlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gY2xhc3MgbGV2ZWwKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmVhbiBjbGFzcyBvZiB0aGlzIGNvbnN0cmFpbnQuCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzczxUPiBnZXRCZWFuQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZW1iZXIgdG8gd2hpY2ggdGhpcyBjb25zdHJhaW50IGFwcGxpZXMuCi0gICAgICogQHJldHVybiBNZW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcigpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFubm90YXRpb24gdGhhdCBkZWZpbmVzIHRoaXMgY29uc3RyYWludC4KLSAgICAgKiBAcmV0dXJuIEFubm90YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQSBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFjY2VzcyBzdHJhdGVneSB1c2VkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBBY2Nlc3NTdHJhdGVneX0KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzU3RyYXRlZ3kgZ2V0QWNjZXNzU3RyYXRlZ3koKSB7Ci0gICAgICAgIHJldHVybiBhY2Nlc3NTdHJhdGVneTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL1ZhbGlkYXRpb25NYXBwaW5nUGFyc2VyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL1ZhbGlkYXRpb25NYXBwaW5nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjczZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9WYWxpZGF0aW9uTWFwcGluZ1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMueG1sOwotCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5FbnVtZXJhdGlvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuU2VjdXJlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5GaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwudXRpbC5NZXRob2RBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwotCi0KLS8qKgotICogVXNlcyBKQVhCIHRvIHBhcnNlIGNvbnN0cmFpbnRzLnhtbCBiYXNlZCBvbiB2YWxpZGF0aW9uLW1hcHBpbmctMS4wLnhzZC48YnI+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1hcHBpbmdQYXJzZXIgewotICAgIC8vICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhWYWxpZGF0aW9uTWFwcGluZ1BhcnNlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFQUElOR19YU0QgPSAiTUVUQS1JTkYvdmFsaWRhdGlvbi1tYXBwaW5nLTEuMC54c2QiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcz4gUkVTRVJWRURfUEFSQU1TID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KEVudW1TZXQub2YoCi0gICAgICAgIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5HUk9VUFMsIENvbnN0cmFpbnRBbm5vdGF0aW9uQXR0cmlidXRlcy5NRVNTQUdFLAotICAgICAgICBDb25zdHJhaW50QW5ub3RhdGlvbkF0dHJpYnV0ZXMuUEFZTE9BRCkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHByb2Nlc3NlZENsYXNzZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVmFsaWRhdGlvbk1hcHBpbmdQYXJzZXIgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1hcHBpbmdQYXJzZXIoQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGZpbGVzIHdpdGggY29uc3RyYWludCBtYXBwaW5ncyBhbmQgY29sbGVjdCBpbmZvcm1hdGlvbiBpbiB0aGUgZmFjdG9yeS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHhtbFN0cmVhbXMgLSBvbmUgb3IgbW9yZSBjb250cmFpbnRzLnhtbCBmaWxlIHN0cmVhbXMgdG8gcGFyc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTWFwcGluZ0NvbmZpZyhTZXQ8SW5wdXRTdHJlYW0+IHhtbFN0cmVhbXMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChJbnB1dFN0cmVhbSB4bWxTdHJlYW0gOiB4bWxTdHJlYW1zKSB7Ci0gICAgICAgICAgICBDb25zdHJhaW50TWFwcGluZ3NUeXBlIG1hcHBpbmcgPSBwYXJzZVhtbE1hcHBpbmdzKHhtbFN0cmVhbSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZSA9IG1hcHBpbmcuZ2V0RGVmYXVsdFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHByb2Nlc3NDb25zdHJhaW50RGVmaW5pdGlvbnMobWFwcGluZy5nZXRDb25zdHJhaW50RGVmaW5pdGlvbigpLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICBmb3IgKEJlYW5UeXBlIGJlYW4gOiBtYXBwaW5nLmdldEJlYW4oKSkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IGJlYW5DbGFzcyA9IGxvYWRDbGFzcyhiZWFuLmdldENsYXp6KCksIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZENsYXNzZXMuYWRkKGJlYW5DbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc3BlYzogQSBnaXZlbiBjbGFzcyBtdXN0IG5vdCBiZSBkZXNjcmliZWQgbW9yZSB0aGFuIG9uY2UgYW1vbmdzdCBhbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoZSBYTUwgbWFwcGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5DbGFzcy5nZXROYW1lKCkgKyAiIGhhcyBhbHJlYWR5IGJlIGNvbmZpZ3VyZWQgaW4geG1sLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmdldEFubm90YXRpb25JZ25vcmVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdElnbm9yZUFubm90YXRpb24oYmVhbkNsYXNzLCBiZWFuLmlzSWdub3JlQW5ub3RhdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0NsYXNzTGV2ZWwoYmVhbi5nZXRDbGFzc1R5cGUoKSwgYmVhbkNsYXNzLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkTGV2ZWwoYmVhbi5nZXRGaWVsZCgpLCBiZWFuQ2xhc3MsIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUHJvcGVydHlMZXZlbChiZWFuLmdldEdldHRlcigpLCBiZWFuQ2xhc3MsIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRDbGFzc2VzLmFkZChiZWFuQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBpbiBYTUwgc3RyZWFtIHRvIHBhcnNlIHVzaW5nIHRoZSB2YWxpZGF0aW9uLW1hcHBpbmctMS4wLnhzZCAqLwotICAgIHByaXZhdGUgQ29uc3RyYWludE1hcHBpbmdzVHlwZSBwYXJzZVhtbE1hcHBpbmdzKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIENvbnN0cmFpbnRNYXBwaW5nc1R5cGUgbWFwcGluZ3M7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKQVhCQ29udGV4dCBqYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKENvbnN0cmFpbnRNYXBwaW5nc1R5cGUuY2xhc3MpOwotICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGpjLmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAgICAgdW5tYXJzaGFsbGVyLnNldFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2Ugc3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZShpbik7Ci0gICAgICAgICAgICBKQVhCRWxlbWVudDxDb25zdHJhaW50TWFwcGluZ3NUeXBlPiByb290ID0KLSAgICAgICAgICAgICAgICAgIHVubWFyc2hhbGxlci51bm1hcnNoYWwoc3RyZWFtLCBDb25zdHJhaW50TWFwcGluZ3NUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgIG1hcHBpbmdzID0gcm9vdC5nZXRWYWx1ZSgpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgWE1MIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlLiIsCi0gICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGluKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwcGluZ3M7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdmFsaWRhdGlvbi1tYXBwaW5nLTEuMC54c2QgYmFzZWQgc2NoZW1hICovCi0gICAgcHJpdmF0ZSBTY2hlbWEgZ2V0U2NoZW1hKCkgewotICAgICAgICByZXR1cm4gVmFsaWRhdGlvblBhcnNlci5nZXRTY2hlbWEoVkFMSURBVElPTl9NQVBQSU5HX1hTRCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDbGFzc0xldmVsKENsYXNzVHlwZSBjbGFzc1R5cGUsIENsYXNzPD8+IGJlYW5DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIGlmIChjbGFzc1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWdub3JlIGFubm90YXRpb24KLSAgICAgICAgaWYgKGNsYXNzVHlwZS5pc0lnbm9yZUFubm90YXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFjdG9yeS5nZXRBbm5vdGF0aW9uSWdub3JlcygpCi0gICAgICAgICAgICAgICAgICAuc2V0SWdub3JlQW5ub3RhdGlvbnNPbkNsYXNzKGJlYW5DbGFzcywgY2xhc3NUeXBlLmlzSWdub3JlQW5ub3RhdGlvbnMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBncm91cCBzZXF1ZW5jZQotICAgICAgICBDbGFzczw/PltdIGdyb3VwU2VxdWVuY2UgPQotICAgICAgICAgICAgICBjcmVhdGVHcm91cFNlcXVlbmNlKGNsYXNzVHlwZS5nZXRHcm91cFNlcXVlbmNlKCksIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgaWYgKGdyb3VwU2VxdWVuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFjdG9yeS5hZGREZWZhdWx0U2VxdWVuY2UoYmVhbkNsYXNzLCBncm91cFNlcXVlbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cmFpbnRzCi0gICAgICAgIGZvciAoQ29uc3RyYWludFR5cGUgY29uc3RyYWludCA6IGNsYXNzVHlwZS5nZXRDb25zdHJhaW50KCkpIHsKLSAgICAgICAgICAgIE1ldGFDb25zdHJhaW50PD8sID8+IG1ldGFDb25zdHJhaW50ID0KLSAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnN0cmFpbnQoY29uc3RyYWludCwgYmVhbkNsYXNzLCBudWxsLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICBmYWN0b3J5LmFkZE1ldGFDb25zdHJhaW50KGJlYW5DbGFzcywgbWV0YUNvbnN0cmFpbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSA8QSBleHRlbmRzIEFubm90YXRpb24sIFQ+IE1ldGFDb25zdHJhaW50PD8sID8+IGNyZWF0ZUNvbnN0cmFpbnQoCi0gICAgICAgICAgQ29uc3RyYWludFR5cGUgY29uc3RyYWludCwgQ2xhc3M8VD4gYmVhbkNsYXNzLCBNZW1iZXIgbWVtYmVyLAotICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZSkgewotICAgICAgICBDbGFzczxBPiBhbm5vdGF0aW9uQ2xhc3MgPQotICAgICAgICAgICAgICAoQ2xhc3M8QT4pIGxvYWRDbGFzcyhjb25zdHJhaW50LmdldEFubm90YXRpb24oKSwgZGVmYXVsdFBhY2thZ2UpOwotICAgICAgICBBbm5vdGF0aW9uUHJveHlCdWlsZGVyPEE+IGFubm9CdWlsZGVyID0gbmV3IEFubm90YXRpb25Qcm94eUJ1aWxkZXI8QT4oYW5ub3RhdGlvbkNsYXNzKTsKLQotICAgICAgICBpZiAoY29uc3RyYWludC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub0J1aWxkZXIuc2V0TWVzc2FnZShjb25zdHJhaW50LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5ub0J1aWxkZXIuc2V0R3JvdXBzKGdldEdyb3Vwcyhjb25zdHJhaW50LmdldEdyb3VwcygpLCBkZWZhdWx0UGFja2FnZSkpOwotICAgICAgICBhbm5vQnVpbGRlci5zZXRQYXlsb2FkKGdldFBheWxvYWQoY29uc3RyYWludC5nZXRQYXlsb2FkKCksIGRlZmF1bHRQYWNrYWdlKSk7Ci0KLSAgICAgICAgZm9yIChFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA6IGNvbnN0cmFpbnQuZ2V0RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnRUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGNoZWNrVmFsaWROYW1lKG5hbWUpOwotICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IGdldEFubm90YXRpb25QYXJhbWV0ZXJUeXBlKGFubm90YXRpb25DbGFzcywgbmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudFZhbHVlID0gZ2V0RWxlbWVudFZhbHVlKGVsZW1lbnRUeXBlLCByZXR1cm5UeXBlLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICBhbm5vQnVpbGRlci5wdXRWYWx1ZShuYW1lLCBlbGVtZW50VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWV0YUNvbnN0cmFpbnQ8VCwgQT4oYmVhbkNsYXNzLCBtZW1iZXIsIGFubm9CdWlsZGVyLmNyZWF0ZUFubm90YXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoQ29uc3RyYWludEFubm90YXRpb25BdHRyaWJ1dGVzIGF0dHIgOiBSRVNFUlZFRF9QQVJBTVMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyLmdldEF0dHJpYnV0ZU5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuYW1lICsgIiBpcyBhIHJlc2VydmVkIHBhcmFtZXRlciBuYW1lLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSA8QSBleHRlbmRzIEFubm90YXRpb24+IENsYXNzPD8+IGdldEFubm90YXRpb25QYXJhbWV0ZXJUeXBlKAotICAgICAgICAgIGZpbmFsIENsYXNzPEE+IGFubm90YXRpb25DbGFzcywgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZmluYWwgTWV0aG9kIG0gPSBkb1ByaXZpbGVnZWQoU2VjdXJlQWN0aW9ucy5nZXRQdWJsaWNNZXRob2QoYW5ub3RhdGlvbkNsYXNzLCBuYW1lKSk7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJBbm5vdGF0aW9uIG9mIHR5cGUgIiArIGFubm90YXRpb25DbGFzcy5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBjb250YWluIGEgcGFyYW1ldGVyICIgKyBuYW1lICsgIi4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbS5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0RWxlbWVudFZhbHVlKEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlLCBDbGFzczw/PiByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2UpIHsKLSAgICAgICAgcmVtb3ZlRW1wdHlDb250ZW50RWxlbWVudHMoZWxlbWVudFR5cGUpOwotCi0gICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IHJldHVyblR5cGUuaXNBcnJheSgpOwotICAgICAgICBpZiAoIWlzQXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZS5nZXRDb250ZW50KCkuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBzcGVjaWZ5IGFuIGFycmF5IHdoZXJlIHNpbmdsZSB2YWx1ZSBpcyBleHBlY3RlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRTaW5nbGVWYWx1ZShlbGVtZW50VHlwZS5nZXRDb250ZW50KCkuZ2V0KDApLCByZXR1cm5UeXBlLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdD4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlcmlhbGl6YWJsZSBzIDogZWxlbWVudFR5cGUuZ2V0Q29udGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLmFkZChnZXRTaW5nbGVWYWx1ZShzLCByZXR1cm5UeXBlLmdldENvbXBvbmVudFR5cGUoKSwgZGVmYXVsdFBhY2thZ2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXMudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UocmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCksIHZhbHVlcy5zaXplKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVFbXB0eUNvbnRlbnRFbGVtZW50cyhFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICBMaXN0PFNlcmlhbGl6YWJsZT4gY29udGVudFRvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxTZXJpYWxpemFibGU+KCk7Ci0gICAgICAgIGZvciAoU2VyaWFsaXphYmxlIGNvbnRlbnQgOiBlbGVtZW50VHlwZS5nZXRDb250ZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBjb250ZW50KS5tYXRjaGVzKCJbXFxuIF0uKiIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFRvRGVsZXRlLmFkZChjb250ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbGVtZW50VHlwZS5nZXRDb250ZW50KCkucmVtb3ZlQWxsKGNvbnRlbnRUb0RlbGV0ZSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0U2luZ2xlVmFsdWUoU2VyaWFsaXphYmxlIHNlcmlhbGl6YWJsZSwgQ2xhc3M8Pz4gcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2UpIHsKLQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWU7Ci0gICAgICAgIGlmIChzZXJpYWxpemFibGUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHNlcmlhbGl6YWJsZTsKLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gY29udmVydFRvUmVzdWx0VHlwZShyZXR1cm5UeXBlLCB2YWx1ZSwgZGVmYXVsdFBhY2thZ2UpOwotICAgICAgICB9IGVsc2UgaWYgKHNlcmlhbGl6YWJsZSBpbnN0YW5jZW9mIEpBWEJFbGVtZW50PD8+ICYmCi0gICAgICAgICAgICAgICgoSkFYQkVsZW1lbnQ8Pz4pIHNlcmlhbGl6YWJsZSkuZ2V0RGVjbGFyZWRUeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICBKQVhCRWxlbWVudDw/PiBlbGVtID0gKEpBWEJFbGVtZW50PD8+KSBzZXJpYWxpemFibGU7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbGVtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGNvbnZlcnRUb1Jlc3VsdFR5cGUocmV0dXJuVHlwZSwgdmFsdWUsIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXJpYWxpemFibGUgaW5zdGFuY2VvZiBKQVhCRWxlbWVudDw/PiAmJgotICAgICAgICAgICAgICAoKEpBWEJFbGVtZW50PD8+KSBzZXJpYWxpemFibGUpLmdldERlY2xhcmVkVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoQW5ub3RhdGlvblR5cGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICBKQVhCRWxlbWVudDw/PiBlbGVtID0gKEpBWEJFbGVtZW50PD8+KSBzZXJpYWxpemFibGU7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uVHlwZSBhbm5vdGF0aW9uVHlwZSA9IChBbm5vdGF0aW9uVHlwZSkgZWxlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0gKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPikgcmV0dXJuVHlwZTsKLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZSwgYW5ub3RhdGlvbkNsYXNzLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHBhcmFtZXRlciB2YWx1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGFyYW1ldGVyIHZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgY29udmVydFRvUmVzdWx0VHlwZShDbGFzczw/PiByZXR1cm5UeXBlLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2UpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENsYXNzIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MuCi0gICAgICAgICAqIHNwZWM6IE5vdGUgdGhhdCBpZiB0aGUgcmF3IHN0cmluZyBpcyB1bnF1YWxpZmllZCwKLSAgICAgICAgICogZGVmYXVsdCBwYWNrYWdlIGlzIHRha2VuIGludG8gYWNjb3VudC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdG9RdWFsaWZpZWRDbGFzc05hbWUodmFsdWUsIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbnZlcnRlciBsb29rdXAgKi8KLSAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IENvbnZlcnRVdGlscy5sb29rdXAocmV0dXJuVHlwZSk7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCAmJiByZXR1cm5UeXBlLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIgPSBFbnVtZXJhdGlvbkNvbnZlcnRlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQocmV0dXJuVHlwZSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBBbm5vdGF0aW9uIGNyZWF0ZUFubm90YXRpb24oQW5ub3RhdGlvblR5cGUgYW5ub3RhdGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczxBPiByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIEFubm90YXRpb25Qcm94eUJ1aWxkZXI8QT4gbWV0YUFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvblByb3h5QnVpbGRlcjxBPihyZXR1cm5UeXBlKTsKLSAgICAgICAgZm9yIChFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA6IGFubm90YXRpb25UeXBlLmdldEVsZW1lbnQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50VHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlID0gZ2V0QW5ub3RhdGlvblBhcmFtZXRlclR5cGUocmV0dXJuVHlwZSwgbmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgZWxlbWVudFZhbHVlID0gZ2V0RWxlbWVudFZhbHVlKGVsZW1lbnRUeXBlLCBwYXJhbWV0ZXJUeXBlLCBkZWZhdWx0UGFja2FnZSk7Ci0gICAgICAgICAgICBtZXRhQW5ub3RhdGlvbi5wdXRWYWx1ZShuYW1lLCBlbGVtZW50VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRhQW5ub3RhdGlvbi5jcmVhdGVBbm5vdGF0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/PltdIGdldEdyb3VwcyhHcm91cHNUeXBlIGdyb3Vwc1R5cGUsIFN0cmluZyBkZWZhdWx0UGFja2FnZSkgewotICAgICAgICBpZiAoZ3JvdXBzVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzW117fTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgIGZvciAoSkFYQkVsZW1lbnQ8U3RyaW5nPiBncm91cENsYXNzIDogZ3JvdXBzVHlwZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBncm91cExpc3QuYWRkKGxvYWRDbGFzcyhncm91cENsYXNzLmdldFZhbHVlKCksIGRlZmF1bHRQYWNrYWdlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdyb3VwTGlzdC50b0FycmF5KG5ldyBDbGFzc1tncm91cExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIGdldFBheWxvYWQoUGF5bG9hZFR5cGUgcGF5bG9hZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZSkgewotICAgICAgICBpZiAocGF5bG9hZFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tde307Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPj4gcGF5bG9hZExpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPj4oKTsKLSAgICAgICAgZm9yIChKQVhCRWxlbWVudDxTdHJpbmc+IGdyb3VwQ2xhc3MgOiBwYXlsb2FkVHlwZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBwYXlsb2FkID0gbG9hZENsYXNzKGdyb3VwQ2xhc3MuZ2V0VmFsdWUoKSwgZGVmYXVsdFBhY2thZ2UpOwotICAgICAgICAgICAgaWYgKCFQYXlsb2FkLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGF5bG9hZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiU3BlY2lmaWVkIHBheWxvYWQgY2xhc3MgIiArIHBheWxvYWQuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGltcGxlbWVudCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGF5bG9hZExpc3QuYWRkKChDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4pIHBheWxvYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXlsb2FkTGlzdC50b0FycmF5KG5ldyBDbGFzc1twYXlsb2FkTGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzPD8+W10gY3JlYXRlR3JvdXBTZXF1ZW5jZShHcm91cFNlcXVlbmNlVHlwZSBncm91cFNlcXVlbmNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIGlmIChncm91cFNlcXVlbmNlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzczw/PltdIGdyb3VwU2VxdWVuY2UgPSBuZXcgQ2xhc3M8Pz5bZ3JvdXBTZXF1ZW5jZVR5cGUuZ2V0VmFsdWUoKS5zaXplKCldOwotICAgICAgICAgICAgaW50IGk9MDsKLSAgICAgICAgICAgIGZvciAoSkFYQkVsZW1lbnQ8U3RyaW5nPiBncm91cE5hbWUgOiBncm91cFNlcXVlbmNlVHlwZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZ3JvdXAgPSBsb2FkQ2xhc3MoZ3JvdXBOYW1lLmdldFZhbHVlKCksIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBncm91cFNlcXVlbmNlW2krK10gPSBncm91cDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBncm91cFNlcXVlbmNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpZWxkTGV2ZWwoTGlzdDxGaWVsZFR5cGU+IGZpZWxkcywgQ2xhc3M8Pz4gYmVhbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2UpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGZpZWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChGaWVsZFR5cGUgZmllbGRUeXBlIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGRUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZE5hbWVzLmNvbnRhaW5zKGZpZWxkTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihmaWVsZE5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICIgaXMgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSBpbiBtYXBwaW5nIHhtbCBmb3IgYmVhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmllbGROYW1lcy5hZGQoZmllbGROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gZG9Qcml2aWxlZ2VkKFNlY3VyZUFjdGlvbnMuZ2V0RGVjbGFyZWRGaWVsZChiZWFuQ2xhc3MsIGZpZWxkTmFtZSkpOwotICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZFR5cGUgICIgKyBmaWVsZE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZ25vcmUgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlRmllbGRBbm5vdGF0aW9uID0gZmllbGRUeXBlLmlzSWdub3JlQW5ub3RhdGlvbnMoKSA9PSBudWxsID8gZmFsc2UgOgotICAgICAgICAgICAgICAgICAgZmllbGRUeXBlLmlzSWdub3JlQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChpZ25vcmVGaWVsZEFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBmYWN0b3J5LmdldEFubm90YXRpb25JZ25vcmVzKCkuc2V0SWdub3JlQW5ub3RhdGlvbnNPbk1lbWJlcihmaWVsZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHZhbGlkCi0gICAgICAgICAgICBpZiAoZmllbGRUeXBlLmdldFZhbGlkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkVmFsaWQoYmVhbkNsYXNzLCBuZXcgRmllbGRBY2Nlc3MoZmllbGQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29uc3RyYWludHMKLSAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFR5cGUgY29uc3RyYWludFR5cGUgOiBmaWVsZFR5cGUuZ2V0Q29uc3RyYWludCgpKSB7Ci0gICAgICAgICAgICAgICAgTWV0YUNvbnN0cmFpbnQ8PywgPz4gY29uc3RyYWludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uc3RyYWludChjb25zdHJhaW50VHlwZSwgYmVhbkNsYXNzLCBmaWVsZCwgZGVmYXVsdFBhY2thZ2UpOwotICAgICAgICAgICAgICAgIGZhY3RvcnkuYWRkTWV0YUNvbnN0cmFpbnQoYmVhbkNsYXNzLCBjb25zdHJhaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUHJvcGVydHlMZXZlbChMaXN0PEdldHRlclR5cGU+IGdldHRlcnMsIENsYXNzPD8+IGJlYW5DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBnZXR0ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKEdldHRlclR5cGUgZ2V0dGVyVHlwZSA6IGdldHRlcnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBnZXR0ZXJOYW1lID0gZ2V0dGVyVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZ2V0dGVyTmFtZXMuY29udGFpbnMoZ2V0dGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihnZXR0ZXJOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAiIGlzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UgaW4gbWFwcGluZyB4bWwgZm9yIGJlYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgYmVhbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldHRlck5hbWVzLmFkZChnZXR0ZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSBnZXRHZXR0ZXIoYmVhbkNsYXNzLCBnZXR0ZXJOYW1lKTsKLSAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIGJlYW5DbGFzcy5nZXROYW1lKCkgKyAiIGRvZXMgbm90IGNvbnRhaW4gdGhlIHByb3BlcnR5ICAiICsgZ2V0dGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbm5vdGF0aW9ucwotICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVHZXR0ZXJBbm5vdGF0aW9uID0gZ2V0dGVyVHlwZS5pc0lnbm9yZUFubm90YXRpb25zKCkgPT0gbnVsbCA/IGZhbHNlIDoKLSAgICAgICAgICAgICAgICAgIGdldHRlclR5cGUuaXNJZ25vcmVBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgaWYgKGlnbm9yZUdldHRlckFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBmYWN0b3J5LmdldEFubm90YXRpb25JZ25vcmVzKCkuc2V0SWdub3JlQW5ub3RhdGlvbnNPbk1lbWJlcihtZXRob2QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB2YWxpZAotICAgICAgICAgICAgaWYgKGdldHRlclR5cGUuZ2V0VmFsaWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRWYWxpZChiZWFuQ2xhc3MsIG5ldyBNZXRob2RBY2Nlc3MoZ2V0dGVyTmFtZSwgbWV0aG9kKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnN0cmFpbnRzCi0gICAgICAgICAgICBmb3IgKENvbnN0cmFpbnRUeXBlIGNvbnN0cmFpbnRUeXBlIDogZ2V0dGVyVHlwZS5nZXRDb25zdHJhaW50KCkpIHsKLSAgICAgICAgICAgICAgICBNZXRhQ29uc3RyYWludDw/LCA/PiBtZXRhQ29uc3RyYWludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29uc3RyYWludChjb25zdHJhaW50VHlwZSwgYmVhbkNsYXNzLCBtZXRob2QsIGRlZmF1bHRQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZE1ldGFDb25zdHJhaW50KGJlYW5DbGFzcywgbWV0YUNvbnN0cmFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25zdHJhaW50RGVmaW5pdGlvbnMoCi0gICAgICAgICAgTGlzdDxDb25zdHJhaW50RGVmaW5pdGlvblR5cGU+IGNvbnN0cmFpbnREZWZpbml0aW9uTGlzdCwgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIGZvciAoQ29uc3RyYWludERlZmluaXRpb25UeXBlIGNvbnN0cmFpbnREZWZpbml0aW9uIDogY29uc3RyYWludERlZmluaXRpb25MaXN0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZSA9IGNvbnN0cmFpbnREZWZpbml0aW9uLmdldEFubm90YXRpb24oKTsKLQotICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBsb2FkQ2xhc3MoYW5ub3RhdGlvbkNsYXNzTmFtZSwgZGVmYXVsdFBhY2thZ2UpOwotICAgICAgICAgICAgaWYgKCFjbGF6ei5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKGFubm90YXRpb25DbGFzc05hbWUgKyAiIGlzIG5vdCBhbiBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0gKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPikgY2xheno7Ci0KLSAgICAgICAgICAgIFZhbGlkYXRlZEJ5VHlwZSB2YWxpZGF0ZWRCeVR5cGUgPSBjb25zdHJhaW50RGVmaW5pdGlvbi5nZXRWYWxpZGF0ZWRCeSgpOwotICAgICAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4+IGNsYXNzZXMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+PigpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICBJZiBpbmNsdWRlLWV4aXN0aW5nLXZhbGlkYXRvciBpcyBzZXQgdG8gZmFsc2UsCi0gICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvciBkZWZpbmVkIG9uIHRoZSBjb25zdHJhaW50IGFubm90YXRpb24gYXJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVkQnlUeXBlLmlzSW5jbHVkZUV4aXN0aW5nVmFsaWRhdG9ycygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZEJ5VHlwZS5pc0luY2x1ZGVFeGlzdGluZ1ZhbGlkYXRvcnMoKSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGUgbGlzdCBvZiBDb25zdHJhaW50VmFsaWRhdG9ycyBkZXNjcmliZWQgaW4gWE1MCi0gICAgICAgICAgICAgICAgIGFyZSBjb25jYXRlbmF0ZWQgdG8gdGhlIGxpc3Qgb2YgQ29uc3RyYWludFZhbGlkYXRvciBkZXNjcmliZWQgb24gdGhlCi0gICAgICAgICAgICAgICAgIGFubm90YXRpb24gdG8gZm9ybSBhIG5ldyBhcnJheSBvZiBDb25zdHJhaW50VmFsaWRhdG9yIGV2YWx1YXRlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZEFsbChmaW5kQ29uc3RyYWludFZhbGlkYXRvckNsYXNzZXMoYW5ub3RhdGlvbkNsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEpBWEJFbGVtZW50PFN0cmluZz4gdmFsaWRhdG9yQ2xhc3NOYW1lIDogdmFsaWRhdGVkQnlUeXBlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gdmFsaWRhdG9yQ2xhc3M7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yQ2xhc3MgPSAoQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+KQotICAgICAgICAgICAgICAgICAgICAgIGxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc05hbWUuZ2V0VmFsdWUoKSk7Ci0KLQotICAgICAgICAgICAgICAgIGlmICghQ29uc3RyYWludFZhbGlkYXRvci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHZhbGlkYXRvckNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ2xhc3MgKyAiIGlzIG5vdCBhIGNvbnN0cmFpbnQgdmFsaWRhdG9yIGNsYXNzIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGJhc2VkIENvbnN0cmFpbnRWYWxpZGF0b3IgY29tZSBiZWZvcmUgWE1MIGJhc2VkCi0gICAgICAgICAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvciBpbiB0aGUgYXJyYXkuIFRoZSBuZXcgbGlzdCBpcyByZXR1cm5lZAotICAgICAgICAgICAgICAgIGJ5IENvbnN0cmFpbnREZXNjcmlwdG9yLmdldENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKCkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFjbGFzc2VzLmNvbnRhaW5zKHZhbGlkYXRvckNsYXNzKSkgY2xhc3Nlcy5hZGQodmFsaWRhdG9yQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZhY3RvcnkuZ2V0Q29uc3RyYWludHNDYWNoZSgpLmNvbnRhaW5zQ29uc3RyYWludFZhbGlkYXRvcihhbm5vdGF0aW9uQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIkNvbnN0cmFpbnQgdmFsaWRhdG9yIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpICsgIiBhbHJlYWR5IGNvbmZpZ3VyZWQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhY3RvcnkuZ2V0Q29uc3RyYWludHNDYWNoZSgpLnB1dENvbnN0cmFpbnRWYWxpZGF0b3IoYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PyBleHRlbmRzIEFubm90YXRpb24sID8+Pj4gZmluZENvbnN0cmFpbnRWYWxpZGF0b3JDbGFzc2VzKAotICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSkgewotICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCA/Pj4+IGNsYXNzZXMgPQotICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBDb25zdHJhaW50VmFsaWRhdG9yPD8gZXh0ZW5kcyBBbm5vdGF0aW9uLCA/Pj4+KCk7Ci0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+W10gdmFsaWRhdG9yID0KLSAgICAgICAgICAgICAgZmFjdG9yeS5nZXREZWZhdWx0Q29uc3RyYWludHMoKS5nZXRWYWxpZGF0b3JDbGFzc2VzKGFubm90YXRpb25UeXBlKTsKLSAgICAgICAgaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsaWRhdG9yKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj5bXSB2YWxpZGF0ZWRCeSA9IGFubm90YXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbihDb25zdHJhaW50LmNsYXNzKQotICAgICAgICAgICAgICAgICAgLnZhbGlkYXRlZEJ5KCk7Ci0gICAgICAgICAgICBjbGFzc2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbGlkYXRlZEJ5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0gICAgICAgIHJldHVybiBsb2FkQ2xhc3ModG9RdWFsaWZpZWRDbGFzc05hbWUoY2xhc3NOYW1lLCBkZWZhdWx0UGFja2FnZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHRvUXVhbGlmaWVkQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBkZWZhdWx0UGFja2FnZSkgewotICAgICAgICBpZiAoIWlzUXVhbGlmaWVkQ2xhc3MoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gZGVmYXVsdFBhY2thZ2UgKyAiLiIgKyBjbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNRdWFsaWZpZWRDbGFzcyhTdHJpbmcgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGNsYXp6LmNvbnRhaW5zKCIuIik7Ci0gICAgfQotCi0KLQotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbikgewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0R2V0dGVyKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBNZXRob2QgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwID0gU3RyaW5nVXRpbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldE1ldGhvZCgiZ2V0IiArIHApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldE1ldGhvZCgiaXMiICsgcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi0KLQotICAgIHByaXZhdGUgQ2xhc3M8Pz4gbG9hZENsYXNzKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZG9Qcml2aWxlZ2VkKFNlY3VyZUFjdGlvbnMuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCi0gICAgICAgICAgICBsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGNsYXNzOiAiICsgY2xhc3NOYW1lLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvVmFsaWRhdGlvblBhcnNlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9WYWxpZGF0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYWNjYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9WYWxpZGF0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMueG1sOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNvbmZpZ3VyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5TZWN1cmVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlByaXZpbGVnZWRBY3Rpb25zOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5zcGkuVmFsaWRhdGlvblByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB1c2VzIGpheGIgdG8gcGFyc2UgdmFsaWRhdGlvbi54bWw8YnIvPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QYXJzZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZBTElEQVRJT05fWE1MX0ZJTEUgPSAiTUVUQS1JTkYvdmFsaWRhdGlvbi54bWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0NPTkZJR1VSQVRJT05fWFNEID0KLSAgICAgICAgICAgICJNRVRBLUlORi92YWxpZGF0aW9uLWNvbmZpZ3VyYXRpb24tMS4wLnhzZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoVmFsaWRhdGlvblBhcnNlci5jbGFzcy5nZXROYW1lKCkpOwotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdmFsaWRhdGlvblhtbEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgVmFsaWRhdGlvblBhcnNlciBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIFZhbGlkYXRpb25QYXJzZXIoU3RyaW5nIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsaWRhdGlvblhtbEZpbGUgPSBERUZBVUxUX1ZBTElEQVRJT05fWE1MX0ZJTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uWG1sRmlsZSA9IGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gaW50byA8Y29kZT50YXJnZXRDb25maWc8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldENvbmZpZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWYWxpZGF0aW9uQ29uZmlnKENvbmZpZ3VyYXRpb25JbXBsIHRhcmdldENvbmZpZykgewotICAgICAgICBWYWxpZGF0aW9uQ29uZmlnVHlwZSB4bWxDb25maWcgPSBwYXJzZVhtbENvbmZpZygpOwotICAgICAgICBpZiAoeG1sQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFwcGx5Q29uZmlnKHhtbENvbmZpZywgdGFyZ2V0Q29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmFsaWRhdGlvbkNvbmZpZ1R5cGUgcGFyc2VYbWxDb25maWcoKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZ2V0SW5wdXRTdHJlYW0odmFsaWRhdGlvblhtbEZpbGUpOwotICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIAlsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiTm8gJXMgZm91bmQuIFVzaW5nIGFubm90YXRpb24gYmFzZWQgY29uZmlndXJhdGlvbiBvbmx5LiIsIHZhbGlkYXRpb25YbWxGaWxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORVNULCBTdHJpbmcuZm9ybWF0KCIlcyBmb3VuZC4iLCB2YWxpZGF0aW9uWG1sRmlsZSkpOwotCi0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBKQVhCQ29udGV4dCBqYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKFZhbGlkYXRpb25Db25maWdUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBqYy5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIHVubWFyc2hhbGxlci5zZXRTY2hlbWEoc2NoZW1hKTsKLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBzdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIEpBWEJFbGVtZW50PFZhbGlkYXRpb25Db25maWdUeXBlPiByb290ID0KLSAgICAgICAgICAgICAgICAgICAgdW5tYXJzaGFsbGVyLnVubWFyc2hhbChzdHJlYW0sIFZhbGlkYXRpb25Db25maWdUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybiByb290LmdldFZhbHVlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSAiICsgdmFsaWRhdGlvblhtbEZpbGUsIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlICIgKyB2YWxpZGF0aW9uWG1sRmlsZSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IFByaXZpbGVnZWRBY3Rpb25zLmdldENsYXNzTG9hZGVyKGdldENsYXNzKCkpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotCi0gICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzcGVjIHNheXM6IElmIG1vcmUgdGhhbiBvbmUgTUVUQS1JTkYvdmFsaWRhdGlvbi54bWwgZmlsZQotICAgICAgICAgICAgLy8gaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aCwgYSBWYWxpZGF0aW9uRXhjZXB0aW9uIGlzIHJhaXNlZC4KLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gdXJscyA9IGxvYWRlci5nZXRSZXNvdXJjZXMocGF0aCk7Ci0gICAgICAgICAgICBpZiAodXJscy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSB1cmxzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodXJscy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXVybC5lcXVhbHModXJscy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCkpKSB7IC8vIGNvbXBsYWluIHdoZW4gZmlyc3QgZHVwbGljYXRlIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiTW9yZSB0aGFuIG9uZSAiICsgcGF0aCArICIgaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHByaXZhdGUgU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNjaGVtYShWQUxJREFUSU9OX0NPTkZJR1VSQVRJT05fWFNEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBTY2hlbWEgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHhzZAotICAgICAqIEByZXR1cm4ge0BsaW5rIFNjaGVtYX0KLSAgICAgKi8KLSAgICBzdGF0aWMgU2NoZW1hIGdldFNjaGVtYShTdHJpbmcgeHNkKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IFByaXZpbGVnZWRBY3Rpb25zLmdldENsYXNzTG9hZGVyKFZhbGlkYXRpb25QYXJzZXIuY2xhc3MpOwotICAgICAgICBTY2hlbWFGYWN0b3J5IHNmID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShYTUxDb25zdGFudHMuVzNDX1hNTF9TQ0hFTUFfTlNfVVJJKTsKLSAgICAgICAgVVJMIHNjaGVtYVVybCA9IGxvYWRlci5nZXRSZXNvdXJjZSh4c2QpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNmLm5ld1NjaGVtYShzY2hlbWFVcmwpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5XQVJOSU5HLCBTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gcGFyc2Ugc2NoZW1hOiAlcyIsIHhzZCksIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlDb25maWcoVmFsaWRhdGlvbkNvbmZpZ1R5cGUgeG1sQ29uZmlnLCBDb25maWd1cmF0aW9uSW1wbCB0YXJnZXRDb25maWcpIHsKLSAgICAgICAgYXBwbHlQcm92aWRlckNsYXNzKHhtbENvbmZpZywgdGFyZ2V0Q29uZmlnKTsKLSAgICAgICAgYXBwbHlNZXNzYWdlSW50ZXJwb2xhdG9yKHhtbENvbmZpZywgdGFyZ2V0Q29uZmlnKTsKLSAgICAgICAgYXBwbHlUcmF2ZXJzYWJsZVJlc29sdmVyKHhtbENvbmZpZywgdGFyZ2V0Q29uZmlnKTsKLSAgICAgICAgYXBwbHlDb25zdHJhaW50RmFjdG9yeSh4bWxDb25maWcsIHRhcmdldENvbmZpZyk7Ci0gICAgICAgIGFwcGx5TWFwcGluZ1N0cmVhbXMoeG1sQ29uZmlnLCB0YXJnZXRDb25maWcpOwotICAgICAgICBhcHBseVByb3BlcnRpZXMoeG1sQ29uZmlnLCB0YXJnZXRDb25maWcpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVByb3BlcnRpZXMoVmFsaWRhdGlvbkNvbmZpZ1R5cGUgeG1sQ29uZmlnLCBDb25maWd1cmF0aW9uSW1wbCB0YXJnZXQpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eVR5cGUgcHJvcGVydHkgOiB4bWxDb25maWcuZ2V0UHJvcGVydHkoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0xvZ2dhYmxlKExldmVsLkZJTkVTVCkpIHsKLSAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiRm91bmQgcHJvcGVydHkgJyVzJyB3aXRoIHZhbHVlICclcycgaW4gJXMiLCBwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKCksIHZhbGlkYXRpb25YbWxGaWxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhcHBseVByb3ZpZGVyQ2xhc3MoVmFsaWRhdGlvbkNvbmZpZ1R5cGUgeG1sQ29uZmlnLCBDb25maWd1cmF0aW9uSW1wbCB0YXJnZXQpIHsKLSAgICAgICAgU3RyaW5nIHByb3ZpZGVyQ2xhc3NOYW1lID0geG1sQ29uZmlnLmdldERlZmF1bHRQcm92aWRlcigpOwotICAgICAgICBpZiAocHJvdmlkZXJDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gY2xhenogPQotICAgICAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4pIGxvYWRDbGFzcyhwcm92aWRlckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0UHJvdmlkZXJDbGFzcyhjbGF6eik7Ci0gICAgICAgICAgICBsb2cubG9nKExldmVsLklORk8sIFN0cmluZy5mb3JtYXQoIlVzaW5nICVzIGFzIHZhbGlkYXRpb24gcHJvdmlkZXIuIiwgcHJvdmlkZXJDbGFzc05hbWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhcHBseU1lc3NhZ2VJbnRlcnBvbGF0b3IoVmFsaWRhdGlvbkNvbmZpZ1R5cGUgeG1sQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlSW50ZXJwb2xhdG9yQ2xhc3MgPSB4bWxDb25maWcuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpOwotICAgICAgICBpZiAodGFyZ2V0LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUludGVycG9sYXRvckNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzczxNZXNzYWdlSW50ZXJwb2xhdG9yPiBjbGF6eiA9IChDbGFzczxNZXNzYWdlSW50ZXJwb2xhdG9yPikKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDbGFzcyhtZXNzYWdlSW50ZXJwb2xhdG9yQ2xhc3MpOwotICAgICAgICAgICAgICAgIHRhcmdldC5tZXNzYWdlSW50ZXJwb2xhdG9yKG5ld0luc3RhbmNlKGNsYXp6KSk7Ci0gICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5JTkZPLCBTdHJpbmcuZm9ybWF0KCJVc2luZyAlcyBhcyBtZXNzYWdlIGludGVycG9sYXRvci4iLCBtZXNzYWdlSW50ZXJwb2xhdG9yQ2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhcHBseVRyYXZlcnNhYmxlUmVzb2x2ZXIoVmFsaWRhdGlvbkNvbmZpZ1R5cGUgeG1sQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyB0cmF2ZXJzYWJsZVJlc29sdmVyQ2xhc3MgPSB4bWxDb25maWcuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpOwotICAgICAgICBpZiAodGFyZ2V0LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodHJhdmVyc2FibGVSZXNvbHZlckNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzczxUcmF2ZXJzYWJsZVJlc29sdmVyPiBjbGF6eiA9IChDbGFzczxUcmF2ZXJzYWJsZVJlc29sdmVyPikKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDbGFzcyh0cmF2ZXJzYWJsZVJlc29sdmVyQ2xhc3MpOwotICAgICAgICAgICAgICAgIHRhcmdldC50cmF2ZXJzYWJsZVJlc29sdmVyKG5ld0luc3RhbmNlKGNsYXp6KSk7Ci0gICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5JTkZPLCBTdHJpbmcuZm9ybWF0KCJVc2luZyAlcyBhcyB0cmF2ZXJzYWJsZSByZXNvbHZlci4iLCB0cmF2ZXJzYWJsZVJlc29sdmVyQ2xhc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgPFQ+IFQgbmV3SW5zdGFuY2UoZmluYWwgQ2xhc3M8VD4gY2xzKSB7Ci0gICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxUPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBUIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFudGlhdGUgOiAiICsgY2xzLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHZvaWQgYXBwbHlDb25zdHJhaW50RmFjdG9yeShWYWxpZGF0aW9uQ29uZmlnVHlwZSB4bWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyBjb25zdHJhaW50RmFjdG9yeUNsYXNzID0geG1sQ29uZmlnLmdldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIGlmICh0YXJnZXQuZ2V0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uc3RyYWludEZhY3RvcnlDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Q29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk+IGNsYXp6ID0gKENsYXNzPENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5PikKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRDbGFzcyhjb25zdHJhaW50RmFjdG9yeUNsYXNzKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkobmV3SW5zdGFuY2UoY2xhenopKTsKLSAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLklORk8sIFN0cmluZy5mb3JtYXQoIlVzaW5nICVzIGFzIGNvbnN0cmFpbnQgZmFjdG9yeS4iLCBjb25zdHJhaW50RmFjdG9yeUNsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlNYXBwaW5nU3RyZWFtcyhWYWxpZGF0aW9uQ29uZmlnVHlwZSB4bWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgdGFyZ2V0KSB7Ci0gICAgICAgIGZvciAoSkFYQkVsZW1lbnQ8U3RyaW5nPiBtYXBwaW5nRmlsZU5hbWVFbGVtZW50IDogeG1sQ29uZmlnLmdldENvbnN0cmFpbnRNYXBwaW5nKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtYXBwaW5nRmlsZU5hbWUgPSBtYXBwaW5nRmlsZU5hbWVFbGVtZW50LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAobWFwcGluZ0ZpbGVOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIC8vIENsYXNzbG9hZGVyIG5lZWRzIGEgcGF0aCB3aXRob3V0IGEgc3RhcnRpbmcgLwotICAgICAgICAgICAgICAgIG1hcHBpbmdGaWxlTmFtZSA9IG1hcHBpbmdGaWxlTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkVTVCwgU3RyaW5nLmZvcm1hdCgiVHJ5aW5nIHRvIG9wZW4gaW5wdXQgc3RyZWFtIGZvciAlcyIsIG1hcHBpbmdGaWxlTmFtZSkpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbiA9IGdldElucHV0U3RyZWFtKG1hcHBpbmdGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIGlucHV0IHN0cmVhbSBmb3IgbWFwcGluZyBmaWxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ0ZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBvcGVuIGlucHV0IHN0cmVhbSBmb3IgbWFwcGluZyBmaWxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ0ZpbGVOYW1lLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhcmdldC5hZGRNYXBwaW5nKGluKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZG9Qcml2aWxlZ2VkKGZpbmFsIFByaXZpbGVnZWRBY3Rpb248VD4gYWN0aW9uKSB7Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBsb2FkQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBkb1ByaXZpbGVnZWQoU2VjdXJlQWN0aW9ucy5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBsb2FkZXIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgY2xhc3M6ICIgKyBjbGFzc05hbWUsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlciBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC52YWxpZGF0aW9uLnNwaS5WYWxpZGF0aW9uUHJvdmlkZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTUxMjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlcgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLW9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRGVmYXVsdENvbnN0cmFpbnRzLnByb3BlcnRpZXMgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9EZWZhdWx0Q29uc3RyYWludHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMWU5NC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9EZWZhdWx0Q29uc3RyYWludHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgY29uZmlndXJhdGlvbiBmb3IgbWFwcGluZyBvZiBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzIHRvIENvbnN0cmFpbnRWYWxpZGF0b3IgaW1wbGVtZW50YXRpb25zCi0jIHRoZSBhbm5vdGF0aW9ucyBmcm9tIHRoZSBKU1IzMDMgdmFsaWRhdGlvbi1hcGkgYXJlIG1lbnRpb25lZCBoZXJlLCBidXQgeW91IGNvdWxkCi0jIGFsc28gZXh0ZW5kIHRoZSBjb25maWd1cmF0aW9uIHRvIGdldCBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG90aGVyIGNvbnN0cmFpbnQtYW5ub3RhdGlvbnMuCi0jIGZvcm1hdDoga2V5PWNvbnN0cmFpbnQtYW5ub3RhdGlvbi1jbGFzcyB2YWx1ZT1jb25zdHJhaW50LXZhbGlkYXRvci1jbGFzcyAobXVsdGlwbGUgY2xhc3NlczogY29tbWEtc2VwYXJhdGVkKQotCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkFzc2VydEZhbHNlPW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Bc3NlcnRGYWxzZVZhbGlkYXRvcgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlPW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Bc3NlcnRUcnVlVmFsaWRhdG9yCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXg9b3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXhWYWxpZGF0b3JGb3JOdW1iZXIsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuRGVjaW1hbE1heFZhbGlkYXRvckZvclN0cmluZwotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EZWNpbWFsTWluPW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5EZWNpbWFsTWluVmFsaWRhdG9yRm9yTnVtYmVyLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkRlY2ltYWxNaW5WYWxpZGF0b3JGb3JTdHJpbmcKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGlnaXRzPW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5EaWdpdHNWYWxpZGF0b3JGb3JOdW1iZXIsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuRGlnaXRzVmFsaWRhdG9yRm9yU3RyaW5nCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkZ1dHVyZT1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuRnV0dXJlVmFsaWRhdG9yRm9yRGF0ZSxcCi0gIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5GdXR1cmVWYWxpZGF0b3JGb3JDYWxlbmRhcgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg9b3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLk1heFZhbGlkYXRvckZvck51bWJlcixcCi0gIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5NYXhWYWxpZGF0b3JGb3JTdHJpbmcKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWluPW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5NaW5WYWxpZGF0b3JGb3JOdW1iZXIsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTWluVmFsaWRhdG9yRm9yU3RyaW5nCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw9b3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLk5vdE51bGxWYWxpZGF0b3IKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTnVsbD1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTnVsbFZhbGlkYXRvcgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0PW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5QYXN0VmFsaWRhdG9yRm9yRGF0ZSxcCi0gIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5QYXN0VmFsaWRhdG9yRm9yQ2FsZW5kYXIKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZT1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuU2l6ZVZhbGlkYXRvckZvclN0cmluZyxcCi0gIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5TaXplVmFsaWRhdG9yRm9yTWFwLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JDb2xsZWN0aW9uLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JBcnJheU9mQm9vbGVhbixcCi0gIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5TaXplVmFsaWRhdG9yRm9yQXJyYXlPZkJ5dGUsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZDaGFyLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JBcnJheU9mRG91YmxlLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JBcnJheU9mRmxvYXQsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZJbnQsXAotICBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuU2l6ZVZhbGlkYXRvckZvckFycmF5T2ZMb25nLFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JBcnJheU9mT2JqZWN0LFwKLSAgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JBcnJheU9mU2hvcnQKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybj1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuUGF0dGVyblZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0ZmQ5Ny4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhlIHByb3BlcnRpZXMgbGlzdGVkIGJlbG93IGFyZSByZXNvbHZlZCBieSB0aGUgZGVmYXVsdCBtZXNzYWdlIHJlc29sdmVyLgotCi0jIHN0YW5kYXJkCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk51bGwubWVzc2FnZT1tdXN0IGJlIG51bGwKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbC5tZXNzYWdlPW1heSBub3QgYmUgbnVsbAotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlLm1lc3NhZ2U9bXVzdCBiZSB0cnVlCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkFzc2VydEZhbHNlLm1lc3NhZ2U9bXVzdCBiZSBmYWxzZQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW4ubWVzc2FnZT1tdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7dmFsdWV9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1heC5tZXNzYWdlPW11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHt2YWx1ZX0KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZS5tZXNzYWdlPXNpemUgbXVzdCBiZSBiZXR3ZWVuIHttaW59IGFuZCB7bWF4fQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EaWdpdHMubWVzc2FnZT1udW1lcmljIHZhbHVlIG91dCBvZiBib3VuZHMgKDx7aW50ZWdlcn0gZGlnaXRzPi48e2ZyYWN0aW9ufSBkaWdpdHM+IGV4cGVjdGVkKQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXN0Lm1lc3NhZ2U9bXVzdCBiZSBhIHBhc3QgZGF0ZQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5GdXR1cmUubWVzc2FnZT1tdXN0IGJlIGEgZnV0dXJlIGRhdGUKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybi5tZXNzYWdlPW11c3QgbWF0Y2ggdGhlIGZvbGxvd2luZyByZWd1bGFyIGV4cHJlc3Npb246IHtyZWdleHB9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXgubWVzc2FnZT1tdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB7dmFsdWV9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNaW4ubWVzc2FnZT1tdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7dmFsdWV9Ci0KLSMgYWRkaXRpb25hbCBidWlsdC1pbnMKLW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3RFbXB0eS5tZXNzYWdlPW1heSBub3QgYmUgZW1wdHkKLW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5FbWFpbC5tZXNzYWdlPW5vdCBhIHdlbGwtZm9ybWVkIGVtYWlsIGFkZHJlc3MKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1ZhbGlkYXRpb25NZXNzYWdlc19kZS5wcm9wZXJ0aWVzIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWE4ZmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFRoZSBwcm9wZXJ0aWVzIGxpc3RlZCBiZWxvdyBhcmUgcmVzb2x2ZWQgYnkgdGhlIGRlZmF1bHQgbWVzc2FnZSByZXNvbHZlci4KLQotIyBzdGFuZGFyZAotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OdWxsLm1lc3NhZ2U9bXVzcyAibnVsbCIgc2VpbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsLm1lc3NhZ2U9ZGFyZiBuaWNodCAibnVsbCIgc2VpbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlLm1lc3NhZ2U9bXVzcyAidHJ1ZSIgc2VpbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRGYWxzZS5tZXNzYWdlPW11c3MgImZhbHNlIiBzZWluCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbi5tZXNzYWdlPW11c3MgZ3JcdTAwRjZcdTAwREZlciBvZGVyIGdsZWljaCB7dmFsdWV9IHNlaW4KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4Lm1lc3NhZ2U9bXVzcyBrbGVpbmVyIG9kZXIgZ2xlaWNoIHt2YWx1ZX0gc2VpbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplLm1lc3NhZ2U9R3JcdTAwRjZcdTAwREZlIG11c3Mgendpc2NoZW4ge21pbn0gdW5kIHttYXh9IGxpZWdlbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EaWdpdHMubWVzc2FnZT1udW1lcmlzY2hlciBXZXJ0IGF1XHUwMERGZXJoYWxiIGRlcyBHXHUwMEZDbHRpZ2tlaXRzYmVyZWljaGVzIChlcndhcnRlOiA8e2ludGVnZXJ9IGRpZ2l0cz4uPHtmcmFjdGlvbn0gZGlnaXRzPikKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdC5tZXNzYWdlPW11c3MgRGF0dW0gaW4gZGVyIFZlcmdhbmdlbmhlaXQgc2VpbgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5GdXR1cmUubWVzc2FnZT1tdXNzIERhdHVtIGluIGRlciBadWt1bmZ0IHNlaW4KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybi5tZXNzYWdlPU11c3MgbWl0IHJlZ3VsXHUwMEU0cmVtIEF1c2RydWNrIFx1MDBGQ2JlcmVpbnN0aW1tZW46IHtyZWdleHB9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXgubWVzc2FnZT1tdXNzIGtsZWluZXIgb2RlciBnbGVpY2gge3ZhbHVlfSBzZWluCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNaW4ubWVzc2FnZT1tdXNzIGdyXHUwMEY2XHUwMERGZXIgb2RlciBnbGVpY2gge3ZhbHVlfSBzZWluCi0KLSMgYWRkaXRpb25hbCBidWlsdC1pbnMKLW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3RFbXB0eS5tZXNzYWdlPWRhcmYgbmljaHQgbGVlciBzZWluCi1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuRW1haWwubWVzc2FnZT1tdXNzIGdcdTAwRkNsdGlnZXMgRm9ybWF0IGVpbmVyIEVNYWlsLUFkcmVzc2Ugc2VpbgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXNfZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjZmFkMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXNfZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgaW50ZW50aW9uYWxseSBlbXB0eSwgYmVjYXVzZSBlbmdsaXNoIG1lc3NhZ2VzIGFyZSBsb2NhdGVkIGluIHRoZSBkZWZhdWx0IGJ1bmRsZS4KLSMgdGhpcyBmaWxlIGVuc3VyZXMsIHRoYXQgYSBsb29rdXAgd2l0aCBhbiBlbmdsaXNoIGxvY2FsZSB1c2VzIHRoZSBkZWZhdWx0IGJ1bmRsZSBhbmQgbm90IHRoZQotIyBidW5kbGUgb2YgdGhlIGRlZmF1bHQgbG9jYWxlLCB3aGljaCBpcyBwbGF0Zm9ybSBzcGVjaWZpYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1ZhbGlkYXRpb25NZXNzYWdlc19lcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTE3NjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFRoZSBwcm9wZXJ0aWVzIGxpc3RlZCBiZWxvdyBhcmUgcmVzb2x2ZWQgYnkgdGhlIGRlZmF1bHQgbWVzc2FnZSByZXNvbHZlci4KLQotIyBzdGFuZGFyZAotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OdWxsLm1lc3NhZ2U9dGllbmUgcXVlIHNlciBudWxsCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGwubWVzc2FnZT1ubyBwdWVkZSBzZXIgbnVsbAotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Bc3NlcnRUcnVlLm1lc3NhZ2U9dGllbmUgcXVlIHNlciB0cnVlCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkFzc2VydEZhbHNlLm1lc3NhZ2U9dGllbmUgcXVlIHNlciBmYWxzZQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW4ubWVzc2FnZT10aWVuZSBxdWUgc2VyIG1lbm9yIG8gaWd1YWwgcXVlIHt2YWx1ZX0KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4Lm1lc3NhZ2U9dGllbmUgcXVlIHNlciBtYXlvciBvIGlndWFsIHF1ZSB7dmFsdWV9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemUubWVzc2FnZT1lbCB0YW1h8W8gdGllbmUgcXVlIGVzdGFyIGNvbXByZW5kaWRvIGVudHJlIHttaW59IHkge21heH0KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGlnaXRzLm1lc3NhZ2U9dmFsb3IgbnVt6XJpY28gZnVlcmEgZGUgbG9zIGztbWl0ZXMgKHNlIGVzcGVyYSA8e2ludGVnZXJ9IGNpZnJhcz4uPHtmcmFjdGlvbn0gY2lmcmFzPikKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGFzdC5tZXNzYWdlPXRpZW5lIHF1ZSBzZXIgdW5hIGZlY2hhIGVuIGVsIHBhc2FkbwotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5GdXR1cmUubWVzc2FnZT10aWVuZSBxdWUgc2VyIHVuYSBmZWNoYSBlbiBlbCBmdXR1cm8KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybi5tZXNzYWdlPXRpZW5lIHF1ZSBjb3JyZXNwb25kZXIgYSBsYSBleHByZXNp824gcmVndWxhciAie3JlZ2V4cH0iCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXgubWVzc2FnZT10aWVuZSBxdWUgc2VyIG1heW9yIG8gaWd1YWwgcXVlIHt2YWx1ZX0KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGVjaW1hbE1pbi5tZXNzYWdlPXRpZW5lIHF1ZSBzZXIgbWVub3IgbyBpZ3VhbCBxdWUge3ZhbHVlfQotCi0jIGFkZGl0aW9uYWwgYnVpbHQtaW5zCi1vcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90RW1wdHkubWVzc2FnZT1ubyBwdWVkZSBzZXIgdmFjaW8KLW9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5FbWFpbC5tZXNzYWdlPXRpZW5lIHF1ZSBzZXIgdW4gY29ycmVvIGVtYWlsIGJpZW4gZm9ybWFkbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvbk1lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlMzI3My4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uTWVzc2FnZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhlIHByb3BlcnRpZXMgbGlzdGVkIGJlbG93IGFyZSByZXNvbHZlZCBieSB0aGUgZGVmYXVsdCBtZXNzYWdlIHJlc29sdmVyLgotCi0jIHN0YW5kYXJkCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk51bGwubWVzc2FnZT1kZXZlIGVzc2VyZSBudWxsCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGwubWVzc2FnZT1ub24gcHVcdTAwRjIgZXNzZXJlIG51bGwKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuQXNzZXJ0VHJ1ZS5tZXNzYWdlPWRldmUgZXNzZXJlIHRydWUKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuQXNzZXJ0RmFsc2UubWVzc2FnZT1kZXZlIGVzc2VyZSBmYWxzZQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW4ubWVzc2FnZT1kZXZlIGVzc2VyZSBtaW5vcmUgbyB1Z3VhbGUgZGkge3ZhbHVlfQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXgubWVzc2FnZT1kZXZlIGVzc2VyZSBtYWdnaW9yZSBvIHVndWFsZSBkaSB7dmFsdWV9Ci1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemUubWVzc2FnZT1sZSBkaW1lbnNpb25pIGRldm9ubyBlc3NlcmUgdHJhIHttaW59IGUge21heH0KLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuRGlnaXRzLm1lc3NhZ2U9dmFsb3JlIG51bWVyaWNvIGZ1b3JpIGRhaSBsaW1pdGkgKGF0dGVzbyA8e2ludGVnZXJ9IGNpZnJlPi48e2ZyYWN0aW9ufSBjaWZyZT4pCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhc3QubWVzc2FnZT1kZXZlIGVzc2VyZSB1bmEgZGF0YSBuZWwgcGFzc2F0bwotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5GdXR1cmUubWVzc2FnZT1kZXZlIGVzc2VyZSB1bmEgZGF0YSBmdXR1cmEKLWphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybi5tZXNzYWdlPWRldmUgY29ycmlzcG9uZGVyZSBhbGwnZXNwcmVzc2lvbmUgcmVnb2xhcmUgIntyZWdleHB9IgotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EZWNpbWFsTWF4Lm1lc3NhZ2U9ZGV2ZSBlc3NlcmUgbWFnZ2lvcmUgbyB1Z3VhbGUgZGkge3ZhbHVlfQotamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EZWNpbWFsTWluLm1lc3NhZ2U9ZGV2ZSBlc3NlcmUgbWlub3JlIG8gdWd1YWxlIGRpIHt2YWx1ZX0KLQotIyBhZGRpdGlvbmFsIGJ1aWx0LWlucwotb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLk5vdEVtcHR5Lm1lc3NhZ2U9bm9uIHB1XHUwMEYyIGVzc2VyZSB2dW90bwotb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkVtYWlsLm1lc3NhZ2U9bm9uIFx1MDBFOCB1biBpbmRpcml6em8gZW1haWwgYmVuIGZvcm1hdG8KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3hqYi9iaW5kaW5nLWN1c3RvbWl6YXRpb24ueGpiIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4veGpiL2JpbmRpbmctY3VzdG9taXphdGlvbi54amIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzYwMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4veGpiL2JpbmRpbmctY3VzdG9taXphdGlvbi54amIKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08anhiOmJpbmRpbmdzIHZlcnNpb249IjEuMCIgeG1sbnM6anhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIgotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eGpjPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyI+Ci0gICAgPGp4YjpiaW5kaW5ncyBzY2hlbWFMb2NhdGlvbj0iLi4veHNkL3ZhbGlkYXRpb24tbWFwcGluZy0xLjAueHNkIiBub2RlPSIveHM6c2NoZW1hIj4KLSAgICAgICAgPGp4YjpnbG9iYWxCaW5kaW5ncz4KLSAgICAgICAgICAgIDx4amM6amF2YVR5cGUgbmFtZT0iamF2YS5sYW5nLlN0cmluZyIgeG1sVHlwZT0ieHM6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICBhZGFwdGVyPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXIiLz4KLSAgICAgICAgPC9qeGI6Z2xvYmFsQmluZGluZ3M+Ci0KLSAgICAgICAgPGp4YjpiaW5kaW5ncyBub2RlPSIvL3hzOmNvbXBsZXhUeXBlWzldL3hzOnNlcXVlbmNlWzFdL3hzOmVsZW1lbnRbMV0iPgotICAgICAgICAgICAgPGp4Yjpwcm9wZXJ0eSBuYW1lPSJjbGFzc1R5cGUiLz4KLSAgICAgICAgPC9qeGI6YmluZGluZ3M+Ci0gICAgPC9qeGI6YmluZGluZ3M+Ci08L2p4YjpiaW5kaW5ncz4KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3hzZC92YWxpZGF0aW9uLWNvbmZpZ3VyYXRpb24tMS4wLnhzZCBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy9tYWluL3hzZC92YWxpZGF0aW9uLWNvbmZpZ3VyYXRpb24tMS4wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3NjcxNC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi94c2QvdmFsaWRhdGlvbi1jb25maWd1cmF0aW9uLTEuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9jb25maWd1cmF0aW9uIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHZlcnNpb249IjEuMCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRhdGlvbi1jb25maWciIHR5cGU9ImNvbmZpZzp2YWxpZGF0aW9uLWNvbmZpZ1R5cGUiCi0gICAgICAgICAgICAgICAgeG1sbnM6Y29uZmlnPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL2NvbmZpZ3VyYXRpb24iLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdGlvbi1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJkZWZhdWx0LXByb3ZpZGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibWVzc2FnZS1pbnRlcnBvbGF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ0cmF2ZXJzYWJsZS1yZXNvbHZlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImNvbnN0cmFpbnQtdmFsaWRhdG9yLWZhY3RvcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJjb25zdHJhaW50LW1hcHBpbmciIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9ImNvbmZpZzpwcm9wZXJ0eVR5cGUiIG5hbWU9InByb3BlcnR5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6Y29uZmlnPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL2NvbmZpZ3VyYXRpb24iLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi94c2QvdmFsaWRhdGlvbi1tYXBwaW5nLTEuMC54c2QgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvbWFpbi94c2QvdmFsaWRhdGlvbi1tYXBwaW5nLTEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzM0YjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL21haW4veHNkL3ZhbGlkYXRpb24tbWFwcGluZy0xLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL21hcHBpbmciCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb25zdHJhaW50LW1hcHBpbmdzIgotICAgICAgICAgICAgICAgIHR5cGU9Im1hcDpjb25zdHJhaW50LW1hcHBpbmdzVHlwZSIKLSAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBheWxvYWRUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3Vwc1R5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ3JvdXBTZXF1ZW5jZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9InZhbHVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RyYWludC1tYXBwaW5nc1R5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImRlZmF1bHQtcGFja2FnZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6YmVhblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJiZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmNvbnN0cmFpbnQtZGVmaW5pdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb25zdHJhaW50LWRlZmluaXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdGVkLWJ5VHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9InhzOnN0cmluZyIgbmFtZT0idmFsdWUiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpib29sZWFuIiBuYW1lPSJpbmNsdWRlLWV4aXN0aW5nLXZhbGlkYXRvcnMiIHVzZT0ib3B0aW9uYWwiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjb25zdHJhaW50VHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibWVzc2FnZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6Z3JvdXBzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6cGF5bG9hZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJwYXlsb2FkIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bWFwPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL21hcHBpbmciLz4gICAgICAgICAgICAKLSAgICAgICAgICAgIDx4czplbGVtZW50IHR5cGU9Im1hcDplbGVtZW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhbm5vdGF0aW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudFR5cGUiIG1peGVkPSJ0cnVlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWx1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmFubm90YXRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iYW5ub3RhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bWFwPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL21hcHBpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB0eXBlPSJ4czpzdHJpbmciIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjbGFzc1R5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6Z3JvdXBTZXF1ZW5jZVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAtc2VxdWVuY2UiIAotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6Y29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOmJvb2xlYW4iIG5hbWU9Imlnbm9yZS1hbm5vdGF0aW9ucyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJlYW5UeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bWFwPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL21hcHBpbmciPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmZpZWxkVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZpZWxkIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmdldHRlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJnZXR0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOmJvb2xlYW4iIG5hbWU9Imlnbm9yZS1hbm5vdGF0aW9ucyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFubm90YXRpb25UeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ibWFwOmVsZW1lbnRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6bWFwPSJodHRwOi8vamJvc3Mub3JnL3htbC9ucy9qYXZheC92YWxpZGF0aW9uL21hcHBpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnZXR0ZXJUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWxpZCIgbWluT2NjdXJzPSIwIiBmaXhlZD0iIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6Y29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOmJvb2xlYW4iIG5hbWU9Imlnbm9yZS1hbm5vdGF0aW9ucyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0cmFpbnQtZGVmaW5pdGlvblR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6dmFsaWRhdGVkLWJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InZhbGlkYXRlZC1ieSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOm1hcD0iaHR0cDovL2pib3NzLm9yZy94bWwvbnMvamF2YXgvdmFsaWRhdGlvbi9tYXBwaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJhbm5vdGF0aW9uIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmllbGRUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6c3RyaW5nIiBuYW1lPSJ2YWxpZCIgbWluT2NjdXJzPSIwIiBmaXhlZD0iIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJtYXA6Y29uc3RyYWludFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJjb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczptYXA9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOnN0cmluZyIgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIHR5cGU9InhzOmJvb2xlYW4iIG5hbWU9Imlnbm9yZS1hbm5vdGF0aW9ucyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Fzc2VydEZhbHNlVmFsaWRhdG9yVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0RmFsc2VWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NzdkMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0RmFsc2VWYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLQotLyoqCi0gKiBDaGVja3MgY29ycmVjdCBiZWhhdmlvdXIgb2Yge0BsaW5rIEFzc2VydEZhbHNlVmFsaWRhdG9yfS4KLSAqIDxwPgotICogUGVyIHRoZSBzcGVjOgotICogPHVsPgotICogPGxpPlRoZSBhbm5vdGF0ZWQgZWxlbWVudCBtdXN0IGJlIGZhbHNlLjwvbGk+Ci0gKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdmFsaWQuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIFRPRE86IE1vY2sgY29udGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQncyBub3QgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbi4KLSAqIAotICogQHNlZSAiYmVhbl92YWxpZGF0aW9uLTFfMF9DUjEtcGZkLXNwZWMjQ2hhcHRlcjYjRXhhbXBsZTYuNCIKLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0RmFsc2VWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXNzZXJ0RmFsc2VWYWxpZGF0b3JUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFzc2VydEZhbHNlVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgIAlzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB7QGxpbmsgQXNzZXJ0RmFsc2VWYWxpZGF0b3J9IHdpdGggPGNvZGU+bnVsbDwvY29kZT4gY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0RmFsc2VWYWxpZGF0b3IoKSB7Ci0gICAgCUFzc2VydEZhbHNlVmFsaWRhdG9yIGFmdiA9IG5ldyBBc3NlcnRGYWxzZVZhbGlkYXRvcigpOwotICAgIAlhc3NlcnRGYWxzZSgiVHJ1ZSB2YWx1ZSB2YWxpZGF0aW9uIG11c3QgZmFpbCIsIGFmdi5pc1ZhbGlkKHRydWUsIG51bGwpKTsKLSAgICAJYXNzZXJ0VHJ1ZSgiRmFsc2UgdmFsdWUgdmFsaWRhdGlvbiBtdXN0IHN1Y2NlZWQiLCBhZnYuaXNWYWxpZChmYWxzZSwgbnVsbCkpOwotICAgIAlhc3NlcnRUcnVlKCJOdWxsIHZhbHVlIHZhbGlkYXRpb24gbXVzdCBzdWNjZWVkIiwgYWZ2LmlzVmFsaWQobnVsbCwgbnVsbCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0VHJ1ZVZhbGlkYXRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0Fzc2VydFRydWVWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNmZlMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXNzZXJ0VHJ1ZVZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotCi0vKioKLSAqIENoZWNrcyBjb3JyZWN0IGJlaGF2aW91ciBvZiB7QGxpbmsgQXNzZXJ0VHJ1ZVZhbGlkYXRvcn0uCi0gKiA8cD4KLSAqIFBlciB0aGUgc3BlYzoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgYW5ub3RhdGVkIGVsZW1lbnQgbXVzdCBiZSB0cnVlLjwvbGk+Ci0gKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdmFsaWQuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIFRPRE86IE1vY2sgY29udGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQncyBub3QgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbi4KLSAqIAotICogQHNlZSAiYmVhbl92YWxpZGF0aW9uLTFfMF9DUjEtcGZkLXNwZWMjQ2hhcHRlcjYjRXhhbXBsZTYuMyIKLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0VHJ1ZVZhbGlkYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBc3NlcnRUcnVlVmFsaWRhdG9yVGVzdC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBc3NlcnRUcnVlVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgIAlzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB7QGxpbmsgQXNzZXJ0VHJ1ZVZhbGlkYXRvcn0gd2l0aCBudWxsIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2VydFRydWVWYWxpZGF0b3IoKSB7Ci0gICAgCUFzc2VydFRydWVWYWxpZGF0b3IgYXR2ID0gbmV3IEFzc2VydFRydWVWYWxpZGF0b3IoKTsKLSAgICAJYXNzZXJ0VHJ1ZSgiVHJ1ZSB2YWx1ZSB2YWxpZGF0aW9uIG11c3Qgc3VjY2VlZCIsIGF0di5pc1ZhbGlkKHRydWUsIG51bGwpKTsKLSAgICAJYXNzZXJ0RmFsc2UoIkZhbHNlIHZhbHVlIHZhbGlkYXRpb24gbXVzdCBmYWlsIiwgYXR2LmlzVmFsaWQoZmFsc2UsIG51bGwpKTsKLSAgICAJYXNzZXJ0VHJ1ZSgiTnVsbCB2YWx1ZSB2YWxpZGF0aW9uIG11c3Qgc3VjY2VlZCIsIGF0di5pc1ZhbGlkKG51bGwsIG51bGwpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0F1dGhvckFkZHJlc3NLbm93bi5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXV0aG9yQWRkcmVzc0tub3duLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDBiNWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQXV0aG9yQWRkcmVzc0tub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkFkZHJlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkF1dGhvcjsKLQotLyoqCi0gKiAKLSAqIAotICogQHZlcnNpb24gJFJldjogOTk5NzI5ICQgJERhdGU6IDIwMTAtMDktMjEgMjE6Mzc6NTQgLTA1MDAgKFR1ZSwgMjEgU2VwIDIwMTApICQKLSAqLwotQFRhcmdldCggeyBBTk5PVEFUSU9OX1RZUEUsIE1FVEhPRCwgRklFTEQgfSkKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gQXV0aG9yQWRkcmVzc0tub3duLlZhbGlkYXRvci5jbGFzcykKLUBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEF1dGhvckFkZHJlc3NLbm93biB7Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIntvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuQXV0aG9yQWRkcmVzc0tub3duLm1lc3NhZ2V9IjsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHsgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxBdXRob3JBZGRyZXNzS25vd24sIEF1dGhvcj4gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEF1dGhvckFkZHJlc3NLbm93biBjb25zdHJhaW50QW5ub3RhdGlvbikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQXV0aG9yIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUuZ2V0QWRkcmVzc2VzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoQWRkcmVzcyBhZGRyZXNzIDogdmFsdWUuZ2V0QWRkcmVzc2VzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvQ29tcGFueUVtYWlsLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Db21wYW55RW1haWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0Y2QyZi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Db21wYW55RW1haWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5PdmVycmlkZXNBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLUBQYXR0ZXJuLkxpc3QoewotICAgIC8vIGVtYWlsCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIltBLVowLTkuXyUrLV0rQFtBLVowLTkuLV0rXFwuW0EtWl17Miw0fSIpLAotICAgIC8vIGFnaW1hdGVjCi0gICAgQFBhdHRlcm4ocmVnZXhwID0gIi4qP0NPTVBBTlkuKj8iKQotfSkKLS8qKgotICogdGVzdCBhIGNvbnN0cmFpbnQgV0lUSE9VVCBhbiBvd24gQ29uc3RyYWludFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbi4KLSAqIHRoZSB2YWxpZGF0aW9ucywgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZCBhcmUgaW4gdGhlIGNvbWJpbmVkIGNvbnN0cmFpbnRzIG9ubHkhIQotICogdGhlIEBDb25zdHJhaW50IGFubm90YXRpb24gaXMgbmV2ZXJ0aGVsZXNzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIGZyYW1ld29yayBzZWFyY2hlcwotICogZm9yIGNvbWJpbmVkIGNvbnN0cmFpbnRzLiAgCi0gKi8KLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pCi1ARG9jdW1lbnRlZAotQFRhcmdldCh7QU5OT1RBVElPTl9UWVBFLCBNRVRIT0QsIEZJRUxELCBDT05TVFJVQ1RPUiwgUEFSQU1FVEVSfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIENvbXBhbnlFbWFpbCB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJOb3QgYW4gZW1haWwgb2YgQ09NUEFOWSI7Ci0KLSAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBQYXR0ZXJuLmNsYXNzLCBuYW1lID0gIm1lc3NhZ2UiLAotICAgICAgICAgIGNvbnN0cmFpbnRJbmRleCA9IDApIFN0cmluZyBlbWFpbE1lc3NhZ2UoKSBkZWZhdWx0ICJOb3QgYW4gZW1haWwiOwotCi0gICAgQE92ZXJyaWRlc0F0dHJpYnV0ZShjb25zdHJhaW50ID0gUGF0dGVybi5jbGFzcywgbmFtZSA9ICJtZXNzYWdlIiwKLSAgICAgICAgICBjb25zdHJhaW50SW5kZXggPSAxKSBTdHJpbmcgYWdpbWF0ZWNNZXNzYWdlKCkgZGVmYXVsdCAiTm90IENPTVBBTlkiOwotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0KLSAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEUsIENPTlNUUlVDVE9SLCBQQVJBTUVURVJ9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgICAgICAgIEBpbnRlcmZhY2UgTGlzdCB7Ci0gICAgICAgIENvbXBhbnlFbWFpbFtdIHZhbHVlKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RlY2ltYWxNaW5NYXhWYWxpZGF0b3JzVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1pbk1heFZhbGlkYXRvcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTBiYjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGVjaW1hbE1pbk1heFZhbGlkYXRvcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkRlY2ltYWxNYXg7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EZWNpbWFsTWluOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxicj4KLSAqIFVzZXI6IHJvbWFuLnN0dW1tPGJyPgotICogRGF0ZTogMDYuMDQuMjAxMDxicj4KLSAqIFRpbWU6IDEzOjQ1OjA5PGJyPgotICovCi1wdWJsaWMgY2xhc3MgRGVjaW1hbE1pbk1heFZhbGlkYXRvcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQERlY2ltYWxNaW4oIjkyMjM5MjIzOTIyMy4wNiIpCi0gICAgcHVibGljIGRvdWJsZSBkbWluOwotICAgIEBEZWNpbWFsTWF4KCI5MjIzOTIyMzkyMjMuMDkiKQotICAgIHB1YmxpYyBkb3VibGUgZG1heDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsTWluVmFsdWUoKSB7Ci0gICAgICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgdGhpcy5kbWluID0gOTIyMzkyMjM5MjIzLjA1OwotICAgICAgICB0aGlzLmRtYXggPSA5MjIzOTIyMzkyMjMuMDg7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248RGVjaW1hbE1pbk1heFZhbGlkYXRvcnNUZXN0Pj4gcmVzID0gdi52YWxpZGF0ZSh0aGlzKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIk1pbiB2YWxpZGF0aW9uIGZhaWxlZCIsIHJlcy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsTWF4VmFsdWUoKSB7Ci0gICAgICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgdGhpcy5kbWluID0gRG91YmxlLk1BWF9WQUxVRTsKLSAgICAgICAgdGhpcy5kbWF4ID0gOTIyMzkyMjM5MjIzLjE7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248RGVjaW1hbE1pbk1heFZhbGlkYXRvcnNUZXN0Pj4gcmVzID0gdi52YWxpZGF0ZSh0aGlzKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIk1heCB2YWxpZGF0aW9uIGZhaWxlZCIsIHJlcy5pc0VtcHR5KCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRGlnaXRzVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVlZDJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0RpZ2l0c1ZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIERpZ2l0c0NvbnN0cmFpbnRWYWxpZGF0b3IgVGVzdGVyLgotICoKLSAqIEBhdXRob3IgPEF1dGhvcnMgbmFtZT4KLSAqIEBzaW5jZSA8cHJlPjAyLzAzLzIwMDk8L3ByZT4KLSAqIEB2ZXJzaW9uIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlnaXRzVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgRGlnaXRzVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXIoKSB7Ci0gICAgICAgIERpZ2l0c1ZhbGlkYXRvckZvck51bWJlciB2YWxpZGF0b3IgPSBuZXcgRGlnaXRzVmFsaWRhdG9yRm9yTnVtYmVyKCk7Ci0gICAgICAgIHZhbGlkYXRvci5zZXRGcmFjdGlvbmFsKDQpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SW50ZWdyYWwoMik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSh2YWxpZGF0b3IuaXNWYWxpZChuZXcgQmlnRGVjaW1hbCgiMTAwLjEyMzQiKSwgbnVsbCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQobmV3IEJpZ0RlY2ltYWwoIjk5LjEyMzQ1IiksIG51bGwpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQobmV3IEJpZ0RlY2ltYWwoIjk5LjEyMzQiKSwgbnVsbCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQoRG91YmxlLnZhbHVlT2YoMTAwLjEyMzQpLCBudWxsKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSh2YWxpZGF0b3IuaXNWYWxpZChEb3VibGUudmFsdWVPZig5OS4xMjM0NSksIG51bGwpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoRG91YmxlLnZhbHVlT2YoOTkuMTIzNCksIG51bGwpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmFsaWRhdG9yLmlzVmFsaWQoRG91YmxlLnZhbHVlT2YoOTkuMTIzNDAwKSwgbnVsbCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZChuZXcgQmlnRGVjaW1hbCgiOTkuMTIzNDAwIiksIG51bGwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmcoKSB7Ci0gICAgICAgIERpZ2l0c1ZhbGlkYXRvckZvclN0cmluZyB2YWxpZGF0b3IgPSBuZXcgRGlnaXRzVmFsaWRhdG9yRm9yU3RyaW5nKCk7Ci0gICAgICAgIHZhbGlkYXRvci5zZXRGcmFjdGlvbmFsKDQpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SW50ZWdyYWwoMik7Ci0gICAgICAgIFN0cmluZyB2YWwgPSAiMTAwLjEyMzQ1IjsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHZhbGlkYXRvci5pc1ZhbGlkKHZhbCwgbnVsbCkpOwotICAgICAgICB2YWwgPSAiOTkuMTIzNCI7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKHZhbCwgbnVsbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU51bWJlcjIoKSB7Ci0gICAgICAgIERpZ2l0c1ZhbGlkYXRvckZvck51bWJlciB2YWxpZGF0b3IgPSBuZXcgRGlnaXRzVmFsaWRhdG9yRm9yTnVtYmVyKCk7Ci0gICAgICAgIHZhbGlkYXRvci5zZXRGcmFjdGlvbmFsKDQpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SW50ZWdyYWwoMik7Ci0gICAgICAgIExvbmcgdmFsID0gbmV3IExvbmcoIjEwMCIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQodmFsLCBudWxsKSk7Ci0gICAgICAgIHZhbCA9IG5ldyBMb25nKCI5OSIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuaXNWYWxpZCh2YWwsIG51bGwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmcyKCkgewotICAgICAgICBEaWdpdHNWYWxpZGF0b3JGb3JTdHJpbmcgdmFsaWRhdG9yID0gbmV3IERpZ2l0c1ZhbGlkYXRvckZvclN0cmluZygpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0RnJhY3Rpb25hbCgwKTsKLSAgICAgICAgdmFsaWRhdG9yLnNldEludGVncmFsKDIpOwotICAgICAgICBTdHJpbmcgdmFsID0gIjk5LjUiOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodmFsaWRhdG9yLmlzVmFsaWQodmFsLCBudWxsKSk7Ci0gICAgICAgIHZhbCA9ICI5OSI7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHZhbGlkYXRvci5pc1ZhbGlkKHZhbCwgbnVsbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRGlnaXRzVmFsaWRhdG9yVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRW1haWxWYWxpZGF0b3JUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9FbWFpbFZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhZTQzYS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9FbWFpbFZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwYWNoZVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkN1c3RvbWVyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLS8qKgotICogRW1haWxWYWxpZGF0b3IgVGVzdGVyLgotICoKLSAqIEBhdXRob3IgUm9tYW4gU3R1bW0KLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDxwcmU+MTAvMTQvMjAwODwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgRW1haWxWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1haWxBZGRyZXNzQnVpbGRlciB7Ci0gICAgICAgIEBFbWFpbAotICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBidWZmZXIuCi0gICAgICAgICAqIEByZXR1cm4gU3RyaW5nQnVpbGRlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgZ2V0QnVmZmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgcHVibGljIEVtYWlsVmFsaWRhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB2YWxpZGF0b3IgPSBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWwoKSB7Ci0gICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gbmV3IEN1c3RvbWVyKCk7Ci0gICAgICAgIGN1c3RvbWVyLnNldEN1c3RvbWVySWQoImlkLTEiKTsKLSAgICAgICAgY3VzdG9tZXIuc2V0Rmlyc3ROYW1lKCJNYXJ5Iik7Ci0gICAgICAgIGN1c3RvbWVyLnNldExhc3ROYW1lKCJEbyIpOwotICAgICAgICBjdXN0b21lci5zZXRQYXNzd29yZCgiMTIzNDUiKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIHZhbGlkYXRvci52YWxpZGF0ZShjdXN0b21lcikuc2l6ZSgpKTsKLQotICAgICAgICBjdXN0b21lci5zZXRFbWFpbEFkZHJlc3MoInNvbWVAaW52YWxpZEBhZGRyZXNzIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgdmFsaWRhdG9yLnZhbGlkYXRlKGN1c3RvbWVyKS5zaXplKCkpOwotCi0gICAgICAgIGN1c3RvbWVyLnNldEVtYWlsQWRkcmVzcygic29tZS52YWxpZC0wMTIzNDVAYWRkcmVzc19hdC10ZXN0Lm9yZyIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIHZhbGlkYXRvci52YWxpZGF0ZShjdXN0b21lcikuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxDaGFyU2VxdWVuY2UoKSB7Ci0gICAgICAgIEVtYWlsQWRkcmVzc0J1aWxkZXIgZW1haWxBZGRyZXNzQnVpbGRlciA9IG5ldyBFbWFpbEFkZHJlc3NCdWlsZGVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgdmFsaWRhdG9yLnZhbGlkYXRlKGVtYWlsQWRkcmVzc0J1aWxkZXIpLnNpemUoKSk7Ci0gICAgICAgIGVtYWlsQWRkcmVzc0J1aWxkZXIuZ2V0QnVmZmVyKCkuYXBwZW5kKCJmb28iKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCB2YWxpZGF0b3IudmFsaWRhdGUoZW1haWxBZGRyZXNzQnVpbGRlcikuc2l6ZSgpKTsKLSAgICAgICAgZW1haWxBZGRyZXNzQnVpbGRlci5nZXRCdWZmZXIoKS5hcHBlbmQoJ0AnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCB2YWxpZGF0b3IudmFsaWRhdGUoZW1haWxBZGRyZXNzQnVpbGRlcikuc2l6ZSgpKTsKLSAgICAgICAgZW1haWxBZGRyZXNzQnVpbGRlci5nZXRCdWZmZXIoKS5hcHBlbmQoImJhciIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIHZhbGlkYXRvci52YWxpZGF0ZShlbWFpbEFkZHJlc3NCdWlsZGVyKS5zaXplKCkpOwotICAgICAgICBlbWFpbEFkZHJlc3NCdWlsZGVyLmdldEJ1ZmZlcigpLmFwcGVuZCgnLicpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIHZhbGlkYXRvci52YWxpZGF0ZShlbWFpbEFkZHJlc3NCdWlsZGVyKS5zaXplKCkpOwotICAgICAgICBlbWFpbEFkZHJlc3NCdWlsZGVyLmdldEJ1ZmZlcigpLmFwcGVuZCgiYmF6Iik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgdmFsaWRhdG9yLnZhbGlkYXRlKGVtYWlsQWRkcmVzc0J1aWxkZXIpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFbWFpbFZhbGlkYXRvclRlc3QuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0ZyZW5jaFppcENvZGUuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0ZyZW5jaFppcENvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlNWI0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9GcmVuY2haaXBDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk92ZXJyaWRlc0F0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5SZXBvcnRBc1NpbmdsZVZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogZXhhbXBsZSBmb3IgY29tcG9zZWQgY29uc3RyYWludC4KLSAqIG5vdCBpbXBsZW1lbnRlZCEgc2ltcGxlIGR1bW15IGltcGxlbWVuYXRpb24gZm9yIHRlc3RzIG9ubHkhIDxici8+Ci0gKi8KLUBOb3RFbXB0eQotQE5vdE51bGwKLUBTaXplKG1pbiA9IDQsIG1heCA9IDUsIG1lc3NhZ2UgPSAiWmlwY29kZSBzaG91bGQgYmUgb2Ygc2l6ZSB7dmFsdWV9IikKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gRnJlbmNoWmlwY29kZVZhbGlkYXRvci5jbGFzcykKLUBSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbgotQERvY3VtZW50ZWQKLUBUYXJnZXQoe0FOTk9UQVRJT05fVFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1AUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBGcmVuY2haaXBDb2RlIHsKLSAgICBAT3ZlcnJpZGVzQXR0cmlidXRlLkxpc3QoewotICAgICAgICAgICAgQE92ZXJyaWRlc0F0dHJpYnV0ZShjb25zdHJhaW50ID0gU2l6ZS5jbGFzcywgbmFtZT0gIm1pbiIpLAotICAgICAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBTaXplLmNsYXNzLCBuYW1lID0gIm1heCIpfSkKLSAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgNjsKLQotICAgIEBPdmVycmlkZXNBdHRyaWJ1dGUoY29uc3RyYWludD1TaXplLmNsYXNzLCBuYW1lPSJtZXNzYWdlIikKLSAgICBTdHJpbmcgc2l6ZU1lc3NhZ2UoKSBkZWZhdWx0ICJ7ZXJyb3IuemlwY29kZS5zaXplfSI7Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIldyb25nIHppcGNvZGUiOwotCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQgeyB9OwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRnJlbmNoWmlwY29kZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvRnJlbmNoWmlwY29kZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkyMTQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0ZyZW5jaFppcGNvZGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IG5vdCBpbXBsZW1lbnRlZCAodGVzdCBvbmx5KTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBGcmVuY2haaXBjb2RlVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxGcmVuY2haaXBDb2RlLCBPYmplY3Q+IHsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEZyZW5jaFppcENvZGUgY29uc3RyYWludEFubm90YXRpb24pIHsKLSAgICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoT2JqZWN0IG9iamVjdCwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgdmFsaWRhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgIT0gb2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0hhc1N0cmluZ1ZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvSGFzU3RyaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmJlNjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvSGFzU3RyaW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEhhc1N0cmluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8SGFzVmFsdWUsIFN0cmluZz4gewotICAgIHByaXZhdGUgU3RyaW5nW10gdmFsdWVzOwotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShIYXNWYWx1ZSBzdHJpbmdWYWx1ZXMpIHsKLSAgICAgICAgdmFsdWVzID0gc3RyaW5nVmFsdWVzLnZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcywgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHMgPT0gbnVsbCB8fCBBcnJheVV0aWxzLmNvbnRhaW5zKHZhbHVlcywgcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvSGFzVmFsdWUuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL0hhc1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzAxMjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvSGFzVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGFsbG93IGRpc3RpbmN0IHN0cmluZyB2YWx1ZXMgZm9yIGVsZW1lbnQgKGxpa2UgZW51bXMpIDxici8+Ci0gKi8KLUBUYXJnZXQoe0FOTk9UQVRJT05fVFlQRSwgTUVUSE9ELCBGSUVMRH0pCi1AQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHtIYXNTdHJpbmdWYWxpZGF0b3IuY2xhc3N9KQotQFJldGVudGlvbihSVU5USU1FKQotcHVibGljIEBpbnRlcmZhY2UgSGFzVmFsdWUgewotICAgIFN0cmluZ1tdIHZhbHVlKCk7Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIldyb25nIHZhbHVlLCBtdXN0IGJlIG9uZSBvZiB7dmFsdWV9IjsKLQotICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHsgfTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01pbk1heFZhbGlkYXRvcnNGb3JOdW1iZXJUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9NaW5NYXhWYWxpZGF0b3JzRm9yTnVtYmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY2OGRjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL01pbk1heFZhbGlkYXRvcnNGb3JOdW1iZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1heDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENoZWNrIGNvcnJlY3QgYmVoYXZpb3VyIG9mIHtAbGluayBNaW5WYWxpZGF0b3JGb3JOdW1iZXJ9IGFuZAotICoge0BsaW5rIE1heFZhbGlkYXRvckZvck51bWJlcn0gb24gYm91bmRhcnkgdmFsdWVzLgotICogPHAvPgotICogVGhlIGNob3NlbiBudW1iZXJzOiA5MjIzMzcyMDM2ODU0Nzc1ODA2bCBhbmQgOTIyMzM3MjAzNjg1NDc3NTgwN2wgY2FzdCB0byB0aGUKLSAqIHNhbWUgZG91YmxlIHZhbHVlLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW5NYXhWYWxpZGF0b3JzRm9yTnVtYmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEBNaW4odmFsdWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3bCkKLSAgICBwdWJsaWMgbG9uZyBtaW47Ci0KLSAgICBATWF4KHZhbHVlID0gOTIyMzM3MjAzNjg1NDc3NTgwNmwpCi0gICAgcHVibGljIGxvbmcgbWF4OwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbkJvdW5kYXJ5VmFsdWUoKSB7Ci0gICAgICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgdGhpcy5taW4gPSA5MjIzMzcyMDM2ODU0Nzc1ODA2bDsKLSAgICAgICAgdGhpcy5tYXggPSAwbDsKLQotICAgICAgICAvLyBDdXJyZW50IG1pbiB2YWx1ZSBpcyBzbWFsbGVyLCBzaG91bGQgZmFpbCwgYnV0IGl0IGRvZXNuJ3QKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248TWluTWF4VmFsaWRhdG9yc0Zvck51bWJlclRlc3Q+PiByZXMgPSB2LnZhbGlkYXRlKHRoaXMpOwotICAgICAgICBhc3NlcnRGYWxzZSgiTWluIHZhbGlkYXRpb24gZmFpbGVkIiwgcmVzLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1heEJvdW5kYXJ5VmFsdWUoKSB7Ci0gICAgICAgIFZhbGlkYXRvciB2ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgdGhpcy5taW4gPSBMb25nLk1BWF9WQUxVRTsKLSAgICAgICAgdGhpcy5tYXggPSA5MjIzMzcyMDM2ODU0Nzc1ODA3bDsKLQotICAgICAgICAvLyBDdXJyZW50IG1heCB2YWx1ZSBpcyBiaWdnZXIsIHNob3VsZCBmYWlsLCBidXQgaXQgZG9lc24ndAotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxNaW5NYXhWYWxpZGF0b3JzRm9yTnVtYmVyVGVzdD4+IHJlcyA9IHYudmFsaWRhdGUodGhpcyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJNYXggdmFsaWRhdGlvbiBmYWlsZWQiLCByZXMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdE51bGxWYWxpZGF0b3JUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9Ob3ROdWxsVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgxNTBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL05vdE51bGxWYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLQotLyoqCi0gKiBDaGVja3MgY29ycmVjdCBiZWhhdmlvdXIgb2Yge0BsaW5rIE5vdE51bGxWYWxpZGF0b3J9LgotICogPHA+Ci0gKiBQZXIgdGhlIHNwZWM6Ci0gKiA8dWw+Ci0gKiA8bGk+VGhlIGFubm90YXRlZCBlbGVtZW50IG11c3Qgbm90IGJlIG51bGwuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIFRPRE86IE1vY2sgY29udGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQncyBub3QgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbi4KLSAqIAotICogQHNlZSAiYmVhbl92YWxpZGF0aW9uLTFfMF9DUjEtcGZkLXNwZWMjQ2hhcHRlcjYjRXhhbXBsZTYuMiIKLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgTm90TnVsbFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE5vdE51bGxWYWxpZGF0b3JUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vdE51bGxWYWxpZGF0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBOb3ROdWxsVmFsaWRhdG9yfSB3aXRoIG51bGwgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbFZhbGlkYXRvcigpIHsKLSAgICAJTm90TnVsbFZhbGlkYXRvciBubnYgPSBuZXcgTm90TnVsbFZhbGlkYXRvcigpOwotICAgIAlhc3NlcnRUcnVlKCJOb24gbnVsbCB2YWx1ZSB2YWxpZGF0aW9uIG11c3Qgc3VjY2VlZCIsIG5udi5pc1ZhbGlkKCJoZWxsbyIsIG51bGwpKTsKLSAgICAJYXNzZXJ0RmFsc2UoIk51bGwgdmFsdWUgdmFsaWRhdGlvbiBtdXN0IGZhaWwiLCBubnYuaXNWYWxpZChudWxsLCBudWxsKSk7ICAgIAkKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9OdWxsVmFsaWRhdG9yVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvTnVsbFZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmZTI4MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9OdWxsVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLS8qKgotICogQ2hlY2tzIGNvcnJlY3QgYmVoYXZpb3VyIG9mIHtAbGluayBOdWxsVmFsaWRhdG9yfS4KLSAqIDxwPgotICogUGVyIHRoZSBzcGVjOgotICogPHVsPgotICogPGxpPlRoZSBhbm5vdGF0ZWQgZWxlbWVudCBtdXN0IGJlIG51bGwuPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIFRPRE86IE1vY2sgY29udGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQncyBub3QgdXNlZCBkdXJpbmcgdmFsaWRhdGlvbi4KLSAqIAotICogQHNlZSAiYmVhbl92YWxpZGF0aW9uLTFfMF9DUjEtcGZkLXNwZWMjQ2hhcHRlcjYjRXhhbXBsZTYuMSIKLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE51bGxWYWxpZGF0b3JUZXN0LmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE51bGxWYWxpZGF0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgCXN1cGVyKG5hbWUpOwotICAgIH0KLQkKLSAgICAvKioKLSAgICAgKiBUZXN0IHtAbGluayBBc3NlcnRGYWxzZVZhbGlkYXRvcn0gd2l0aCBudWxsIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxWYWxpZGF0b3IoKSB7Ci0gICAgCU51bGxWYWxpZGF0b3IgbnYgPSBuZXcgTnVsbFZhbGlkYXRvcigpOwotICAgIAlhc3NlcnRUcnVlKCJOdWxsIHZhbHVlIHZhbGlkYXRpb24gbXVzdCBzdWNjZWVkIiwgbnYuaXNWYWxpZChudWxsLCBudWxsKSk7Ci0gICAgCWFzc2VydEZhbHNlKCJOb24gbnVsbCB2YWx1ZSB2YWxpZGF0aW9uIG11c3QgZmFpbCIsIG52LmlzVmFsaWQoImhlbGxvIiwgbnVsbCkpOyAgICAJCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGFzc3dvcmQuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1Bhc3N3b3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjJmYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvUGFzc3dvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqIFVzZXI6IHJvbWFuLnN0dW1tIDxici8+Ci0gKiBEYXRlOiAwMS4wNC4yMDA4IDxici8+Ci0gKiBUaW1lOiAxMjowMjowNiA8YnIvPgotICovCi1ATm90RW1wdHkKLUBOb3ROdWxsCi1AU2l6ZShtaW4gPSA0LCBtYXggPSA1KQotQFJldGVudGlvbihSVU5USU1FKQotQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkKLS8vIHRlc3QgdGhhdCBQYXNzd29yZCBpcyB2YWxpZGF0ZWQgYWx0aG91Z2ggb25seSBjb21iaW5lZCBjb25zdHJhaW50cyBleGlzdHMsIG5vIG93biBpbXBsZW1lbnRhdGlvbiAKLXB1YmxpYyBAaW50ZXJmYWNlIFBhc3N3b3JkIHsKLSAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIldyb25nIHBhc3N3b3JkIjsKLQotICAgIGludCByb2J1c3RuZXNzKCkgZGVmYXVsdCA4OwotCi0gICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQgeyB9OwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvWmlwQ29kZUNpdHlDb2hlcmVuY2UuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1ppcENvZGVDaXR5Q29oZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTJjN2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvY29uc3RyYWludHMvWmlwQ29kZUNpdHlDb2hlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLS8qKgotICogbm90IGltcGxlbWVudGVkISBzaW1wbGUgZHVtbXkgaW1wbGVtZW5hdGlvbiBmb3IgdGVzdHMgb25seSEKLSAqLwotQERvY3VtZW50ZWQKLUBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gWmlwQ29kZUNpdHlDb2hlcmVuY2VWYWxpZGF0b3IuY2xhc3MpCi1AVGFyZ2V0KHtUWVBFfSkKLUBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFppcENvZGVDaXR5Q29oZXJlbmNlIHsKLSAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgInt2YWxpZGF0b3IuemlwQ29kZUNpdHlDb2hlcmVuY2V9IjsgICAgCi0gICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHsgfTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1ppcENvZGVDaXR5Q29oZXJlbmNlVmFsaWRhdG9yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9jb25zdHJhaW50cy9aaXBDb2RlQ2l0eUNvaGVyZW5jZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmFiNmQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2NvbnN0cmFpbnRzL1ppcENvZGVDaXR5Q29oZXJlbmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50czsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLlppcENvZGVDaXR5Q2FycmllcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBDbGFzcyBub3QgaW1wbGVtZW50ZWQhIHNpbXBsZSBkdW1teSBpbXBsZW1lbmF0aW9uIGZvciB0ZXN0cyBvbmx5ISA8YnIvPgotICogVXNlcjogcm9tYW4uc3R1bW0gPGJyLz4KLSAqIERhdGU6IDAxLjA0LjIwMDggPGJyLz4KLSAqIFRpbWU6IDExOjQ1OjIyIDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBaaXBDb2RlQ2l0eUNvaGVyZW5jZVZhbGlkYXRvcgotICAgICAgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPFppcENvZGVDaXR5Q29oZXJlbmNlLCBaaXBDb2RlQ2l0eUNhcnJpZXI+IHsKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFppcENvZGVDaXR5Q29oZXJlbmNlIGNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChaaXBDb2RlQ2l0eUNhcnJpZXIgYWRyLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gciA9IHRydWU7Ci0gICAgICAgIGlmICgiZXJyb3IiLmVxdWFscyhhZHIuZ2V0WmlwQ29kZSgpKSkgewotICAgICAgICAgICAgY29udGV4dC5kaXNhYmxlRGVmYXVsdENvbnN0cmFpbnRWaW9sYXRpb24oKTsKLSAgICAgICAgICAgIGNvbnRleHQuYnVpbGRDb25zdHJhaW50VmlvbGF0aW9uV2l0aFRlbXBsYXRlKCJ6aXBjb2RlIG5vdCBPSyIpLmFkZENvbnN0cmFpbnRWaW9sYXRpb24oKTsKLSAgICAgICAgICAgIHIgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImVycm9yIi5lcXVhbHMoYWRyLmdldENpdHkoKSkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuZGlzYWJsZURlZmF1bHRDb25zdHJhaW50VmlvbGF0aW9uKCk7Ci0gICAgICAgICAgICBjb250ZXh0LmJ1aWxkQ29uc3RyYWludFZpb2xhdGlvbldpdGhUZW1wbGF0ZSgiY2l0eSBub3QgT0siKS5hZGROb2RlKCJjaXR5IikuYWRkQ29uc3RyYWludFZpb2xhdGlvbigpOwotICAgICAgICAgICAgciA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9CZWFuRGVzY3JpcHRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9CZWFuRGVzY3JpcHRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYzZhNi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQmVhbkRlc2NyaXB0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5UZXN0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuKjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yLkNvbnN0cmFpbnRGaW5kZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEJlYW5EZXNjcmlwdG9yfSBhbmQgaXRzIGRlcGVuZGVudAotICogaW50ZXJmYWNlcy4KLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgQmVhbkRlc2NyaXB0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCBncm91cHMoKSwgbWVzc2FnZSgpIGFuZCBwYXlsb2FkKCkgYXJlIGFsd2F5cyBpbiB0aGUKLSAgICAgKiBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5kYXRvcnlBdHRyaWJ1dGVzUHJlc2VudEluQ29uc3RyYWludERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gbmFtZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKEZvcm0uY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoIm5hbWUiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBkZXNjcmlwdG9ycyIsIDEsIG5hbWVEZXNjcmlwdG9ycy5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBuYW1lRGVzY3JpcHRvciA9IG5hbWVEZXNjcmlwdG9ycy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImdyb3VwcyBhdHRyaWJ1dGUgbm90IHByZXNlbnQiLCBuYW1lRGVzY3JpcHRvci5nZXRBdHRyaWJ1dGVzKCkuY29udGFpbnNLZXkoImdyb3VwcyIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInBheWxvYWQgYXR0cmlidXRlIG5vdCBwcmVzZW50IiwgbmFtZURlc2NyaXB0b3IuZ2V0QXR0cmlidXRlcygpLmNvbnRhaW5zS2V5KCJwYXlsb2FkIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgibWVzc2FnZSBhdHRyaWJ1dGUgbm90IHByZXNlbnQiLCBuYW1lRGVzY3JpcHRvci5nZXRBdHRyaWJ1dGVzKCkuY29udGFpbnNLZXkoIm1lc3NhZ2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCB0aGUgZ3JvdXBzKCkgYXR0cmlidXRlIHZhbHVlIGhhcyB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuCi0gICAgICogaW5oZXJpdGluZyBncm91cHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RWYWx1ZUZvckluaGVyaXRlZEdyb3Vwc0F0dHJpYnV0ZSgpIHsKLSAgICAgICAgU2V0PENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBwYXNzd29yZERlc2NyaXB0b3JzID0KLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKEFjY291bnQuY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInBhc3N3b3JkIikKLSAgICAgICAgICAgICAgICAuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgZGVzY3JpcHRvcnMiLCAxLCBwYXNzd29yZERlc2NyaXB0b3JzLnNpemUoKSk7Ci0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IHBhc3N3b3JkRGVzY3JpcHRvciA9IHBhc3N3b3JkRGVzY3JpcHRvcnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgY29tcG9zaW5nIGNvbnN0cmFpbnRzIiwgMSwgcGFzc3dvcmREZXNjcmlwdG9yCi0gICAgICAgICAgICAuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKS5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBub3ROdWxsRGVzY3JpcHRvciA9IHBhc3N3b3JkRGVzY3JpcHRvci5nZXRDb21wb3NpbmdDb25zdHJhaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGdyb3VwcyB2YWx1ZSBjb250YWludHMgR3JvdXAxLmNsYXNzCi0gICAgICAgIENsYXNzPD8+W10gbm90TnVsbEdyb3VwcyA9IChDbGFzczw/PltdKSBub3ROdWxsRGVzY3JpcHRvci5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJncm91cHMiKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKENsYXNzPD8+IGdyb3VwIDogbm90TnVsbEdyb3VwcykgewotICAgICAgICAgICAgaWYgKGdyb3VwID09IEdyb3VwMS5jbGFzcykgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiR3JvdXAxIG5vdCBwcmVzZW50IGluIGdyb3VwcyBhdHRyaWJ1dGUiLCBmb3VuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCB0aGUgZ3JvdXBzKCkgYXR0cmlidXRlIHZhbHVlIGNvbnRhaW5zIHRoZSBjb3JyZWN0IGludGVyZmFjZSBhcwotICAgICAqIGltcGxpY2l0IGdyb3VwIHdoZW4gdGhlIGNvbnN0cmFpbnQgaXMgZGVmaW5lZCBpbiB0aGF0IGludGVyZmFjZSBpbnN0ZWFkCi0gICAgICogb2YgdGhlIHF1ZXJpZWQgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0R3JvdXBJc1ByZXNlbnQoKSB7Ci0gICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gbmFtZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKFdvbWFuLmNsYXNzKS5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJuYW1lIikuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgZGVzY3JpcHRvcnMiLCAxLCBuYW1lRGVzY3JpcHRvcnMuc2l6ZSgpKTsKLSAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gbm90TnVsbERlc2NyaXB0b3IgPSBuYW1lRGVzY3JpcHRvcnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZ3JvdXBzIGF0dHJpYnV0ZSB2YWx1ZSBjb250YWlucyB0aGUgaW1wbGljaXQgZ3JvdXAKLSAgICAgICAgLy8gUGVyc29uIGFuZCB0aGUgRGVmYXVsdCBncm91cAotICAgICAgICBDbGFzczw/PltdIG5vdE51bGxHcm91cHMgPSAoQ2xhc3M8Pz5bXSkgbm90TnVsbERlc2NyaXB0b3IuZ2V0QXR0cmlidXRlcygpLmdldCgiZ3JvdXBzIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgZ3JvdXBzIiwgMiwgbm90TnVsbEdyb3Vwcy5sZW5ndGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRGVmYXVsdCBncm91cCBub3QgcHJlc2VudCIsIG5vdE51bGxHcm91cHNbMF0uZXF1YWxzKERlZmF1bHQuY2xhc3MpCi0gICAgICAgICAgICB8fCBub3ROdWxsR3JvdXBzWzFdLmVxdWFscyhEZWZhdWx0LmNsYXNzKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJJbXBsaWNpdCBncm91cCBub3QgcHJlc2VudCIsIG5vdE51bGxHcm91cHNbMF0uZXF1YWxzKFBlcnNvbi5jbGFzcykKLSAgICAgICAgICAgIHx8IG5vdE51bGxHcm91cHNbMV0uZXF1YWxzKFBlcnNvbi5jbGFzcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoYXQgdGhlIGdyb3VwcygpIGF0dHJpYnV0ZSB2YWx1ZSBkb2VzIG5vdCBjb250YWluIHRoZSBpbXBsaWNpdAotICAgICAqIGludGVyZmFjZSBncm91cCB3aGVuIHF1ZXJ5aW5nIHRoZSBpbnRlcmZhY2UgZGlyZWN0bHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vSW1wbGljaXRHcm91cFdoZW5RdWVyeWluZ0ludGVyZmFjZURpcmVjdGx5KCkgewotICAgICAgICBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IG5hbWVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhQZXJzb24uY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoIm5hbWUiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBkZXNjcmlwdG9ycyIsIDEsIG5hbWVEZXNjcmlwdG9ycy5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBub3ROdWxsRGVzY3JpcHRvciA9IG5hbWVEZXNjcmlwdG9ycy5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IG9ubHkgdGhlIGRlZmF1bHQgZ3JvdXAgaXMgcHJlc2VudAotICAgICAgICBDbGFzczw/PltdIG5vdE51bGxHcm91cHMgPSAoQ2xhc3M8Pz5bXSkgbm90TnVsbERlc2NyaXB0b3IuZ2V0QXR0cmlidXRlcygpLmdldCgiZ3JvdXBzIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgZ3JvdXBzIiwgMSwgbm90TnVsbEdyb3Vwcy5sZW5ndGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRGVmYXVsdCBncm91cCBub3QgcHJlc2VudCIsIG5vdE51bGxHcm91cHNbMF0uZXF1YWxzKERlZmF1bHQuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YKLSAgICAgKiB7QGxpbmsgRWxlbWVudERlc2NyaXB0b3IjZ2V0RWxlbWVudENsYXNzKCl9IHdvcmsgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudERlc2NyaXB0b3JHZXRFbGVtZW50Q2xhc3MoKSB7Ci0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoUGVyc29uLmNsYXNzKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNsYXNzIHJldHVybmVkIiwgUGVyc29uLmNsYXNzLCBiZWFuRGVzY3JpcHRvci5nZXRFbGVtZW50Q2xhc3MoKSk7Ci0KLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG5hbWVEZXNjcmlwdG9yID0gYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgibmFtZSIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY2xhc3MgcmV0dXJuZWQiLCBTdHJpbmcuY2xhc3MsIG5hbWVEZXNjcmlwdG9yLmdldEVsZW1lbnRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgY29ycmVjdCBiZWhhdmlvciBvZgotICAgICAqIHtAbGluayBDb25zdHJhaW50RmluZGVyI2xvb2tpbmdBdChqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLlNjb3BlKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnN0cmFpbnRGaW5kZXJMb29raW5nQXQoKSB7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhXb21hbi5jbGFzcykuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgibmFtZSIpOwotICAgICAgICBTZXQ8Q29uc3RyYWludERlc2NyaXB0b3I8Pz4+IGNvbnN0cmFpbnRzID0KLSAgICAgICAgICAgIG5hbWVEZXNjcmlwdG9yLmZpbmRDb25zdHJhaW50cygpLmxvb2tpbmdBdChTY29wZS5ISUVSQVJDSFkpLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIiwgMSwgY29uc3RyYWludHMuc2l6ZSgpKTsKLQotICAgICAgICBjb25zdHJhaW50cyA9IG5hbWVEZXNjcmlwdG9yLmZpbmRDb25zdHJhaW50cygpLmxvb2tpbmdBdChTY29wZS5MT0NBTF9FTEVNRU5UKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBkZXNjcmlwdG9ycyIsIDAsIGNvbnN0cmFpbnRzLnNpemUoKSk7Ci0gICAgICAgIFRlc3RVdGlscy5mYWlsT25Nb2RpZmlhYmxlKGNvbnN0cmFpbnRzLCAiY29uc3RyYWludEZpbmRlciBjb25zdHJhaW50RGVzY3JpcHRvcnMiKTsKLSAgICAgICAgLy92ZXJpZnkgdGhhdCBjaGFuZ2VzIHRvIG9uZSBDb25zdHJhaW50RmluZGVyIGRvbid0IGFmZmVjdCB0aGUgYmFzZToKLSAgICAgICAgY29uc3RyYWludHMgPSBuYW1lRGVzY3JpcHRvci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IG51bWJlciBvZiBkZXNjcmlwdG9ycyIsIDEsIGNvbnN0cmFpbnRzLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtIHsKLSAgICAgICAgQE5vdE51bGwKLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWNjb3VudCB7Ci0gICAgICAgIEBQYXNzd29yZChncm91cHMgPSB7IEdyb3VwMS5jbGFzcyB9KQotICAgICAgICBwdWJsaWMgU3RyaW5nIHBhc3N3b3JkOwotICAgIH0KLQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IHt9KQotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pCi0gICAgQERvY3VtZW50ZWQKLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIFRZUEUgfSkKLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFBhc3N3b3JkIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJJbnZhbGlkIHBhc3N3b3JkIjsKLQotICAgICAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgR3JvdXAxIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdvbWFuIGltcGxlbWVudHMgUGVyc29uIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUGVyc29uIHsKLSAgICAgICAgQE5vdE51bGwKLSAgICAgICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Cb290c3RyYXBUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQm9vdHN0cmFwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQ1NDg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Cb290c3RyYXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ib290c3RyYXAuUHJvdmlkZXJTcGVjaWZpY0Jvb3RzdHJhcDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLnNwaS5WYWxpZGF0aW9uUHJvdmlkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3ROdWxsVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5DdXN0b21lcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJvb3RzdHJhcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdERpcmVjdEJvb3RzdHJhcCgpIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKSA9PSBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZXJ5ZGF5Qm9vdHN0cmFwKCkgewotICAgICAgICBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5IGZhY3RvcnkgPSAoQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSkgVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBmYWN0b3J5LmdldFZhbGlkYXRvcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IpOwotCi0gICAgICAgIC8vIGVhY2ggY2FsbCB0byBWYWxpZGF0aW9uLmdldFZhbGlkYXRpb25CdWlsZGVyKCkgcmV0dXJucyBhIG5ldyBidWlsZGVyCi0gICAgICAgIC8vIHdpdGggbmV3IHN0YXRlCi0gICAgICAgIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTIgPSAoQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSkgVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZhY3RvcnkyICE9IGZhY3RvcnkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmYWN0b3J5Mi5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkgIT0gZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExvY2FsaXplZE1lc3NhZ2VJbnRlcnBvbGF0b3JGYWN0b3J5KCkgewotICAgICAgICBDb25maWd1cmF0aW9uPD8+IGJ1aWxkZXIgPSBWYWxpZGF0aW9uLmJ5RGVmYXVsdFByb3ZpZGVyKCkuY29uZmlndXJlKCk7Ci0gICAgICAgIC8vIGNoYW5naW5nIHRoZSBidWlsZGVyIGFsbG93cyB0byBjcmVhdGUgZGlmZmVyZW50IGZhY3RvcmllcwotICAgICAgICBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXcgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgYnVpbGRlci5tZXNzYWdlSW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7Ci0gICAgICAgIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeSA9IChBcGFjaGVWYWxpZGF0b3JGYWN0b3J5KSBidWlsZGVyLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpOwotCi0gICAgICAgIC8vIEFMVEVSTkFUSVZFOgotICAgICAgICAvLyB5b3UgY291bGQgZG8gaXQgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGJ1aWxkZXIgb3IgcmV1c2luZyBpdCwKLSAgICAgICAgLy8gYnV0IHRoZW4geW91IG5lZWQgdG8gdXNlIGJ2YWwtY29yZSBwcm9wcmlldGFyeSBBUElzOgotICAgICAgICAoKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKSBmYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkuc2V0TG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgLy8gbm93IGZhY3RvcnkncyBtZXNzYWdlIHJlc29sdmVyIGlzIHVzaW5nIHRoZSBlbmdsaXNoIGxvY2FsZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNvbWUgdGVzdHMgYmFzZWQgb24gUkkgdGVzdGVkIGJlaGF2aW9ycyB0byBlbnN1cmUgb3VyIGltcGxlbWVudGF0aW9uCi0gICAgICogd29ya3MgYXMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbnN0cmFpbnRGYWN0b3J5KCkgewotCi0gICAgICAgIENvbmZpZ3VyYXRpb248Pz4gYnVpbGRlciA9IFZhbGlkYXRpb24uYnlEZWZhdWx0UHJvdmlkZXIoKS5jb25maWd1cmUoKTsKLSAgICAgICAgYXNzZXJ0RGVmYXVsdEJ1aWxkZXJBbmRGYWN0b3J5KGJ1aWxkZXIpOwotCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeSA9IGJ1aWxkZXIuYnVpbGRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBmYWN0b3J5LmdldFZhbGlkYXRvcigpOwotCi0gICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gbmV3IEN1c3RvbWVyKCk7Ci0gICAgICAgIGN1c3RvbWVyLnNldEZpcnN0TmFtZSgiSm9obiIpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEN1c3RvbWVyPj4gQ29uc3RyYWludFZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoY3VzdG9tZXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQ29uc3RyYWludFZpb2xhdGlvbnMuaXNFbXB0eSgpKTsKLQotICAgICAgICBidWlsZGVyID0gVmFsaWRhdGlvbi5ieURlZmF1bHRQcm92aWRlcigpLmNvbmZpZ3VyZSgpOwotICAgICAgICBidWlsZGVyLmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KG5ldyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4ga2V5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtleSA9PSBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIHJlc3VsdCA9IChUKSBuZXcgQmFkbHlCZWhhdmVkTm90TnVsbFZhbGlkYXRvcigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpLmdldEluc3RhbmNlKGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBmYWN0b3J5ID0gYnVpbGRlci5idWlsZFZhbGlkYXRvckZhY3RvcnkoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Q3VzdG9tZXI+PiBDb25zdHJhaW50VmlvbGF0aW9uczIgPSB2YWxpZGF0b3IudmFsaWRhdGUoY3VzdG9tZXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbnN0cmFpbnRzIiwgQ29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpID4gQ29uc3RyYWludFZpb2xhdGlvbnMyLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVJlc29sdmVyQW5kVHlwZSgpIHsKLSAgICAgICAgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvblByb3ZpZGVyPD8+PigxKTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBsaXN0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gYnVpbGRlciA9Ci0gICAgICAgICAgICBWYWxpZGF0aW9uLmJ5UHJvdmlkZXIoQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKS5wcm92aWRlclJlc29sdmVyKHJlc29sdmVyKS5jb25maWd1cmUoKTsKLSAgICAgICAgYXNzZXJ0RGVmYXVsdEJ1aWxkZXJBbmRGYWN0b3J5KGJ1aWxkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21SZXNvbHZlcigpIHsKLSAgICAgICAgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gc2luZ2xldG9uTGlzdChuZXcgQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIENvbmZpZ3VyYXRpb248Pz4gYnVpbGRlciA9IFZhbGlkYXRpb24uYnlEZWZhdWx0UHJvdmlkZXIoKS5wcm92aWRlclJlc29sdmVyKHJlc29sdmVyKS5jb25maWd1cmUoKTsKLSAgICAgICAgYXNzZXJ0RGVmYXVsdEJ1aWxkZXJBbmRGYWN0b3J5KGJ1aWxkZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnREZWZhdWx0QnVpbGRlckFuZEZhY3RvcnkoQ29uZmlndXJhdGlvbjw/PiBidWlsZGVyKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGJ1aWxkZXIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShidWlsZGVyIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkltcGwpOwotCi0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeSA9IGJ1aWxkZXIuYnVpbGRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZhY3RvcnkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxpbmdDdXN0b21SZXNvbHZlcigpIHsKLSAgICAgICAgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgVmFsaWRhdGlvblByb3ZpZGVyUmVzb2x2ZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgUHJvdmlkZXJTcGVjaWZpY0Jvb3RzdHJhcDxBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uPiB0eXBlID0KLSAgICAgICAgICAgIFZhbGlkYXRpb24uYnlQcm92aWRlcihBcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgIGZpbmFsIFByb3ZpZGVyU3BlY2lmaWNCb290c3RyYXA8QXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbj4gc3BlY2lhbGl6ZWRCdWlsZGVyRmFjdG9yeSA9Ci0gICAgICAgICAgICB0eXBlLnByb3ZpZGVyUmVzb2x2ZXIocmVzb2x2ZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzcGVjaWFsaXplZEJ1aWxkZXJGYWN0b3J5LmNvbmZpZ3VyZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgbWVzc2FnZSIsIGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJwcm92aWRlciIpCi0gICAgICAgICAgICAgICAgJiYgZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIm9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQmFkbHlCZWhhdmVkTm90TnVsbFZhbGlkYXRvciBleHRlbmRzIE5vdE51bGxWYWxpZGF0b3IgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3Qgb2JqZWN0LCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9DaXJjdWxhclJlZmVyZW5jZXNUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ2lyY3VsYXJSZWZlcmVuY2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhkZDg4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9DaXJjdWxhclJlZmVyZW5jZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uKjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENoZWNrcyB0aGF0IGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gdGhlIGJlYW4gZ3JhcGggYXJlIGNvcnJlY3RseSBkZXRlY3RlZCB3aGVuCi0gKiB2YWxpZGF0aW5nLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhclJlZmVyZW5jZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgdmFsaWRhdGlvbiBjb3JyZWN0bHkgc3RvcHMgd2hlbiBmaW5kaW5nIGEgY2lyY3VsYXIKLSAgICAgKiBkZXBlbmRlbmN5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvcmVmZXJyaW5nQmVhbigpIHsKLSAgICAgICAgUGVyc29uIHAxID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMS5uYW1lID0gInRvby1sb25nLW5hbWUiOwotICAgICAgICBwMS5zaWJsaW5nID0gcDE7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248UGVyc29uPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShwMSk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiT25seSAxIHZpb2xhdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQiLCAxLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248UGVyc29uPiB2aW9sYXRpb24gPSB2aW9sYXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmlvbGF0aW9uIHBhdGgiLCAibmFtZSIsIHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhIGJlYW4gaXMgYWx3YXlzIHZhbGlkYXRlZCB3aGVuIGFwcGVhcmluZyBpbiBub24tY2lyY3VsYXIKLSAgICAgKiBwYXRocyBpbnNpZGUgdGhlIGJlYW4gZ3JhcGguCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbkNpcmN1bGFyQXJyYXlPZlNhbWVCZWFuKCkgewotICAgICAgICBCb3NzIGJvc3MgPSBuZXcgQm9zcygpOwotICAgICAgICBQZXJzb24gcDEgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAxLm5hbWUgPSAidG9vLWxvbmctbmFtZSI7Ci0KLSAgICAgICAgYm9zcy5lbXBsb3llZXMgPSBuZXcgUGVyc29uW10geyBwMSwgcDEsIHAxLCBwMSB9OwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEJvc3M+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJvc3MpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkEgdG90YWwgb2YgNCB2aW9sYXRpb25zIHNob3VsZCBiZSByZXBvcnRlZCIsIDQsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7Ci0KLSAgICAgICAgQFZhbGlkCi0gICAgICAgIHB1YmxpYyBQZXJzb24gc2libGluZzsKLQotICAgICAgICBAU2l6ZShtYXggPSAxMCkKLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb3NzIHsKLQotICAgICAgICBAVmFsaWQKLSAgICAgICAgcHVibGljIFBlcnNvbltdIGVtcGxveWVlczsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbXBvc2VkQ29uc3RyYWludHNUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29tcG9zZWRDb25zdHJhaW50c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4YjlhMS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29tcG9zZWRDb25zdHJhaW50c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQ29tcGFueUFkZHJlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkZyZW5jaEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlRlc3RVdGlsczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2VkQ29uc3RyYWludHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFEYXRhQVBJX0NvbXBvc2VkQ29uc3RyYWludHMoKSB7Ci0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGVkID0KLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoRnJlbmNoQWRkcmVzcy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInppcENvZGUiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBlZC5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5zaXplKCkpOwotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNkIDogZWQuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNkLmlzUmVwb3J0QXNTaW5nbGVWaW9sYXRpb24oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGNkLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJubyBjb21wb3NpbmcgY29uc3RyYWludHMgZm91bmQhISIsCi0gICAgICAgICAgICAgICAgICAhY2QuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKS5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcHJvY2Vzc0NvbnN0cmFpbnREZXNjcmlwdG9yKGNkKTsgLy9jaGVjayBhbGwgY29uc3RyYWludHMgb24gemlwIGNvZGUKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb25zdHJhaW50RGVzY3JpcHRvcihDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjZCkgewotICAgICAgICAvL1NpemUuY2xhc3MgaXMgdW5kZXJzdG9vZCBieSB0aGUgdG9vbAotICAgICAgICBpZiAoY2QuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZXF1YWxzKFNpemUuY2xhc3MpKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgICAgIFNpemUgbSA9IChTaXplKSBjZC5nZXRBbm5vdGF0aW9uKCk7Ly93aGF0IGZvcj8KLSAgICAgICAgfQotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNvbXBvc2luZ0NkIDogY2QuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKSkgewotICAgICAgICAgICAgLy9jaGVjayBjb21wb3NpbmcgY29uc3RyYWludHMgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgIHByb2Nlc3NDb25zdHJhaW50RGVzY3JpcHRvcihjb21wb3NpbmdDZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDb21wb3NlZCgpIHsKLSAgICAgICAgRnJlbmNoQWRkcmVzcyBhZHIgPSBuZXcgRnJlbmNoQWRkcmVzcygpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxGcmVuY2hBZGRyZXNzPj4gZmluZGluZ3MgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRyKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBmaW5kaW5ncy5zaXplKCkpOyAvLyB3aXRoIEBSZXBvcnRBc1NpbmdsZUNvbnN0cmFpbnRWaW9sYXRpb24KLQotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPEZyZW5jaEFkZHJlc3M+IGZpbmRpbmcgPSBmaW5kaW5ncy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgemlwY29kZSIsIGZpbmRpbmcuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICBhZHIuc2V0WmlwQ29kZSgiMTIzNDU2NyIpOwotICAgICAgICBmaW5kaW5ncyA9IHZhbGlkYXRvci52YWxpZGF0ZShhZHIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGZpbmRpbmdzLnNpemUoKSk7Ci0KLSAgICAgICAgYWRyLnNldFppcENvZGUoIjEyMzQ1NjcyMzQ1NjciKTsKLSAgICAgICAgZmluZGluZ3MgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRyKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmluZGluZ3Muc2l6ZSgpID4gMCk7IC8vIHRvbyBsb25nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlc0F0dHJpYnV0ZUNvbnN0cmFpbnRJbmRleCgpIHsKLSAgICAgICAgQ29tcGFueUFkZHJlc3MgYWRyID0gbmV3IENvbXBhbnlBZGRyZXNzKCJpbnZhbGlkLXN0cmluZyIpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxDb21wYW55QWRkcmVzcz4+IGZpbmRpbmdzID0gdmFsaWRhdG9yLnZhbGlkYXRlKGFkcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBmaW5kaW5ncy5zaXplKCkpOyAvLyB3aXRob3V0IEBSZXBvcnRBc1NpbmdsZUNvbnN0cmFpbnRWaW9sYXRpb24KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uV2l0aE1lc3NhZ2UoZmluZGluZ3MsICJOb3QgQ09NUEFOWSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uV2l0aE1lc3NhZ2UoZmluZGluZ3MsICJOb3QgYW4gZW1haWwiKSk7Ci0KLSAgICAgICAgYWRyID0gIG5ldyBDb21wYW55QWRkcmVzcygiSk9ITl9ET0BXRUIuREUiKTsKLSAgICAgICAgZmluZGluZ3MgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbmRpbmdzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbldpdGhNZXNzYWdlKGZpbmRpbmdzLCAiTm90IENPTVBBTlkiKSk7Ci0KLSAgICAgICAgYWRyID0gIG5ldyBDb21wYW55QWRkcmVzcygiSk9ITl9ET0BDT01QQU5ZLkRFIik7Ci0gICAgICAgIGZpbmRpbmdzID0gdmFsaWRhdG9yLnZhbGlkYXRlKGFkcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZpbmRpbmdzLmlzRW1wdHkoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludENvbXBvc2l0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRDb21wb3NpdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNDg4OS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludENvbXBvc2l0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk92ZXJyaWRlc0F0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5SZXBvcnRBc1NpbmdsZVZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBDaGVja3MgdGhhdCBncm91cHMgYXJlIGNvcnJlY3RseSBpbmhlcml0ZWQgZnJvbSB0aGUgcm9vdCBjb25zdHJhaW50IHRvIGl0cwotICogY29tcG9zaXRpbmcgY29uc3RyYWludHMuCi0gKiAKLSAqIEBhdXRob3IgQ2FybG9zIFZhcmEKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbnRDb21wb3NpdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsKLSAgICAgICAgKChEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcikgZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpLnNldExvY2FsZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdG9yIGluc3RhbmNlIHRvIHRlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZhbGlkYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBjb3JyZWN0IGdyb3VwIGluaGVyaXRhbmNlIG9uIGNvbnN0cmFpbnQgY29tcG9zaXRpb24gb24gYSAxIGxldmVsCi0gICAgICogaGllcmFyY2h5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxTGV2ZWxJbmhlcml0YW5jZSgpIHsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248UGVyc29uPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShuZXcgUGVyc29uKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB2aW9sYXRpb25zIGRldGVjdGVkIiwgMSwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBTdHJpbmcgbXNnID0gdmlvbGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCB2aW9sYXRpb24gbWVzc2FnZSIsICJBIHBlcnNvbiBuZWVkcyBhIG5vbiBudWxsIG5hbWUiLCBtc2cpOwotCi0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobmV3IFBlcnNvbigpLCBHcm91cDEuY2xhc3MpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdmlvbGF0aW9ucyBkZXRlY3RlZCIsIDAsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBjb3JyZWN0IGdyb3VwIGluaGVyaXRhbmNlIG9uIGNvbnN0cmFpbnQgY29tcG9zaXRpb24gb24gYSAyIGxldmVsCi0gICAgICogaGllcmFyY2h5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QyTGV2ZWxJbmhlcml0YW5jZSgpIHsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248TWFuPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShuZXcgTWFuKCkpOwotCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB2aW9sYXRpb25zIGRldGVjdGVkIiwgMCwgdmlvbGF0aW9ucy5zaXplKCkpOwotCi0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobmV3IE1hbigpLCBHcm91cDEuY2xhc3MpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdmlvbGF0aW9ucyBkZXRlY3RlZCIsIDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgU3RyaW5nIG1zZyA9IHZpb2xhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgdmlvbGF0aW9uIG1lc3NhZ2UiLCAiQSBwZXJzb24gbmVlZHMgYSBub24gbnVsbCBuYW1lIiwgbXNnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ3JvdXBzKCkgdmFsdWUgb2YgdGhlIGNvbnN0cmFpbnQgYW5ub3RhdGlvbnMgYXJlCi0gICAgICogY29ycmVjdGx5IHNldCB0byB0aGUgaW5oZXJpdGVkIG9uZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25Hcm91cHNBcmVJbmhlcml0ZWQoKSB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGdyb3VwcygpIHZhbHVlIGlzIHJpZ2h0IHdoZW4gcXVlcnlpbmcgdGhlIG1ldGFkYXRhCi0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IG1hbk5hbWVEZXNjID0KLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKE1hbi5jbGFzcykuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgibmFtZSIpLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpCi0gICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBwZXJzb25OYW1lRGVzYyA9IG1hbk5hbWVEZXNjLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IG5vdE51bGxEZXNjID0gcGVyc29uTmFtZURlc2MuZ2V0Q29tcG9zaW5nQ29uc3RyYWludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBncm91cCIsIDEsIG1hbk5hbWVEZXNjLmdldEdyb3VwcygpLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cDEgc2hvdWxkIGJlIHByZXNlbnQiLCBtYW5OYW1lRGVzYy5nZXRHcm91cHMoKS5jb250YWlucyhHcm91cDEuY2xhc3MpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBncm91cCIsIDEsIHBlcnNvbk5hbWVEZXNjLmdldEdyb3VwcygpLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cDEgc2hvdWxkIGJlIHByZXNlbnQiLCBwZXJzb25OYW1lRGVzYy5nZXRHcm91cHMoKS5jb250YWlucyhHcm91cDEuY2xhc3MpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBncm91cCIsIDEsIHBlcnNvbk5hbWVEZXNjLmdldEdyb3VwcygpLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cDEgc2hvdWxkIGJlIHByZXNlbnQiLCBub3ROdWxsRGVzYy5nZXRHcm91cHMoKS5jb250YWlucyhHcm91cDEuY2xhc3MpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBncm91cHMoKSB2YWx1ZSBpcyByaWdodCB3aGVuIGFjY2Vzc2luZyBpdCBmcm9tIGFuCi0gICAgICAgIC8vIGVycm9yCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE1hbj4+IHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobmV3IE1hbigpLCBHcm91cDEuY2xhc3MpOwotICAgICAgICBTZXQ8Q2xhc3M8Pz4+IG5vdE51bGxHcm91cHMgPSB2aW9sYXRpb25zLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZ3JvdXAiLCAxLCBub3ROdWxsR3JvdXBzLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cDEgc2hvdWxkIGJlIHRoZSBvbmx5IGdyb3VwIiwgbm90TnVsbEdyb3Vwcy5jb250YWlucyhHcm91cDEuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCB0aGUgcGF5bG9hZCgpIHZhbHVlIG9mIHRoZSBjb25zdHJhaW50IGFubm90YXRpb25zIGFyZQotICAgICAqIGNvcnJlY3RseSBzZXQgdG8gdGhlIGluaGVyaXRlZCBvbmVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uUGF5bG9hZHNBcmVJbmhlcml0ZWQoKSB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHBheWxvYWQoKSB2YWx1ZSBpcyByaWdodCB3aGVuIHF1ZXJ5aW5nIHRoZSBtZXRhZGF0YQotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBtYW5OYW1lRGVzYyA9Ci0gICAgICAgICAgICB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhNYW4uY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoIm5hbWUiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gcGVyc29uTmFtZURlc2MgPSBtYW5OYW1lRGVzYy5nZXRDb21wb3NpbmdDb25zdHJhaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBub3ROdWxsRGVzYyA9IHBlcnNvbk5hbWVEZXNjLmdldENvbXBvc2luZ0NvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBvbmx5IGJlIDEgcGF5bG9hZCBjbGFzcyIsIDEsIG1hbk5hbWVEZXNjLmdldFBheWxvYWQoKS5zaXplKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUGF5bG9hZDEgc2hvdWxkIGJlIHByZXNlbnQiLCBtYW5OYW1lRGVzYy5nZXRQYXlsb2FkKCkuY29udGFpbnMoUGF5bG9hZDEuY2xhc3MpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBwYXlsb2FkIGNsYXNzIiwgMSwgcGVyc29uTmFtZURlc2MuZ2V0UGF5bG9hZCgpLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQYXlsb2FkMSBzaG91bGQgYmUgcHJlc2VudCIsIHBlcnNvbk5hbWVEZXNjLmdldFBheWxvYWQoKS5jb250YWlucyhQYXlsb2FkMS5jbGFzcykpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgb25seSBiZSAxIHBheWxvYWQgY2xhc3MiLCAxLCBwZXJzb25OYW1lRGVzYy5nZXRQYXlsb2FkKCkuc2l6ZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlBheWxvYWQxIHNob3VsZCBiZSBwcmVzZW50Iiwgbm90TnVsbERlc2MuZ2V0UGF5bG9hZCgpLmNvbnRhaW5zKFBheWxvYWQxLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGF5bG9hZCgpIHZhbHVlIGlzIHJpZ2h0IHdoZW4gYWNjZXNzaW5nIGl0IGZyb20gYW4KLSAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248TWFuPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShuZXcgTWFuKCksIEdyb3VwMS5jbGFzcyk7Ci0gICAgICAgIFNldDxDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD4+IG5vdE51bGxQYXlsb2FkID0KLSAgICAgICAgICAgIHZpb2xhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBvbmx5IGJlIDEgcGF5bG9hZCBjbGFzcyIsIDEsIG5vdE51bGxQYXlsb2FkLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQYXlsb2FkMSBzaG91bGQgYmUgdGhlIG9ubHkgcGF5bG9hZCIsIG5vdE51bGxQYXlsb2FkLmNvbnRhaW5zKFBheWxvYWQxLmNsYXNzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQge0BsaW5rIE92ZXJyaWRlc0F0dHJpYnV0ZSNjb25zdHJhaW50SW5kZXgoKX0gcGFyc2luZyBhbmQKLSAgICAgKiBhcHBseWluZyB3b3Jrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhlZE92ZXJyaWRlc0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIFBlcnNvbiBwID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwLm5hbWUgPSAidmFsaWQiOwotCi0gICAgICAgIC8vIFdpdGggYSB2YWxpZCBpZCwgbm8gZXJyb3JzIGV4cGVjdGVkCi0gICAgICAgIHAuaWQgPSAiMTIzNCI7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFBlcnNvbj4+IGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm8gdmlvbGF0aW9ucyBzaG91bGQgYmUgcmVwb3J0ZWQgb24gdmFsaWQgaWQiLCBjb25zdHJhaW50VmlvbGF0aW9ucy5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIFdpdGggYSBzaG9ydCBpZCwgb25seSAxIGVycm9yIGV4cGVjdGVkCi0gICAgICAgIHAuaWQgPSAiMSI7Ci0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJPbmx5IDEgdmlvbGF0aW9uIGV4cGVjdGVkIiwgMSwgY29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxQZXJzb24+IHZpb2xhdGlvbiA9IGNvbnN0cmFpbnRWaW9sYXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyB2aW9sYXRpb24iLCAiSWQgaXMgdG9vIHNob3J0IiwgdmlvbGF0aW9uLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgLy8gV2l0aCBhIGxvbmcgaWQsIG9ubHkgMSBlcnJvciBleHBlY3RlZAotICAgICAgICBwLmlkID0gImxvb29vb29uZyBpZCI7Ci0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJPbmx5IDEgdmlvbGF0aW9uIGV4cGVjdGVkIiwgMSwgY29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgdmlvbGF0aW9uID0gY29uc3RyYWludFZpb2xhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIHZpb2xhdGlvbiIsICJJZCBpcyB0b28gbG9uZyIsIHZpb2xhdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGVycm9ycyBhcmUgcmVwb3J0ZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcKLSAgICAgKiB7QGxpbmsgUmVwb3J0QXNTaW5nbGVWaW9sYXRpb259LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvcnRBc0FzaW5nbGVWaW9sYXRpb24oKSB7Ci0gICAgICAgIENvZGUgYyA9IG5ldyBDb2RlKCk7Ci0gICAgICAgIGMuY29kZSA9ICJ2ZXJ5IGludmFsaWQgY29kZSI7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPENvZGU+PiBjb25zdHJhaW50VmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShjKTsKLQotICAgICAgICAvLyBPbmx5IDEgZXJyb3IgZXhwZWN0ZWQKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiT25seSAxIHZpb2xhdGlvbiBleHBlY3RlZCIsIDEsIGNvbnN0cmFpbnRWaW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248Q29kZT4gdmlvbGF0aW9uID0gY29uc3RyYWludFZpb2xhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIHZpb2xhdGlvbiBtZXNzYWdlIiwgIkludmFsaWQgY29kZSIsIHZpb2xhdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyB2aW9sYXRpb24gdHlwZSIsIEVsZXZlbkRpZ2l0c0NvZGUuY2xhc3MsICgoQW5ub3RhdGlvbikgdmlvbGF0aW9uCi0gICAgICAgICAgICAuZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRBbm5vdGF0aW9uKCkpLmFubm90YXRpb25UeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIHsKLSAgICAgICAgQFBlcnNvbk5hbWUKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgQFBlcnNvbklkCi0gICAgICAgIFN0cmluZyBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hbiB7Ci0gICAgICAgIEBNYW5OYW1lKGdyb3VwcyA9IHsgR3JvdXAxLmNsYXNzIH0sIHBheWxvYWQgPSB7IFBheWxvYWQxLmNsYXNzIH0pCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29kZSB7Ci0gICAgICAgIEBFbGV2ZW5EaWdpdHNDb2RlCi0gICAgICAgIFN0cmluZyBjb2RlOwotICAgIH0KLQotICAgIEBOb3ROdWxsKG1lc3NhZ2UgPSAiQSBwZXJzb24gbmVlZHMgYSBub24gbnVsbCBuYW1lIiwgZ3JvdXBzID0geyBHcm91cDEuY2xhc3MgfSwgcGF5bG9hZCA9IHt9KQotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pCi0gICAgQERvY3VtZW50ZWQKLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIFRZUEUgfSkKLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFBlcnNvbk5hbWUgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIldyb25nIHBlcnNvbiBuYW1lIjsKLQotICAgICAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0gICAgfQotCi0gICAgQFBlcnNvbk5hbWUoZ3JvdXBzID0geyBHcm91cDIuY2xhc3MgfSwgcGF5bG9hZCA9IHsgUGF5bG9hZDEuY2xhc3MsIFBheWxvYWQyLmNsYXNzIH0pCi0gICAgQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCwgVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTWFuTmFtZSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiV3JvbmcgbWFuIG5hbWUiOwotCi0gICAgICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLSAgICB9Ci0KLSAgICBAU2l6ZS5MaXN0KCB7IEBTaXplKG1pbiA9IDMsIG1heCA9IDMsIG1lc3NhZ2UgPSAiSWQgaXMgdG9vIHNob3J0IiksCi0gICAgICAgIEBTaXplKG1pbiA9IDUsIG1heCA9IDUsIG1lc3NhZ2UgPSAiSWQgaXMgdG9vIGxvbmciKSB9KQotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pCi0gICAgQERvY3VtZW50ZWQKLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIFRZUEUgfSkKLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFBlcnNvbklkIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJXcm9uZyBwZXJzb24gaWQiOwotCi0gICAgICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICBAT3ZlcnJpZGVzQXR0cmlidXRlKGNvbnN0cmFpbnQgPSBTaXplLmNsYXNzLCBjb25zdHJhaW50SW5kZXggPSAwLCBuYW1lID0gIm1heCIpCi0gICAgICAgIGludCBtYXhTaXplKCkgZGVmYXVsdCAxMDAwOwotCi0gICAgICAgIEBPdmVycmlkZXNBdHRyaWJ1dGUoY29uc3RyYWludCA9IFNpemUuY2xhc3MsIGNvbnN0cmFpbnRJbmRleCA9IDEsIG5hbWUgPSAibWluIikKLSAgICAgICAgaW50IG1pblNpemUoKSBkZWZhdWx0IDA7Ci0gICAgfQotCi0gICAgQFNpemUobWluID0gMTEsIG1heCA9IDExKQotICAgIEBQYXR0ZXJuKHJlZ2V4cCA9ICJcXGQqIikKLSAgICBAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQotICAgIEBSZXBvcnRBc1NpbmdsZVZpb2xhdGlvbgotICAgIEBEb2N1bWVudGVkCi0gICAgQFRhcmdldCggeyBNRVRIT0QsIEZJRUxELCBUWVBFIH0pCi0gICAgQFJldGVudGlvbihSVU5USU1FKQotICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBFbGV2ZW5EaWdpdHNDb2RlIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJJbnZhbGlkIGNvZGUiOwotCi0gICAgICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBHcm91cDEgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEdyb3VwMiB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXlsb2FkMSBpbXBsZW1lbnRzIFBheWxvYWQgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF5bG9hZDIgaW1wbGVtZW50cyBQYXlsb2FkIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RGVmaW5pdGlvbnNUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ29uc3RyYWludERlZmluaXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI5MzcwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50RGVmaW5pdGlvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkNvbnN0cmFpbnREZXNjcmlwdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90TnVsbFZhbGlkYXRvcjsKLQotLyoqCi0gKiBDaGVja3MgdGhlIGNvcnJlY3QgcGFyc2luZyBvZiBjb25zdHJhaW50IGRlZmluaXRpb25zLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50RGVmaW5pdGlvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBjb3JyZWN0IHBhcnNpbmcgb2YgYSBjb25zdHJhaW50IHdpdGggYW4gYXJyYXkgb2YgY29uc3RyYWludHMKLSAgICAgKiBhcyBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21BdHRyaWJ1dGVzKCkgewotICAgICAgICBCZWFuRGVzY3JpcHRvciBjb25zdHJhaW50cyA9IHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKFBlcnNvbi5jbGFzcyk7Ci0gICAgICAgIFNldDxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gYWdlQ29uc3RyYWludHMgPQotICAgICAgICAgICAgY29uc3RyYWludHMuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiYWdlIikuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCk7Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIGJlIDIgY29uc3RyYWludHMgaW4gJ2FnZSciLCBhZ2VDb25zdHJhaW50cy5zaXplKCksIDIpOwotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGNkIDogYWdlQ29uc3RyYWludHMpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkFubm90YXRpb24gc2hvdWxkIGJlIEBNaW4iLCBjZC5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCksIE1pbi5jbGFzcwotICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIDxjb2RlPmdyb3VwcygpPC9jb2RlPiBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vR3JvdXBzQ29uc3RyYWludCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgTm9Hcm91cHMoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIGdyb3VwcygpIG1ldGhvZCIpOwotICAgICAgICB9IGNhdGNoIChDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhIHtAbGluayBDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiBwYXJzaW5nIGEgY29uc3RyYWludCBkZWZpbml0aW9uIHdpdGggYW4gaW52YWxpZCA8Y29kZT5ncm91cHMoKTwvY29kZT4KLSAgICAgKiBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWREZWZhdWx0R3JvdXBzQ29uc3RyYWludCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgSW52YWxpZEdyb3VwcygpKTsKLSAgICAgICAgICAgIGZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzaW5nIGEgY29uc3RyYWludCBkZWZpbml0aW9uIHdpdGggYSBncm91cHMoKSBtZXRob2QgZG9lcyBub3QgcmV0dXJuIENsYXNzW10iKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIDxjb2RlPnBheWxvYWQoKTwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BheWxvYWRDb25zdHJhaW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBOb1BheWxvYWQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIHBheWxvYWQoKSBtZXRob2QiKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGFuIGludmFsaWQgPGNvZGU+cGF5bG9hZCgpPC9jb2RlPgotICAgICAqIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZERlZmF1bHRQYXlsb2FkQ29uc3RyYWludCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgSW52YWxpZFBheWxvYWQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGEgcGF5bG9hZCgpIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkiKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIDxjb2RlPm1lc3NhZ2UoKTwvY29kZT4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb01lc3NhZ2VDb25zdHJhaW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBOb01lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIG5vIHBheWxvYWQoKSBtZXRob2QiKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGFuIGludmFsaWQgPGNvZGU+bWVzc2FnZSgpPC9jb2RlPgotICAgICAqIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZERlZmF1bHRNZXNzYWdlQ29uc3RyYWludCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgSW52YWxpZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGEgbWVzc2FnZSgpIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYSBTdHJpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gY29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYSB7QGxpbmsgQ29uc3RyYWludERlZmluaXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGEgbWV0aG9kIHN0YXJ0aW5nIHdpdGggJ3ZhbGlkJy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEF0dHJpYnV0ZUNvbnN0cmFpbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUobmV3IEludmFsaWRBdHRyaWJ1dGUoKSk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2luZyBhIGNvbnN0cmFpbnQgZGVmaW5pdGlvbiB3aXRoIGEgbWV0aG9kIHN0YXJ0aW5nIHdpdGggJ3ZhbGlkJyIpOwotICAgICAgICB9IGNhdGNoIChDb25zdHJhaW50RGVmaW5pdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7Ci0gICAgICAgIEBNaW5MaXN0KCB7IEBNaW4odmFsdWUgPSAyMCksIEBNaW4odmFsdWUgPSAzMCkgfSkKLSAgICAgICAgcHVibGljIEludGVnZXIgYWdlOwotICAgIH0KLQotICAgIEBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFIH0pCi0gICAgQFJldGVudGlvbihSVU5USU1FKQotICAgIEBEb2N1bWVudGVkCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIE1pbkxpc3QgewotICAgICAgICBNaW5bXSB2YWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9Hcm91cHMgewotICAgICAgICBATm9Hcm91cHNDb25zdHJhaW50Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvcDsKLSAgICB9Ci0KLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIE5vR3JvdXBzQ29uc3RyYWludCB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiZGVmIG1zZyI7Ci0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkR3JvdXBzIHsKLSAgICAgICAgQEludmFsaWRHcm91cHNDb25zdHJhaW50Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvcDsKLSAgICB9Ci0KLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEludmFsaWRHcm91cHNDb25zdHJhaW50IHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJkZWYgbXNnIjsKLQotICAgICAgICBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHsgIkdyb3VwMSIgfTsKLQotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vUGF5bG9hZCB7Ci0gICAgICAgIEBOb1BheWxvYWRDb25zdHJhaW50Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvcDsKLSAgICB9Ci0KLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIE5vUGF5bG9hZENvbnN0cmFpbnQgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImRlZiBtc2ciOwotCi0gICAgICAgIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkUGF5bG9hZCB7Ci0gICAgICAgIEBJbnZhbGlkUGF5bG9hZENvbnN0cmFpbnQKLSAgICAgICAgcHVibGljIFN0cmluZyBwcm9wOwotICAgIH0KLQotICAgIEBUYXJnZXQoIHsgTUVUSE9ELCBGSUVMRCwgQU5OT1RBVElPTl9UWVBFIH0pCi0gICAgQFJldGVudGlvbihSVU5USU1FKQotICAgIEBEb2N1bWVudGVkCi0gICAgQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7IE5vdE51bGxWYWxpZGF0b3IuY2xhc3MgfSkKLSAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgSW52YWxpZFBheWxvYWRDb25zdHJhaW50IHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJkZWYgbXNnIjsKLQotICAgICAgICBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHsgUGF5bG9hZDEuY2xhc3MgfTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBheWxvYWQxIGltcGxlbWVudHMgUGF5bG9hZCB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vTWVzc2FnZSB7Ci0gICAgICAgIEBOb01lc3NhZ2VDb25zdHJhaW50Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvcDsKLSAgICB9Ci0KLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIE5vTWVzc2FnZUNvbnN0cmFpbnQgewotICAgICAgICBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZE1lc3NhZ2UgewotICAgICAgICBASW52YWxpZE1lc3NhZ2VDb25zdHJhaW50KG1lc3NhZ2UgPSAyKQotICAgICAgICBwdWJsaWMgU3RyaW5nIHByb3A7Ci0gICAgfQotCi0gICAgQFRhcmdldCggeyBNRVRIT0QsIEZJRUxELCBBTk5PVEFUSU9OX1RZUEUgfSkKLSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgQERvY3VtZW50ZWQKLSAgICBAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHsgTm90TnVsbFZhbGlkYXRvci5jbGFzcyB9KQotICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBJbnZhbGlkTWVzc2FnZUNvbnN0cmFpbnQgewotICAgICAgICBpbnQgbWVzc2FnZSgpOwotCi0gICAgICAgIFN0cmluZ1tdIGdyb3VwcygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkQXR0cmlidXRlIHsKLSAgICAgICAgQEludmFsaWRBdHRyaWJ1dGVDb25zdHJhaW50Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvcDsKLSAgICB9Ci0KLSAgICBAVGFyZ2V0KCB7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEludmFsaWRBdHRyaWJ1dGVDb25zdHJhaW50IHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJkZWYgbXNnIjsKLQotICAgICAgICBTdHJpbmdbXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgIFN0cmluZyB2YWxpZFZhbHVlKCkgZGVmYXVsdCAiMSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0NvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzE1MjhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5QYXRoSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXIuRXJyb3I7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwotaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKLWltcG9ydCBvcmcubW9ja2l0by5pbnZvY2F0aW9uLkludm9jYXRpb25Pbk1vY2s7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0LkNvbnN0cmFpbnRWaW9sYXRpb25CdWlsZGVyOwotCi0vKioKLSAqIENoZWNrcyB0byB2YWxpZGF0ZSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZgotICoge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0fSBhbmQgaXRzIHN1Yi1pbnRlcmZhY2VzLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0SW1wbCBjdmM7Ci0gICAgcHJpdmF0ZSBDb25zdHJhaW50VmlvbGF0aW9uQnVpbGRlciBjdmI7Ci0KLSAgICBATW9jawotICAgIHByaXZhdGUgR3JvdXBWYWxpZGF0aW9uQ29udGV4dDxWYWxpZGF0aW9uTGlzdGVuZXI+IGdyb3VwVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKLSAgICAgICAgTW9ja2l0by53aGVuKGdyb3VwVmFsaWRhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHlQYXRoKCkpLnRoZW5BbnN3ZXIobmV3IEFuc3dlcjxQYXRoSW1wbD4oKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBQYXRoSW1wbCBhbnN3ZXIoSW52b2NhdGlvbk9uTW9jayBpbnZvY2F0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5jdmMgPSBuZXcgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHRJbXBsKGdyb3VwVmFsaWRhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIHRoaXMuY3ZjLmRpc2FibGVEZWZhdWx0Q29uc3RyYWludFZpb2xhdGlvbigpOwotICAgICAgICB0aGlzLmN2YiA9IGN2Yy5idWlsZENvbnN0cmFpbnRWaW9sYXRpb25XaXRoVGVtcGxhdGUoImR1bW15Lm1zZy50cGwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc29uMSgpIHsKLSAgICAgICAgY3ZiLmFkZE5vZGUoInBlcnNvbiIpLmFkZE5vZGUobnVsbCkuaW5JdGVyYWJsZSgpLmF0SW5kZXgoMSkKLSAgICAgICAgICAgICAgICAuYWRkQ29uc3RyYWludFZpb2xhdGlvbigpOwotICAgICAgICBFcnJvciBlcnJvciA9IGN2Yy5nZXRFcnJvck1lc3NhZ2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFBhdGhJbXBsIGVycm9yUGF0aCA9IChQYXRoSW1wbCkgZXJyb3IuZ2V0T3duZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhdGggY3JlYXRlZCIsICJwZXJzb25bMV0iLCBlcnJvclBhdGgKLSAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNvbkxhd3llck5hbWUoKSB7Ci0gICAgICAgIGN2Yi5hZGROb2RlKCJwZXJzb24iKS5hZGROb2RlKCJuYW1lIikuaW5JdGVyYWJsZSgpLmF0S2V5KCJqb2huIikKLSAgICAgICAgICAgICAgICAuYWRkQ29uc3RyYWludFZpb2xhdGlvbigpOwotICAgICAgICBFcnJvciBlcnJvciA9IGN2Yy5nZXRFcnJvck1lc3NhZ2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFBhdGhJbXBsIGVycm9yUGF0aCA9IChQYXRoSW1wbCkgZXJyb3IuZ2V0T3duZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhdGggY3JlYXRlZCIsICJwZXJzb25bam9obl0ubmFtZSIsCi0gICAgICAgICAgICAgICAgZXJyb3JQYXRoLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QwTmFtZSgpIHsKLSAgICAgICAgY3ZiLmFkZE5vZGUobnVsbCkuYWRkTm9kZSgibmFtZSIpLmluSXRlcmFibGUoKS5hdEluZGV4KDApLmFkZE5vZGUobnVsbCkKLSAgICAgICAgICAgICAgICAuaW5JdGVyYWJsZSgpLmFkZENvbnN0cmFpbnRWaW9sYXRpb24oKTsKLSAgICAgICAgRXJyb3IgZXJyb3IgPSBjdmMuZ2V0RXJyb3JNZXNzYWdlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBQYXRoSW1wbCBlcnJvclBhdGggPSAoUGF0aEltcGwpIGVycm9yLmdldE93bmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBwYXRoIGNyZWF0ZWQiLCAiWzBdLm5hbWVbXSIsIGVycm9yUGF0aAotICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbmRleCgpIHsKLSAgICAgICAgY3ZiLmFkZE5vZGUobnVsbCkuYWRkTm9kZShudWxsKS5pbkl0ZXJhYmxlKCkuYWRkQ29uc3RyYWludFZpb2xhdGlvbigpOwotICAgICAgICBFcnJvciBlcnJvciA9IGN2Yy5nZXRFcnJvck1lc3NhZ2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFBhdGhJbXBsIGVycm9yUGF0aCA9IChQYXRoSW1wbCkgZXJyb3IuZ2V0T3duZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IHBhdGggY3JlYXRlZCIsICJbXSIsIGVycm9yUGF0aAotICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdFBhdGgoKSB7Ci0gICAgICAgIC8vIEFkZGluZyBvbmx5IG51bGxzIHNob3VsZCBzdGlsbCBnaXZlIGEgcm9vdCBwYXRoCi0gICAgICAgIGN2Yi5hZGROb2RlKG51bGwpLmFkZE5vZGUobnVsbCkuYWRkTm9kZShudWxsKS5hZGROb2RlKG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZENvbnN0cmFpbnRWaW9sYXRpb24oKTsKLSAgICAgICAgRXJyb3IgZXJyb3IgPSBjdmMuZ2V0RXJyb3JNZXNzYWdlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBQYXRoSW1wbCBlcnJvclBhdGggPSAoUGF0aEltcGwpIGVycm9yLmdldE93bmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDcmVhdGVkIHBhdGggbXVzdCBiZSBhIHJvb3QgcGF0aCIsIGVycm9yUGF0aAotICAgICAgICAgICAgICAgIC5pc1Jvb3RQYXRoKCkpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ3VzdG9tQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvQ3VzdG9tQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmFiZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0N1c3RvbUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7Ci1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkN1c3RvbUNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5VGVzdC5Hb29kUGVyc29uLkdvb2RQZXJzb25WYWxpZGF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogQ2hlY2tzIHRoYXQgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnl9IHdvcmtzCi0gKiBhcyBleHBlY3RlZC4KLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1c3RvbSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhCi0gICAgICogdmFsaWQge0BsaW5rIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5I2dldEluc3RhbmNlKENsYXNzKX0gY2FsbCwgYQotICAgICAqIHZhbGlkYXRpb24gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25FeGNlcHRpb25XaGVuRmFjdG9yeVJldHVybnNOdWxsVmFsaWRhdG9yKCkgewotICAgICAgICAKLSAgICAgICAgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY3VzdG9tRmFjdG9yeSA9IG5ldyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIC8vIEBPdmVycmlkZSAtIG5vdCBhbGxvd2VkIGluIDEuNSBmb3IgSW50ZXJmYWNlIG1ldGhvZHMKLSAgICAgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIENvbnN0cmFpbnRWYWxpZGF0b3I8PywgPz4+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4ga2V5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGFsd2F5cyByZXR1cm4gbnVsbAotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgdmFsaWRhdG9yIHdpdGggdGhpcyBmYWN0b3J5Ci0gICAgICAgIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24gY3VzdG9tQ29uZmlnID0gVmFsaWRhdGlvbi5ieVByb3ZpZGVyKEFwYWNoZVZhbGlkYXRpb25Qcm92aWRlci5jbGFzcykuY29uZmlndXJlKCkuY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoY3VzdG9tRmFjdG9yeSk7Ci0gICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBjdXN0b21Db25maWcuYnVpbGRWYWxpZGF0b3JGYWN0b3J5KCkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBQZXJzb24oKSk7Ci0gICAgICAgICAgICBmYWlsKCJWYWxpZGF0aW9uRXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIHdoZW4gZmFjdG9yeSByZXR1cm5zIGEgbnVsbCBjb25zdHJhaW50IHZhbGlkYXRvci4iKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBjb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQEdvb2RQZXJzb24KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7Ci0gICAgfQotICAgIAotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBHb29kUGVyc29uVmFsaWRhdG9yLmNsYXNzIH0pCi0gICAgQFRhcmdldCh7IE1FVEhPRCwgRklFTEQsIEFOTk9UQVRJT05fVFlQRSwgVFlQRSB9KQotICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICBARG9jdW1lbnRlZAotICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBHb29kUGVyc29uIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiTm90IGEgZ29vZCBwZXJzb24iOwotICAgICAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQgeyB9OwotICAgICAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR29vZFBlcnNvblZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8R29vZFBlcnNvbiwgUGVyc29uPiB7Ci0gICAgICAgICAgICAvLyBAT3ZlcnJpZGUgLSBub3QgYWxsb3dlZCBpbiAxLjUgZm9yIEludGVyZmFjZSBtZXRob2RzCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEdvb2RQZXJzb24gY29uc3RyYWludEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQE92ZXJyaWRlIC0gbm90IGFsbG93ZWQgaW4gMS41IGZvciBJbnRlcmZhY2UgbWV0aG9kcwotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChQZXJzb24gdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9DdXN0b21WYWxpZGF0b3JGYWN0b3J5VGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0N1c3RvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmMzOGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0N1c3RvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi4qOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLkNvbmZpZ3VyYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBUZXN0IHRoZSBhYmlsaXR5IHRvIGZvcmNlIGEgcGFydGljdWxhciB7QGxpbmsgVmFsaWRhdG9yRmFjdG9yeX0KLSAqIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICogCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbVZhbGlkYXRvckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21WYWxpZGF0b3JGYWN0b3J5IGV4dGVuZHMgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeSB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyBDdXN0b21WYWxpZGF0b3JGYWN0b3J5IGluc3RhbmNlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEN1c3RvbVZhbGlkYXRvckZhY3RvcnkoQ29uZmlndXJhdGlvblN0YXRlIGNvbmZpZ3VyYXRpb25TdGF0ZSkgewotICAgICAgICAgICAgc3VwZXIoY29uZmlndXJhdGlvblN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jb21wYXRpYmxlVmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhbGlkYXRvckZhY3RvcnkgewotCi0gICAgICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBnZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRyYXZlcnNhYmxlUmVzb2x2ZXIgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyA8VD4gVCB1bndyYXAoQ2xhc3M8VD4gdHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmFsaWRhdG9yQ29udGV4dCB1c2luZ0NvbnRleHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb3RBVmFsaWRhdG9yRmFjdG9yeSB7Ci0gICAgICAgIHB1YmxpYyBOb3RBVmFsaWRhdG9yRmFjdG9yeShDb25maWd1cmF0aW9uU3RhdGUgY29uZmlndXJhdGlvblN0YXRlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKSB7Ci0gICAgICAgIFZhbGlkYXRpb24uYnlQcm92aWRlcihBcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXIuY2xhc3MpLmNvbmZpZ3VyZSgpLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpLnVud3JhcCgKLSAgICAgICAgICAgIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hUeXBlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVmFsaWRhdGlvbi5ieVByb3ZpZGVyKEFwYWNoZVZhbGlkYXRpb25Qcm92aWRlci5jbGFzcykuY29uZmlndXJlKCkuYWRkUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzLlZBTElEQVRPUl9GQUNUT1JZX0NMQVNTTkFNRSwgIm5vLnN1Y2gudHlwZSIpCi0gICAgICAgICAgICAgICAgLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21WYWxpZGF0b3JGYWN0b3J5KCkgewotICAgICAgICBkb1Rlc3QoQ3VzdG9tVmFsaWRhdG9yRmFjdG9yeS5jbGFzcywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlKCkgewotICAgICAgICBkb1Rlc3QoTm90QVZhbGlkYXRvckZhY3RvcnkuY2xhc3MsIENsYXNzQ2FzdEV4Y2VwdGlvbi5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkVmFsaWRhdG9yRmFjdG9yeVR5cGUoKSB7Ci0gICAgICAgIGRvVGVzdChJbmNvbXBhdGlibGVWYWxpZGF0b3JGYWN0b3J5LmNsYXNzLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Rlc3QoQ2xhc3M8Pz4gdmFsaWRhdG9yRmFjdG9yeVR5cGUsIENsYXNzPD8gZXh0ZW5kcyBFeGNlcHRpb24+IGV4cGVjdGVkRmFpbHVyZUNhdXNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWYWxpZGF0aW9uLmJ5UHJvdmlkZXIoQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKS5jb25maWd1cmUoKS5hZGRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uLlByb3BlcnRpZXMuVkFMSURBVE9SX0ZBQ1RPUllfQ0xBU1NOQU1FLCB2YWxpZGF0b3JGYWN0b3J5VHlwZS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpLnVud3JhcCh2YWxpZGF0b3JGYWN0b3J5VHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGV4cGVjdGVkRmFpbHVyZUNhdXNlKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZEZhaWx1cmVDYXVzZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkRmFpbHVyZUNhdXNlLmlzSW5zdGFuY2UoZXguZ2V0Q2F1c2UoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0RlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjljZTA5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCi0gKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGCi0gKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkF1dGhvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuUHJlZmVycmVkR3Vlc3Q7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBNZXNzYWdlUmVzb2x2ZXJJbXBsIFRlc3Rlci4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yOwotCi0gICAgcHVibGljIERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsgLy8gY2FsbCBzdXBlciEKLSAgICAgICAgaW50ZXJwb2xhdG9yID0gbmV3IERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIGludGVycG9sYXRvci5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSZXNvbHZlcigpIHsKLQotICAgICAgICBmaW5hbCBWYWxpZGF0b3IgZ3ZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotCi0gICAgICAgIGFzc2VydFRydWUoIWd2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhQcmVmZXJyZWRHdWVzdC5jbGFzcykuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgKLSAgICAgICAgICAgICJndWVzdENyZWRpdENhcmROdW1iZXIiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCBjdHggPSBuZXcgTWVzc2FnZUludGVycG9sYXRvci5Db250ZXh0KCkgewotCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PikgZ3ZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKFByZWZlcnJlZEd1ZXN0LmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiZ3Vlc3RDcmVkaXRDYXJkTnVtYmVyIikuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsaWRhdGVkVmFsdWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIxMjM0NTY3OCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZyBtc2cgPSBpbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoInt2YWxpZGF0b3IuY3JlZGl0Y2FyZH0iLCBjdHgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjcmVkaXQgY2FyZCBpcyBub3QgdmFsaWQiLCBtc2cpOwotCi0gICAgICAgIGN0eCA9IG5ldyBNZXNzYWdlSW50ZXJwb2xhdG9yLkNvbnRleHQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGd2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhBdXRob3IuY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoImxhc3ROYW1lIikKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlZFZhbHVlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBtc2cgPSBpbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoIntvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90RW1wdHkubWVzc2FnZX0iLCBjdHgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYXkgbm90IGJlIGVtcHR5IiwgbXNnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBzdHJpbmdzIGNvbnRhaW5pbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBjb3JyZWN0bHkKLSAgICAgKiBzdWJzdGl0dXRlZCB3aGVuIGludGVycG9sYXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VtZW50V2l0aFNwZWNpYWxDaGFycygpIHsKLQotICAgICAgICBmaW5hbCBWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKCk7Ci0gICAgICAgIE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCBjdHg7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGludGVycG9sYXRlIGFuIGFubm90YXRpb24gYXR0cmlidXRlIGNvbnRhaW5pbmcgJAotICAgICAgICBjdHggPSBuZXcgTWVzc2FnZUludGVycG9sYXRvci5Db250ZXh0KCkgewotCi0gICAgICAgICAgICBwdWJsaWMgQ29uc3RyYWludERlc2NyaXB0b3I8Pz4gZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PikgdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoUGVyc29uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiaWROdW1iZXIiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjEyMzQ1Njc4IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoIklkIG51bWJlciBzaG91bGQgbWF0Y2gge3JlZ2V4cH0iLCBjdHgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbWVzc2FnZSBpbnRlcnBvbGF0aW9uIHdoZW4gJCBpcyBpbiBhbiBhdHRyaWJ1dGUiLAotICAgICAgICAgICAgIklkIG51bWJlciBzaG91bGQgbWF0Y2ggLi4uLiQiLCByZXN1bHQpOwotCi0gICAgICAgIC8vIFRyeSB0byBpbnRlcnBvbGF0ZSBhbiBhbm5vdGF0aW9uIGF0dHJpYnV0ZSBjb250YWluaW5nIFwKLSAgICAgICAgY3R4ID0gbmV3IE1lc3NhZ2VJbnRlcnBvbGF0b3IuQ29udGV4dCgpIHsKLQotICAgICAgICAgICAgcHVibGljIENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoQ29uc3RyYWludERlc2NyaXB0b3I8Pz4pIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKFBlcnNvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoIm90aGVySWQiKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZWRWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjEyMzQ1Njc4IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICByZXN1bHQgPSB0aGlzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZSgiT3RoZXIgaWQgc2hvdWxkIG1hdGNoIHtyZWdleHB9IiwgY3R4KTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSW5jb3JyZWN0IG1lc3NhZ2UgaW50ZXJwb2xhdGlvbiB3aGVuIFxcIGlzIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSIsCi0gICAgICAgICAgICAiT3RoZXIgaWQgc2hvdWxkIG1hdGNoIC5cXG4iLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb24gewotCi0gICAgICAgIEBQYXR0ZXJuKG1lc3NhZ2UgPSAiSWQgbnVtYmVyIHNob3VsZCBtYXRjaCB7cmVnZXhwfSIsIHJlZ2V4cCA9ICIuLi4uJCIpCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgaWROdW1iZXI7Ci0KLSAgICAgICAgQFBhdHRlcm4obWVzc2FnZSA9ICJPdGhlciBpZCBzaG91bGQgbWF0Y2gge3JlZ2V4cH0iLCByZWdleHAgPSAiLlxcbiIpCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgb3RoZXJJZDsKLQotICAgIH0KLQotICAgIHByaXZhdGUgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9FeGNlcHRpb25zQ29udHJhY3RUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRXhjZXB0aW9uc0NvbnRyYWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDJmYzA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9FeGNlcHRpb25zQ29udHJhY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFNldmVyYWwgY2hlY2tzIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgVmFsaWRhdG9yfSBhbmQKLSAqIHtAbGluayBCZWFuRGVzY3JpcHRvcn0gdGhyb3cgdGhlIGNvcnJlY3QgZXhjZXB0aW9ucyBhcyBwZXIgdGhlIHNwZWMuCi0gKiAKLSAqIEBhdXRob3IgQ2FybG9zIFZhcmEKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNDb250cmFjdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsKLSAgICAgICAgKChEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcikgZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpLnNldExvY2FsZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdG9yIGluc3RhbmNlIHRvIHRlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZhbGlkYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCB0aGUgY29ycmVjdCBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gdmFsaWRhdGluZyBhIGJlYW4gd2hvc2UKLSAgICAgKiBnZXR0ZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uVGhyb3dpbmdCZWFuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBFeGNlcHRpb25UaHJvd2luZ0JlYW4oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIHZhbGlkYXRpbmcgYSBiZWFuIHdob3NlIGdldHRlciB0aHJvd3MgYSBSVEUiKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBwYXNzaW5nCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gYXMgZ3JvdXAgYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTnVsbEdyb3VwKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3M8Pz5bXSBncm91cHMgPSBudWxsOwotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBTdHJpbmcoKSwgZ3JvdXBzKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFzc2luZyBudWxsIGFzIGdyb3VwIGFycmF5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBwYXNzaW5nIGFuCi0gICAgICogaW52YWxpZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUludmFsaWRQcm9wZXJ0eU5hbWUoKSB7Ci0KLSAgICAgICAgLy8gTnVsbCBwcm9wZXJ0eU5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KG5ldyBQZXJzb24oKSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3JyZWN0Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbXB0eSBwcm9wZXJ0eU5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KG5ldyBQZXJzb24oKSwgIiIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ29ycmVjdAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW52YWxpZCBwcm9wZXJ0eU5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KG5ldyBQZXJzb24oKSwgInN1cm5hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdHJ5aW5nIHRvCi0gICAgICogdmFsaWRhdGUgYSBwcm9wZXJ0eSBvbiBhIG51bGwgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVByb3BlcnR5T25OdWxsQmVhbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KG51bGwsICJjbGFzcyIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ29ycmVjdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoYXQgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gcGFzc2luZwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGFzIGdyb3VwIGFycmF5IGluIGEKLSAgICAgKiB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcsIENsYXNzLi4uKX0gY2FsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVQcm9wZXJ0eU51bGxHcm91cCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzPD8+W10gZ3JvdXBzID0gbnVsbDsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KG5ldyBQZXJzb24oKSwgIm5hbWUiLCBncm91cHMpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXNzaW5nIG51bGwgYXMgZ3JvdXAgYXJyYXkiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9IHdpdGggYQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVZhbHVlT25OdWxsQ2xhc3MoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShudWxsLCAiY2xhc3MiLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXNzaW5nIG51bGwgYXMgZ3JvdXAgYXJyYXkiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHBhc3NpbmcgYW4KLSAgICAgKiBpbnZhbGlkIHByb3BlcnR5IG5hbWUgdG8KLSAgICAgKiB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVZhbHVlSW52YWxpZFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgLy8gTnVsbCBwcm9wZXJ0eU5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVZhbHVlKFBlcnNvbi5jbGFzcywgbnVsbCwgIkpvaG4iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtcHR5IHByb3BlcnR5TmFtZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlVmFsdWUoUGVyc29uLmNsYXNzLCAiIiwgIkpvaG4iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEludmFsaWQgcHJvcGVydHlOYW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShQZXJzb24uY2xhc3MsICJ1bmV4aXN0YW50IiwgIkpvaG4iKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9IHdpdGggYQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGdyb3VwIGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVZhbHVlTnVsbEdyb3VwKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3M8Pz5bXSBncm91cHMgPSBudWxsOwotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlVmFsdWUoUGVyc29uLmNsYXNzLCAibmFtZSIsICJKb2huIiwgZ3JvdXBzKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFzc2luZyBudWxsIGFzIGdyb3VwIGFycmF5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmZvcmNlcyB0aGUgIm5vdCBhIHZhbGlkIG9iamVjdCBwcm9wZXJ0eSIgcGFydCBvZiB0aGUge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0KLSAgICAgKiBkZWNsYXJhdGlvbiBvbiB7QGxpbmsgVmFsaWRhdG9yI3ZhbGlkYXRlVmFsdWUoQ2xhc3MsIFN0cmluZywgT2JqZWN0LCBDbGFzcy4uLil9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlSW5jb21wYXRpYmxlVmFsdWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShQZXJzb24uY2xhc3MsICJuYW1lIiwgNjY2KTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gcGFzc2luZyBJbnRlZ2VyIGZvciBzdHJpbmcgdmFsdWUiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlVmFsdWUoUGVyc29uLmNsYXNzLCAiYWdlIiwgbnVsbCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIHBhc3NpbmcgbnVsbCBmb3IgcHJpbWl0aXZlIHZhbHVlIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3JyZWN0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiBjYWxsaW5nCi0gICAgICoge0BsaW5rIEJlYW5EZXNjcmlwdG9yI2dldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoU3RyaW5nKX0gd2l0aCBhbiBpbnZhbGlkCi0gICAgICogcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RyYWludHNGb3JJbnZhbGlkUHJvcGVydHkoKSB7Ci0gICAgICAgIEJlYW5EZXNjcmlwdG9yIHBlcnNvbkRlc2NyaXB0b3IgPSB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhQZXJzb24uY2xhc3MpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwZXJzb25EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkobnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gY2FsbGluZyBnZXRDb25zdHJhaW50c0ZvclByb3BlcnR5IHdpdGggbnVsbCBwcm9wZXJ0eSIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ29ycmVjdAotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBlcnNvbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiIik7Ci0gICAgICAgICAgICBmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHdoZW4gY2FsbGluZyBnZXRDb25zdHJhaW50c0ZvclByb3BlcnR5IHdpdGggZW1wdHkgcHJvcGVydHkiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uVGhyb3dpbmdCZWFuIHsKLQotICAgICAgICBATm90TnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7Ci0KLSAgICAgICAgQE5vdE51bGwKLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotCi0gICAgICAgIEBNaW4oMCkKLSAgICAgICAgcHVibGljIGludCBhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRm9vVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL0Zvb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NTUyYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvRm9vVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEZvb1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBAVmFsaWQKLSAgICBwcml2YXRlIENvbGxlY3Rpb248Rm9vPiBmb29zID0gbmV3IEFycmF5TGlzdDxGb28+KCk7Ci0KLSAgICBwdWJsaWMgRm9vVGVzdCgpIHsKLSAgICAgICAgZm9vcy5hZGQobmV3IEZvbygiZm9vMSIpKTsKLSAgICAgICAgZm9vcy5hZGQobnVsbCk7Ci0gICAgICAgIGZvb3MuYWRkKG5ldyBGb28oImZvbzMiKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgY2xhc3MgRm9vIHsKLSAgICAgICAgQE5vdE51bGwKLSAgICAgICAgcHVibGljIFN0cmluZyBiYXI7Ci0KLSAgICAgICAgcHVibGljIEZvbyhTdHJpbmcgYmFyKSB7Ci0gICAgICAgICAgICB0aGlzLmJhciA9IGJhcjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIEZvb1Rlc3QgdCA9IG5ldyBGb29UZXN0KCk7Ci0KLSAgICAgICAgVmFsaWRhdG9yIHYgPSBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Rm9vVGVzdD4+IGVycm9ycyA9IHYudmFsaWRhdGUodCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ290IGVycm9yczoiKTsKLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uPD8+IGVycm9yIDogZXJyb3JzKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3IuZ2V0UHJvcGVydHlQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Kc3IzMDNUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvSnNyMzAzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGJkMTE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9Kc3IzMDNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5VbmV4cGVjdGVkVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLkVsZW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuUHJvcGVydHlEZXNjcmlwdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuU2l6ZVZhbGlkYXRvckZvclN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQm9vazsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5JbGx1c3RyYXRlZEJvb2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLk1heFRlc3RFbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLk5vVmFsaWRhdG9yVGVzdEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuU2Vjb25kOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5TaXplVGVzdEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuVGVzdFV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgSnNyMzAzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAvKgotICAgICAqIHN0YXRpYyB7IEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmdldE1ldGFCZWFuTWFuYWdlcigpCi0gICAgICogLmFkZFJlc291cmNlTG9hZGVyKCJvcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS90ZXN0LWJlYW5JbmZvcy54bWwiKTsgfQotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBwdWJsaWMgdm9pZCB0ZXN0VXNlQ29yZVhtbE1ldGFEYXRhKCkgeyBWYWxpZGF0b3IgdmFsaWRhdG9yID0KLSAgICAgKiBnZXRWYWxpZGF0b3IoKTsKLSAgICAgKiAKLSAgICAgKiBCdXNpbmVzc09iamVjdCBvYmplY3QgPSBuZXcgQnVzaW5lc3NPYmplY3QoKTsKLSAgICAgKiBvYmplY3Quc2V0VGl0bGUoIjEyMzQ1Njc4MzQ1NjcgdG9vIGxvbmcgdGl0bGUgIik7Ci0gICAgICogU2V0PENvbnN0cmFpbnRWaW9sYXRpb248QnVzaW5lc3NPYmplY3Q+PiB2aW9sYXRpb25zID0KLSAgICAgKiB2YWxpZGF0b3IudmFsaWRhdGUob2JqZWN0KTsgQXNzZXJ0LmFzc2VydE5vdE51bGwodmlvbGF0aW9ucyk7Ci0gICAgICogQXNzZXJ0LmFzc2VydFRydWUoIXZpb2xhdGlvbnMuaXNFbXB0eSgpKTsKLSAgICAgKiAKLSAgICAgKiBBc3NlcnQuYXNzZXJ0VHJ1ZSghdmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydHkob2JqZWN0LAotICAgICAqICJ0aXRsZSIpLmlzRW1wdHkoKSk7IH0KLSAgICAgKi8KLQotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RGVzY3JpcHRvckhhc0NvbnN0cmFpbnRzKCkgewotICAgICAgICBCZWFuRGVzY3JpcHRvciBjb25zID0gdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoQm9vay5jbGFzcyk7Ci0gICAgICAgIGFzc2VydFRydWUoY29ucy5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJhdXRob3IiKS5oYXNDb25zdHJhaW50cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25zLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInRpdGxlIikuaGFzQ29uc3RyYWludHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29ucy5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJ1c2VsZXNzRmllbGQiKS5oYXNDb25zdHJhaW50cygpKTsKLSAgICAgICAgLy8gY29ucy5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJ1bmNvbnN0cmFpbnRGaWVsZCIpID09IG51bGwgd2l0aG91dAotICAgICAgICAvLyBJbnRyb3NwZWN0b3IKLSAgICAgICAgLy8gY29ucy5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJ1bmNvbnN0cmFpbnRGaWVsZCIpICE9IG51bGwgd2l0aAotICAgICAgICAvLyBJbnRyb3NwZWN0b3IKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25zLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInVuY29uc3RyYWludEZpZWxkIikgPT0gbnVsbAotICAgICAgICAgICAgfHwgIWNvbnMuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgidW5jb25zdHJhaW50RmllbGQiKS5oYXNDb25zdHJhaW50cygpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjb25zLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInVua25vd25GaWVsZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVWYWx1ZSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShCb29rLmNsYXNzLCAic3VidGl0bGUiLCAiMTIzNDU2Nzg5MDk4NzY1NDMyIikuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodmFsaWRhdG9yLnZhbGlkYXRlVmFsdWUoQm9vay5jbGFzcywgInN1YnRpdGxlIiwKLSAgICAgICAgICAgICIxMjM0NTY3ODkwOTg3NjU0MzIxMjM0MTIzNDU2Nzg5MDk4NzY1NDMyMTIzNDEyMzQ1NjQ1Njc4OTA5ODc2NTQzMjEyMzQiLCBTZWNvbmQuY2xhc3MpLmlzRW1wdHkoKSk7Ci0gICAgICAgIC8vIHRlc3RzIGZvciBpc3N1ZSAyMjogdmFsaWRhdGlvbiBvZiBhIGZpZWxkIHdpdGhvdXQgYW55IGNvbnN0cmFpbnRzCi0gICAgICAgIGFzc2VydEVxdWFscygwLCB2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShCb29rLmNsYXNzLCAidW5jb25zdHJhaW50RmllbGQiLCA0KS5zaXplKCkpOwotICAgICAgICAvLyB0ZXN0cyBmb3IgaXNzdWUgMjI6IHZhbGlkYXRpb24gb2YgdW5rbm93biBmaWVsZCBjYXVzZQotICAgICAgICAvLyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVWYWx1ZShCb29rLmNsYXNzLCAidW5rbm93blByb3BlcnR5IiwgNCk7Ci0gICAgICAgICAgICBmYWlsKCJ1bmtub3duUHJvcGVydHkgbm90IGRldGVjdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gT0sKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidW5rbm93biBwcm9wZXJ0eSAndW5rbm93blByb3BlcnR5JyBpbiBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQm9vayIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOb25DYXNjYWRlZFJlYWxOZXN0ZWRQcm9wZXJ0eSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVZhbHVlKElsbHVzdHJhdGVkQm9vay5jbGFzcywgImlsbHVzdHJhdG9yLmZpcnN0TmFtZSIsICJFZGdhciIpOwotICAgICAgICAgICAgZmFpbCgidW5rbm93blByb3BlcnR5IG5vdCBkZXRlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIE9LCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5JbGx1c3RyYXRlZEJvb2suaWxsdXN0cmF0b3IgaXMgbm90IGNhc2NhZGVkIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUFQSV9Cb29rKCkgewotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhCb29rLmNsYXNzKSk7Ci0gICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgZm9yIGltcGxlbWVudGF0aW9uIGNvcnJlY3RuZXNzLCBidXQgd2UnbGwgdGVzdAotICAgICAgICAvLyBuZXZlcnRoZWxlc3M6Ci0gICAgICAgIEFzc2VydC5hc3NlcnRTYW1lKHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKEJvb2suY2xhc3MpLCB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhCb29rLmNsYXNzKSk7Ci0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJjID0gdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoQm9vay5jbGFzcyk7Ci0gICAgICAgIC8vIGFzc2VydEVxdWFscyhFbGVtZW50VHlwZS5UWVBFLCBiYy5nZXRFbGVtZW50VHlwZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCb29rLmNsYXNzLCBiYy5nZXRFbGVtZW50Q2xhc3MoKSk7Ci0gICAgICAgIC8vIGFzc2VydEVxdWFscyhmYWxzZSwgYmMuaXNDYXNjYWRlZCgpKTsKLSAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKCIiLCBiYy5nZXRQcm9wZXJ0eVBhdGgoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGJjLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpICE9IG51bGwpOwotICAgICAgICBUZXN0VXRpbHMuZmFpbE9uTW9kaWZpYWJsZShiYy5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSwgImJlYW5EZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9ycyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhZGF0YUFQSV9FbmdpbmUoKSB7Ci0gICAgICAgIEVsZW1lbnREZXNjcmlwdG9yIGRlc2MgPQotICAgICAgICAgICAgdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoRW5naW5lLmNsYXNzKS5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJzZXJpYWxOdW1iZXIiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjKTsKLSAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKEVsZW1lbnRUeXBlLkZJRUxELCBkZXNjLmdldEVsZW1lbnRUeXBlKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgZGVzYy5nZXRFbGVtZW50Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhQVBJX0FkZHJlc3MoKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSh2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhBZGRyZXNzLmNsYXNzKS5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIFNldDxQcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BzID0gdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MoQWRkcmVzcy5jbGFzcykuZ2V0Q29uc3RyYWluZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFRlc3RVdGlscy5mYWlsT25Nb2RpZmlhYmxlKHByb3BzLCAiYmVhbkRlc2NyaXB0b3IgY29uc3RyYWluZWRQcm9wZXJ0aWVzIik7Ci0gICAgICAgIFNldDxTdHJpbmc+IHByb3BOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocHJvcHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgZWFjaCA6IHByb3BzKSB7Ci0gICAgICAgICAgICBUZXN0VXRpbHMuZmFpbE9uTW9kaWZpYWJsZShlYWNoLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpLCAicHJvcGVydHlEZXNjcmlwdG9yIGNvbnN0cmFpbnREZXNjcmlwdG9ycyIpOwotICAgICAgICAgICAgcHJvcE5hbWVzLmFkZChlYWNoLmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm9wTmFtZXMuY29udGFpbnMoImFkZHJlc3NsaW5lMSIpKTsgLy8gYW5ub3RhdGVkIGF0Ci0gICAgICAgIC8vIGZpZWxkIGxldmVsCi0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByb3BOYW1lcy5jb250YWlucygiYWRkcmVzc2xpbmUyIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm9wTmFtZXMuY29udGFpbnMoInppcENvZGUiKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHByb3BOYW1lcy5jb250YWlucygiY291bnRyeSIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJvcE5hbWVzLmNvbnRhaW5zKCJjaXR5IikpOyAvLyBhbm5vdGF0ZWQgYXQgbWV0aG9kCi0gICAgICAgIC8vIGxldmVsCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNSwgcHJvcHMuc2l6ZSgpKTsKLQotICAgICAgICBFbGVtZW50RGVzY3JpcHRvciBkZXNjID0KLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKEFkZHJlc3MuY2xhc3MpLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoImFkZHJlc3NsaW5lMSIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChkZXNjKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKENvbnN0cmFpbnREZXNjcmlwdG9yPD8+IGVhY2ggOiBkZXNjLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpKSB7Ci0gICAgICAgICAgICBpZiAoZWFjaC5nZXRDb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlcygpLmdldCgwKS5lcXVhbHMoU2l6ZVZhbGlkYXRvckZvclN0cmluZy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlYWNoLmdldEF0dHJpYnV0ZXMoKS5jb250YWluc0tleSgibWF4IikpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzMCwgZWFjaC5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJtYXgiKSk7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvdW5kKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU11bHRpVmFsdWVkQ29uc3RyYWludHMoKSB7Ci0gICAgICAgIEVuZ2luZSBlbmdpbmUgPSBuZXcgRW5naW5lKCk7Ci0gICAgICAgIGVuZ2luZS5zZXJpYWxOdW1iZXIgPSAiYWJjZC1kZWZnLTAxMjMiOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxFbmdpbmU+PiB2aW9sYXRpb25zOwotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGVuZ2luZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0KLSAgICAgICAgZW5naW5lLnNlcmlhbE51bWJlciA9ICIhKS8oLygpIjsKLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShlbmdpbmUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBmb3IgKFN0cmluZyBtc2cgOiBuZXcgU3RyaW5nW10geyAibXVzdCBjb250YWluIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXJzIG9ubHkiLCAibXVzdCBtYXRjaCAuLi4uLS4uLi4tLi4uLiIgfSkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uV2l0aE1lc3NhZ2UodmlvbGF0aW9ucywgbXNnKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RyYWludFZhbGlkYXRvclJlc29sdXRpb25BbGdvcml0aG0oKSB7Ci0gICAgICAgIE1heFRlc3RFbnRpdHkgZW50aXR5ID0gbmV3IE1heFRlc3RFbnRpdHkoKTsKLSAgICAgICAgZW50aXR5LnNldFRleHQoIjEwMSIpOwotICAgICAgICBlbnRpdHkuc2V0UHJvcGVydHkoIjIwMSIpOwotICAgICAgICBlbnRpdHkuc2V0TG9uZ1ZhbHVlKDMwMSk7Ci0gICAgICAgIGVudGl0eS5zZXREZWNpbWFsVmFsdWUobmV3IEJpZ0RlY2ltYWwoNDAxKSk7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE1heFRlc3RFbnRpdHk+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGVudGl0eSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCB2aW9sYXRpb25zLnNpemUoKSk7Ci0KLSAgICAgICAgTm9WYWxpZGF0b3JUZXN0RW50aXR5IGVudGl0eTIgPSBuZXcgTm9WYWxpZGF0b3JUZXN0RW50aXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoZW50aXR5Mik7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkVHlwZUV4Y2VwdGlvbiBleHBlY3RlZCBidXQgbm90IHRocm93biIpOwotICAgICAgICB9IGNhdGNoIChVbmV4cGVjdGVkVHlwZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gd2UgZXhwZWN0ZWQgdGhpcwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJObyB2YWxpZGF0b3IgY291bGQgYmUgZm91bmQgZm9yIHR5cGUgamF2YS5sYW5nLk9iamVjdC4gIgotICAgICAgICAgICAgICAgICsgIlNlZTogQE1heCBhdCBwcml2YXRlIGphdmEubGFuZy5PYmplY3QgIiArICJvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuIgotICAgICAgICAgICAgICAgICsgIk5vVmFsaWRhdG9yVGVzdEVudGl0eS5hbnl0aGluZyIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZVZhbGlkYXRpb24oKSB7Ci0gICAgICAgIFNpemVUZXN0RW50aXR5IGVuID0gbmV3IFNpemVUZXN0RW50aXR5KCk7Ci0gICAgICAgIGVuLmJhID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGVuLmNhID0gbmV3IGNoYXJbM107Ci0gICAgICAgIGVuLmJvYSA9IG5ldyBib29sZWFuWzNdOwotICAgICAgICBlbi5jb2xsID0gQXJyYXlzLmFzTGlzdCgiMSIsICIyIiwgIjMiKTsKLSAgICAgICAgZW4uZGEgPSBuZXcgZG91YmxlWzNdOwotICAgICAgICBlbi5mYSA9IG5ldyBmbG9hdFszXTsKLSAgICAgICAgZW4uaXQgPSBuZXcgaW50WzNdOwotICAgICAgICBlbi5sYSA9IG5ldyBsb25nWzNdOwotICAgICAgICBlbi5tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZW4ubWFwLnB1dCgiMSIsICIxIik7Ci0gICAgICAgIGVuLm1hcC5wdXQoIjMiLCAiMyIpOwotICAgICAgICBlbi5tYXAucHV0KCIyIiwgIjIiKTsKLSAgICAgICAgZW4ub2EgPSBuZXcgSW50ZWdlclszXTsKLSAgICAgICAgZW4ub2EyID0gbmV3IEludGVnZXJbM107Ci0gICAgICAgIGVuLnNhID0gbmV3IHNob3J0WzNdOwotICAgICAgICBlbi50ZXh0ID0gIjEyMyI7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFNpemVUZXN0RW50aXR5Pj4gdmkgPSB2YWxpZGF0b3IudmFsaWRhdGUoZW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTMsIHZpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNSLTMwMyBTZWN0aW9uIDUuMS5jLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb25zdHJhaW50c0Zvck51bGxDbGFzcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKG51bGwpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gb24gVmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MobnVsbCkiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1BheWxvYWRUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvUGF5bG9hZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmYTY2MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvUGF5bG9hZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuVGVzdFV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiB0ZXN0IHRoYXQgcGF5bG9hZCBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0cmlldmVkCi0gKiBmcm9tIGVycm9yIHJlcG9ydHMgdmlhIHRoZSBDb25zdHJhaW50RGVzY3JpcHRvciBlaXRoZXIgYWNjZXNzZWQKLSAqIHRocm91Z2ggdGhlIENvbnN0cmFpbnRWaW9sYXRpb24gb2JqZWN0czxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXlsb2FkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmFjdG9yeSA9IFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOwotICAgICAgICAoKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKSBmYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkuc2V0TG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0b3IgaW5zdGFuY2UgdG8gdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHZhbGlkYXRvciA9IGNyZWF0ZVZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmFsaWRhdG9yIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVmFsaWRhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldFZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTZXZlcml0eSB7Ci0gICAgICAgIHN0YXRpYyBjbGFzcyBJbmZvIGltcGxlbWVudHMgUGF5bG9hZCB7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgY2xhc3MgRXJyb3IgaW1wbGVtZW50cyBQYXlsb2FkIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBBZGRyZXNzIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgemlwQ29kZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKLQotICAgICAgICBBZGRyZXNzKFN0cmluZyB6aXBDb2RlLCBTdHJpbmcgY2l0eSkgewotICAgICAgICAgICAgdGhpcy56aXBDb2RlID0gemlwQ29kZTsKLSAgICAgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBATm90TnVsbChtZXNzYWdlID0gIndvdWxkIGJlIG5pY2UgaWYgd2UgaGFkIG9uZSIsIHBheWxvYWQgPSBTZXZlcml0eS5JbmZvLmNsYXNzKQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFppcENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gemlwQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb3ROdWxsKG1lc3NhZ2UgPSAidGhlIGNpdHkgaXMgbWFuZGF0b3J5IiwgcGF5bG9hZCA9IFNldmVyaXR5LkVycm9yLmNsYXNzKQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2l0eTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXlsb2FkKCkgewotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBZGRyZXNzPj4gdmlvbGF0aW9uczsKLSAgICAgICAgQWRkcmVzcyBhZGRyZXNzID0gbmV3IEFkZHJlc3MobnVsbCwgbnVsbCk7Ci0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRkcmVzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIENvbnN0cmFpbnRWaW9sYXRpb248Pz4gdmlvOwotICAgICAgICB2aW8gPSBUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJ6aXBDb2RlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmlvKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpby5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldFBheWxvYWQoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICB2aW8uZ2V0Q29uc3RyYWludERlc2NyaXB0b3IoKS5nZXRQYXlsb2FkKCkuY29udGFpbnMoU2V2ZXJpdHkuSW5mby5jbGFzcykpOwotCi0gICAgICAgIHZpbyA9IFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImNpdHkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2aW8pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmlvLmdldENvbnN0cmFpbnREZXNjcmlwdG9yKCkuZ2V0UGF5bG9hZCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgIHZpby5nZXRDb25zdHJhaW50RGVzY3JpcHRvcigpLmdldFBheWxvYWQoKS5jb250YWlucyhTZXZlcml0eS5FcnJvci5jbGFzcykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9UY2tSZXByb2R1Y2VyVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1Rja1JlcHJvZHVjZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDk4MDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL1Rja1JlcHJvZHVjZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnV0aWwuUHJvcGVydHlBY2Nlc3M7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxicj4KLSAqIFVzZXI6IHJvbWFuLnN0dW1tPGJyPgotICogRGF0ZTogMjEuMDQuMjAxMDxicj4KLSAqIFRpbWU6IDE0OjIxOjQ1PGJyPgotICovCi1wdWJsaWMgY2xhc3MgVGNrUmVwcm9kdWNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsKLSAgICAgICAgKChEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcikgZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpLnNldExvY2FsZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdG9yIGluc3RhbmNlIHRvIHRlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZhbGlkYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIGFzc2VydENvcnJlY3ROdW1iZXJPZlZpb2xhdGlvbnMoU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+IHZpb2xhdGlvbnMsCi0gICAgICAgIGludCBleHBlY3RlZFZpb2xhdGlvbnMpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uc3RyYWludCB2aW9sYXRpb25zLiBFeHBlY3RlZDogIiArIGV4cGVjdGVkVmlvbGF0aW9ucyArICIgQWN0dWFsOiAiCi0gICAgICAgICAgICArIHZpb2xhdGlvbnMuc2l6ZSgpLCBleHBlY3RlZFZpb2xhdGlvbnMsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlBY2Nlc3NPbk5vblB1YmxpY0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENhciBjYXIgPSBuZXcgQ2FyKCJVU2QtMjk4Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYXIuZ2V0TGljZW5zZVBsYXRlTnVtYmVyKCksIFByb3BlcnR5QWNjZXNzLmdldFByb3BlcnR5KGNhciwgImxpY2Vuc2VQbGF0ZU51bWJlciIpKTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxDYXI+PiB2aW9sYXRpb25zID0KLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KGNhciwgImxpY2Vuc2VQbGF0ZU51bWJlciIsIEZpcnN0LmNsYXNzLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5TZWNvbmQuY2xhc3MpOwotICAgICAgICBhc3NlcnRDb3JyZWN0TnVtYmVyT2ZWaW9sYXRpb25zKHZpb2xhdGlvbnMsIDEpOwotCi0gICAgICAgIGNhci5zZXRMaWNlbnNlUGxhdGVOdW1iZXIoIlVTRC0yOTgiKTsKLSAgICAgICAgdmlvbGF0aW9ucyA9Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0eShjYXIsICJsaWNlbnNlUGxhdGVOdW1iZXIiLCBGaXJzdC5jbGFzcywKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuU2Vjb25kLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Q29ycmVjdE51bWJlck9mVmlvbGF0aW9ucyh2aW9sYXRpb25zLCAwKTsKLSAgICB9Ci0KLSAgICBjbGFzcyBDYXIgewotICAgICAgICBAUGF0dGVybihyZWdleHAgPSAiW0EtWl1bQS1aXVtBLVpdLVswLTldWzAtOV1bMC05XSIsIGdyb3VwcyA9IHsgRmlyc3QuY2xhc3MsIFNlY29uZC5jbGFzcyB9KQotICAgICAgICBwcml2YXRlIFN0cmluZyBsaWNlbnNlUGxhdGVOdW1iZXI7Ci0KLSAgICAgICAgQ2FyKFN0cmluZyBsaWNlbnNlUGxhdGVOdW1iZXIpIHsKLSAgICAgICAgICAgIHRoaXMubGljZW5zZVBsYXRlTnVtYmVyID0gbGljZW5zZVBsYXRlTnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMaWNlbnNlUGxhdGVOdW1iZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGljZW5zZVBsYXRlTnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGljZW5zZVBsYXRlTnVtYmVyKFN0cmluZyBsaWNlbnNlUGxhdGVOdW1iZXIpIHsKLSAgICAgICAgICAgIHRoaXMubGljZW5zZVBsYXRlTnVtYmVyID0gbGljZW5zZVBsYXRlTnVtYmVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIEZpcnN0IHsKLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgU2Vjb25kIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdGlvblRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU3MWZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQmVhbkRlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5Db25zdHJhaW50RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLk5vdE51bGxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5BZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5BdXRob3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkJvb2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkJ1c2luZXNzQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQ29udGluZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5Db3VudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5GaXJzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuTGFzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuUmVjdXJzaXZlRm9vOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5UZXN0VXRpbHM7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmFjdG9yeSA9IFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOwotICAgICAgICAoKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKSBmYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSkuc2V0TG9jYWxlKExvY2FsZS5FTkdMSVNIKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0b3IgaW5zdGFuY2UgdG8gdGVzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHZhbGlkYXRvciA9IGNyZWF0ZVZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmFsaWRhdG9yIGluc3RhbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVmFsaWRhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldFZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NTdHJhdGVnaWVzX2ZpZWxkX21ldGhvZCgpIHsKLSAgICAgICAgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0IG8xID0gbmV3IEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCgiMSIpOwotICAgICAgICBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3RTdWIgbzIgPSBuZXcgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViKCIzIik7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdD4+IGVycm9ycyA9IHZhbGlkYXRvci52YWxpZGF0ZShvMSk7Ci0gICAgICAgIGFzc2VydFRydWUoZXJyb3JzLmlzRW1wdHkoKSk7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdFN1Yj4+IGVycm9yczIgPSB2YWxpZGF0b3IudmFsaWRhdGUobzIpOwotICAgICAgICBhc3NlcnRUcnVlKGVycm9yczIuaXNFbXB0eSgpKTsKLQotICAgICAgICBvMiA9IG5ldyBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3RTdWIoIjEiKTsKLSAgICAgICAgZXJyb3JzMiA9IHZhbGlkYXRvci52YWxpZGF0ZShvMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcnJvcnMyLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gYXNzZXJ0LCB0aGF0IGdldHZhcjIoKSBhbmQgZ2V0VmFyMigpIGFyZSBib3RoIHZhbGlkYXRlZCB3aXRoIHRoZWlyCi0gICAgICAgIC8vIGdldHRlciBtZXRob2QKLSAgICAgICAgbzIgPSBuZXcgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViKCIzIik7Ci0gICAgICAgIG8yLnNldFZhcjIoIjEiKTsKLSAgICAgICAgbzIuc2V0dmFyMigiMiIpOwotICAgICAgICBlcnJvcnMyID0gdmFsaWRhdG9yLnZhbGlkYXRlKG8yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGVycm9yczIuc2l6ZSgpKTsKLQotICAgICAgICBvMi5zZXR2YXIyKCI1Iik7Ci0gICAgICAgIG8yLnNldFZhcjIoIjYiKTsKLSAgICAgICAgZXJyb3JzMiA9IHZhbGlkYXRvci52YWxpZGF0ZShvMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBlcnJvcnMyLnNpemUoKSk7Ci0KLSAgICAgICAgbzIuc2V0dmFyMigiNSIpOwotICAgICAgICBvMi5zZXRWYXIyKCItMSIpOwotICAgICAgICBlcnJvcnMyID0gdmFsaWRhdG9yLnZhbGlkYXRlKG8yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVycm9yczIuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzU3RyYXRlZ2llc19vbl9jaGlsZHJlbigpIHsKLSAgICAgICAgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0IG8xID0gbmV3IEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCgiMSIpOwotICAgICAgICBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgbzIgPSBuZXcgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0KCIyIik7Ci0gICAgICAgIG8xLm5leHQobzIpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3Q+PiBlcnJvcnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobzEpOwotICAgICAgICAvLyBhc3NlcnQsIHRoYXQgZmllbGQgYWNjZXNzICduZXh0JyBpcyB1c2VkIGFuZCBub3QgZ2V0TmV4dCgpIGlzCi0gICAgICAgIC8vIGNhbGxlZCEhIQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXJyb3JzLnNpemUoKSk7Ci0gICAgICAgIG8yID0gbmV3IEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCgiMSIpOwotICAgICAgICBvMS5uZXh0KG8yKTsKLSAgICAgICAgZXJyb3JzID0gdmFsaWRhdG9yLnZhbGlkYXRlKG8xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVycm9ycy5zaXplKCkpOwotCi0gICAgICAgIC8vIGFzc2VydCB0aGF0IHRvQmVJZ25vcmVkIG5vdCB2YWxpZGF0ZWQsIGJlY2F1c2Ugbm90IGFubm90YXRlZCB3aXRoCi0gICAgICAgIC8vIEBWYWxpZAotICAgICAgICBvMS5zZXRUb0JlSWdub3JlZChuZXcgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0KCI5OSIpKTsKLSAgICAgICAgZXJyb3JzID0gdmFsaWRhdG9yLnZhbGlkYXRlKG8xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVycm9ycy5zaXplKCkpOwotCi0gICAgICAgIG8xLnNldE5leHQobmV3IEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCgiOTkiKSk7Ci0gICAgICAgIGVycm9ycyA9IHZhbGlkYXRvci52YWxpZGF0ZShvMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcnJvcnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vaygpIHsKLSAgICAgICAgQXV0aG9yIGF1dGhvciA9IG5ldyBBdXRob3IoKTsKLSAgICAgICAgYXV0aG9yLnNldExhc3ROYW1lKCJCYXVkZWxhaXJlIik7Ci0gICAgICAgIGF1dGhvci5zZXRGaXJzdE5hbWUoIiIpOwotICAgICAgICBCb29rIGJvb2sgPSBuZXcgQm9vaygpOwotICAgICAgICBib29rLnNldEF1dGhvcihhdXRob3IpOwotICAgICAgICBib29rLnNldFN1YnRpdGxlKCIxMjM0NTY3ODkwMDEyNTY3ODkwMTIzNDU3ODkwMTIzNDU2Nzg5MCIpOwotCi0gICAgICAgIC8vIE5vdEVtcHR5IGZhaWx1cmUgb24gdGhlIHRpdGxlIGZpZWxkCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEJvb2s+PiBlcnJvcnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYm9vaywgQm9vay5BbGwuY2xhc3MpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghZXJyb3JzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYm9vay5zZXRUaXRsZSgiTGVzIGZsZXVycyBkdSBtYWwiKTsKLSAgICAgICAgYXV0aG9yLnNldENvbXBhbnkoIlNvbWUgcmFuZG9tIHB1Ymxpc2hlciB3aXRoIGEgdmVyeSB2ZXJ5IHZlcnkgbG9uZyBuYW1lIik7Ci0KLSAgICAgICAgLy8gYXV0aG9yLmZpcnN0TmFtZSBmYWlscyB0byBwYXNzIHRoZSBOb3RFbXB0eSBjb25zdHJhaW50Ci0gICAgICAgIC8vIGF1dGhvci5jb21wYW55IGZhaWxzIHRvIHBhc3MgdGhlIFNpemUgY29uc3RyYWludAotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3Q6IC0gZHluYW1pYyByZXNvbHV0aW9uIG9mIGFzc29jaWF0ZWQgb2JqZWN0IHR5cGVzLiAtIGluaGVyaXRhbmNlIG9mIHZhbGlkYXRpb24gY29uc3RyYWludHMgLSBjb21wbGV4Ci0gICAgICogdmFsaWF0aW9uLCBkaWZmZXJlbnQgZ3JvdXBzLCBuZXN0ZWQgb2JqZWN0IG5ldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEFubm90YXRpb24oKSB7Ci0gICAgICAgIEF1dGhvciBhID0gbmV3IEF1dGhvcigpOwotICAgICAgICBhLnNldEFkZHJlc3NlcyhuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KCkpOwotICAgICAgICBCdXNpbmVzc0FkZHJlc3MgYWRyID0gbmV3IEJ1c2luZXNzQWRkcmVzcygpOwotICAgICAgICBhZHIuc2V0Q291bnRyeShuZXcgQ291bnRyeSgpKTsKLSAgICAgICAgYWRyLnNldEFkZHJlc3NsaW5lMSgibGluZTEiKTsKLSAgICAgICAgYWRyLnNldEFkZHJlc3NsaW5lMigibGluZTIiKTsKLQotICAgICAgICBhZHIuc2V0WmlwQ29kZSgiMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotICAgICAgICBhLmdldEFkZHJlc3NlcygpLmFkZChhZHIpOwotCi0gICAgICAgIGEuc2V0Rmlyc3ROYW1lKCJLYXJsIik7Ci0gICAgICAgIGEuc2V0TGFzdE5hbWUoIk1heSIpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEF1dGhvcj4+IGZvdW5kID0gdmFsaWRhdG9yLnZhbGlkYXRlKGEsIERlZmF1bHQuY2xhc3MsIEZpcnN0LmNsYXNzLCBMYXN0LmNsYXNzKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIWZvdW5kLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgZm91bmQuc2l6ZSgpKTsKLQotICAgICAgICBhZHIuc2V0Q2l0eSgiQmVybGluIik7Ci0gICAgICAgIGFkci5zZXRaaXBDb2RlKCIxMjM0NSIpOwotICAgICAgICBhZHIuc2V0Q29tcGFueSgiYXBhY2hlIik7Ci0gICAgICAgIGZvdW5kID0gdmFsaWRhdG9yLnZhbGlkYXRlKGEsIERlZmF1bHQuY2xhc3MsIEZpcnN0LmNsYXNzLCBMYXN0LmNsYXNzKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBmb3VuZC5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPEF1dGhvcj4gaWMgPSBmb3VuZC5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWRkcmVzc2VzWzBdLmNvdW50cnkubmFtZSIsIGljLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVBhdGhXaXRoSW5kZXgoKSB7Ci0gICAgICAgIEF1dGhvciBhID0gbmV3IEF1dGhvcigpOwotICAgICAgICBhLnNldEFkZHJlc3NlcyhuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KCkpOwotICAgICAgICBBZGRyZXNzIGFkciA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIGFkci5zZXRBZGRyZXNzbGluZTEoImFkcjEiKTsKLSAgICAgICAgYWRyLnNldENpdHkoIlNhbnRpYWdvIik7Ci0gICAgICAgIGEuZ2V0QWRkcmVzc2VzKCkuYWRkKGFkcik7Ci0gICAgICAgIGFkciA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIGFkci5zZXRBZGRyZXNzbGluZTEoImFkcjIiKTsKLSAgICAgICAgYWRyLnNldENpdHkoIkhhdmFubmEiKTsKLSAgICAgICAgYS5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyKTsKLSAgICAgICAgYWRyID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgYWRyLnNldEFkZHJlc3NsaW5lMSgiYWRyMyIpOwotICAgICAgICBhZHIuc2V0Q2l0eSgiVHJpbmlkYWQiKTsKLSAgICAgICAgYS5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyKTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBdXRob3I+PiBjb25zdHJhaW50cyA9IHZhbGlkYXRvci52YWxpZGF0ZShhKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIWNvbnN0cmFpbnRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzZXJ0UHJvcGVydHlQYXRoKCJhZGRyZXNzZXNbMF0uY291bnRyeSIsIGNvbnN0cmFpbnRzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlQYXRoKCJhZGRyZXNzZXNbMV0uY291bnRyeSIsIGNvbnN0cmFpbnRzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlQYXRoKCJhZGRyZXNzZXNbMl0uY291bnRyeSIsIGNvbnN0cmFpbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBjb3JyZWN0IHBhdGggcmVwb3J0aW5nIHdoZW4gdmFsaWRhdGluZyBhIHNldCBvZiBiZWFucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlQYXRoT25TZXQoKSB7Ci0gICAgICAgIENvbnRpbmVudCBjID0gbmV3IENvbnRpbmVudCgpOwotICAgICAgICBjLm5hbWUgPSAiYzEiOwotICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgpOwotICAgICAgICBjb3VudHJ5LnNldElTTzJDb2RlKCJ4eCIpOwotICAgICAgICBjb3VudHJ5LnNldElTTzNDb2RlKCJ4eHgiKTsKLSAgICAgICAgY291bnRyeS5zZXROYW1lKG51bGwpOwotICAgICAgICBjLmNvdW50cmllcy5hZGQoY291bnRyeSk7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Q29udGluZW50Pj4gY29uc3RyYWludHMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgdmlvbGF0aW9ucyBkZXRlY3RlZCIsIDEsIGNvbnN0cmFpbnRzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5UGF0aCgiY291bnRyaWVzW10ubmFtZSIsIGNvbnN0cmFpbnRzKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgPFQ+IHZvaWQgYXNzZXJ0UHJvcGVydHlQYXRoKFN0cmluZyBwcm9wZXJ0eVBhdGgsIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiBjb25zdHJhaW50cykgewotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb248VD4gZWFjaCA6IGNvbnN0cmFpbnRzKSB7Ci0gICAgICAgICAgICBpZiAoZWFjaC5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscyhwcm9wZXJ0eVBhdGgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuZmFpbChwcm9wZXJ0eVBhdGggKyAiIG5vdCBmb3VuZCBpbiAiICsgY29uc3RyYWludHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVBhdGhSZWN1cnNpdmUoKSB7Ci0gICAgICAgIFJlY3Vyc2l2ZUZvbyBmb28xID0gbmV3IFJlY3Vyc2l2ZUZvbygpOyAvLyByb290Ci0gICAgICAgIFJlY3Vyc2l2ZUZvbyBmb28xMSA9IG5ldyBSZWN1cnNpdmVGb28oKTsKLSAgICAgICAgZm9vMS5nZXRGb29zKCkuYWRkKGZvbzExKTsgLy8gZm9vc1swXQotICAgICAgICBSZWN1cnNpdmVGb28gZm9vMTIgPSBuZXcgUmVjdXJzaXZlRm9vKCk7Ci0gICAgICAgIGZvbzEuZ2V0Rm9vcygpLmFkZChmb28xMik7IC8vIGZvb3NbMV0KLSAgICAgICAgUmVjdXJzaXZlRm9vIGZvbzIgPSBuZXcgUmVjdXJzaXZlRm9vKCk7Ci0gICAgICAgIGZvbzExLmdldEZvb3MoKS5hZGQoZm9vMik7IC8vIGZvb3NbMF0uZm9vc1swXQotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFJlY3Vyc2l2ZUZvbz4+IGNvbnN0cmFpbnRzID0gdmFsaWRhdG9yLnZhbGlkYXRlKGZvbzEpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eVBhdGgoImZvb3NbMF0uZm9vc1swXS5mb29zIiwgY29uc3RyYWludHMpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eVBhdGgoImZvb3NbMV0uZm9vcyIsIGNvbnN0cmFpbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEVsZW1lbnRJbkNvbGxlY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUobnVsbCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgICAgICBSZWN1cnNpdmVGb28gZm9vID0gbmV3IFJlY3Vyc2l2ZUZvbygpOwotICAgICAgICBmb28uZ2V0Rm9vcygpLmFkZChuZXcgUmVjdXJzaXZlRm9vKCkpOwotICAgICAgICBmb28uZ2V0Rm9vcygpLmFkZChudWxsKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIXZhbGlkYXRvci52YWxpZGF0ZShmb28pLmlzRW1wdHkoKSk7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gbnVsbHBvaW50ZXIgZXhjZXB0aW9uIGdldHMgdGhyb3duCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwcygpIHsKLSAgICAgICAgQXV0aG9yIGF1dGhvciA9IG5ldyBBdXRob3IoKTsKLSAgICAgICAgYXV0aG9yLnNldENvbXBhbnkoIkFDTUUiKTsKLSAgICAgICAgQm9vayBib29rID0gbmV3IEJvb2soKTsKLSAgICAgICAgYm9vay5zZXRUaXRsZSgiIik7Ci0gICAgICAgIGJvb2suc2V0QXV0aG9yKGF1dGhvcik7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRUaXRsZUNvbnN0cmFpbnQgPSBmYWxzZTsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Qm9vaz4+IGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJvb2ssIEJvb2suQWxsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbnN0cmFpbnRWaW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIC8vIGFzc3VtaW5nIGFuIGVuZ2xpc2ggbG9jYWxlLCB0aGUgaW50ZXJwb2xhdGVkIG1lc3NhZ2UgaXMgcmV0dXJuZWQKLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uPEJvb2s+IGNvbnN0cmFpbnRWaW9sYXRpb24gOiBjb25zdHJhaW50VmlvbGF0aW9ucykgewotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0Um9vdEJlYW4oKS5nZXRDbGFzcygpID09IEJvb2suY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYXkgbm90IGJlIGVtcHR5IiwgY29uc3RyYWludFZpb2xhdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGJvb2sgPT0gY29uc3RyYWludFZpb2xhdGlvbi5nZXRSb290QmVhbigpKTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZlbmRpbmcgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWludFZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygidGl0bGUiKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFRpdGxlQ29uc3RyYWludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZlbmRpbmcgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhib29rLmdldFRpdGxlKCksIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0SW52YWxpZFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3VuZFRpdGxlQ29uc3RyYWludCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhhbXBsZSAyLjE0LiBVc2luZyB0aGUgZmx1ZW50IEFQSSB0byBidWlsZCBjdXN0b20gY29uc3RyYWludCB2aW9sYXRpb25zLiB0ZXN0IHRoYXQ6IHRoZQotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuWmlwQ29kZUNpdHlDb2hlcmVuY2VWYWxpZGF0b3J9IGFkZHMgY3VzdG9tIG1lc3NhZ2VzIHRvIHRoZSBjb250ZXh0IGFuZAotICAgICAqIHN1cHByZXNzZXMgdGhlIGRlZmF1bHQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dEZsdWVudEFQSSgpIHsKLSAgICAgICAgQWRkcmVzcyBhZCA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIGFkLnNldENpdHkoImVycm9yIik7Ci0gICAgICAgIGFkLnNldFppcENvZGUoImVycm9yIik7Ci0gICAgICAgIGFkLnNldEFkZHJlc3NsaW5lMSgic29tZXRoaW5nIik7Ci0gICAgICAgIGFkLnNldENvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgIGFkLmdldENvdW50cnkoKS5zZXROYW1lKCJzb21ldGhpbmciKTsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248QWRkcmVzcz4+IHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWQpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uPEFkZHJlc3M+IGVhY2ggOiB2aW9sYXRpb25zKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlYWNoLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiIG5vdCBPSyIpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImNpdHkiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAiIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU5lc3RlZFByb3BlcnR5UGF0aCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCi0gICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFBhdGggPSAiYWRkcmVzc2VzWzBdLmNvdW50cnkuSVNPMkNvZGUiOwotCi0gICAgICAgIEF1dGhvciBhdXRob3IgPSBuZXcgQXV0aG9yKCk7Ci0gICAgICAgIGF1dGhvci5zZXRBZGRyZXNzZXMobmV3IEFycmF5TGlzdDxBZGRyZXNzPigpKTsKLSAgICAgICAgQWRkcmVzcyBhZHIgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBhdXRob3IuZ2V0QWRkcmVzc2VzKCkuYWRkKGFkcik7Ci0gICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCk7Ci0gICAgICAgIGFkci5zZXRDb3VudHJ5KGNvdW50cnkpOwotICAgICAgICBjb3VudHJ5LnNldElTTzJDb2RlKCJ0b29fbG9uZyIpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEF1dGhvcj4+IGl2ID0gdmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydHkoYXV0aG9yLCBwcm9wUGF0aCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYuc2l6ZSgpKTsKLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjxBdXRob3I+IHZpbyA9IGl2Lml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFBhdGgsIHZpby5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShhdXRob3IsIHZpby5nZXRSb290QmVhbigpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShhdXRob3IuZ2V0QWRkcmVzc2VzKCkuZ2V0KDApLmdldENvdW50cnkoKSwgdmlvLmdldExlYWZCZWFuKCkpOwotCi0gICAgICAgIGNvdW50cnkuc2V0SVNPMkNvZGUoIjIzIik7Ci0gICAgICAgIGl2ID0gdmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydHkoYXV0aG9yLCBwcm9wUGF0aCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaXYuc2l6ZSgpKTsKLQotICAgICAgICBpdiA9IHZhbGlkYXRvci52YWxpZGF0ZVZhbHVlKEF1dGhvci5jbGFzcywgcHJvcFBhdGgsICIzNDUiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOwotICAgICAgICB2aW8gPSBpdi5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3BQYXRoLCB2aW8uZ2V0UHJvcGVydHlQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodmlvLmdldFJvb3RCZWFuKCkpOwotICAgICAgICBhc3NlcnROdWxsKHZpby5nZXRMZWFmQmVhbigpKTsKLQotICAgICAgICBpdiA9IHZhbGlkYXRvci52YWxpZGF0ZVZhbHVlKEF1dGhvci5jbGFzcywgcHJvcFBhdGgsICIzNCIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGl2LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlQ2FzY2FkaW5nTmVzdGVkQmVhbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCi0gICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFBhdGggPSAiYWRkcmVzc2VzWzBdIjsKLQotICAgICAgICBDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvciB2ID0gdmFsaWRhdG9yLnVud3JhcChDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvci5jbGFzcyk7Ci0gICAgICAgIEF1dGhvciBhdXRob3IgPSBuZXcgQXV0aG9yKCk7Ci0gICAgICAgIGF1dGhvci5zZXRBZGRyZXNzZXMobmV3IEFycmF5TGlzdDxBZGRyZXNzPigpKTsKLSAgICAgICAgQWRkcmVzcyBhZHIgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBhdXRob3IuZ2V0QWRkcmVzc2VzKCkuYWRkKGFkcik7Ci0gICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCk7Ci0gICAgICAgIGFkci5zZXRDaXR5KCJkYXJrIik7Ci0gICAgICAgIGFkci5zZXRDb3VudHJ5KGNvdW50cnkpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEF1dGhvcj4+IGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGF1dGhvciwgcHJvcFBhdGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGl2LnNpemUoKSk7IC8vIG51bGwgYWRkcmVzcyBsaW5lIDEgKG5vIGNhc2NhZGUpCi0KLSAgICAgICAgY291bnRyeS5zZXRJU08yQ29kZSgidG9vX2xvbmciKTsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlUHJvcGVydHkoYXV0aG9yLCBwcm9wUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgaXYuc2l6ZSgpKTsgLy8gbnVsbCBhZGRyZXNzIGxpbmUgMSArIG51bGwKLSAgICAgICAgLy8gY291bnRyeS5uYW1lICsgdG9vIGxvbmcKLSAgICAgICAgLy8gY291bnRyeS5pc28yY29kZQotCi0gICAgICAgIGNvdW50cnkuc2V0SVNPMkNvZGUoIjIzIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGF1dGhvciwgcHJvcFBhdGgsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGl2LnNpemUoKSk7IC8vIG51bGwgYWRkcmVzcyBsaW5lIDEgKyBudWxsCi0gICAgICAgIC8vIGNvdW50cnkubmFtZSwgY291bnRyeS5pc28yY29kZQotICAgICAgICAvLyBmaXhlZAotCi0gICAgICAgIEFkZHJlc3MgdmFsdWUgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICB2YWx1ZS5zZXRDaXR5KCJ3aGF0ZXZlciIpOwotICAgICAgICB2YWx1ZS5zZXRBZGRyZXNzbGluZTEoIjEgYWRkcmVzcyBsaW5lIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVZhbHVlKEF1dGhvci5jbGFzcywgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOyAvLyBudWxsIGNvdW50cnkKLQotICAgICAgICB2YWx1ZS5zZXRDb3VudHJ5KG5ldyBDb3VudHJ5KCkpOwotICAgICAgICBpdiA9IHYudmFsaWRhdGVWYWx1ZShBdXRob3IuY2xhc3MsIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Lm5hbWUKLQotICAgICAgICB2YWx1ZS5nZXRDb3VudHJ5KCkuc2V0TmFtZSgiTldPIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVZhbHVlKEF1dGhvci5jbGFzcywgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdi5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUNhc2NhZGluZ05lc3RlZFByb3BlcnR5KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wUGF0aCA9ICJhZGRyZXNzZXNbMF0uY291bnRyeSI7Ci0KLSAgICAgICAgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IgdiA9IHZhbGlkYXRvci51bndyYXAoQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBBdXRob3IgYXV0aG9yID0gbmV3IEF1dGhvcigpOwotICAgICAgICBhdXRob3Iuc2V0QWRkcmVzc2VzKG5ldyBBcnJheUxpc3Q8QWRkcmVzcz4oKSk7Ci0gICAgICAgIEFkZHJlc3MgYWRyID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgYXV0aG9yLmdldEFkZHJlc3NlcygpLmFkZChhZHIpOwotICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgpOwotICAgICAgICBhZHIuc2V0Q2l0eSgiZGFyayIpOwotICAgICAgICBhZHIuc2V0Q291bnRyeShjb3VudHJ5KTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBdXRob3I+PiBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShhdXRob3IsIHByb3BQYXRoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdi5zaXplKCkpOwotCi0gICAgICAgIGNvdW50cnkuc2V0SVNPMkNvZGUoInRvb19sb25nIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGF1dGhvciwgcHJvcFBhdGgsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGl2LnNpemUoKSk7Ci0gICAgICAgIC8vIGNvdW50cnkubmFtZSArIHRvbyBsb25nCi0gICAgICAgIC8vIGNvdW50cnkuaXNvMmNvZGUKLQotICAgICAgICBjb3VudHJ5LnNldElTTzJDb2RlKCIyMyIpOwotICAgICAgICBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShhdXRob3IsIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOwotICAgICAgICAvLyBjb3VudHJ5Lm5hbWUsIGNvdW50cnkuaXNvMmNvZGUKLQotICAgICAgICBDb3VudHJ5IHZhbHVlID0gbnVsbDsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlVmFsdWUoQXV0aG9yLmNsYXNzLCBwcm9wUGF0aCwgdmFsdWUsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGl2LnNpemUoKSk7IC8vIG51bGwgY291bnRyeQotCi0gICAgICAgIHZhbHVlID0gbmV3IENvdW50cnkoKTsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlVmFsdWUoQXV0aG9yLmNsYXNzLCBwcm9wUGF0aCwgdmFsdWUsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGl2LnNpemUoKSk7IC8vIG51bGwgY291bnRyeS5uYW1lCi0KLSAgICAgICAgdmFsdWUuc2V0TmFtZSgiTldPIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVZhbHVlKEF1dGhvci5jbGFzcywgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdi5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUNhc2NhZGluZ05lc3RlZFRpcFByb3BlcnR5KCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFBhdGggPSAiYWRkcmVzc2VzWzBdLmNvdW50cnkubmFtZSI7Ci0KLSAgICAgICAgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IgdiA9IHZhbGlkYXRvci51bndyYXAoQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBBdXRob3IgYXV0aG9yID0gbmV3IEF1dGhvcigpOwotICAgICAgICBhdXRob3Iuc2V0QWRkcmVzc2VzKG5ldyBBcnJheUxpc3Q8QWRkcmVzcz4oKSk7Ci0gICAgICAgIEFkZHJlc3MgYWRyID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgYXV0aG9yLmdldEFkZHJlc3NlcygpLmFkZChhZHIpOwotICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgpOwotICAgICAgICBhZHIuc2V0Q2l0eSgiZGFyayIpOwotICAgICAgICBhZHIuc2V0Q291bnRyeShjb3VudHJ5KTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBdXRob3I+PiBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShhdXRob3IsIHByb3BQYXRoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOwotCi0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGF1dGhvciwgcHJvcFBhdGgsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGl2LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlQ2FzY2FkaW5nS2V5ZWRFbGVtZW50KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wUGF0aCA9ICJbZm9vXSI7Ci0KLSAgICAgICAgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IgdiA9IHZhbGlkYXRvci51bndyYXAoQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBmaW5hbCBBZGRyZXNzIGFkciA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotICAgICAgICBPYmplY3QgbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBZGRyZXNzPigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoImZvbyIsIGFkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCk7Ci0gICAgICAgIGFkci5zZXRDaXR5KCJkYXJrIik7Ci0gICAgICAgIGFkci5zZXRDb3VudHJ5KGNvdW50cnkpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPYmplY3Q+PiBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShtYXAsIHByb3BQYXRoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOyAvLyBudWxsIGFkZHJlc3MgbGluZSAxIChubyBjYXNjYWRlKQotCi0gICAgICAgIGNvdW50cnkuc2V0SVNPMkNvZGUoInRvb19sb25nIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KG1hcCwgcHJvcFBhdGgsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGl2LnNpemUoKSk7IC8vIG51bGwgYWRkcmVzcyBsaW5lIDEgKyBudWxsCi0gICAgICAgIC8vIGNvdW50cnkubmFtZSArIHRvbyBsb25nCi0gICAgICAgIC8vIGNvdW50cnkuaXNvMmNvZGUKLQotICAgICAgICBjb3VudHJ5LnNldElTTzJDb2RlKCIyMyIpOwotICAgICAgICBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShtYXAsIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBpdi5zaXplKCkpOyAvLyBudWxsIGFkZHJlc3MgbGluZSAxICsgbnVsbAotICAgICAgICAvLyBjb3VudHJ5Lm5hbWUsIGNvdW50cnkuaXNvMmNvZGUKLSAgICAgICAgLy8gZml4ZWQKLQotICAgICAgICBBZGRyZXNzIHZhbHVlID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgdmFsdWUuc2V0Q2l0eSgid2hhdGV2ZXIiKTsKLSAgICAgICAgdmFsdWUuc2V0QWRkcmVzc2xpbmUxKCIxIGFkZHJlc3MgbGluZSIpOwotCi0gICAgICAgIFNldDw/PiBpdjIgPSB2LnZhbGlkYXRlVmFsdWUobWFwLmdldENsYXNzKCksIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYyLnNpemUoKSk7IC8vIG51bGwgY291bnRyeQotCi0gICAgICAgIHZhbHVlLnNldENvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgIGl2MiA9IHYudmFsaWRhdGVWYWx1ZShtYXAuZ2V0Q2xhc3MoKSwgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdjIuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Lm5hbWUKLQotICAgICAgICB2YWx1ZS5nZXRDb3VudHJ5KCkuc2V0TmFtZSgiTldPIik7Ci0gICAgICAgIGl2MiA9IHYudmFsaWRhdGVWYWx1ZShtYXAuZ2V0Q2xhc3MoKSwgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdjIuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDYXNjYWRpbmdLZXllZEdlbmVyaWNFbGVtZW50KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wUGF0aCA9ICJbZm9vXSI7Ci0KLSAgICAgICAgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IgdiA9IHZhbGlkYXRvci51bndyYXAoQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBmaW5hbCBBZGRyZXNzIGFkciA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIE9iamVjdCBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFkZHJlc3M+KCk7Ci0gICAgICAgICgoTWFwPFN0cmluZywgQWRkcmVzcz4pIG1hcCkucHV0KCJmb28iLCBhZHIpOwotICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgpOwotICAgICAgICBhZHIuc2V0Q2l0eSgiZGFyayIpOwotICAgICAgICBhZHIuc2V0Q291bnRyeShjb3VudHJ5KTsKLSAgICAgICAgU2V0PD8+IGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KG1hcCwgcHJvcFBhdGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGl2LnNpemUoKSk7IC8vIG51bGwgYWRkcmVzcyBsaW5lIDEgKG5vIGNhc2NhZGUpCi0KLSAgICAgICAgY291bnRyeS5zZXRJU08yQ29kZSgidG9vX2xvbmciKTsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlUHJvcGVydHkobWFwLCBwcm9wUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgaXYuc2l6ZSgpKTsgLy8gbnVsbCBhZGRyZXNzIGxpbmUgMSArIG51bGwKLSAgICAgICAgLy8gY291bnRyeS5uYW1lICsgdG9vIGxvbmcKLSAgICAgICAgLy8gY291bnRyeS5pc28yY29kZQotCi0gICAgICAgIGNvdW50cnkuc2V0SVNPMkNvZGUoIjIzIik7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KG1hcCwgcHJvcFBhdGgsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGl2LnNpemUoKSk7IC8vIG51bGwgYWRkcmVzcyBsaW5lIDEgKyBudWxsCi0gICAgICAgIC8vIGNvdW50cnkubmFtZSwgY291bnRyeS5pc28yY29kZQotICAgICAgICAvLyBmaXhlZAotCi0gICAgICAgIEFkZHJlc3MgdmFsdWUgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICB2YWx1ZS5zZXRDaXR5KCJ3aGF0ZXZlciIpOwotICAgICAgICB2YWx1ZS5zZXRBZGRyZXNzbGluZTEoIjEgYWRkcmVzcyBsaW5lIik7Ci0KLSAgICAgICAgU2V0PD8+IGl2MiA9IHYudmFsaWRhdGVWYWx1ZShNYXAuY2xhc3MsIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYyLnNpemUoKSk7IC8vIG51bGwgY291bnRyeQotCi0gICAgICAgIHZhbHVlLnNldENvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgIGl2MiA9IHYudmFsaWRhdGVWYWx1ZShNYXAuY2xhc3MsIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYyLnNpemUoKSk7IC8vIG51bGwgY291bnRyeS5uYW1lCi0KLSAgICAgICAgdmFsdWUuZ2V0Q291bnRyeSgpLnNldE5hbWUoIk5XTyIpOwotICAgICAgICBpdjIgPSB2LnZhbGlkYXRlVmFsdWUoTWFwLmNsYXNzLCBwcm9wUGF0aCwgdmFsdWUsIHRydWUpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGl2Mi5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUNhc2NhZGluZ0luZGV4ZWRFbGVtZW50KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wUGF0aCA9ICJbMF0iOwotICAgICAgICBDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvciB2ID0gdmFsaWRhdG9yLnVud3JhcChDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvci5jbGFzcyk7Ci0gICAgICAgIEFkZHJlc3MgdmFsdWUgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICB2YWx1ZS5zZXRDaXR5KCJ3aGF0ZXZlciIpOwotICAgICAgICB2YWx1ZS5zZXRBZGRyZXNzbGluZTEoIjEgYWRkcmVzcyBsaW5lIik7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEFkZHJlc3NbXT4+IGl2OwotICAgICAgICBBZGRyZXNzW10gYXJyYXkgPSB7IHZhbHVlIH07Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGFycmF5LCBwcm9wUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Ci0KLSAgICAgICAgdmFsdWUuc2V0Q291bnRyeShuZXcgQ291bnRyeSgpKTsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlUHJvcGVydHkoYXJyYXksIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOyAvLyBudWxsIGNvdW50cnkubmFtZQotCi0gICAgICAgIHZhbHVlLmdldENvdW50cnkoKS5zZXROYW1lKCJOV08iKTsKLSAgICAgICAgaXYgPSB2LnZhbGlkYXRlUHJvcGVydHkoYXJyYXksIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdi5zaXplKCkpOwotCi0gICAgICAgIHZhbHVlID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgdmFsdWUuc2V0Q2l0eSgid2hhdGV2ZXIiKTsKLSAgICAgICAgdmFsdWUuc2V0QWRkcmVzc2xpbmUxKCIxIGFkZHJlc3MgbGluZSIpOwotICAgICAgICBTZXQ8Pz4gaXYyOwotICAgICAgICBpdjIgPSB2LnZhbGlkYXRlVmFsdWUoYXJyYXkuZ2V0Q2xhc3MoKSwgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdjIuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Ci0KLSAgICAgICAgdmFsdWUuc2V0Q291bnRyeShuZXcgQ291bnRyeSgpKTsKLSAgICAgICAgaXYyID0gdi52YWxpZGF0ZVZhbHVlKGFycmF5LmdldENsYXNzKCksIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYyLnNpemUoKSk7IC8vIG51bGwgY291bnRyeS5uYW1lCi0KLSAgICAgICAgdmFsdWUuZ2V0Q291bnRyeSgpLnNldE5hbWUoIk5XTyIpOwotICAgICAgICBpdjIgPSB2LnZhbGlkYXRlVmFsdWUoYXJyYXkuZ2V0Q2xhc3MoKSwgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBpdjIuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDYXNjYWRpbmdJbmRleGVkR2VuZXJpY0VsZW1lbnQoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAotICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFBhdGggPSAiWzBdIjsKLSAgICAgICAgQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IgdiA9IHZhbGlkYXRvci51bndyYXAoQ2FzY2FkaW5nUHJvcGVydHlWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBBZGRyZXNzIHZhbHVlID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgdmFsdWUuc2V0Q2l0eSgid2hhdGV2ZXIiKTsKLSAgICAgICAgdmFsdWUuc2V0QWRkcmVzc2xpbmUxKCIxIGFkZHJlc3MgbGluZSIpOwotICAgICAgICBTZXQ8Pz4gaXY7Ci0gICAgICAgIE9iamVjdCBsaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2YWx1ZSk7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGxpc3QsIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOyAvLyBudWxsIGNvdW50cnkKLSAgICAgICAgCi0gICAgICAgIHZhbHVlLnNldENvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgIGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGxpc3QsIHByb3BQYXRoLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdi5zaXplKCkpOyAvLyBudWxsIGNvdW50cnkubmFtZQotICAgICAgICAKLSAgICAgICAgdmFsdWUuZ2V0Q291bnRyeSgpLnNldE5hbWUoIk5XTyIpOwotICAgICAgICBpdiA9IHYudmFsaWRhdGVQcm9wZXJ0eShsaXN0LCBwcm9wUGF0aCwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaXYuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHZhbHVlID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgdmFsdWUuc2V0Q2l0eSgid2hhdGV2ZXIiKTsKLSAgICAgICAgdmFsdWUuc2V0QWRkcmVzc2xpbmUxKCIxIGFkZHJlc3MgbGluZSIpOwotICAgICAgICBTZXQ8Pz4gaXYyOwotICAgICAgICBpdjIgPSB2LnZhbGlkYXRlVmFsdWUoTGlzdC5jbGFzcywgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdjIuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Ci0gICAgICAgIAotICAgICAgICB2YWx1ZS5zZXRDb3VudHJ5KG5ldyBDb3VudHJ5KCkpOwotICAgICAgICBpdjIgPSB2LnZhbGlkYXRlVmFsdWUoTGlzdC5jbGFzcywgcHJvcFBhdGgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBpdjIuc2l6ZSgpKTsgLy8gbnVsbCBjb3VudHJ5Lm5hbWUKLSAgICAgICAgCi0gICAgICAgIHZhbHVlLmdldENvdW50cnkoKS5zZXROYW1lKCJOV08iKTsKLSAgICAgICAgaXYyID0gdi52YWxpZGF0ZVZhbHVlKExpc3QuY2xhc3MsIHByb3BQYXRoLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaXYyLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgRm9vIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb0FkZHJlc3MgZXh0ZW5kcyBBZGRyZXNzIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBATm90TnVsbChncm91cHMgPSBGb28uY2xhc3MpCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDaXR5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDYXNjYWRpbmdQcm9wZXJ0eVdpdGhNdWx0aXBsZUdyb3Vwc0lnbm9yZXNTaWJsaW5nUHJvcGVydGllcygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BQYXRoID0gImFkZHJlc3Nlc1swXS5jb3VudHJ5IjsKLQotICAgICAgICBDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvciB2ID0gdmFsaWRhdG9yLnVud3JhcChDYXNjYWRpbmdQcm9wZXJ0eVZhbGlkYXRvci5jbGFzcyk7Ci0gICAgICAgIEF1dGhvciBhdXRob3IgPSBuZXcgQXV0aG9yKCk7Ci0gICAgICAgIGF1dGhvci5zZXRBZGRyZXNzZXMobmV3IEFycmF5TGlzdDxBZGRyZXNzPigpKTsKLSAgICAgICAgQWRkcmVzcyBhZHIgPSBuZXcgRm9vQWRkcmVzcygpOwotICAgICAgICBhdXRob3IuZ2V0QWRkcmVzc2VzKCkuYWRkKGFkcik7Ci0gICAgICAgIENvdW50cnkgY291bnRyeSA9IG5ldyBDb3VudHJ5KCk7Ci0gICAgICAgIGFkci5zZXRDb3VudHJ5KGNvdW50cnkpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEF1dGhvcj4+IGl2ID0gdi52YWxpZGF0ZVByb3BlcnR5KGF1dGhvciwgcHJvcFBhdGgsIHRydWUsIERlZmF1bHQuY2xhc3MsIEZvby5jbGFzcyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgaXYuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFBUEkoKSB7Ci0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJvb2tCZWFuRGVzY3JpcHRvciA9IHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKEJvb2suY2xhc3MpOwotCi0gICAgICAgIC8vIGV4cGVjdCBubyBjb25zdHJhaW50cyBvbiBCb29rJ3MgQ2xhc3MtTGV2ZWwKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGJvb2tCZWFuRGVzY3JpcHRvci5oYXNDb25zdHJhaW50cygpKTsKLSAgICAgICAgLy8gYnV0IHRoZXJlIGFyZSBjb25zdHJhaW50cyBvbiBCb29rJ3MgUHJvcGVydHktTGV2ZWwKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoYm9va0JlYW5EZXNjcmlwdG9yLmlzQmVhbkNvbnN0cmFpbmVkKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShib29rQmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludERlc2NyaXB0b3JzKCkuc2l6ZSgpID09IDApOyAvLyBubwotICAgICAgICAvLyBjb25zdHJhaW50Ci0gICAgICAgIC8vIG1vcmUgc3BlY2lmaWNhbGx5ICJhdXRob3IiIGFuZCAidGl0bGUiCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgYm9va0JlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbmVkUHJvcGVydGllcygpLnNpemUoKSk7Ci0gICAgICAgIC8vIG5vdCBhIHByb3BlcnR5Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGJvb2tCZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJkb2VzTm90RXhpc3QiKSA9PSBudWxsKTsKLSAgICAgICAgLy8gcHJvcGVydHkgd2l0aCBubyBjb25zdHJhaW50Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGJvb2tCZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJkZXNjcmlwdGlvbiIpID09IG51bGwpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gYm9va0JlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInRpdGxlIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgcHJvcGVydHlEZXNjcmlwdG9yLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpLnNpemUoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJ0aXRsZSIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eU5hbWUoKSkpOwotICAgICAgICAvLyBhc3N1bWluZyB0aGUgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgTm90RW1wdHkgY29uc3RyYWludCBmaXJzdAotICAgICAgICBJdGVyYXRvcjxDb25zdHJhaW50RGVzY3JpcHRvcjw/Pj4gaXRlciA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOwotICAgICAgICBDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBjb25zdHJhaW50RGVzY3JpcHRvciA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgY29uc3RyYWludERlc2NyaXB0b3IgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKS5lcXVhbHMoTm90TnVsbC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbnN0cmFpbnREZXNjcmlwdG9yICE9IG51bGwpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRHcm91cHMoKS5zaXplKCkgPT0gMSk7IC8vICJmaXJzdCIKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhOb3ROdWxsVmFsaWRhdG9yLmNsYXNzLCBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRDb25zdHJhaW50VmFsaWRhdG9yQ2xhc3NlcygpLmdldCgwKSk7Ci0gICAgICAgIC8vIGFzc3VtaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBTaXplIGNvbnN0cmFpbnQgZmlyc3QKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yID0gYm9va0JlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoInN1YnRpdGxlIik7Ci0gICAgICAgIEl0ZXJhdG9yPENvbnN0cmFpbnREZXNjcmlwdG9yPD8+PiBpdGVyYXRvciA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOwotICAgICAgICBjb25zdHJhaW50RGVzY3JpcHRvciA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uc3RyYWludERlc2NyaXB0b3IuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZXF1YWxzKFNpemUuY2xhc3MpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoKChJbnRlZ2VyKSBjb25zdHJhaW50RGVzY3JpcHRvci5nZXRBdHRyaWJ1dGVzKCkuZ2V0KCJtYXgiKSkgPT0gMzApOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25zdHJhaW50RGVzY3JpcHRvci5nZXRHcm91cHMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IGJvb2tCZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJhdXRob3IiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJvcGVydHlEZXNjcmlwdG9yLmdldENvbnN0cmFpbnREZXNjcmlwdG9ycygpLnNpemUoKSA9PSAxKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJvcGVydHlEZXNjcmlwdG9yLmlzQ2FzY2FkZWQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGJvb2tCZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJ1bmNvbnN0cmFpbnRGaWVsZCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5ZWRNZXRhZGF0YSgpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgICAgIEJlYW5EZXNjcmlwdG9yIGJlYW5EZXNjcmlwdG9yID0gdmFsaWRhdG9yLmdldENvbnN0cmFpbnRzRm9yQ2xhc3MobmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewotICAgICAgICB9LmdldENsYXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChiZWFuRGVzY3JpcHRvcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShiZWFuRGVzY3JpcHRvci5pc0JlYW5Db25zdHJhaW5lZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiW2Zvb10iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNLZXllZE1ldGFkYXRhKCkgewotICAgICAgICBCZWFuRGVzY3JpcHRvciBiZWFuRGVzY3JpcHRvciA9IHZhbGlkYXRvci5nZXRDb25zdHJhaW50c0ZvckNsYXNzKE1hcC5jbGFzcyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGJlYW5EZXNjcmlwdG9yKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGJlYW5EZXNjcmlwdG9yLmlzQmVhbkNvbnN0cmFpbmVkKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChiZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0ZvclByb3BlcnR5KCJbZm9vXSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEluZGV4ZWRNZXRhZGF0YSgpIHsKLSAgICAgICAgQmVhbkRlc2NyaXB0b3IgYmVhbkRlc2NyaXB0b3IgPSB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhBcnJheS5uZXdJbnN0YW5jZShBdXRob3IuY2xhc3MsIDApLmdldENsYXNzKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChiZWFuRGVzY3JpcHRvcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShiZWFuRGVzY3JpcHRvci5pc0JlYW5Db25zdHJhaW5lZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoYmVhbkRlc2NyaXB0b3IuZ2V0Q29uc3RyYWludHNGb3JQcm9wZXJ0eSgiWzBdIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0luZGV4ZWRNZXRhZGF0YSgpIHsKLSAgICAgICAgQmVhbkRlc2NyaXB0b3IgYmVhbkRlc2NyaXB0b3IgPSB2YWxpZGF0b3IuZ2V0Q29uc3RyYWludHNGb3JDbGFzcyhMaXN0LmNsYXNzKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoYmVhbkRlc2NyaXB0b3IpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoYmVhbkRlc2NyaXB0b3IuaXNCZWFuQ29uc3RyYWluZWQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGJlYW5EZXNjcmlwdG9yLmdldENvbnN0cmFpbnRzRm9yUHJvcGVydHkoIlswXSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvVmFsaWRhdG9yUmVzb2x1dGlvblRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0b3JSZXNvbHV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDE3NTgyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9WYWxpZGF0b3JSZXNvbHV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uKjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7Ci0KLQotLyoqCi0gKiBDaGVja3MgdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgdGhlIHZhbGlkYXRvciByZXNvbHV0aW9uIGFsZ29yaXRobS4KLSAqIAotICogQGF1dGhvciBDYXJsb3MgVmFyYQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yUmVzb2x1dGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZhY3RvcnkgPSBWYWxpZGF0aW9uLmJ1aWxkRGVmYXVsdFZhbGlkYXRvckZhY3RvcnkoKTsKLSAgICAgICAgKChEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcikgZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpLnNldExvY2FsZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdG9yIGluc3RhbmNlIHRvIHRlc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB2YWxpZGF0b3IgPSBjcmVhdGVWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZhbGlkYXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IGEge0BsaW5rIENvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUKLSAgICAgKiBvbmx5IGF2YWlsYWJsZSB2YWxpZGF0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50IGFubm90YXRpb24gdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZhbGlkYXRvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShuZXcgUGVyc29uKCkpOwotICAgICAgICAgICAgZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biwgYnV0IG5vIHZhbGlkIHZhbGlkYXRvciBhdmFpbGFibGUuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENvbnN0cmFpbnREZWZpbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGNvcnJlY3QKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIHsKLSAgICAgICAgQFBlcnNvbk5hbWUKLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIH0KLQotICAgIEBDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0geyBJbnZhbGlkUGVyc29uTmFtZVZhbGlkYXRvci5jbGFzcyB9KQotICAgIEBEb2N1bWVudGVkCi0gICAgQFRhcmdldCggeyBNRVRIT0QsIEZJRUxELCBUWVBFIH0pCi0gICAgQFJldGVudGlvbihSVU5USU1FKQotICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBQZXJzb25OYW1lIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJXcm9uZyBwZXJzb24gbmFtZSI7Ci0KLSAgICAgICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZFBlcnNvbk5hbWVWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPE5vdE51bGwsIFN0cmluZz4gewotICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE5vdE51bGwgY29uc3RyYWludEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9BY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2NjIyNy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9BY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5IYXNWYWx1ZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgewotICAgIC8vIHRlc3QgdGhhdCBmaWVsZC1hY2Nlc3MgaXMgdXNlZCwgbm90IG1ldGhvZC1hY2Nlc3MgCi0gICAgQEhhc1ZhbHVlKHsiMSIsICIzIn0pCi0gICAgcHJvdGVjdGVkIFN0cmluZyB2YXIxOwotCi0gICAgLy8gdGVzdCB0aGF0IGZpZWxkLWFjY2VzcyBpcyB1c2VkLCBub3QgbWV0aG9kLWFjY2VzcwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIEBWYWxpZAotICAgIHByaXZhdGUgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0IG5leHQ7Ci0KLSAgICAvLyBub3QgYW5ub3RhdGVkIHdpdGggQFZhbGlkLCBub3QgdmFsaWRhdGVkISEKLSAgICBwcml2YXRlIEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCB0b0JlSWdub3JlZDsKLSAgICBwcml2YXRlIEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCBfbmV4dDsKLQotICAgIHB1YmxpYyBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QoU3RyaW5nIHZhcjEpIHsKLSAgICAgICAgdGhpcy52YXIxID0gdmFyMTsKLSAgICB9Ci0KLSAgICBASGFzVmFsdWUoIjMiKQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyMSgpIHsKLSAgICAgICAgcmV0dXJuICIzIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdCBuZXh0KSB7Ci0gICAgICAgIHRoaXMuX25leHQgPSBuZXh0OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0TmV4dChBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgbmV4dCkgewotICAgICAgICB0aGlzLm5leHQgPSBuZXh0OwotICAgIH0KLQotICAgIEBWYWxpZAotICAgIHB1YmxpYyBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgZ2V0TmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIF9uZXh0OyAvLyBtZXRob2QgcmV0dXJucyAnX25leHQnLCBub3QgdGhlIGZpZWxkICduZXh0JwotICAgIH0KLQotICAgIHB1YmxpYyBBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgZ2V0VG9CZUlnbm9yZWQoKSB7Ci0gICAgICAgIHJldHVybiB0b0JlSWdub3JlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0JlSWdub3JlZChBY2Nlc3NUZXN0QnVzaW5lc3NPYmplY3QgdG9CZUlnbm9yZWQpIHsKLSAgICAgICAgdGhpcy50b0JlSWdub3JlZCA9IHRvQmVJZ25vcmVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0FjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdFN1Yi5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTNiNWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkhhc1ZhbHVlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0U3ViIGV4dGVuZHMgQWNjZXNzVGVzdEJ1c2luZXNzT2JqZWN0IHsKLSAgICBwcml2YXRlIFN0cmluZyB2YXIyLCBfdmFyMjsKLQotICAgIHB1YmxpYyB2b2lkIHNldFZhcjIoU3RyaW5nIHZhcjIpIHsKLSAgICAgICAgdGhpcy52YXIyID0gdmFyMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXR2YXIyKFN0cmluZyBfdmFyMikgewotICAgICAgICB0aGlzLl92YXIyID0gX3ZhcjI7Ci0gICAgfQotCi0gICAgcHVibGljIEFjY2Vzc1Rlc3RCdXNpbmVzc09iamVjdFN1YihTdHJpbmcgdmFyMSkgewotICAgICAgICBzdXBlcih2YXIxKTsKLSAgICB9Ci0KLSAgICAvLyBnZXRWYXIxKCkgaXMgY2FsbGVkIG9uIHN1YmNsYXNzLCBhbHRob3VnaCBhbm5vdGF0ZWQgb24gc3VwZXJjbGFzcyAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcjEoKSB7Ci0gICAgICAgIHJldHVybiB2YXIxOwotICAgIH0KLQotICAgIC8vLy8gdGVzdCB0aGF0IGdldHZhcjIoKSBpcyBjYWxsZWQsIG5vdCBnZXRWYXIyKCkKLQotICAgIEBIYXNWYWx1ZSgiNSIpCi0gICAgcHVibGljIFN0cmluZyBnZXR2YXIyKCkgewotICAgICAgICByZXR1cm4gX3ZhcjI7Ci0gICAgfQotCi0gICAgQEhhc1ZhbHVlKCI2IikKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhcjIoKSB7Ci0gICAgICAgIHJldHVybiB2YXIyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0FkZHJlc3MuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0FkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyZjJmYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9BZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5aaXBDb2RlQ2l0eUNvaGVyZW5jZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLQotQFppcENvZGVDaXR5Q29oZXJlbmNlCi1wdWJsaWMgY2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIFppcENvZGVDaXR5Q2FycmllciB7Ci0gICAgQE5vdE51bGwKLSAgICBAU2l6ZShtYXggPSAzMCkKLSAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzbGluZTE7Ci0gICAgQFNpemUobWF4ID0gMzApCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzc2xpbmUyOwotICAgIEBTaXplKG1heCA9IDExKQotICAgIHByaXZhdGUgU3RyaW5nIHppcENvZGU7Ci0gICAgQE5vdE51bGwKLSAgICBAVmFsaWQKLSAgICBwcml2YXRlIENvdW50cnkgY291bnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBjaXR5OwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzbGluZTEoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzbGluZTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2xpbmUxKFN0cmluZyBhZGRyZXNzbGluZTEpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzbGluZTEgPSBhZGRyZXNzbGluZTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzbGluZTIoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzbGluZTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2xpbmUyKFN0cmluZyBhZGRyZXNzbGluZTIpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzbGluZTIgPSBhZGRyZXNzbGluZTI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRaaXBDb2RlKCkgewotICAgICAgICByZXR1cm4gemlwQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRaaXBDb2RlKFN0cmluZyB6aXBDb2RlKSB7Ci0gICAgICAgIHRoaXMuemlwQ29kZSA9IHppcENvZGU7Ci0gICAgfQotCi0gICAgQFNpemUobWF4ID0gMzApCi0gICAgQE5vdE51bGwKLSAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KCkgewotICAgICAgICByZXR1cm4gY291bnRyeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHJ5KENvdW50cnkgY291bnRyeSkgewotICAgICAgICB0aGlzLmNvdW50cnkgPSBjb3VudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGNvbmhlcmVuY2Ugb24gdGhlIG92ZXJhbGwgb2JqZWN0Ci0gICAgICogTmVlZHMgYmFzaWMgY2hlY2tpbmcgdG8gYmUgZ3JlZW4gZmlyc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEhpZ2hMZXZlbENvaGVyZW5jZSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgYm90aCBiYXNpYyBjb25zdHJhaW50cyBhbmQgaGlnaCBsZXZlbCBvbmVzLgotICAgICAqIEhpZ2ggbGV2ZWwgY29uc3RyYWludHMgYXJlIG5vdCBjaGVja2VkIGlmIGJhc2ljIGNvbnN0cmFpbnRzIGZhaWwuCi0gICAgICovCi0gICAgQEdyb3VwU2VxdWVuY2UodmFsdWUgPSB7RGVmYXVsdC5jbGFzcywgSGlnaExldmVsQ29oZXJlbmNlLmNsYXNzfSkKLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRlIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQXV0aG9yLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9BdXRob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlMmNhOC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9BdXRob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90RW1wdHk7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2U7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLUBHcm91cFNlcXVlbmNlKHtGaXJzdC5jbGFzcywgQXV0aG9yLmNsYXNzLCBMYXN0LmNsYXNzfSkKLXB1YmxpYyBjbGFzcyBBdXRob3IgewotICAgIEBOb3RFbXB0eShncm91cHMgPSBMYXN0LmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLSAgICBATm90RW1wdHkoZ3JvdXBzID0gRmlyc3QuY2xhc3MpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0gICAgQFNpemUobWF4ID0gNDAsIGdyb3VwcyA9IEZpcnN0LmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBhbnk7Ci0KLSAgICBAVmFsaWQKLSAgICBwcml2YXRlIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzOwotCi0gICAgcHVibGljIExpc3Q8QWRkcmVzcz4gZ2V0QWRkcmVzc2VzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NlcyhMaXN0PEFkZHJlc3M+IGFkZHJlc3NlcykgewotICAgICAgICB0aGlzLmFkZHJlc3NlcyA9IGFkZHJlc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBhbnkoKSB7Ci0gICAgICAgIHJldHVybiBjb21wYW55OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBhbnkoU3RyaW5nIGNvbXBhbnkpIHsKLSAgICAgICAgdGhpcy5jb21wYW55ID0gY29tcGFueTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQm9vay5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDVjN2FjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90RW1wdHk7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2U7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotCi1AR3JvdXBTZXF1ZW5jZSh7Rmlyc3QuY2xhc3MsIFNlY29uZC5jbGFzcywgQm9vay5jbGFzcywgTGFzdC5jbGFzc30pCi1wdWJsaWMgY2xhc3MgQm9vayB7Ci0gICAgQE5vdE51bGwoZ3JvdXBzID0gRmlyc3QuY2xhc3MpCi0gICAgQE5vdEVtcHR5KGdyb3VwcyA9IEZpcnN0LmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0gICAgQFNpemUobWF4ID0gMzAsIGdyb3VwcyA9IFNlY29uZC5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBzdWJ0aXRsZTsKLQotICAgIEBWYWxpZAotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEZpcnN0LmNsYXNzKQotICAgIHByaXZhdGUgQXV0aG9yIGF1dGhvcjsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIEBOb3ROdWxsCi0gICAgcHJpdmF0ZSBpbnQgdXNlbGVzc0ZpZWxkOwotCi0gICAgcHJpdmF0ZSBpbnQgdW5jb25zdHJhaW50RmllbGQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldFVuY29uc3RyYWludEZpZWxkKCkgewotICAgICAgICByZXR1cm4gdW5jb25zdHJhaW50RmllbGQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5jb25zdHJhaW50RmllbGQoaW50IHVuY29uc3RyYWludEZpZWxkKSB7Ci0gICAgICAgIHRoaXMudW5jb25zdHJhaW50RmllbGQgPSB1bmNvbnN0cmFpbnRGaWVsZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1YnRpdGxlKCkgewotICAgICAgICByZXR1cm4gc3VidGl0bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoU3RyaW5nIHN1YnRpdGxlKSB7Ci0gICAgICAgIHRoaXMuc3VidGl0bGUgPSBzdWJ0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0aG9yIGdldEF1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIGF1dGhvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRob3IoQXV0aG9yIGF1dGhvcikgewotICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKLSAgICB9Ci0KLSAgICBAR3JvdXBTZXF1ZW5jZSh2YWx1ZSA9IHtGaXJzdC5jbGFzcywgU2Vjb25kLmNsYXNzLCBMYXN0LmNsYXNzfSkKLSAgICBwdWJsaWMgaW50ZXJmYWNlIEFsbCB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0J1c2luZXNzQWRkcmVzcy5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQnVzaW5lc3NBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjEwNDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQnVzaW5lc3NBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJ1c2luZXNzQWRkcmVzcyBleHRlbmRzIEFkZHJlc3MgewotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBhbnk7Ci0KLSAgICBATm90TnVsbAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFueSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhbnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGFueShTdHJpbmcgY29tcGFueSkgewotICAgICAgICB0aGlzLmNvbXBhbnkgPSBjb21wYW55OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0NvbXBhbnlBZGRyZXNzLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9Db21wYW55QWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk3M2E2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0NvbXBhbnlBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Db21wYW55RW1haWw7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21wYW55QWRkcmVzcyB7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgQENvbXBhbnlFbWFpbAotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOwotCi0gICAgcHVibGljIENvbXBhbnlBZGRyZXNzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYW55QWRkcmVzcyhTdHJpbmcgZW1haWwpIHsKLSAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOwotICAgIH0KLQotICAgIC8vIGRvIG5vdCBwcm92aWRlZCBnZXR0ZXJzICYgc2V0dGVycyB0byB0ZXN0IHRoYXQgdmFsdWUgYWNjZXNzCi0gICAgLy8gb2YgY29tYmluZWQgY29uc3RyYWludHMgZGlyZWN0bHkgdXNlIHRoZSBwcml2YXRlIGZpZWxkICdlbWFpbCcKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0NvbnRpbmVudC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQ29udGluZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YmU1YzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQ29udGluZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIGNvbnRpbmVudCBoYXMgYSBuYW1lIGFuZCBhIHNldCBvZiB7QGxpbmsgQ291bnRyeX1zLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250aW5lbnQgewotCi0gICAgQE5vdE51bGwKLSAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgCi0gICAgQFZhbGlkCi0gICAgcHVibGljIFNldDxDb3VudHJ5PiBjb3VudHJpZXMgPSBuZXcgSGFzaFNldDxDb3VudHJ5PigpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQ291bnRyeS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQ291bnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI0MDhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0NvdW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotCi1wdWJsaWMgY2xhc3MgQ291bnRyeSB7Ci0gICAgQE5vdE51bGwKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIEBTaXplKG1heCA9IDIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgSVNPMkNvZGU7Ci0gICAgQFNpemUobWF4ID0gMykKLSAgICBwcml2YXRlIFN0cmluZyBJU08zQ29kZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SVNPMkNvZGUoKSB7Ci0gICAgICAgIHJldHVybiBJU08yQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJU08yQ29kZShTdHJpbmcgSVNPMkNvZGUpIHsKLSAgICAgICAgdGhpcy5JU08yQ29kZSA9IElTTzJDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SVNPM0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiBJU08zQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJU08zQ29kZShTdHJpbmcgSVNPM0NvZGUpIHsKLSAgICAgICAgdGhpcy5JU08zQ29kZSA9IElTTzNDb2RlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9DdXN0b21lci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvQ3VzdG9tZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3NGYxYy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9DdXN0b21lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5FbWFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuUGFzc3dvcmQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci0KLXB1YmxpYyBjbGFzcyBDdXN0b21lciBpbXBsZW1lbnRzIFBlcnNvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1pZGRsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7Ci0gICAgQE5vdE51bGwKLSAgICBwcml2YXRlIFN0cmluZyBjdXN0b21lcklkOwotICAgIEBQYXNzd29yZChyb2J1c3RuZXNzID0gNSkKLSAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKLQotICAgIEBFbWFpbAotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsQWRkcmVzczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZW1haWxBZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsQWRkcmVzcyhTdHJpbmcgZW1haWxBZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuZW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWlkZGxlTmFtZShTdHJpbmcgbWlkZGxlTmFtZSkgewotICAgICAgICB0aGlzLm1pZGRsZU5hbWUgPSBtaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbWVySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tZXJJZChTdHJpbmcgY3VzdG9tZXJJZCkgewotICAgICAgICB0aGlzLmN1c3RvbWVySWQgPSBjdXN0b21lcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9FbXBsb3llZS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvRW1wbG95ZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmZTAxZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9FbXBsb3llZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEVtcGxveWVlIGltcGxlbWVudHMgUGVyc29uIHsKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWUsIGxhc3ROYW1lOwotCi0gICAgcHVibGljIEVtcGxveWVlKFN0cmluZyBmaXJzdE4sIFN0cmluZyBsYXN0TikgewotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TjsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAvLyBub3Qgc3VwcG9ydGVkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgewotICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvRW5naW5lLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxY2IzZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9FbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgRW5naW5lIHsKLSAgICBAUGF0dGVybi5MaXN0KHsKLSAgICAgICAgQFBhdHRlcm4ocmVnZXhwID0gIl5bQS1aMC05LV0rJCIsIGZsYWdzID0gUGF0dGVybi5GbGFnLkNBU0VfSU5TRU5TSVRJVkUsCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJtdXN0IGNvbnRhaW4gYWxwaGFiZXRpY2FsIGNoYXJhY3RlcnMgb25seSIpLAotICAgICAgICBAUGF0dGVybigKLSAgICAgICAgICAgICAgICByZWdleHAgPSAiXi4uLi4tLi4uLi0uLi4uJCIsIG1lc3NhZ2UgPSAibXVzdCBtYXRjaCAuLi4uLS4uLi4tLi4uLiIpfSkKLSAgICBwdWJsaWMgU3RyaW5nIHNlcmlhbE51bWJlcjsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvRmlyc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0ZpcnN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjY4OGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvRmlyc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpcnN0IHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0ZyZW5jaEFkZHJlc3MuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0ZyZW5jaEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhNDY4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9GcmVuY2hBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5GcmVuY2haaXBDb2RlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgRnJlbmNoQWRkcmVzcyB7Ci0gICAgQEZyZW5jaFppcENvZGUoc2l6ZSA9IDcpCi0gICAgU3RyaW5nIHppcENvZGU7Ci0KLSAgICBwdWJsaWMgRnJlbmNoQWRkcmVzcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnJlbmNoQWRkcmVzcyhTdHJpbmcgemlwQ29kZSkgewotICAgICAgICB0aGlzLnppcENvZGUgPSB6aXBDb2RlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFppcENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB6aXBDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFppcENvZGUoU3RyaW5nIHppcENvZGUpIHsKLSAgICAgICAgdGhpcy56aXBDb2RlID0gemlwQ29kZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL0lsbHVzdHJhdGVkQm9vay5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvSWxsdXN0cmF0ZWRCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTkzYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvSWxsdXN0cmF0ZWRCb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLS8qKgotICogQWRkIGEgbm9uLWNhc2NhZGVkIGJlYW4gdG8gYSBib29rLgotICogCi0gKiBAdmVyc2lvbiAkUmV2OiAxMDA0NzY0ICQgJERhdGU6IDIwMTAtMTAtMDUgMTM6MzU6NDIgLTA1MDAgKFR1ZSwgMDUgT2N0IDIwMTApICQKLSAqLwotcHVibGljIGNsYXNzIElsbHVzdHJhdGVkQm9vayBleHRlbmRzIEJvb2sgewotICAgIHByaXZhdGUgUGVyc29uIGlsbHVzdHJhdG9yOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaWxsdXN0cmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc29uIGdldElsbHVzdHJhdG9yKCkgewotICAgICAgICByZXR1cm4gaWxsdXN0cmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlsbHVzdHJhdG9yCi0gICAgICogICAgICAgICAgICB0aGUgaWxsdXN0cmF0b3IgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWxsdXN0cmF0b3IoUGVyc29uIGlsbHVzdHJhdG9yKSB7Ci0gICAgICAgIHRoaXMuaWxsdXN0cmF0b3IgPSBpbGx1c3RyYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9MYXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9MYXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGE2MGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvTGFzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGFzdCB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9MaWJyYXJ5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9MaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDMzMDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnkgewotICAgIEBOb3ROdWxsCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlicmFyeU5hbWU7Ci0gICAgQFZhbGlkCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBCb29rPiB0YWdnZWRCb29rcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vaz4oKTsKLQotICAgIHByaXZhdGUgUGVyc29uW10gcGVyc29uczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsaWJyYXJ5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5TmFtZShTdHJpbmcgbGlicmFyeU5hbWUpIHsKLSAgICAgICAgdGhpcy5saWJyYXJ5TmFtZSA9IGxpYnJhcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBCb29rPiBnZXRUYWdnZWRCb29rcygpIHsKLSAgICAgICAgcmV0dXJuIHRhZ2dlZEJvb2tzOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb25bXSBnZXRQZXJzb25zKCkgewotICAgICAgICByZXR1cm4gcGVyc29uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb25zKFBlcnNvbltdIHBlcnNvbnMpIHsKLSAgICAgICAgdGhpcy5wZXJzb25zID0gcGVyc29uczsKLSAgICB9Ci0KLSAgICBAVmFsaWQKLSAgICBwdWJsaWMgTGlzdDxFbXBsb3llZT4gZ2V0RW1wbG95ZWVzKCkgewotICAgICAgICBpZiAocGVyc29ucyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgICAgIEFycmF5TGlzdDxFbXBsb3llZT4gZW1wcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KHBlcnNvbnMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChQZXJzb24gZWFjaCA6IHBlcnNvbnMpIHsKLSAgICAgICAgICAgIGlmIChlYWNoIGluc3RhbmNlb2YgRW1wbG95ZWUpCi0gICAgICAgICAgICAgICAgZW1wcy5hZGQoKEVtcGxveWVlKSBlYWNoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW1wczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9NYXhUZXN0RW50aXR5LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9NYXhUZXN0RW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjNmOTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvTWF4VGVzdEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4OwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgTWF4VGVzdEVudGl0eSB7Ci0gICAgQE1heCgxMDApCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLQotICAgIEBNYXgoMzAwKQotICAgIHByaXZhdGUgbG9uZyBsb25nVmFsdWU7Ci0KLSAgICBwcml2YXRlIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICBATWF4KDIwMCkKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gbG9uZ1ZhbHVlOwotICAgIH0KLQotICAgIEBNYXgoNDAwKQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldERlY2ltYWxWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlY2ltYWxWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyBsb25nVmFsdWUpIHsKLSAgICAgICAgdGhpcy5sb25nVmFsdWUgPSBsb25nVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZGVjaW1hbFZhbHVlID0gZGVjaW1hbFZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL05vVmFsaWRhdG9yVGVzdEVudGl0eS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvTm9WYWxpZGF0b3JUZXN0RW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmFjN2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvTm9WYWxpZGF0b3JUZXN0RW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1ZhbGlkYXRvclRlc3RFbnRpdHkgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIEBNYXgoMjApCi0gICAgcHJpdmF0ZSBPYmplY3QgYW55dGhpbmc7Ci0gICAgCi19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9QZXJzb24uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAxMmQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuTm90RW1wdHk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc29uIHsKLSAgICBATm90RW1wdHkKLSAgICBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCk7Ci0KLSAgICBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpOwotCi0gICAgQE5vdEVtcHR5Ci0gICAgU3RyaW5nIGdldExhc3ROYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvUHJlZmVycmVkR3Vlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1ByZWZlcnJlZEd1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOWYxMGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvUHJlZmVycmVkR3Vlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5EaWdpdHM7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmZXJyZWRHdWVzdCBleHRlbmRzIEN1c3RvbWVyIHsKLSAgICBARGlnaXRzKGludGVnZXIgPSAxMCwgZnJhY3Rpb24gPSAwKQotICAgIHByaXZhdGUgU3RyaW5nIGd1ZXN0Q3JlZGl0Q2FyZE51bWJlcjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3Vlc3RDcmVkaXRDYXJkTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gZ3Vlc3RDcmVkaXRDYXJkTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEd1ZXN0Q3JlZGl0Q2FyZE51bWJlcihTdHJpbmcgZ3Vlc3RDcmVkaXRDYXJkTnVtYmVyKSB7Ci0gICAgICAgIHRoaXMuZ3Vlc3RDcmVkaXRDYXJkTnVtYmVyID0gZ3Vlc3RDcmVkaXRDYXJkTnVtYmVyOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9SZWN1cnNpdmVGb28uamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1JlY3Vyc2l2ZUZvby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhhMmY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1JlY3Vyc2l2ZUZvby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3RFbXB0eTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZUZvbyB7Ci0gICAgQE5vdEVtcHR5Ci0gICAgQFZhbGlkCi0gICAgQ29sbGVjdGlvbjxSZWN1cnNpdmVGb28+IGZvb3MgPSBuZXcgQXJyYXlMaXN0PFJlY3Vyc2l2ZUZvbz4oKTsKLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFJlY3Vyc2l2ZUZvbz4gZ2V0Rm9vcygpIHsKLSAgICAgICAgcmV0dXJuIGZvb3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9vcyhDb2xsZWN0aW9uPFJlY3Vyc2l2ZUZvbz4gZm9vcykgewotICAgICAgICB0aGlzLmZvb3MgPSBmb29zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1NlY29uZC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvU2Vjb25kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2NiZWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvU2Vjb25kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZWNvbmQgewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvU2l6ZVRlc3RFbnRpdHkuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1NpemVUZXN0RW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTFmMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvU2l6ZVRlc3RFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIFNpemVUZXN0RW50aXR5IHsKLSAgICBAU2l6ZShtYXg9MikKLSAgICBwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IG1hcDsKLSAgICBAU2l6ZShtYXg9MikKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGw7Ci0gICAgQFNpemUobWF4PTIpCi0gICAgcHVibGljIFN0cmluZyB0ZXh0OwotCi0gICAgQFNpemUobWF4PTIpCi0gICAgcHVibGljIE9iamVjdFtdIG9hOwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBieXRlW10gYmE7Ci0gICAgQFNpemUobWF4PTIpCi0gICAgcHVibGljIGludFtdIGl0OwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBJbnRlZ2VyW10gb2EyOwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBib29sZWFuW10gYm9hOwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBjaGFyW10gY2E7Ci0gICAgQFNpemUobWF4PTIpCi0gICAgcHVibGljIGRvdWJsZVtdIGRhOwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBmbG9hdFtdIGZhOwotICAgIEBTaXplKG1heD0yKQotICAgIHB1YmxpYyBsb25nW10gbGE7Ci0gICAgQFNpemUobWF4PTIpCi0gICAgcHVibGljIHNob3J0W10gc2E7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9YbWxFbnRpdHlTYW1wbGVCZWFuLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXhhbXBsZS9YbWxFbnRpdHlTYW1wbGVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmVmYjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvWG1sRW50aXR5U2FtcGxlQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogYmVhbiB1c2VkIHRvIHRlc3QgY29uc3RyYWludHMgZGVzY3JpYmVkIGluIFhNTDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHlTYW1wbGVCZWFuIHsKLSAgICBwcml2YXRlIFN0cmluZyB6aXBDb2RlOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlQ29kZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WmlwQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHppcENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WmlwQ29kZShTdHJpbmcgemlwQ29kZSkgewotICAgICAgICB0aGlzLnppcENvZGUgPSB6aXBDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2RlKCkgewotICAgICAgICByZXR1cm4gdmFsdWVDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlQ29kZShTdHJpbmcgdmFsdWVDb2RlKSB7Ci0gICAgICAgIHRoaXMudmFsdWVDb2RlID0gdmFsdWVDb2RlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leGFtcGxlL1ppcENvZGVDaXR5Q2Fycmllci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvWmlwQ29kZUNpdHlDYXJyaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmFkYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4YW1wbGUvWmlwQ29kZUNpdHlDYXJyaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFppcENvZGVDaXR5Q2FycmllciB7Ci0gICAgU3RyaW5nIGdldFppcENvZGUoKTsKLSAgICBTdHJpbmcgZ2V0Q2l0eSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvRXhhbXBsZU1ldGhvZFNlcnZpY2UuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL0V4YW1wbGVNZXRob2RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTI0MzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2V4dGVuc2lvbnMvRXhhbXBsZU1ldGhvZFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4dGVuc2lvbnM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5Ob3RFbXB0eTsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGNsYXNzIHdpdGggYW5ub3RhdGVkIG1ldGhvZHMgdG8gZGVtb25zdHJhdGUKLSAqIG1ldGhvZC1sZXZlbC12YWxpZGF0aW9uPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVNZXRob2RTZXJ2aWNlIHsKLSAgICBwdWJsaWMgRXhhbXBsZU1ldGhvZFNlcnZpY2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEV4YW1wbGVNZXRob2RTZXJ2aWNlKEBOb3ROdWxsIEBOb3RFbXB0eSBTdHJpbmcgczEsIEBOb3ROdWxsIFN0cmluZyBzMikgewotICAgIH0KLQotICAgIEBOb3ROdWxsCi0gICAgQE5vdEVtcHR5Ci0gICAgcHVibGljIFN0cmluZyBjb25jYXQoQE5vdE51bGwgQE5vdEVtcHR5IFN0cmluZyBzMSwgQE5vdE51bGwgU3RyaW5nIHMyKSB7Ci0gICAgICAgIHJldHVybiBzMSArIHMyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlKEBQYXR0ZXJuKHJlZ2V4cD0iW2EtZjAtOV17NH0iKSBTdHJpbmcgZGF0YSkgewotICAgIAlyZXR1cm47Ci0gICAgfQotICAgIAotICAgIEBOb3ROdWxsCi0gICAgQFNpemUobWluPTMsbWF4PTEwKQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhATm90TnVsbCBAU2l6ZShtaW49MyxtYXg9MTApIFN0cmluZyBzdHIpIHsKLSAgICAJcmV0dXJuIHN0cjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcGVyc29uT3AxKEBWYWxpZCBQZXJzb24gcCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHBlcnNvbk9wMihATm90TnVsbCBAVmFsaWQgUGVyc29uIHApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7Ci0gICAgICAgIEBOb3ROdWxsCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZFZhbGlkYXRvckltcGxUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZXh0ZW5zaW9ucy9NZXRob2RWYWxpZGF0b3JJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIzM2E3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9leHRlbnNpb25zL01ldGhvZFZhbGlkYXRvckltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leHRlbnNpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXh0ZW5zaW9ucy5FeGFtcGxlTWV0aG9kU2VydmljZS5QZXJzb247Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWV0aG9kVmFsaWRhdG9ySW1wbCBUZXN0ZXIuCi0gKgotICogQGF1dGhvciA8QXV0aG9ycyBuYW1lPgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgPHByZT4xMS8xMS8yMDA5PC9wcmU+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLXB1YmxpYyBjbGFzcyBNZXRob2RWYWxpZGF0b3JJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgTWV0aG9kVmFsaWRhdG9ySW1wbFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShNZXRob2RWYWxpZGF0b3JJbXBsVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVud3JhcCgpIHsKLSAgICAgICAgVmFsaWRhdG9yIHYgPSBnZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgQ2xhc3NWYWxpZGF0b3IgY3YgPSB2LnVud3JhcChDbGFzc1ZhbGlkYXRvci5jbGFzcyk7Ci0gICAgICAgIGFzc2VydFRydWUodiA9PSBjdik7Ci0gICAgICAgIGFzc2VydFRydWUodiA9PSB2LnVud3JhcChWYWxpZGF0b3IuY2xhc3MpKTsKLSAgICAgICAgTWV0aG9kVmFsaWRhdG9ySW1wbCBtdmkgPSB2LnVud3JhcChNZXRob2RWYWxpZGF0b3JJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtdmkpOwotICAgICAgICBNZXRob2RWYWxpZGF0b3IgbXYgPSB2LnVud3JhcChNZXRob2RWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG12KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtdiA9PSBtdi51bndyYXAoTWV0aG9kVmFsaWRhdG9ySW1wbC5jbGFzcykpOwotICAgICAgICBhc3NlcnRUcnVlKG12ID09IG12LnVud3JhcChDbGFzc1ZhbGlkYXRvci5jbGFzcykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1ldGhvZFBhcmFtZXRlcnMoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgRXhhbXBsZU1ldGhvZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBFeGFtcGxlTWV0aG9kU2VydmljZSgpOwotICAgICAgICBNZXRob2RWYWxpZGF0b3IgbXYgPSBnZXRWYWxpZGF0b3IoKS51bndyYXAoTWV0aG9kVmFsaWRhdG9yLmNsYXNzKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9Ci0gICAgICAgICAgICAgIHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImNvbmNhdCIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSk7Ci0gICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIHBhcmFtc1swXSA9ICJIZWxsbyAiOwotICAgICAgICBwYXJhbXNbMV0gPSAid29ybGQiOwotICAgICAgICBTZXQgcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVycyhzZXJ2aWNlLmdldENsYXNzKCksIG1ldGhvZCwgcGFyYW1zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlc3VsdHMuaXNFbXB0eSgpKTsKLQotICAgICAgICBwYXJhbXNbMF0gPSAiIjsKLSAgICAgICAgcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVycyhzZXJ2aWNlLmdldENsYXNzKCksIG1ldGhvZCwgcGFyYW1zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdHMuc2l6ZSgpKTsKLQotICAgICAgICBwYXJhbXNbMV0gPSBudWxsOwotICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgbWV0aG9kLCBwYXJhbXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0cy5zaXplKCkpOwotCi0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcihzZXJ2aWNlLmdldENsYXNzKCksIG1ldGhvZCwgIHBhcmFtc1swXSwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRzLnNpemUoKSk7Ci0KLSAgICAgICAgcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVyKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgbWV0aG9kLCAgIm9rIiwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHRzLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1vcmVNZXRob2RQYXJhbWV0ZXJzKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0gICAgCQotICAgIAlFeGFtcGxlTWV0aG9kU2VydmljZSBzZXJ2aWNlID0gbmV3IEV4YW1wbGVNZXRob2RTZXJ2aWNlKCk7Ci0gICAgCU1ldGhvZFZhbGlkYXRvciBtdiA9IGdldFZhbGlkYXRvcigpLnVud3JhcChNZXRob2RWYWxpZGF0b3IuY2xhc3MpOwotICAgIAlNZXRob2Qgc2F2ZU1ldGhvZCA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNhdmUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLSAgICAJCi0gICAgCVN0cmluZ1tdIHNhdmVQYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotICAgIAlzYXZlUGFyYW1zWzBdID0gImFiY2QiOwotICAgIAkKLSAgICAJU2V0IHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBzYXZlTWV0aG9kLCBzYXZlUGFyYW1zKTsKLSAgICAJYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgCQotICAgIAlzYXZlUGFyYW1zWzBdID0gInp6enoiOwotICAgIAlyZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgc2F2ZU1ldGhvZCwgc2F2ZVBhcmFtcyk7Ci0gICAgCWFzc2VydEVxdWFscygxLCByZXN1bHRzLnNpemUoKSk7Ci0gICAgCQotICAgIAlNZXRob2QgZWNob01ldGhvZCA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImVjaG8iLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLSAgICAJCi0gICAgCVN0cmluZ1tdIGVjaG9QYXJhbXMgPSBuZXcgU3RyaW5nWzFdOwotICAgIAllY2hvUGFyYW1zWzBdID0gImhlbGxvIjsKLSAgICAJCi0gICAgCXJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBlY2hvTWV0aG9kLCBlY2hvUGFyYW1zKTsKLSAgICAJYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgCQotICAgIAllY2hvUGFyYW1zWzBdID0gImgiOwotICAgIAlyZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgZWNob01ldGhvZCwgZWNob1BhcmFtcyk7Ci0gICAgCWFzc2VydEVxdWFscygxLCByZXN1bHRzLnNpemUoKSk7Ci0gICAgCQotICAgIAllY2hvUGFyYW1zWzBdID0gbnVsbDsKLSAgICAJcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVycyhzZXJ2aWNlLmdldENsYXNzKCksIGVjaG9NZXRob2QsIGVjaG9QYXJhbXMpOwotICAgIAlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwotICAgIAkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVDb25zdHJ1Y3RvclBhcmFtZXRlcnMoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgRXhhbXBsZU1ldGhvZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBFeGFtcGxlTWV0aG9kU2VydmljZSgpOwotICAgICAgICBNZXRob2RWYWxpZGF0b3IgbXYgPSBnZXRWYWxpZGF0b3IoKS51bndyYXAoTWV0aG9kVmFsaWRhdG9yLmNsYXNzKTsKLSAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPQotICAgICAgICAgICAgICBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICBwYXJhbXNbMF0gPSAiSGVsbG8gIjsKLSAgICAgICAgcGFyYW1zWzFdID0gIndvcmxkIjsKLSAgICAgICAgU2V0IHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBjb25zdHJ1Y3RvciwgcGFyYW1zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlc3VsdHMuaXNFbXB0eSgpKTsKLQotICAgICAgICBwYXJhbXNbMF0gPSAiIjsKLSAgICAgICAgcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVycyhzZXJ2aWNlLmdldENsYXNzKCksIGNvbnN0cnVjdG9yLCBwYXJhbXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwotCi0gICAgICAgIHBhcmFtc1sxXSA9IG51bGw7Ci0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBjb25zdHJ1Y3RvciwgcGFyYW1zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdHMuc2l6ZSgpKTsKLQotICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXIoc2VydmljZS5nZXRDbGFzcygpLCBjb25zdHJ1Y3RvciwgIHBhcmFtc1swXSwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRzLnNpemUoKSk7Ci0KLSAgICAgICAgcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVyKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgY29uc3RydWN0b3IsICAib2siLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdHMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVSZXR1cm5WYWx1ZSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICBFeGFtcGxlTWV0aG9kU2VydmljZSBzZXJ2aWNlID0gbmV3IEV4YW1wbGVNZXRob2RTZXJ2aWNlKCk7Ci0gICAgICAgIE1ldGhvZFZhbGlkYXRvciBtdiA9IGdldFZhbGlkYXRvcigpLnVud3JhcChNZXRob2RWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICBNZXRob2QgbWV0aG9kID0KLSAgICAgICAgICAgICAgc2VydmljZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiY29uY2F0IiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKLSAgICAgICAgU2V0IHJlc3VsdHM7Ci0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVJldHVybmVkVmFsdWUoc2VydmljZS5nZXRDbGFzcygpLCBtZXRob2QsICJ0ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXN1bHRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgcmVzdWx0cyA9IG12LnZhbGlkYXRlUmV0dXJuZWRWYWx1ZShzZXJ2aWNlLmdldENsYXNzKCksIG1ldGhvZCwgIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVNb3JlUmV0dXJuVmFsdWUoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAJRXhhbXBsZU1ldGhvZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBFeGFtcGxlTWV0aG9kU2VydmljZSgpOwotICAgIAlNZXRob2RWYWxpZGF0b3IgbXYgPSBnZXRWYWxpZGF0b3IoKS51bndyYXAoTWV0aG9kVmFsaWRhdG9yLmNsYXNzKTsKLSAgICAJTWV0aG9kIGVjaG9NZXRob2QgPSBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJlY2hvIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0gICAgCQotICAgIAlTdHJpbmcgcmV0dXJuZWRWYWx1ZSA9ICJhIHRvbyBsb25nIHN0cmluZyI7Ci0gICAgCVNldCByZXN1bHRzID0gbXYudmFsaWRhdGVSZXR1cm5lZFZhbHVlKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgZWNob01ldGhvZCwgcmV0dXJuZWRWYWx1ZSk7Ci0gICAgCWFzc2VydEVxdWFscygxLCByZXN1bHRzLnNpemUoKSk7Ci0gICAgCQotICAgIAlyZXR1cm5lZFZhbHVlID0gbnVsbDsKLSAgICAJcmVzdWx0cyA9IG12LnZhbGlkYXRlUmV0dXJuZWRWYWx1ZShzZXJ2aWNlLmdldENsYXNzKCksIGVjaG9NZXRob2QsIHJldHVybmVkVmFsdWUpOwotICAgIAlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwotICAgIAkKLSAgICAJcmV0dXJuZWRWYWx1ZSA9ICJ2YWxpZCI7Ci0gICAgCXJlc3VsdHMgPSBtdi52YWxpZGF0ZVJldHVybmVkVmFsdWUoc2VydmljZS5nZXRDbGFzcygpLCBlY2hvTWV0aG9kLCByZXR1cm5lZFZhbHVlKTsKLSAgICAJYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVZhbGlkUGFyYW0oKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgRXhhbXBsZU1ldGhvZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBFeGFtcGxlTWV0aG9kU2VydmljZSgpOwotICAgICAgICBNZXRob2RWYWxpZGF0b3IgbXYgPSBnZXRWYWxpZGF0b3IoKS51bndyYXAoTWV0aG9kVmFsaWRhdG9yLmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIE1ldGhvZCBwZXJzb25PcDEgPSBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJwZXJzb25PcDEiLCBuZXcgQ2xhc3NbXXtQZXJzb24uY2xhc3N9KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZhbGlkYXRlIHdpdGggaW52YWxpZCBwZXJzb24KLSAgICAgICAgUGVyc29uIHAgPSBuZXcgRXhhbXBsZU1ldGhvZFNlcnZpY2UuUGVyc29uKCk7Ci0gICAgICAgIFNldDw/PiByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgcGVyc29uT3AxLCBuZXcgT2JqZWN0W117cH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIDEgdmlvbGF0aW9uIiwgMSwgcmVzdWx0cy5zaXplKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gdmFsaWRhdGUgd2l0aCB2YWxpZCBwZXJzb24KLSAgICAgICAgcC5uYW1lID0gInZhbGlkIG5hbWUiOwotICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgcGVyc29uT3AxLCBuZXcgT2JqZWN0W117cH0pOwotICAgICAgICBhc3NlcnRUcnVlKCJObyB2aW9sYXRpb25zIGV4cGVjdGVkIiwgcmVzdWx0cy5pc0VtcHR5KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gdmFsaWRhdGUgd2l0aCBudWxsIHBlcnNvbgotICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHNlcnZpY2UuZ2V0Q2xhc3MoKSwgcGVyc29uT3AxLCBuZXcgT2JqZWN0W117bnVsbH0pOwotICAgICAgICBhc3NlcnRUcnVlKCJObyB2aW9sYXRpb25zIGV4cGVjdGVkIiwgcmVzdWx0cy5pc0VtcHR5KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOb3ROdWxsVmFsaWRQYXJhbSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICBFeGFtcGxlTWV0aG9kU2VydmljZSBzZXJ2aWNlID0gbmV3IEV4YW1wbGVNZXRob2RTZXJ2aWNlKCk7Ci0gICAgICAgIE1ldGhvZFZhbGlkYXRvciBtdiA9IGdldFZhbGlkYXRvcigpLnVud3JhcChNZXRob2RWYWxpZGF0b3IuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kIHBlcnNvbk9wMiA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInBlcnNvbk9wMiIsIG5ldyBDbGFzc1tde1BlcnNvbi5jbGFzc30pOwotICAgICAgICAKLSAgICAgICAgLy8gVmFsaWRhdGUgd2l0aCBudWxsIHBlcnNvbgotICAgICAgICBTZXQ8Pz4gcmVzdWx0cyA9IG12LnZhbGlkYXRlUGFyYW1ldGVycyhzZXJ2aWNlLmdldENsYXNzKCksIHBlcnNvbk9wMiwgbmV3IE9iamVjdFtde251bGx9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCAxIHZpb2xhdGlvbiIsIDEsIHJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZhbGlkYXRlIHdpdGggaW52YWxpZCBwZXJzb24KLSAgICAgICAgUGVyc29uIHAgPSBuZXcgRXhhbXBsZU1ldGhvZFNlcnZpY2UuUGVyc29uKCk7Ci0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBwZXJzb25PcDIsIG5ldyBPYmplY3RbXXtwfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgMSB2aW9sYXRpb24iLCAxLCByZXN1bHRzLnNpemUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyB2YWxpZGF0ZSB3aXRoIHZhbGlkIHBlcnNvbgotICAgICAgICBwLm5hbWUgPSAidmFsaWQgbmFtZSI7Ci0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoc2VydmljZS5nZXRDbGFzcygpLCBwZXJzb25PcDIsIG5ldyBPYmplY3RbXXtwfSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk5vIHZpb2xhdGlvbnMgZXhwZWN0ZWQiLCByZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIGEgbWV0aG9kIGRlZmluZWQgaW4gYW4gaW50ZXJmYWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgotICAgICAqIDx1bD4KLSAgICAgKiAgPGxpPmltcGwuY2xhc3MgKyBpbXBsLm1ldGhvZDwvbGk+Ci0gICAgICogIDxsaT5pbnRlcmZhY2UuY2xhc3MgKyBpbnRlcmZhY2UubWV0aG9kPC9saT4KLSAgICAgKiAgPGxpPmltcGwuY2xhc3MgKyBpbnRlcmZhY2UubWV0aG9kPC9saT4KLSAgICAgKiAgPGxpPmludGVyZmFjZS5jbGFzcyArIGltcGwubWV0aG9kPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUltcGxlbWVudGVkTWV0aG9kKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVzZXJNZXRob2RzSW1wbCB1bSA9IG5ldyBVc2VyTWV0aG9kc0ltcGwoKTsKLSAgICAgICAgTWV0aG9kVmFsaWRhdG9yIG12ID0gZ2V0VmFsaWRhdG9yKCkudW53cmFwKE1ldGhvZFZhbGlkYXRvci5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2QgY2xhc3NNZXRob2QgPSB1bS5nZXRDbGFzcygpLmdldE1ldGhvZCgiZmluZFVzZXIiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgSW50ZWdlci5jbGFzc30pOwotICAgICAgICBNZXRob2QgaWZhY2VNZXRob2QgPSBVc2VyTWV0aG9kcy5jbGFzcy5nZXRNZXRob2QoImZpbmRVc2VyIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIEludGVnZXIuY2xhc3N9KTsKLSAgICAgICAgCi0gICAgICAgIFNldDw/PiByZXN1bHRzOwotICAgICAgICAKLSAgICAgICAgLy8gVmFsaWRhdGUgZnJvbSBjbGFzcyAoc2hvdWxkIGNyZWF0ZSB2aW9sYXRpb25zKQotICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKHVtLmdldENsYXNzKCksIGNsYXNzTWV0aG9kLCBuZXcgT2JqZWN0W117IiIsICJ2YWxpZCIsIG51bGwgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBudW1iZXIgb2YgdmlvbGF0aW9ucyIsIDIsIHJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZhbGlkYXRlIGZyb20gaW50ZXJmYWNlCi0gICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnMoVXNlck1ldGhvZHMuY2xhc3MsIGlmYWNlTWV0aG9kLCBuZXcgT2JqZWN0W117IiIsICJ2YWxpZCIsIG51bGwgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBudW1iZXIgb2YgdmlvbGF0aW9ucyIsIDAsIHJlc3VsdHMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEludmFsaWQgY29tYmluYXRpb25zCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHRzID0gbXYudmFsaWRhdGVQYXJhbWV0ZXJzKFVzZXJNZXRob2RzLmNsYXNzLCBjbGFzc01ldGhvZCwgbmV3IE9iamVjdFtdeyIiLCAidmFsaWQiLCBudWxsIH0pOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBub3QgdGhyb3duIHdoZW4gdmFsaWRhdGluZyBpbnRlcmZhY2UuY2xhc3MgKyBpbXBsLm1ldGhvZCIpOwotICAgICAgICB9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdHMgPSBtdi52YWxpZGF0ZVBhcmFtZXRlcnModW0uZ2V0Q2xhc3MoKSwgaWZhY2VNZXRob2QsIG5ldyBPYmplY3RbXXsiIiwgInZhbGlkIiwgbnVsbCB9KTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gbm90IHRocm93biB3aGVuIHZhbGlkYXRpbmcgaW1wbC5jbGFzcyArIGludGVyZmFjZS5tZXRob2QiKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBVc2VyTWV0aG9kcyB7Ci0gICAgICAgIHZvaWQgZmluZFVzZXIoU3RyaW5nIHBhcmFtMSwgU3RyaW5nIHBhcmFtMiwgSW50ZWdlciBwYXJhbTMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVzZXJNZXRob2RzSW1wbCBpbXBsZW1lbnRzIFVzZXJNZXRob2RzIHsKLSAgICAgICAgLy8gQE92ZXJyaWRlIC0gbm90IGFsbG93ZWQgaW4gMS41IGZvciBJbnRlcmZhY2UgbWV0aG9kcwotICAgICAgICBwdWJsaWMgdm9pZCBmaW5kVXNlciggQFNpemUoIG1pbj0xICkgU3RyaW5nIHBhcmFtMSwgQE5vdE51bGwgU3RyaW5nIHBhcmFtMiwgQE5vdE51bGwgSW50ZWdlciBwYXJhbTMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gVmFsaWRhdGlvbgotICAgICAgICAgICAgLmJ5UHJvdmlkZXIoQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKQotICAgICAgICAgICAgLmNvbmZpZ3VyZSgpCi0gICAgICAgICAgICAuYWRkUHJvcGVydHkoQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbi5Qcm9wZXJ0aWVzLk1FVEFCRUFOX0ZBQ1RPUllfQ0xBU1NOQU1FUywKLSAgICAgICAgICAgICAgICBNZXRob2RWYWxpZGF0b3JNZXRhQmVhbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKS5idWlsZFZhbGlkYXRvckZhY3RvcnkoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0JpbGxhYmxlLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0JpbGxhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjhmYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9CaWxsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzOwotCi0vKioKLSAqIFZhbGlkYXRpb24gZ3JvdXAgY2hlY2tpbmcgYSB1c2VyIGlzIGJpbGxhYmxlLgotICogRXhhbXBsZSAzLjEuIERlZmluaXRpb24gb2YgZ3JvdXBzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlsbGFibGUgewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9CaWxsYWJsZUNyZWRpdENhcmQuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvQmlsbGFibGVDcmVkaXRDYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmViYWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9CaWxsYWJsZUNyZWRpdENhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotLyoqCi0gKiBFeGFtcGxlIDMuMi4gQXNzaWduIGdyb3VwcyB0byBjb25zdHJhaW50cy4KLSAqLwotcHVibGljIGNsYXNzIEJpbGxhYmxlQ3JlZGl0Q2FyZCB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0JpbGxhYmxlVXNlci5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9CaWxsYWJsZVVzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmM2U1Ny4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0JpbGxhYmxlVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7Ci0KLS8qKgotICogVXNlciByZXByZXNlbnRhdGlvbgotICogRXhhbXBsZSAzLjIuIEFzc2lnbiBncm91cHMgdG8gY29uc3RyYWludHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCaWxsYWJsZVVzZXIgewotICAgIEBOb3ROdWxsCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3RuYW1lOwotCi0gICAgQE5vdE51bGwoZ3JvdXBzID0gRGVmYXVsdC5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0bmFtZTsKLQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IHtCaWxsYWJsZS5jbGFzcywgQnV5SW5PbmVDbGljay5jbGFzc30pCi0gICAgcHJpdmF0ZSBCaWxsYWJsZUNyZWRpdENhcmQgZGVmYXVsdENyZWRpdENhcmQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0bmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0bmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdG5hbWUoU3RyaW5nIGZpcnN0bmFtZSkgewotICAgICAgICB0aGlzLmZpcnN0bmFtZSA9IGZpcnN0bmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RuYW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdG5hbWUoU3RyaW5nIGxhc3RuYW1lKSB7Ci0gICAgICAgIHRoaXMubGFzdG5hbWUgPSBsYXN0bmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlsbGFibGVDcmVkaXRDYXJkIGdldERlZmF1bHRDcmVkaXRDYXJkKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdENyZWRpdENhcmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdENyZWRpdENhcmQoQmlsbGFibGVDcmVkaXRDYXJkIGRlZmF1bHRDcmVkaXRDYXJkKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdENyZWRpdENhcmQgPSBkZWZhdWx0Q3JlZGl0Q2FyZDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9CdXlJbk9uZUNsaWNrLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0J1eUluT25lQ2xpY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1MzZiZi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0J1eUluT25lQ2xpY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotLyoqCi0gKiBjdXN0b21lciBjYW4gYnV5IHdpdGhvdXQgYW55IGhhcnJhc3NpbmcgY2hlY2tpbmcgcHJvY2Vzcy4KLSAqIEV4YW1wbGUgMy4xLiBEZWZpbml0aW9uIG9mIGdyb3VwcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1eUluT25lQ2xpY2sgewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9Db2xsZWN0aW9uVmFsaWRhdGlvblRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvQ29sbGVjdGlvblZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTZkZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9Db2xsZWN0aW9uVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5EZWZhdWx0TWVzc2FnZUludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuQXV0aG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5Cb29rOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5Db3VudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5DdXN0b21lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuRW1wbG95ZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLlBlcnNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnV0aWwuVGVzdFV0aWxzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblZhbGlkYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpIGZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRvciBpbnN0YW5jZSB0byB0ZXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2YWxpZGF0b3IgaW5zdGFuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBWYWxpZGF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTGlzdCgpIHsKLSAgICAgICAgQXV0aG9yIGF1dGhvciA9IG5ldyBBdXRob3IoKTsKLSAgICAgICAgYXV0aG9yLnNldEZpcnN0TmFtZSgiUGV0ZXIiKTsKLSAgICAgICAgYXV0aG9yLnNldExhc3ROYW1lKCJGb3JkIik7Ci0gICAgICAgIGF1dGhvci5zZXRDb21wYW55KCJJQk0iKTsKLSAgICAgICAgYXV0aG9yLnNldEFkZHJlc3NlcyhuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KCkpOwotCi0gICAgICAgIEFkZHJlc3MgYWRyMSwgYWRyMiwgYWRyMzsKLSAgICAgICAgYWRyMSA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIGFkcjEuc2V0Q291bnRyeShuZXcgQ291bnRyeSgpKTsKLSAgICAgICAgYWRyMS5nZXRDb3VudHJ5KCkuc2V0TmFtZSgiR2VybWFueSIpOwotICAgICAgICBhZHIxLnNldENpdHkoIkJvbm4iKTsKLSAgICAgICAgYWRyMS5zZXRBZGRyZXNzbGluZTEoIlN0cmFzc2UgMSIpOwotCi0gICAgICAgIGFkcjIgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBhZHIyLnNldENvdW50cnkobmV3IENvdW50cnkoKSk7Ci0gICAgICAgIGFkcjIuZ2V0Q291bnRyeSgpLnNldE5hbWUoIkN1YmEiKTsKLSAgICAgICAgYWRyMi5zZXRDaXR5KCJIYWJhbmEiKTsKLSAgICAgICAgYWRyMi5zZXRBZGRyZXNzbGluZTEoIkNhbGxlIDIiKTsKLQotICAgICAgICBhZHIzID0gbmV3IEFkZHJlc3MoKTsKLSAgICAgICAgYWRyMy5zZXRDb3VudHJ5KG5ldyBDb3VudHJ5KCkpOwotICAgICAgICBhZHIzLmdldENvdW50cnkoKS5zZXROYW1lKCJVU0EiKTsKLSAgICAgICAgYWRyMy5zZXRDaXR5KCJTYW4gRnJhbmNpc2NvIik7Ci0gICAgICAgIGFkcjMuc2V0QWRkcmVzc2xpbmUxKCJTdHJlZXQgMyIpOwotCi0gICAgICAgIGF1dGhvci5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyMSk7Ci0gICAgICAgIGF1dGhvci5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyMik7Ci0gICAgICAgIGF1dGhvci5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyMyk7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248QXV0aG9yPj4gdmlvbGF0aW9uczsKLQotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGF1dGhvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0KLSAgICAgICAgYWRyMi5zZXRDaXR5KG51bGwpOyAvLyB2aW9sYXRlIG5vdCBudWxsCi0gICAgICAgIGFkcjMuc2V0QWRkcmVzc2xpbmUxKG51bGwpOyAvLyB2aW9sYXRlIG5vdCBudWxsCi0KLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShhdXRob3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImFkZHJlc3Nlc1sxXS5jaXR5IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImFkZHJlc3Nlc1syXS5hZGRyZXNzbGluZTEiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTWFwQW5kUmVkZWZpbmVkRGVmYXVsdEdyb3VwT25Ob25Sb290QmVhbigpIHsKLSAgICAgICAgTGlicmFyeSBsaWIgPSBuZXcgTGlicmFyeSgpOwotICAgICAgICBsaWIuc2V0TGlicmFyeU5hbWUoIkxlaWJuaXR6IEJpYmxpb3RoZWsiKTsKLQotICAgICAgICBCb29rIGJvb2sxLCBib29rMiwgYm9vazM7Ci0KLSAgICAgICAgYm9vazEgPSBuZXcgQm9vaygpOwotICAgICAgICBib29rMS5zZXRUaXRsZSgiSGlzdG9yeSBvZiB0aW1lIik7Ci0gICAgICAgIGJvb2sxLnNldFN1YnRpdGxlKCJIb3cgaXQgcmVhbGx5IHdvcmtzIik7Ci0gICAgICAgIEF1dGhvciBoYXdraW5nID0gbmV3IEF1dGhvcigpOwotICAgICAgICBoYXdraW5nLnNldEZpcnN0TmFtZSgiU3RlcGhlbiIpOwotICAgICAgICBoYXdraW5nLnNldEZpcnN0TmFtZSgiSGF3a2luZyIpOwotICAgICAgICBoYXdraW5nLnNldEFkZHJlc3NlcyhuZXcgQXJyYXlMaXN0PEFkZHJlc3M+KDEpKTsKLSAgICAgICAgQWRkcmVzcyBhZHIgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBhZHIuc2V0QWRkcmVzc2xpbmUxKCJTdHJlZXQgMSIpOwotICAgICAgICBhZHIuc2V0Q2l0eSgiTG9uZG9uIik7Ci0gICAgICAgIGFkci5zZXRDb3VudHJ5KG5ldyBDb3VudHJ5KCkpOwotICAgICAgICBhZHIuZ2V0Q291bnRyeSgpLnNldE5hbWUoIkVuZ2xhbmQiKTsKLSAgICAgICAgaGF3a2luZy5nZXRBZGRyZXNzZXMoKS5hZGQoYWRyKTsKLSAgICAgICAgYm9vazEuc2V0QXV0aG9yKGhhd2tpbmcpOwotCi0gICAgICAgIGJvb2syID0gbmV3IEJvb2soKTsKLSAgICAgICAgQXV0aG9yIGNhc3RybyA9IG5ldyBBdXRob3IoKTsKLSAgICAgICAgY2FzdHJvLnNldEZpcnN0TmFtZSgiRmlkZWwiKTsKLSAgICAgICAgY2FzdHJvLnNldExhc3ROYW1lKCJDYXN0cm8gUnV6Iik7Ci0gICAgICAgIGJvb2syLnNldEF1dGhvcihjYXN0cm8pOwotICAgICAgICBib29rMi5zZXRUaXRsZSgiTXkgbGlmZSIpOwotCi0gICAgICAgIGJvb2szID0gbmV3IEJvb2soKTsKLSAgICAgICAgYm9vazMuc2V0VGl0bGUoIldvcmxkIGJlc3Qgam9rZXMiKTsKLSAgICAgICAgQXV0aG9yIHNvbWVvbmUgPSBuZXcgQXV0aG9yKCk7Ci0gICAgICAgIHNvbWVvbmUuc2V0Rmlyc3ROYW1lKCJKb2huIik7Ci0gICAgICAgIHNvbWVvbmUuc2V0TGFzdE5hbWUoIkRvIik7Ci0gICAgICAgIGJvb2szLnNldEF1dGhvcihzb21lb25lKTsKLQotICAgICAgICBsaWIuZ2V0VGFnZ2VkQm9va3MoKS5wdXQoInNjaWVuY2UiLCBib29rMSk7Ci0gICAgICAgIGxpYi5nZXRUYWdnZWRCb29rcygpLnB1dCgicG9saXRpY3MiLCBib29rMik7Ci0gICAgICAgIGxpYi5nZXRUYWdnZWRCb29rcygpLnB1dCgiaHVtb3IiLCBib29rMyk7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248TGlicmFyeT4+IHZpb2xhdGlvbnM7Ci0KLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShsaWIpOwotICAgICAgICBhc3NlcnRUcnVlKHZpb2xhdGlvbnMuaXNFbXB0eSgpKTsKLQotICAgICAgICBib29rMi5zZXRUaXRsZShudWxsKTsKLSAgICAgICAgYm9vazMuZ2V0QXV0aG9yKCkuc2V0Rmlyc3ROYW1lKCIiKTsgLy8gdmlvbGF0ZSBOb3RFbXB0eSB2YWxpZGF0aW9uCi0gICAgICAgIGJvb2sxLmdldEF1dGhvcigpLmdldEFkZHJlc3NlcygpLmdldCgwKS5zZXRDaXR5KG51bGwpOwotICAgICAgICAvKgotICAgICAgICAgKiBUaGlzLCBieSB0aGUgd2F5LCB0ZXN0cyByZWRlZmluZWQgZGVmYXVsdCBncm91cCBzZXF1ZW5jZSBiZWhhdmlvciBvbgotICAgICAgICAgKiBub24tcm9vdC1iZWFucyAoTGlicmFyeS5Cb29rKSEhCi0gICAgICAgICAqLwotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGxpYik7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVkZWZpbmVkIGRlZmF1bHQgZ3JvdXAgb2YgQm9vayBub3QgY29ycmVjdGx5IHZhbGlkYXRlZCBmcm9tIExpYnJhcnkiLCAzLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAidGFnZ2VkQm9va3NbcG9saXRpY3NdLnRpdGxlIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgInRhZ2dlZEJvb2tzW2h1bW9yXS5hdXRob3IuZmlyc3ROYW1lIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgInRhZ2dlZEJvb2tzW3NjaWVuY2VdLmF1dGhvci5hZGRyZXNzZXNbMF0uY2l0eSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBcnJheSgpIHsKLSAgICAgICAgTGlicmFyeSBsaWIgPSBuZXcgTGlicmFyeSgpOwotICAgICAgICBsaWIuc2V0TGlicmFyeU5hbWUoIlVuaWJpYmxpb3RoZWsiKTsKLSAgICAgICAgbGliLnNldFBlcnNvbnMobmV3IFBlcnNvblszXSk7Ci0gICAgICAgIGxpYi5nZXRQZXJzb25zKClbMF0gPSBuZXcgRW1wbG95ZWUoIk1hcmNlbCIsICJSZWljaC1SYW5pY2tpIik7Ci0gICAgICAgIGxpYi5nZXRQZXJzb25zKClbMV0gPSBuZXcgRW1wbG95ZWUoIkVsa2UiLCAiSGVpZGVucmVpY2giKTsKLSAgICAgICAgbGliLmdldFBlcnNvbnMoKVsyXSA9IG5ldyBDdXN0b21lcigpOyAvLyBub3QgdmFsaWRhdGVkLCBiZWNhdXNlIG9ubHkKLSAgICAgICAgLy8gZ2V0RW1wbG95ZWVzKCkgaXMgQFZhbGlkCi0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248TGlicmFyeT4+IHZpb2xhdGlvbnM7Ci0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobGliKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2aW9sYXRpb25zLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgKChFbXBsb3llZSkgbGliLmdldFBlcnNvbnMoKVsxXSkuc2V0Rmlyc3ROYW1lKCIiKTsgLy8gdmlvbGF0ZSBOb3RFbXB0eQotICAgICAgICAvLyBjb25zdHJhaW50Ci0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUobGliKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJlbXBsb3llZXNbMV0uZmlyc3ROYW1lIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvQ3ljbGljR3JvdXBTZXF1ZW5jZS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9DeWNsaWNHcm91cFNlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmEyYmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9DeWNsaWNHcm91cFNlcXVlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cFNlcXVlbmNlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1AR3JvdXBTZXF1ZW5jZSh2YWx1ZSA9IEN5Y2xpY0dyb3VwU2VxdWVuY2UuY2xhc3MpCi1wdWJsaWMgaW50ZXJmYWNlIEN5Y2xpY0dyb3VwU2VxdWVuY2UgewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9DeWNsaWNHcm91cFNlcXVlbmNlMS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9DeWNsaWNHcm91cFNlcXVlbmNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc2YWFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvQ3ljbGljR3JvdXBTZXF1ZW5jZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2U7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBHcm91cFNlcXVlbmNlKHZhbHVlID0gQ3ljbGljR3JvdXBTZXF1ZW5jZTIuY2xhc3MpCi1wdWJsaWMgaW50ZXJmYWNlIEN5Y2xpY0dyb3VwU2VxdWVuY2UxIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0N5Y2xpY0dyb3VwU2VxdWVuY2UyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0N5Y2xpY0dyb3VwU2VxdWVuY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDJkMzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9DeWNsaWNHcm91cFNlcXVlbmNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotQEdyb3VwU2VxdWVuY2UoIHZhbHVlID0gQ3ljbGljR3JvdXBTZXF1ZW5jZTEuY2xhc3MpCi1wdWJsaWMgaW50ZXJmYWNlIEN5Y2xpY0dyb3VwU2VxdWVuY2UyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9EZWZhdWx0R3JvdXBTZXF1ZW5jZVRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvRGVmYXVsdEdyb3VwU2VxdWVuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTk1YWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9EZWZhdWx0R3JvdXBTZXF1ZW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cERlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBhdXRob3IgSGFyZHkgRmVyZW50c2NoaWsKLSAqIEBhdXRob3IgUm9tYW4gU3R1bW0KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRHcm91cFNlcXVlbmNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGVXaXRoRGVmYXVsdEF0RW5kT2ZTZXF1ZW5jZSgpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgZHVtbXkgc2VxdWVuY2UKLSAgICAgICAgR3JvdXAgYSA9IG5ldyBHcm91cChHcm91cEEuY2xhc3MpOwotICAgICAgICBHcm91cCBiID0gbmV3IEdyb3VwKEdyb3VwQi5jbGFzcyk7Ci0gICAgICAgIEdyb3VwIGMgPSBuZXcgR3JvdXAoR3JvdXBDLmNsYXNzKTsKLSAgICAgICAgR3JvdXAgZGVmYXVsdEdyb3VwID0gbmV3IEdyb3VwKERlZmF1bHQuY2xhc3MpOwotICAgICAgICBMaXN0PEdyb3VwPiBzZXF1ZW5jZSA9IG5ldyBBcnJheUxpc3Q8R3JvdXA+KCk7Ci0gICAgICAgIHNlcXVlbmNlLmFkZChhKTsKLSAgICAgICAgc2VxdWVuY2UuYWRkKGIpOwotICAgICAgICBzZXF1ZW5jZS5hZGQoYyk7Ci0gICAgICAgIHNlcXVlbmNlLmFkZChkZWZhdWx0R3JvdXApOwotCi0gICAgICAgIEdyb3VwcyBjaGFpbiA9IG5ldyBHcm91cHMoKTsKLSAgICAgICAgY2hhaW4uaW5zZXJ0U2VxdWVuY2Uoc2VxdWVuY2UpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0ZXN0IGRlZmF1bHQgc2VxdWVuY2UKLSAgICAgICAgTGlzdDxHcm91cD4gZGVmYXVsdFNlcXVlbmNlID0gbmV3IEFycmF5TGlzdDxHcm91cD4oKTsKLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmFkZChHcm91cC5ERUZBVUxUKTsKLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmFkZChuZXcgR3JvdXAoR3JvdXBBLmNsYXNzKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFpbi5hc3NlcnREZWZhdWx0R3JvdXBTZXF1ZW5jZUlzRXhwYW5kYWJsZShkZWZhdWx0U2VxdWVuY2UpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChHcm91cERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmNsZWFyKCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQobmV3IEdyb3VwKEdyb3VwQS5jbGFzcykpOwotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuYWRkKG5ldyBHcm91cChEZWZhdWx0LmNsYXNzKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFpbi5hc3NlcnREZWZhdWx0R3JvdXBTZXF1ZW5jZUlzRXhwYW5kYWJsZShkZWZhdWx0U2VxdWVuY2UpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChHcm91cERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmNsZWFyKCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQoR3JvdXAuREVGQVVMVCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQobmV3IEdyb3VwKEdyb3VwQy5jbGFzcykpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhaW4uYXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGUoZGVmYXVsdFNlcXVlbmNlKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5jbGVhcigpOwotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuYWRkKG5ldyBHcm91cChHcm91cEMuY2xhc3MpKTsKLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmFkZChHcm91cC5ERUZBVUxUKTsKLSAgICAgICAgY2hhaW4uYXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGUoZGVmYXVsdFNlcXVlbmNlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NlcnREZWZhdWxHcm91cFNlcXVlbmNlSXNFeHBhbmRhYmxlV2l0aERlZmF1bHRBdEJlZ2lubmluZ09mU2VxdWVuY2UoKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGR1bW15IHNlcXVlbmNlCi0gICAgICAgIEdyb3VwIGEgPSBuZXcgR3JvdXAoR3JvdXBBLmNsYXNzKTsKLSAgICAgICAgR3JvdXAgYiA9IG5ldyBHcm91cChHcm91cEIuY2xhc3MpOwotICAgICAgICBHcm91cCBjID0gbmV3IEdyb3VwKEdyb3VwQy5jbGFzcyk7Ci0gICAgICAgIEdyb3VwIGRlZmF1bHRHcm91cCA9IG5ldyBHcm91cChEZWZhdWx0LmNsYXNzKTsKLSAgICAgICAgTGlzdDxHcm91cD4gc2VxdWVuY2UgPSBuZXcgQXJyYXlMaXN0PEdyb3VwPigpOwotICAgICAgICBzZXF1ZW5jZS5hZGQoZGVmYXVsdEdyb3VwKTsKLSAgICAgICAgc2VxdWVuY2UuYWRkKGEpOwotICAgICAgICBzZXF1ZW5jZS5hZGQoYik7Ci0gICAgICAgIHNlcXVlbmNlLmFkZChjKTsKLQotICAgICAgICBHcm91cHMgY2hhaW4gPSBuZXcgR3JvdXBzKCk7Ci0gICAgICAgIGNoYWluLmluc2VydFNlcXVlbmNlKHNlcXVlbmNlKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGVzdCBkZWZhdWx0IHNlcXVlbmNlCi0gICAgICAgIExpc3Q8R3JvdXA+IGRlZmF1bHRTZXF1ZW5jZSA9IG5ldyBBcnJheUxpc3Q8R3JvdXA+KCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQoR3JvdXAuREVGQVVMVCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQobmV3IEdyb3VwKEdyb3VwQS5jbGFzcykpOwotICAgICAgICBjaGFpbi5hc3NlcnREZWZhdWx0R3JvdXBTZXF1ZW5jZUlzRXhwYW5kYWJsZShkZWZhdWx0U2VxdWVuY2UpOwotCi0KLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmNsZWFyKCk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQobmV3IEdyb3VwKEdyb3VwQS5jbGFzcykpOwotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuYWRkKEdyb3VwLkRFRkFVTFQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhaW4uYXNzZXJ0RGVmYXVsdEdyb3VwU2VxdWVuY2VJc0V4cGFuZGFibGUoZGVmYXVsdFNlcXVlbmNlKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHN1Y2Nlc3MKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5jbGVhcigpOwotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuYWRkKEdyb3VwLkRFRkFVTFQpOwotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuYWRkKG5ldyBHcm91cChHcm91cEMuY2xhc3MpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYWluLmFzc2VydERlZmF1bHRHcm91cFNlcXVlbmNlSXNFeHBhbmRhYmxlKGRlZmF1bHRTZXF1ZW5jZSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEdyb3VwRGVmaW5pdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzdWNjZXNzCi0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0U2VxdWVuY2UuY2xlYXIoKTsKLSAgICAgICAgZGVmYXVsdFNlcXVlbmNlLmFkZChuZXcgR3JvdXAoR3JvdXBDLmNsYXNzKSk7Ci0gICAgICAgIGRlZmF1bHRTZXF1ZW5jZS5hZGQoR3JvdXAuREVGQVVMVCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFpbi5hc3NlcnREZWZhdWx0R3JvdXBTZXF1ZW5jZUlzRXhwYW5kYWJsZShkZWZhdWx0U2VxdWVuY2UpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChHcm91cERlZmluaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnRlcmZhY2UgVGVzdFNlcXVlbmNlIHsKLX0KLQotaW50ZXJmYWNlIEdyb3VwQSB7Ci19Ci0KLWludGVyZmFjZSBHcm91cEIgewotfQotCi1pbnRlcmZhY2UgR3JvdXBDIHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR0NsYXNzMS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9HQ2xhc3MxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MzE2ZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9HQ2xhc3MxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgR0NsYXNzMSBpbXBsZW1lbnRzIEdJbnRlcmZhY2UxIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9HQ2xhc3MyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dDbGFzczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxZGU1MS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2U7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBHcm91cFNlcXVlbmNlKHtHQ2xhc3MxLmNsYXNzLCBHQ2xhc3MyLmNsYXNzfSkKLXB1YmxpYyBjbGFzcyBHQ2xhc3MyIGV4dGVuZHMgR0NsYXNzMSB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dDbGFzczMuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR0NsYXNzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWI5MmM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR0NsYXNzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotQEdyb3VwU2VxdWVuY2Uoe0dDbGFzczMuY2xhc3MsIEdDbGFzczEuY2xhc3N9KQotcHVibGljIGNsYXNzIEdDbGFzczMgewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9HSW50ZXJmYWNlMS5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9HSW50ZXJmYWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdjM2Y5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR0ludGVyZmFjZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkdyb3VwU2VxdWVuY2U7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBHcm91cFNlcXVlbmNlKEdJbnRlcmZhY2UxLmNsYXNzKQotcHVibGljIGludGVyZmFjZSBHSW50ZXJmYWNlMSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBTZXF1ZW5jZUlzb2xhdGlvblRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBTZXF1ZW5jZUlzb2xhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2YTczNC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwU2VxdWVuY2VJc29sYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3I7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLio7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEFkZGl0aW9uYWwgdGVzdHMgdG8gY2hlY2sgdGhlIGNvcnJlY3QgcHJvY2Vzc2luZyBvZiB7QGxpbmsgR3JvdXBTZXF1ZW5jZX1zCi0gKiBieSB0aGUgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIENhcmxvcyBWYXJhCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFNlcXVlbmNlSXNvbGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBzdGF0aWMgVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmFjdG9yeSA9IFZhbGlkYXRpb24uYnVpbGREZWZhdWx0VmFsaWRhdG9yRmFjdG9yeSgpOwotICAgICAgICAoKERlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yKWZhY3RvcnkuZ2V0TWVzc2FnZUludGVycG9sYXRvcigpKS5zZXRMb2NhbGUoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIHByaXZhdGUgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiB2YWxpZGF0aW5nIHRoZSB7QGxpbmsgRGVmYXVsdH0gZ3JvdXAgaW4gYSBiZWFuIHdob3NlIGNsYXNzIGRvZXNuJ3QKLSAgICAgKiBkZWZpbmUgYSB7QGxpbmsgR3JvdXBTZXF1ZW5jZX0sIGFsbCB0aGUgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5IG11c3QgYmUKLSAgICAgKiBjaGVja2VkIGZvciBncm91cCBzZXF1ZW5jZSBkZWZpbml0aW9ucyBhbmQgdGhleSBtdXN0IGJlIGV2YWx1YXRlZCBpbgotICAgICAqIG9yZGVyIGZvciB0aGUgY29uc3RyYWludHMgZGVmaW5lZCBvbiB0aG9zZSBjbGFzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cFNlcXVlbmNlc0luSGllcmFyY2h5Q2xhc3NlcygpIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotICAgICAgICAKLSAgICAgICAgSG9sZGVyV2l0aE5vR1MgaCA9IG5ldyBIb2xkZXJXaXRoTm9HUygpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxIb2xkZXJXaXRoTm9HUz4+IHZpb2xhdGlvbnM7Ci0gICAgICAgIAotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiB2aW9sYXRpb25zIiwgMiwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBmb3IgKCBDb25zdHJhaW50VmlvbGF0aW9uPEhvbGRlcldpdGhOb0dTPiB2aW9sYXRpb24gOiB2aW9sYXRpb25zICkgewotICAgICAgICAgICAgYm9vbGVhbiBnb29kID0gdmlvbGF0aW9uLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCJhMSIpOwotICAgICAgICAgICAgZ29vZCB8PSB2aW9sYXRpb24uZ2V0UHJvcGVydHlQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoImIyIik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV3JvbmcgY29uc3RyYWludCIsIGdvb2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaC5hMSA9ICJnb29kIjsKLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgdmlvbGF0aW9ucyIsIDIsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yICggQ29uc3RyYWludFZpb2xhdGlvbjxIb2xkZXJXaXRoTm9HUz4gdmlvbGF0aW9uIDogdmlvbGF0aW9ucyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiYTIiKTsKLSAgICAgICAgICAgIGdvb2QgfD0gdmlvbGF0aW9uLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCJiMiIpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldyb25nIGNvbnN0cmFpbnQiLCBnb29kKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaC5iMiA9ICJnb29kIjsKLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgdmlvbGF0aW9ucyIsIDIsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yICggQ29uc3RyYWludFZpb2xhdGlvbjxIb2xkZXJXaXRoTm9HUz4gdmlvbGF0aW9uIDogdmlvbGF0aW9ucyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiYTIiKTsKLSAgICAgICAgICAgIGdvb2QgfD0gdmlvbGF0aW9uLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCJiMSIpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldyb25nIGNvbnN0cmFpbnQiLCBnb29kKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaC5iMSA9ICJnb29kIjsKLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgdmlvbGF0aW9ucyIsIDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yICggQ29uc3RyYWludFZpb2xhdGlvbjxIb2xkZXJXaXRoTm9HUz4gdmlvbGF0aW9uIDogdmlvbGF0aW9ucyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiYTIiKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXcm9uZyBjb25zdHJhaW50IiwgZ29vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogV2hlbiB2YWxpZGF0aW5nIHRoZSB7QGxpbmsgRGVmYXVsdH0gZ3JvdXAgaW4gYSBiZWFuIHdob3NlIGNsYXNzIGRlZmluZXMKLSAgICAgKiBhIGdyb3VwIHNlcXVlbmNlLCB0aGF0IGdyb3VwIHNlcXVlbmNlIGlzIHVzZWQgZm9yIGFsbCB0aGUgY29uc3RyYWludHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdyb3VwU2VxdWVuY2VPZkJlYW5DbGFzcygpIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotICAgICAgICAKLSAgICAgICAgSG9sZGVyV2l0aEdTIGggPSBuZXcgSG9sZGVyV2l0aEdTKCk7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEhvbGRlcldpdGhHUz4+IHZpb2xhdGlvbnM7Ci0gICAgICAgIAotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiB2aW9sYXRpb25zIiwgMSwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBmb3IgKCBDb25zdHJhaW50VmlvbGF0aW9uPEhvbGRlcldpdGhHUz4gdmlvbGF0aW9uIDogdmlvbGF0aW9ucyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiYTEiKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXcm9uZyBjb25zdHJhaW50IiwgZ29vZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGguYTEgPSAiZ29vZCI7Ci0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoaCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHZpb2xhdGlvbnMiLCAyLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGZvciAoIENvbnN0cmFpbnRWaW9sYXRpb248SG9sZGVyV2l0aEdTPiB2aW9sYXRpb24gOiB2aW9sYXRpb25zICkgewotICAgICAgICAgICAgYm9vbGVhbiBnb29kID0gdmlvbGF0aW9uLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCJhMiIpOwotICAgICAgICAgICAgZ29vZCB8PSB2aW9sYXRpb24uZ2V0UHJvcGVydHlQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoImIyIik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV3JvbmcgY29uc3RyYWludCIsIGdvb2QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBoLmEyID0gImdvb2QiOwotICAgICAgICBoLmIyID0gImdvb2QiOwotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiB2aW9sYXRpb25zIiwgMSwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBmb3IgKCBDb25zdHJhaW50VmlvbGF0aW9uPEhvbGRlcldpdGhHUz4gdmlvbGF0aW9uIDogdmlvbGF0aW9ucyApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiYjEiKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXcm9uZyBjb25zdHJhaW50IiwgZ29vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQEdyb3VwU2VxdWVuY2Uoe0dyb3VwQTEuY2xhc3MsIEEuY2xhc3N9KQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSB7Ci0gICAgICAgIEBOb3ROdWxsKGdyb3Vwcz17R3JvdXBBMS5jbGFzc30pCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYTE7Ci0gICAgICAgIEBOb3ROdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYTI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEdyb3VwQTEgewotICAgIH0KLSAgICAKLSAgICBAR3JvdXBTZXF1ZW5jZSh7Qi5jbGFzcywgR3JvdXBCMS5jbGFzc30pCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSB7Ci0gICAgICAgIEBOb3ROdWxsKGdyb3Vwcz17R3JvdXBCMS5jbGFzc30pCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYjE7Ci0gICAgICAgIEBOb3ROdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgYjI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEdyb3VwQjEgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy8gTm8gZ3JvdXAgc2VxdWVuY2UgZGVmaW5pdGlvbgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG9sZGVyV2l0aE5vR1MgZXh0ZW5kcyBCIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBHcm91cFNlcXVlbmNlKHtHcm91cEExLmNsYXNzLCBIb2xkZXJXaXRoR1MuY2xhc3MsIEdyb3VwQjEuY2xhc3N9KQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSG9sZGVyV2l0aEdTIGV4dGVuZHMgQiB7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBTZXF1ZW5jZVRlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBTZXF1ZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmY2IzOC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwU2VxdWVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuSnNyMzAzRmVhdHVyZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLio7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdGVzdCBvZiBncm91cCBzZXF1ZW5jZSBiZWhhdmlvcjxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFNlcXVlbmNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHN0YXRpYyBWYWxpZGF0b3JGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmYWN0b3J5ID0gVmFsaWRhdGlvbi5idWlsZERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5KCk7Ci0gICAgICAgICgoRGVmYXVsdE1lc3NhZ2VJbnRlcnBvbGF0b3IpZmFjdG9yeS5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpLnNldExvY2FsZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cFNlcXVlbmNlMSgpIHsKLSAgICAgICAgTWV0YUJlYW4gbWV0YUJlYW4gPQotICAgICAgICAgICAgICBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKS51c2luZ0NvbnRleHQoKS5nZXRNZXRhQmVhbkZpbmRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRm9yQ2xhc3MoR0ludGVyZmFjZTEuY2xhc3MpOwotICAgICAgICBMaXN0PEdyb3VwPiBnc2VxID0gbWV0YUJlYW4uZ2V0RmVhdHVyZShKc3IzMDNGZWF0dXJlcy5CZWFuLkdST1VQX1NFUVVFTkNFKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZ3NlcSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZ3NlcS5zaXplKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEdyb3VwLkRFRkFVTFQsIGdzZXEuZ2V0KDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBTZXF1ZW5jZTIoKSB7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0KLSAgICAgICAgICAgICAgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5nZXREZWZhdWx0KCkudXNpbmdDb250ZXh0KCkuZ2V0TWV0YUJlYW5GaW5kZXIoKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZvckNsYXNzKEdDbGFzczEuY2xhc3MpOwotICAgICAgICBMaXN0PEdyb3VwPiBnc2VxID0gbWV0YUJlYW4uZ2V0RmVhdHVyZShKc3IzMDNGZWF0dXJlcy5CZWFuLkdST1VQX1NFUVVFTkNFKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZ3NlcSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZ3NlcS5zaXplKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEdyb3VwLkRFRkFVTFQsIGdzZXEuZ2V0KDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBTZXF1ZW5jZTMoKSB7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0KLSAgICAgICAgICAgICAgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5nZXREZWZhdWx0KCkudXNpbmdDb250ZXh0KCkuZ2V0TWV0YUJlYW5GaW5kZXIoKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZvckNsYXNzKEdDbGFzczIuY2xhc3MpOwotICAgICAgICBMaXN0PEdyb3VwPiBnc2VxID0gbWV0YUJlYW4uZ2V0RmVhdHVyZShKc3IzMDNGZWF0dXJlcy5CZWFuLkdST1VQX1NFUVVFTkNFKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZ3NlcSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgZ3NlcS5zaXplKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBHcm91cChHQ2xhc3MxLmNsYXNzKSwgZ3NlcS5nZXQoMCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEdyb3VwLkRFRkFVTFQsIGdzZXEuZ2V0KDEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBTZXF1ZW5jZTQoKSB7Ci0gICAgICAgIE1ldGFCZWFuIG1ldGFCZWFuID0KLSAgICAgICAgICAgICAgQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5nZXREZWZhdWx0KCkudXNpbmdDb250ZXh0KCkuZ2V0TWV0YUJlYW5GaW5kZXIoKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZvckNsYXNzKEdDbGFzczMuY2xhc3MpOwotICAgICAgICBMaXN0PEdyb3VwPiBnc2VxID0gbWV0YUJlYW4uZ2V0RmVhdHVyZShKc3IzMDNGZWF0dXJlcy5CZWFuLkdST1VQX1NFUVVFTkNFKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZ3NlcSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgZ3NlcS5zaXplKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEdyb3VwLkRFRkFVTFQsIGdzZXEuZ2V0KDApKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgR3JvdXAoR0NsYXNzMS5jbGFzcyksIGdzZXEuZ2V0KDEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBzKCkgewotICAgICAgICBWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgQXV0aG9yIGF1dGhvciA9IG5ldyBBdXRob3IoKTsKLSAgICAgICAgYXV0aG9yLnNldExhc3ROYW1lKCIiKTsKLSAgICAgICAgYXV0aG9yLnNldEZpcnN0TmFtZSgiIik7Ci0gICAgICAgIEJvb2sgYm9vayA9IG5ldyBCb29rKCk7Ci0gICAgICAgIGJvb2suc2V0VGl0bGUoIiIpOwotICAgICAgICBib29rLnNldEF1dGhvcihhdXRob3IpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEJvb2s+PiBjb25zdHJhaW50VmlvbGF0aW9ucyA9Ci0gICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShib29rLCBGaXJzdC5jbGFzcywgU2Vjb25kLmNsYXNzLCBMYXN0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uc3RyYWludHMiLCAzLCBjb25zdHJhaW50VmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24oY29uc3RyYWludFZpb2xhdGlvbnMsICJ0aXRsZSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKGNvbnN0cmFpbnRWaW9sYXRpb25zLCAiYXV0aG9yLmZpcnN0TmFtZSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKGNvbnN0cmFpbnRWaW9sYXRpb25zLCAiYXV0aG9yLmxhc3ROYW1lIikpOwotCi0gICAgICAgIGF1dGhvci5zZXRGaXJzdE5hbWUoIkdhdmluIik7Ci0gICAgICAgIGF1dGhvci5zZXRMYXN0TmFtZSgiS2luZyIpOwotCi0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJvb2ssIEZpcnN0LmNsYXNzLCBTZWNvbmQuY2xhc3MsIExhc3QuY2xhc3MpOwotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPD8+IGNvbnN0cmFpbnRWaW9sYXRpb24gPSBjb25zdHJhaW50VmlvbGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbnN0cmFpbnRWaW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWF5IG5vdCBiZSBlbXB0eSIsIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJvb2ssIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0Um9vdEJlYW4oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhib29rLmdldFRpdGxlKCksIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0SW52YWxpZFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRpdGxlIiwgY29uc3RyYWludFZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpKTsKLQotICAgICAgICBib29rLnNldFRpdGxlKCJNeSBmYXVsdCIpOwotICAgICAgICBib29rLnNldFN1YnRpdGxlKCJjb25mZXNzaW9ucyBvZiBhIHByZXNpZGVudCAtIGEgYm9vayBmb3IgYSBuaWNlIHByaWNlIik7Ci0KLSAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYm9vaywgRmlyc3QuY2xhc3MsIFNlY29uZC5jbGFzcywgTGFzdC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjb25zdHJhaW50VmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uID0gY29uc3RyYWludFZpb2xhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzAiLCBjb25zdHJhaW50VmlvbGF0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhib29rLCBjb25zdHJhaW50VmlvbGF0aW9uLmdldFJvb3RCZWFuKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYm9vay5nZXRTdWJ0aXRsZSgpLCBjb25zdHJhaW50VmlvbGF0aW9uLmdldEludmFsaWRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWJ0aXRsZSIsIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0UHJvcGVydHlQYXRoKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgYm9vay5zZXRTdWJ0aXRsZSgiQ2FwaXRhbGlzbSBpbiBjcmlzaXMiKTsKLSAgICAgICAgYXV0aG9yLnNldENvbXBhbnkoIjEyMzQ1Njc4OTDDnzk4NzY1NDMyMTI1Nzg5MDk4NzY1NDIyNDU2Nzg5ODc0MzIiKTsKLQotICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShib29rKTsKLSAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbiA9IGNvbnN0cmFpbnRWaW9sYXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA0MCIsIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJvb2ssIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0Um9vdEJlYW4oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdXRob3IuZ2V0Q29tcGFueSgpLCBjb25zdHJhaW50VmlvbGF0aW9uLmdldEludmFsaWRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRob3IuY29tcGFueSIsIGNvbnN0cmFpbnRWaW9sYXRpb24uZ2V0UHJvcGVydHlQYXRoKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgYXV0aG9yLnNldENvbXBhbnkoImFwYWNoZSIpOwotCi0gICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJvb2ssIEZpcnN0LmNsYXNzLCBTZWNvbmQuY2xhc3MsIExhc3QuY2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBTZXF1ZW5jZSgpIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotCi0gICAgICAgIEF1dGhvciBhdXRob3IgPSBuZXcgQXV0aG9yKCk7Ci0gICAgICAgIGF1dGhvci5zZXRMYXN0TmFtZSgiIik7Ci0gICAgICAgIGF1dGhvci5zZXRGaXJzdE5hbWUoIiIpOwotICAgICAgICBCb29rIGJvb2sgPSBuZXcgQm9vaygpOwotICAgICAgICBib29rLnNldEF1dGhvcihhdXRob3IpOwotCi0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEJvb2s+PiBjb25zdHJhaW50VmlvbGF0aW9ucyA9Ci0gICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShib29rLCBCb29rLkFsbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjb25zdHJhaW50VmlvbGF0aW9ucy5zaXplKCkpOwotCi0gICAgICAgIGF1dGhvci5zZXRGaXJzdE5hbWUoIktlbHZpbiIpOwotICAgICAgICBhdXRob3Iuc2V0TGFzdE5hbWUoIkNsaW5lIik7Ci0KLSAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYm9vaywgQm9vay5BbGwuY2xhc3MpOwotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPD8+IGNvbnN0cmFpbnRWaW9sYXRpb24gPSBjb25zdHJhaW50VmlvbGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbnN0cmFpbnRWaW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWF5IG5vdCBiZSBudWxsIiwgY29uc3RyYWludFZpb2xhdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYm9vaywgY29uc3RyYWludFZpb2xhdGlvbi5nZXRSb290QmVhbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJvb2suZ2V0VGl0bGUoKSwgY29uc3RyYWludFZpb2xhdGlvbi5nZXRJbnZhbGlkVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGl0bGUiLCBjb25zdHJhaW50VmlvbGF0aW9uLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGJvb2suc2V0VGl0bGUoIjI0NzMwNzg5MjQzMDc5ODc4OTAyNDM4OTc5ODc4OSIpOwotICAgICAgICBib29rLnNldFN1YnRpdGxlKCJmNDN1IHJsw7ZrIGZqw7ZxM2xpdSBvcGl1ciDDtmx3M2tqIHLDtmxraiBkIik7Ci0KLSAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYm9vaywgQm9vay5BbGwuY2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uc3RyYWludFZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IHdoZW4gdGhlcmUgaXMgb25lIGNvbnN0cmFpbnQgZmFpbHVyZSBpbiBvbmUgb2YgdGhlIGdyb3VwcyBpbgotICAgICAqIGEgc2VxdWVuY2UsIHZhbGlkYXRpb24gc3RvcHMuCi0gICAgICogSlNSLTMwMzogMy40LjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblN0b3BzV2hlbkZhaWx1cmVzT25Hcm91cCgpIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldFZhbGlkYXRvcigpOwotICAgICAgICAKLSAgICAgICAgLy8gVmFsaWRhdGUgRHVtbXkgd2l0aCBpdHMgcmVkZWZpbmVkIERlZmF1bHQgZ3JvdXAKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248RHVtbXk+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKG5ldyBEdW1teSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmx5IDEgdmlvbGF0aW9uIGV4cGVjdGVkIiwgMSwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPER1bW15PiB2aW9sYXRpb24gPSB2aW9sYXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkdyb3VwMSBzaG91bGQgYmUgZXZhbHVhdGVkIGZpcnN0IiwgImZpZWxkMSIsIHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgQEdyb3VwU2VxdWVuY2Uoe0R1bW15Lkdyb3VwMS5jbGFzcywgRHVtbXkuY2xhc3N9KQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXkgewotICAgICAgICAKLSAgICAgICAgQE5vdE51bGwoZ3JvdXBzPUdyb3VwMS5jbGFzcykKLSAgICAgICAgcHVibGljIFN0cmluZyBmaWVsZDE7Ci0gICAgICAgIAotICAgICAgICBATm90TnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGZpZWxkMjsKLSAgICAgICAgCi0gICAgICAgIGludGVyZmFjZSBHcm91cDEgewotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9Hcm91cFZhbGlkYXRpb25UZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3MTJiYS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3VwVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5UZXN0VXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdGVzdCBmZWF0dXJlcyBmcm9tIHNwZWMgY2hhcHRlciAzLjQgZ3JvdXAgYW5kIGdyb3VwIHNlcXVlbmNlPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHZhbGlkYXRvciA9IEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3Qgc3BlYzogQE5vdE51bGwgb24gZmlyc3RuYW1lIGFuZCBvbiBsYXN0bmFtZSBhcmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiB0aGUgRGVmYXVsdCBncm91cCBpcyB2YWxpZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlRmlyc3ROYW1lTGFzdE5hbWVXaXRoRGVmYXVsdEdyb3VwKCkgewotICAgICAgICBCaWxsYWJsZVVzZXIgdXNlciA9IG5ldyBCaWxsYWJsZVVzZXIoKTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxCaWxsYWJsZVVzZXI+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVzZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBDb25zdHJhaW50VmlvbGF0aW9uPD8+IHZpb2xhdGlvbiA9IFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImZpcnN0bmFtZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZpb2xhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1c2VyLCB2aW9sYXRpb24uZ2V0Um9vdEJlYW4oKSk7Ci0gICAgICAgIHZpb2xhdGlvbiA9IFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImxhc3RuYW1lIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmlvbGF0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXIsIHZpb2xhdGlvbi5nZXRSb290QmVhbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXN0IHNwZWM6IEBOb3ROdWxsIGlzIGNoZWNrZWQgb24gZGVmYXVsdENyZWRpdENhcmQgd2hlbiBlaXRoZXIgdGhlCi0gICAgICogQmlsbGFibGUgb3IgQnV5SW5PbmVDbGljayBncm91cCBpcyB2YWxpZGF0ZWQuCi0gICAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZURlZmF1bHRDcmVkaXRDYXJkSW5CaWxsYWJsZUdyb3VwKCkgewotICAgICAgICBCaWxsYWJsZVVzZXIgdXNlciA9IG5ldyBCaWxsYWJsZVVzZXIoKTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxCaWxsYWJsZVVzZXI+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVzZXIsCi0gICAgICAgICAgICAgIEJpbGxhYmxlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjw/PiB2aW9sYXRpb24gPSBUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJkZWZhdWx0Q3JlZGl0Q2FyZCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZpb2xhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1c2VyLCB2aW9sYXRpb24uZ2V0Um9vdEJlYW4oKSk7Ci0gICAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZURlZmF1bHRDcmVkaXRDYXJkSW5CaWxsYWJsZUFuZEJ5SW5PbmVDbGlja0dyb3VwKCkgewotICAgICAgICBCaWxsYWJsZVVzZXIgdXNlciA9IG5ldyBCaWxsYWJsZVVzZXIoKTsKLQotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxCaWxsYWJsZVVzZXI+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVzZXIsCi0gICAgICAgICAgICAgIEJ1eUluT25lQ2xpY2suY2xhc3MsIEJpbGxhYmxlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgQ29uc3RyYWludFZpb2xhdGlvbjw/PiB2aW9sYXRpb24gPSBUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJkZWZhdWx0Q3JlZGl0Q2FyZCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZpb2xhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh1c2VyLCB2aW9sYXRpb24uZ2V0Um9vdEJlYW4oKSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBzQ29tcHV0ZXJUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL0dyb3Vwc0NvbXB1dGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkzODEyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvR3JvdXBzQ29tcHV0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3VwczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5BZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5GaXJzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuTGFzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuU2Vjb25kOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cERlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZ3JvdXBzLkRlZmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogR3JvdXBMaXN0Q29tcHV0ZXIgVGVzdGVyLgotICoKLSAqIEBhdXRob3IgPEF1dGhvcnMgbmFtZT4KLSAqIEB2ZXJzaW9uIDEuMAotICogQHNpbmNlIDxwcmU+MDQvMDkvMjAwOTwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBzQ29tcHV0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEdyb3Vwc0NvbXB1dGVyIGdyb3Vwc0NvbXB1dGVyOwotCi0gICAgcHVibGljIEdyb3Vwc0NvbXB1dGVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBncm91cHNDb21wdXRlciA9IG5ldyBHcm91cHNDb21wdXRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShHcm91cHNDb21wdXRlclRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wdXRlR3JvdXBzTm90QW5JbnRlcmZhY2UoKSB7Ci0gICAgICAgIFNldDxDbGFzczw/Pj4gZ3JvdXBzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgIGdyb3Vwcy5hZGQoU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdyb3Vwc0NvbXB1dGVyLmNvbXB1dGVHcm91cHMoZ3JvdXBzKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBDaGFpbkZvck51bGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBncm91cHNDb21wdXRlci5jb21wdXRlR3JvdXBzKChDbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cENoYWluRm9yRW1wdHlTZXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBncm91cHNDb21wdXRlci5jb21wdXRlR3JvdXBzKG5ldyBIYXNoU2V0PENsYXNzPD8+PigpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDeWNsaWNHcm91cFNlcXVlbmNlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxDbGFzczw/Pj4gZ3JvdXBzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7Ci0gICAgICAgICAgICBncm91cHMuYWRkKEN5Y2xpY0dyb3VwU2VxdWVuY2UxLmNsYXNzKTsKLSAgICAgICAgICAgIGdyb3Vwc0NvbXB1dGVyLmNvbXB1dGVHcm91cHMoZ3JvdXBzKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uIGV4KSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDeWNsaWNHcm91cFNlcXVlbmNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2V0PENsYXNzPD8+PiBncm91cHMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKLSAgICAgICAgICAgIGdyb3Vwcy5hZGQoQ3ljbGljR3JvdXBTZXF1ZW5jZS5jbGFzcyk7Ci0gICAgICAgICAgICBncm91cHNDb21wdXRlci5jb21wdXRlR3JvdXBzKGdyb3Vwcyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEdyb3VwRGVmaW5pdGlvbkV4Y2VwdGlvbiBleCkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBEdXBsaWNhdGVzKCkgewotICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGdyb3VwcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOwotICAgICAgICBncm91cHMuYWRkKEZpcnN0LmNsYXNzKTsKLSAgICAgICAgZ3JvdXBzLmFkZChTZWNvbmQuY2xhc3MpOwotICAgICAgICBncm91cHMuYWRkKExhc3QuY2xhc3MpOwotICAgICAgICBHcm91cHMgY2hhaW4gPSBncm91cHNDb21wdXRlci5jb21wdXRlR3JvdXBzKGdyb3Vwcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBjaGFpbi5ncm91cHMuc2l6ZSgpKTsKLQotICAgICAgICBncm91cHMuY2xlYXIoKTsKLSAgICAgICAgZ3JvdXBzLmFkZChGaXJzdC5jbGFzcyk7Ci0gICAgICAgIGdyb3Vwcy5hZGQoRmlyc3QuY2xhc3MpOwotICAgICAgICBjaGFpbiA9IGdyb3Vwc0NvbXB1dGVyLmNvbXB1dGVHcm91cHMoZ3JvdXBzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoYWluLmdyb3Vwcy5zaXplKCkpOwotCi0gICAgICAgIGdyb3Vwcy5jbGVhcigpOwotICAgICAgICBncm91cHMuYWRkKEZpcnN0LmNsYXNzKTsKLSAgICAgICAgZ3JvdXBzLmFkZChMYXN0LmNsYXNzKTsKLSAgICAgICAgZ3JvdXBzLmFkZChGaXJzdC5jbGFzcyk7Ci0gICAgICAgIGNoYWluID0gZ3JvdXBzQ29tcHV0ZXIuY29tcHV0ZUdyb3Vwcyhncm91cHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2hhaW4uZ3JvdXBzLnNpemUoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VSZXNvbHV0aW9uKCkgewotICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGdyb3VwcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOwotICAgICAgICBncm91cHMuYWRkKEFkZHJlc3MuQ29tcGxldGUuY2xhc3MpOwotICAgICAgICBHcm91cHMgY2hhaW4gPSBncm91cHNDb21wdXRlci5jb21wdXRlR3JvdXBzKGdyb3Vwcyk7Ci0gICAgICAgIEl0ZXJhdG9yPExpc3Q8R3JvdXA+PiBzZXF1ZW5jZXMgPSBjaGFpbi5nZXRTZXF1ZW5jZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBMaXN0PEdyb3VwPiBzZXF1ZW5jZSA9IHNlcXVlbmNlcy5uZXh0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHQuY2xhc3MsIHNlcXVlbmNlLmdldCgwKS5nZXRHcm91cCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3MuSGlnaExldmVsQ29oZXJlbmNlLmNsYXNzLCBzZXF1ZW5jZS5nZXQoMSkuZ2V0R3JvdXAoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9pbXBsaWNpdC9BdWRpdGFibGUuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW1wbGljaXQvQXVkaXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjBkY2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9pbXBsaWNpdC9BdWRpdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5pbXBsaWNpdDsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLQotLyoqCi0gKiBBdWRpdGFibGUgb2JqZWN0IGNvbnRyYWN0LgotICogRXhhbXBsZSAzLjcuIEV4YW1wbGUgb2YgaW50ZXJmYWNlIC8gZ3JvdXAgaG9zdGluZyBjb25zdHJhaW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF1ZGl0YWJsZSB7Ci0gICAgQE5vdE51bGwgU3RyaW5nIGdldENyZWF0aW9uRGF0ZSgpOwotICAgIEBOb3ROdWxsCi0gICAgU3RyaW5nIGdldExhc3RVcGRhdGUoKTsKLSAgICBATm90TnVsbCBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVyKCk7Ci0gICAgQE5vdE51bGwgU3RyaW5nIGdldExhc3RSZWFkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW1wbGljaXQvSW1wbGljaXRHcm91cGluZ1Rlc3QuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW1wbGljaXQvSW1wbGljaXRHcm91cGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYWZjNS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2ltcGxpY2l0L0ltcGxpY2l0R3JvdXBpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuaW1wbGljaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5UZXN0VXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdGVzdCBzcGVjIGNoYXB0ZXIgMy40LjQuIEltcGxpY2l0IGdyb3VwaW5nPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEltcGxpY2l0R3JvdXBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotICAgICAgICB2YWxpZGF0b3IgPSBBcGFjaGVWYWxpZGF0b3JGYWN0b3J5LmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVJbXBsaWNpdEdyb3VwaW5nKCkgewotICAgICAgICBPcmRlciBvcmRlciA9IG5ldyBPcmRlcigpOwotICAgICAgICAvLyBXaGVuIGFuIE9yZGVyIG9iamVjdCBpcyB2YWxpZGF0ZWQgb24gdGhlIERlZmF1bHQgZ3JvdXAsIC4uLgotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxPcmRlcj4+IHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUob3JkZXIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImNyZWF0aW9uRGF0ZSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJsYXN0VXBkYXRlIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgImxhc3RNb2RpZmllciIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJsYXN0UmVhZGVyIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgIm9yZGVyTnVtYmVyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgdmlvbGF0aW9ucy5zaXplKCkpOwotCi0gICAgICAgIC8vIFdoZW4gYW4gT3JkZXIgb2JqZWN0IGlzIHZhbGlkYXRlZCBvbiB0aGUgQXVkaXRhYmxlIGdyb3VwLCAuLi4KLQotICAgICAgICAvKiBPbmx5IHRoZSBjb25zdHJhaW50cyBwcmVzZW50IG9uIEF1ZGl0YWJsZSAoYW5kIGFueSBvZiBpdHMgc3VwZXIgaW50ZXJmYWNlcykKLSAgICAgICAgICAgYW5kIGJlbG9uZ2luZyB0byB0aGUgRGVmYXVsdCBncm91cCBhcmUgdmFsaWRhdGVkCi0gICAgICAgICAgIHdoZW4gdGhlIGdyb3VwIEF1ZGl0YWJsZSBpcyByZXF1ZXN0ZWQuICovCi0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUob3JkZXIsIEF1ZGl0YWJsZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXQgZ3JvdXBpbmcgbm90IGNvcnJlY3RseSBpbXBsZW1lbnRlZCIsIDQsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJjcmVhdGlvbkRhdGUiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAibGFzdFVwZGF0ZSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJsYXN0TW9kaWZpZXIiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAibGFzdFJlYWRlciIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2ltcGxpY2l0L09yZGVyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2ltcGxpY2l0L09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNmU3ZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9pbXBsaWNpdC9PcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLmltcGxpY2l0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIG9yZGVyIGluIHRoZSBzeXN0ZW0KLSAqLwotcHVibGljIGNsYXNzIE9yZGVyIGltcGxlbWVudHMgQXVkaXRhYmxlIHsKLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGlvbkRhdGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdFVwZGF0ZTsKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TW9kaWZpZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFzdFJlYWRlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9yZGVyTnVtYmVyOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNyZWF0aW9uRGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RVcGRhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhc3RVcGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TW9kaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhc3RNb2RpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhc3RSZWFkZXI7Ci0gICAgfQotCi0gICAgQE5vdE51bGwKLSAgICBAU2l6ZShtaW49MTAsIG1heD0xMCkKLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yZGVyTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5vcmRlck51bWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoU3RyaW5nIGNyZWF0aW9uRGF0ZSkgewotICAgICAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlKFN0cmluZyBsYXN0VXBkYXRlKSB7Ci0gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IGxhc3RVcGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVyKFN0cmluZyBsYXN0TW9kaWZpZXIpIHsKLSAgICAgICAgdGhpcy5sYXN0TW9kaWZpZXIgPSBsYXN0TW9kaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdFJlYWRlcihTdHJpbmcgbGFzdFJlYWRlcikgewotICAgICAgICB0aGlzLmxhc3RSZWFkZXIgPSBsYXN0UmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyTnVtYmVyKFN0cmluZyBvcmRlck51bWJlcikgewotICAgICAgICB0aGlzLm9yZGVyTnVtYmVyID0gb3JkZXJOdW1iZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW5oZXJpdGFuY2UvQmlsbGFibGVVc2VyLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2luaGVyaXRhbmNlL0JpbGxhYmxlVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU5YWY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW5oZXJpdGFuY2UvQmlsbGFibGVVc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLmluaGVyaXRhbmNlOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5CaWxsYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5CaWxsYWJsZUNyZWRpdENhcmQ7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5ncm91cHMuRGVmYXVsdDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJpbGxhYmxlVXNlciB7Ci0gICAgQE5vdE51bGwKLSAgICBwcml2YXRlIFN0cmluZyBmaXJzdG5hbWU7Ci0KLSAgICBATm90TnVsbChncm91cHMgPSBEZWZhdWx0LmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIGxhc3RuYW1lOwotCi0gICAgQE5vdE51bGwoZ3JvdXBzID0ge0JpbGxhYmxlLmNsYXNzfSkKLSAgICBwcml2YXRlIEJpbGxhYmxlQ3JlZGl0Q2FyZCBkZWZhdWx0Q3JlZGl0Q2FyZDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RuYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3RuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0bmFtZShTdHJpbmcgZmlyc3RuYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlyc3RuYW1lID0gZmlyc3RuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsYXN0bmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0bmFtZShTdHJpbmcgbGFzdG5hbWUpIHsKLSAgICAgICAgdGhpcy5sYXN0bmFtZSA9IGxhc3RuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWxsYWJsZUNyZWRpdENhcmQgZ2V0RGVmYXVsdENyZWRpdENhcmQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q3JlZGl0Q2FyZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q3JlZGl0Q2FyZChCaWxsYWJsZUNyZWRpdENhcmQgZGVmYXVsdENyZWRpdENhcmQpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q3JlZGl0Q2FyZCA9IGRlZmF1bHRDcmVkaXRDYXJkOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2luaGVyaXRhbmNlL0J1eUluT25lQ2xpY2suamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW5oZXJpdGFuY2UvQnV5SW5PbmVDbGljay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRhZDU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvaW5oZXJpdGFuY2UvQnV5SW5PbmVDbGljay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5pbmhlcml0YW5jZTsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5ncm91cHMuQmlsbGFibGU7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0OwotCi0vKioKLSAqIEN1c3RvbWVyIGNhbiBidXkgd2l0aG91dCBoYXJyYXNzaW5nIGNoZWNraW5nIHByb2Nlc3MuCi0gKiBzcGVjOiBFeGFtcGxlIDMuMy4gR3JvdXBzIGNhbiBpbmhlcml0IG90aGVyIGdyb3VwcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1eUluT25lQ2xpY2sgZXh0ZW5kcyBEZWZhdWx0LCBCaWxsYWJsZSB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2luaGVyaXRhbmNlL0dyb3VwSW5oZXJpdGFuY2VUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL2luaGVyaXRhbmNlL0dyb3VwSW5oZXJpdGFuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTgxYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9pbmhlcml0YW5jZS9Hcm91cEluaGVyaXRhbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5pbmhlcml0YW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkFwYWNoZVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsLlRlc3RVdGlsczsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBJbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHZhbGlkYXRvciA9IEFwYWNoZVZhbGlkYXRvckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmdldFZhbGlkYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRpbmcgdGhlIGdyb3VwIEJ1eUluT25lQ2xpY2sgd2lsbCBsZWFkIHRvIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgY2hlY2tpbmc6Ci0gICAgICo8cHJlPgotICAgICAqICAqIEBOb3ROdWxsIG9uIGZpcnN0bmFtZSBhbmQgbGFzdG5hbWUKLSAgICAgKiAgKiBATm90TnVsbCBvbiBkZWZhdWx0Q3JlZGl0Q2FyZDwvcHJlPgotICAgICAqIGJlY2F1c2UgRGVmYXVsdCBhbmQgQmlsbGFibGUgYXJlIHN1cGVyaW50ZXJmYWNlcyBvZiBCdXlJbk9uZUNsaWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEdyb3VwQnV5SW5PbmVDbGljaygpIHsKLSAgICAgICAgQmlsbGFibGVVc2VyIHVzZXIgPSBuZXcgQmlsbGFibGVVc2VyKCk7Ci0KLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248QmlsbGFibGVVc2VyPj4gdmlvbGF0aW9ucyA9Ci0gICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSh1c2VyLCBCdXlJbk9uZUNsaWNrLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJmaXJzdG5hbWUiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAibGFzdG5hbWUiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAiZGVmYXVsdENyZWRpdENhcmQiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9yZWRlZmluaW5nL0FkZHJlc3MuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvcmVkZWZpbmluZy9BZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGNhZGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9yZWRlZmluaW5nL0FkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5yZWRlZmluaW5nOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuY29uc3RyYWludHMuWmlwQ29kZUNpdHlDb2hlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlLlppcENvZGVDaXR5Q2FycmllcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uR3JvdXBTZXF1ZW5jZTsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOwotCi0vKioKLSAqIEV4YW1wbGUgMy42LiBSZWRlZmluaW5nIERlZmF1bHQgZ3JvdXAgZm9yIEFkZHJlc3M6Ci0gKiBUbyByZWRlZmluZSBEZWZhdWx0IGZvciBhIGNsYXNzLCBwbGFjZSBhIEBHcm91cFNlcXVlbmNlIGFubm90YXRpb24gb24gdGhlIGNsYXNzIDsgCi0gKiB0aGlzIHNlcXVlbmNlIGV4cHJlc3NlcyB0aGUgc2VxdWVuY2Ugb2YgZ3JvdXBzIHRoYXQgZG9lcwotICogc3Vic3RpdHV0ZSBEZWZhdWx0IGZvciB0aGlzIGNsYXNzLgotICovCi1AR3JvdXBTZXF1ZW5jZSh7QWRkcmVzcy5jbGFzcywgQWRkcmVzcy5IaWdoTGV2ZWxDb2hlcmVuY2UuY2xhc3MsIEFkZHJlc3MuRXh0cmFDYXJlZnVsLmNsYXNzIH0pCi1AWmlwQ29kZUNpdHlDb2hlcmVuY2UoZ3JvdXBzID0gQWRkcmVzcy5IaWdoTGV2ZWxDb2hlcmVuY2UuY2xhc3MpCi1wdWJsaWMgY2xhc3MgQWRkcmVzcyBpbXBsZW1lbnRzIFppcENvZGVDaXR5Q2FycmllciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogY2hlY2sgY29oZXJlbmNlIG9uIHRoZSBvdmVyYWxsIG9iamVjdAotICAgICAqIE5lZWRzIGJhc2ljIGNoZWNraW5nIHRvIGJlIGdyZWVuIGZpcnN0Ci0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBIaWdoTGV2ZWxDb2hlcmVuY2Uge30KLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHRyYS1jYXJlZnVsIHZhbGlkYXRpb24gZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFeHRyYUNhcmVmdWwge30KLQotICAgIEBOb3ROdWxsCi0gICAgQFNpemUobWF4ID0gNTAsIG1pbiA9IDEsIGdyb3VwcyA9IEV4dHJhQ2FyZWZ1bC5jbGFzcykKLSAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQxOwotCi0gICAgQE5vdE51bGwgCi0gICAgcHJpdmF0ZSBTdHJpbmcgemlwQ29kZTsKLSAgICAKLSAgICBATm90TnVsbAotICAgIEBTaXplKG1heCA9IDMwKQotICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldDEoKSB7Ci0gICAgICAgIHJldHVybiBzdHJlZXQxOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldDEoU3RyaW5nIHN0cmVldDEpIHsKLSAgICAgICAgdGhpcy5zdHJlZXQxID0gc3RyZWV0MTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFppcENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB6aXBDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFppcENvZGUoU3RyaW5nIHppcENvZGUpIHsKLSAgICAgICAgdGhpcy56aXBDb2RlID0gemlwQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9yZWRlZmluaW5nL0ludmFsaWRSZWRlZmluZWREZWZhdWx0R3JvdXBBZGRyZXNzLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL3JlZGVmaW5pbmcvSW52YWxpZFJlZGVmaW5lZERlZmF1bHRHcm91cEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTgxMS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvZ3JvdXBzL3JlZGVmaW5pbmcvSW52YWxpZFJlZGVmaW5lZERlZmF1bHRHcm91cEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmdyb3Vwcy5yZWRlZmluaW5nOwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cFNlcXVlbmNlOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKLQotCi0vKioKLSAqIElmIGEgQEdyb3VwU2VxdWVuY2UgcmVkZWZpbmluZyB0aGUgRGVmYXVsdCBncm91cCBmb3IgYSBjbGFzcyBBIGRvZXMgbm90Ci0gKiBjb250YWluIHRoZSBncm91cCBBLCBhIEdyb3VwRGVmaW5pdGlvbkV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0aGUgY2xhc3MgaXMKLSAqIHZhbGlkYXRlZCBvciB3aGVuIGl0cyBtZXRhZGF0YSBpcyByZXF1ZXN0ZWQuCi0gKi8KLUBHcm91cFNlcXVlbmNlKHtBZGRyZXNzLmNsYXNzLCBBZGRyZXNzLkhpZ2hMZXZlbENvaGVyZW5jZS5jbGFzc30pCi1wdWJsaWMgY2xhc3MgSW52YWxpZFJlZGVmaW5lZERlZmF1bHRHcm91cEFkZHJlc3MgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIEBOb3ROdWxsKGdyb3VwcyA9IEFkZHJlc3MuSGlnaExldmVsQ29oZXJlbmNlLmNsYXNzKQotICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIEBOb3ROdWxsCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIGNvaGVyZW5jZSBvbiB0aGUgb3ZlcmFsbCBvYmplY3QKLSAgICAgKiBOZWVkcyBiYXNpYyBjaGVja2luZyB0byBiZSBncmVlbiBmaXJzdAotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSGlnaExldmVsQ29oZXJlbmNlIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy9ncm91cHMvcmVkZWZpbmluZy9SZWRlZmluaW5nRGVmYXVsdEdyb3VwVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9yZWRlZmluaW5nL1JlZGVmaW5pbmdEZWZhdWx0R3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTU5ODUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL2dyb3Vwcy9yZWRlZmluaW5nL1JlZGVmaW5pbmdEZWZhdWx0R3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZ3JvdXBzLnJlZGVmaW5pbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmpzcjMwMy5BcGFjaGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbC5UZXN0VXRpbHM7Ci0KLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Hcm91cERlZmluaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogdGVzdCBSZWRlZmluaW5nIHRoZSBEZWZhdWx0IGdyb3VwIGZvciBhIGNsYXNzIChzcGVjLiBjaGFwdGVyIDMuNC4zKTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWRlZmluaW5nRGVmYXVsdEdyb3VwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgdmFsaWRhdG9yID0gQXBhY2hlVmFsaWRhdG9yRmFjdG9yeS5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogd2hlbiBhbiBhZGRyZXNzIG9iamVjdCBpcyB2YWxpZGF0ZWQgZm9yIHRoZSBncm91cCBEZWZhdWx0LAotICAgICAqIGFsbCBjb25zdHJhaW50cyBiZWxvbmdpbmcgdG8gdGhlIGdyb3VwIERlZmF1bHQgYW5kIGhvc3RlZCBvbiBBZGRyZXNzIGFyZSBldmFsdWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVEZWZhdWx0R3JvdXAoKSB7Ci0gICAgICAgIEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPEFkZHJlc3M+PiB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGFkZHJlc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKFRlc3RVdGlscy5nZXRWaW9sYXRpb24odmlvbGF0aW9ucywgInN0cmVldDEiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAiemlwQ29kZSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJjaXR5IikpOwotCi0gICAgICAgIGFkZHJlc3Muc2V0U3RyZWV0MSgiRWxtc3RyZWV0Iik7Ci0gICAgICAgIGFkZHJlc3Muc2V0WmlwQ29kZSgiMTIzNCIpOwotICAgICAgICBhZGRyZXNzLnNldENpdHkoIkdvdGhhbSBDaXR5Iik7Ci0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRkcmVzcyk7Ci0gICAgICAgIGFzc2VydFRydWUodmlvbGF0aW9ucy5pc0VtcHR5KCkpOwotCi0gICAgICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYWRkcmVzcywgQWRkcmVzcy5IaWdoTGV2ZWxDb2hlcmVuY2UuY2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmlvbGF0aW9ucy5zaXplKCkpOwotCi0gICAgICAgIGFkZHJlc3Muc2V0Q2l0eSgiZXJyb3IiKTsKLSAgICAgICAgdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZShhZGRyZXNzLCBBZGRyZXNzLkhpZ2hMZXZlbENvaGVyZW5jZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIG5vbmUgZmFpbHMsIGFsbCBIaWdoTGV2ZWxDb2hlcmVuY2UgY29uc3RyYWludHMgcHJlc2VudCBvbiBBZGRyZXNzIGFyZSBldmFsdWF0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEluIG90aGVyIHdvcmRzLCB3aGVuIHZhbGlkYXRpbmcgdGhlIERlZmF1bHQgZ3JvdXAgZm9yIEFkZHJlc3MsCi0gICAgICAgICAqIHRoZSBncm91cCBzZXF1ZW5jZSBkZWZpbmVkIG9uIHRoZSBBZGRyZXNzIGNsYXNzIGlzIHVzZWQuCi0gICAgICAgICAqLwotICAgICAgICB2aW9sYXRpb25zID0gdmFsaWRhdG9yLnZhbGlkYXRlKGFkZHJlc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICJyZWRlZmluZWQgZGVmYXVsdCBncm91cCBmb3IgQWRkcmVzcyBtdXN0IGFsc28gdmFsaWRhdGUgSGlnaExldmVsQ29oZXJlbmNlIiwKLSAgICAgICAgICAgICAgMSwgdmlvbGF0aW9ucy5zaXplKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVByb3BlcnR5KCkgewotICAgICAgICBBZGRyZXNzIGFkZHJlc3MgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBhZGRyZXNzLnNldFN0cmVldDEoIiIpOwotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBZGRyZXNzPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnR5KGFkZHJlc3MsICJzdHJlZXQxIik7Ci0gICAgICAgIC8vcHJvdmUgdGhhdCBFeHRyYUNhcmVmdWwgZ3JvdXAgd2FzIHZhbGlkYXRlZDoKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZpb2xhdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChUZXN0VXRpbHMuZ2V0VmlvbGF0aW9uKHZpb2xhdGlvbnMsICJzdHJlZXQxIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVZhbHVlKCkgewotICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxBZGRyZXNzPj4gdmlvbGF0aW9ucyA9IHZhbGlkYXRvci52YWxpZGF0ZVZhbHVlKEFkZHJlc3MuY2xhc3MsICJzdHJlZXQxIiwgIiIpOwotICAgICAgICAvL3Byb3ZlIHRoYXQgRXh0cmFDYXJlZnVsIGdyb3VwIHdhcyB2YWxpZGF0ZWQ6Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB2aW9sYXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoVGVzdFV0aWxzLmdldFZpb2xhdGlvbih2aW9sYXRpb25zLCAic3RyZWV0MSIpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJhaXNlR3JvdXBEZWZpbml0aW9uRXhjZXB0aW9uKCkgewotICAgICAgICBJbnZhbGlkUmVkZWZpbmVkRGVmYXVsdEdyb3VwQWRkcmVzcyBhZGRyZXNzID0KLSAgICAgICAgICAgICAgbmV3IEludmFsaWRSZWRlZmluZWREZWZhdWx0R3JvdXBBZGRyZXNzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoYWRkcmVzcyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEdyb3VwRGVmaW5pdGlvbkV4Y2VwdGlvbiBleCkgewotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9FbnVtZXJhdGlvbkNvbnZlcnRlclRlc3RDYXNlLmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9FbnVtZXJhdGlvbkNvbnZlcnRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYzNlY2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvRW51bWVyYXRpb25Db252ZXJ0ZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi0vKioKLSAqIEVudW1lcmF0aW9uQ29udmVydGVyIHRlc3Rlci4KLSAqCi0gKiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnVtZXJhdGlvbkNvbnZlcnRlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIEVudW1lcmF0aW9uQ29udmVydGVyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudW0oKSB7Ci0gICAgICAgIENvbnZlcnRlciBjb252ZXJ0ZXIgPSBFbnVtZXJhdGlvbkNvbnZlcnRlci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIFRocmVhZC5TdGF0ZSBleHBlY3RlZCA9IFRocmVhZC5TdGF0ZS5URVJNSU5BVEVEOwotICAgICAgICBUaHJlYWQuU3RhdGUgYWN0dWFsID0gKFRocmVhZC5TdGF0ZSkgY29udmVydGVyLmNvbnZlcnQoVGhyZWFkLlN0YXRlLmNsYXNzLAotICAgICAgICAgICAgICAgIFRocmVhZC5TdGF0ZS5URVJNSU5BVEVELm5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVudW1lcmF0aW9uQ29udmVydGVyVGVzdENhc2UuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3V0aWwvUGF0aEltcGxUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9QYXRoSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkNjBmZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9QYXRoSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsKLWltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBQYXRoSW1wbCBUZXN0ZXIuCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgPHByZT4xMC8wMS8yMDA5PC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIFBhdGhJbXBsVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZygpIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gIm9yZGVyWzNdLmRlbGl2ZXJ5QWRkcmVzcy5hZGRyZXNzbGluZVsxXSI7Ci0gICAgICAgIFBhdGggcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZVBhdGhGcm9tU3RyaW5nKHByb3BlcnR5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3BlcnR5LCBwYXRoLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIEl0ZXJhdG9yPFBhdGguTm9kZT4gcHJvcEl0ZXIgPSBwYXRoLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wSXRlci5oYXNOZXh0KCkpOwotICAgICAgICBQYXRoLk5vZGUgZWxlbSA9IHByb3BJdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZWxlbS5pc0luSXRlcmFibGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JkZXIiLCBlbGVtLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wSXRlci5oYXNOZXh0KCkpOwotICAgICAgICBlbGVtID0gcHJvcEl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKGVsZW0uaXNJbkl0ZXJhYmxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMyksIGVsZW0uZ2V0SW5kZXgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGVsaXZlcnlBZGRyZXNzIiwgZWxlbS5nZXROYW1lKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocHJvcEl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgZWxlbSA9IHByb3BJdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZWxlbS5pc0luSXRlcmFibGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBlbGVtLmdldEluZGV4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFkZHJlc3NsaW5lIiwgZWxlbS5nZXROYW1lKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocHJvcEl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgZWxlbSA9IHByb3BJdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBlbGVtLmdldEluZGV4KCkpOwotICAgICAgICBhc3NlcnROdWxsKGVsZW0uZ2V0TmFtZSgpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShwcm9wSXRlci5oYXNOZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1hcEJhc2VkUHJvcGVydHkoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9ICJvcmRlcltmb29dLmRlbGl2ZXJ5QWRkcmVzcyI7Ci0gICAgICAgIFBhdGggcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZVBhdGhGcm9tU3RyaW5nKHByb3BlcnR5KTsKLSAgICAgICAgSXRlcmF0b3I8UGF0aC5Ob2RlPiBwcm9wSXRlciA9IHBhdGguaXRlcmF0b3IoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHByb3BJdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIFBhdGguTm9kZSBlbGVtID0gcHJvcEl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRGYWxzZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmRlciIsIGVsZW0uZ2V0TmFtZSgpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHByb3BJdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIGVsZW0gPSBwcm9wSXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWxlbS5pc0luSXRlcmFibGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZWxlbS5nZXRLZXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGVsaXZlcnlBZGRyZXNzIiwgZWxlbS5nZXROYW1lKCkpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKHByb3BJdGVyLmhhc05leHQoKSk7Ci0gICAgfQotCi0gICAgLy9zb21lIG9mIHRoZSBleGFtcGxlcyBmcm9tIHRoZSAxLjAgYmVhbiB2YWxpZGF0aW9uIHNwZWMsIHNlY3Rpb24gNC4yCi0gICAgcHVibGljIHZvaWQgdGVzdFNwZWNFeGFtcGxlcygpIHsKLSAgICAgICAgU3RyaW5nIGZvdXJ0aEF1dGhvciA9ICJhdXRob3JzWzNdIjsKLSAgICAgICAgUGF0aCBwYXRoID0gUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoZm91cnRoQXV0aG9yKTsKLSAgICAgICAgSXRlcmF0b3I8UGF0aC5Ob2RlPiBwcm9wSXRlciA9IHBhdGguaXRlcmF0b3IoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHByb3BJdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIFBhdGguTm9kZSBlbGVtID0gcHJvcEl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRGYWxzZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRob3JzIiwgZWxlbS5nZXROYW1lKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocHJvcEl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgZWxlbSA9IHByb3BJdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGVsZW0uZ2V0SW5kZXgoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChlbGVtLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHByb3BJdGVyLmhhc05leHQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGZpcnN0QXV0aG9yQ29tcGFueSA9ICJhdXRob3JzWzBdLmNvbXBhbnkiOwotICAgICAgICBwYXRoID0gUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoZmlyc3RBdXRob3JDb21wYW55KTsKLSAgICAgICAgcHJvcEl0ZXIgPSBwYXRoLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wSXRlci5oYXNOZXh0KCkpOwotICAgICAgICBlbGVtID0gcHJvcEl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRGYWxzZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRob3JzIiwgZWxlbS5nZXROYW1lKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocHJvcEl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgZWxlbSA9IHByb3BJdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtLmlzSW5JdGVyYWJsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVsZW0uZ2V0SW5kZXgoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21wYW55IiwgZWxlbS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wSXRlci5oYXNOZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcobnVsbCksIFBhdGhJbXBsLmNyZWF0ZShudWxsKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQYXRoSW1wbC5jcmVhdGUobnVsbCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIFBhdGggcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICAgICAgUGF0aC5Ob2RlIG5vZGUgPSBwYXRoLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgbm9kZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmJhbGFuY2VkQnJhY2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoImZvb1suYmFyIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleEluTWlkZGxlT2ZQcm9wZXJ0eSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhdGhJbXBsLmNyZWF0ZVBhdGhGcm9tU3RyaW5nKCJmWzFdb28uYmFyIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQYXRoSW1wbC5jcmVhdGVQYXRoRnJvbVN0cmluZygiZm9vLmJhci4iKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExlYWRpbmdQYXRoU2VwYXJhdG9yKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoIi5mb28uYmFyIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZygpIHsKLSAgICAgICAgUGF0aCBwYXRoID0gUGF0aEltcGwuY3JlYXRlUGF0aEZyb21TdHJpbmcoIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcGF0aC5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLSAgICAgICAgUGF0aEltcGwgcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICAgICAgcGF0aC5hZGROb2RlKG5ldyBOb2RlSW1wbCgiZmlyc3ROYW1lIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZpcnN0TmFtZSIsIHBhdGgudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgcGF0aCA9IFBhdGhJbXBsLmNyZWF0ZShudWxsKTsKLSAgICAgICAgcGF0aC5nZXRMZWFmTm9kZSgpLnNldEluZGV4KDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlsyXSIsIHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgIHBhdGguYWRkTm9kZShuZXcgTm9kZUltcGwoImZpcnN0TmFtZSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMl0uZmlyc3ROYW1lIiwgcGF0aC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTm9kZXMoKSB7Ci0gICAgICAgIFBhdGhJbXBsIHBhdGggPSBQYXRoSW1wbC5jcmVhdGVQYXRoRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGFzc2VydFRydWUocGF0aC5pc1Jvb3RQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnROb2RlcyhwYXRoKSk7Ci0gICAgICAgIHBhdGguYWRkTm9kZShuZXcgTm9kZUltcGwoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocGF0aC5pc1Jvb3RQYXRoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnROb2RlcyhwYXRoKSk7Ci0gICAgICAgIHBhdGgucmVtb3ZlTGVhZk5vZGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXRoLmlzUm9vdFBhdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjb3VudE5vZGVzKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudE5vZGVzKFBhdGggcGF0aCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxQYXRoLk5vZGU+IGl0ZXIgPSBwYXRoLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICByZXN1bHQrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUGF0aEltcGxUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMvdXRpbC9UZXN0VXRpbHMuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZjYjRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4gICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOwotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24ubWV0YWRhdGEuQ29uc3RyYWludERlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5FbGVtZW50RGVzY3JpcHRvci5Db25zdHJhaW50RmluZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RVdGlscyB7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHZpb2xhdGlvbnMKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlQYXRoCi0gICAgICogICAgICAgICAgICAtIHN0cmluZyBmb3JtYXQgb2YgYSBwcm9wZXJ0eVBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25zdHJhaW50VmlvbGF0aW9uIHdpdGggdGhlIHByb3BlcnR5UGF0aCdzIHN0cmluZwotICAgICAqICAgICAgICAgcmVwcmVzZW50YXRpb24gZ2l2ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJhaW50VmlvbGF0aW9uPFQ+IGdldFZpb2xhdGlvbihTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmlvbGF0aW9ucywgU3RyaW5nIHByb3BlcnR5UGF0aCkgewotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb248VD4gZWFjaCA6IHZpb2xhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChlYWNoLmdldFByb3BlcnR5UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKHByb3BlcnR5UGF0aCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVhY2g7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZpb2xhdGlvbnMKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlQYXRoCi0gICAgICogQHJldHVybiBjb3VudCBvZiB2aW9sYXRpb25zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gaW50IGNvdW50VmlvbGF0aW9ucyhTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmlvbGF0aW9ucywgU3RyaW5nIHByb3BlcnR5UGF0aCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgZm9yIChDb25zdHJhaW50VmlvbGF0aW9uPFQ+IGVhY2ggOiB2aW9sYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoZWFjaC5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpLmVxdWFscyhwcm9wZXJ0eVBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIHZpb2xhdGlvbnMKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cmFpbnQgdmlvbGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlIGZvdW5kLCBpZiBhbnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJhaW50VmlvbGF0aW9uPFQ+IGdldFZpb2xhdGlvbldpdGhNZXNzYWdlKFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2aW9sYXRpb25zLAotICAgICAgICBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBmb3IgKENvbnN0cmFpbnRWaW9sYXRpb248VD4gZWFjaCA6IHZpb2xhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChlYWNoLmdldE1lc3NhZ2UoKS5lcXVhbHMobWVzc2FnZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVhY2g7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYXNzdW1lIHNldCBhZGRpdGlvbiBlaXRoZXIgZG9lcyBub3RoaW5nLCByZXR1cm5pbmcgZmFsc2UgcGVyIGNvbGxlY3Rpb24KLSAgICAgKiBjb250cmFjdCwgb3IgdGhyb3dzIGFuIEV4Y2VwdGlvbjsgaW4gZWl0aGVyIGNhc2Ugc2l6ZSBzaG91bGQgcmVtYWluCi0gICAgICogdW5jaGFuZ2VkCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbE9uTW9kaWZpYWJsZShDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXNzZXJ0Ci0gICAgICAgICAgICAgICAgLmFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoInNob3VsZCBub3QgcGVybWl0IG1vZGlmaWNhdGlvbiB0byAlcyIsIGRlc2NyaXB0aW9uKSwgY29sbGVjdGlvbi5hZGQobnVsbCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2theQotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNvbnN0cmFpbnQgZGVzY3JpcHRvciBzZXQgc2l6ZSBjaGFuZ2VkIiwgc2l6ZSwgY29sbGVjdGlvbi5zaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydCB0aGF0IHRoZSBzcGVjaWZpZWQgQ29uc3RyYWludEZpbmRlciBwcm92aWRlcyBjb25zdHJhaW50cyBvZiBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCi0gICAgICogQHBhcmFtIGNvbnN0cmFpbnRGaW5kZXIKLSAgICAgKiBAcGFyYW0gdHlwZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Q29uc3RyYWludFR5cGVzRm91bmQoQ29uc3RyYWludEZpbmRlciBjb25zdHJhaW50RmluZGVyLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4uLi4gdHlwZXMpIHsKLSAgICAgICAgb3V0ZXI6IGZvciAoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgZm9yIChDb25zdHJhaW50RGVzY3JpcHRvcjw/PiBkZXNjcmlwdG9yIDogY29uc3RyYWludEZpbmRlci5nZXRDb25zdHJhaW50RGVzY3JpcHRvcnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldEFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbChTdHJpbmcuZm9ybWF0KCJNaXNzaW5nIGV4cGVjdGVkIGNvbnN0cmFpbnQgZGVzY3JpcHRvciBvZiB0eXBlICVzIiwgdHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9UZXN0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvVGVzdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWY1ZWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9UZXN0Q29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuRGVmYXVsdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGV4dGVuZHMgRGVmYXVsdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvVGVzdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YSBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2pzcjMwMy94bWwvVGVzdE1lc3NhZ2VJbnRlcnBvbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0NDE4YS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL1Rlc3RNZXNzYWdlSW50ZXJwb2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkRlZmF1bHRNZXNzYWdlSW50ZXJwb2xhdG9yOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE1lc3NhZ2VJbnRlcnBvbGF0b3IgZXh0ZW5kcyBEZWZhdWx0TWVzc2FnZUludGVycG9sYXRvciB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL1ZhbGlkYXRpb25QYXJzZXJUZXN0LmphdmEgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9qc3IzMDMveG1sL1ZhbGlkYXRpb25QYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTNiNzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvanNyMzAzL3htbC9WYWxpZGF0aW9uUGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLnhtbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuanNyMzAzLkNvbmZpZ3VyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuZXhhbXBsZS5YbWxFbnRpdHlTYW1wbGVCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5qc3IzMDMucmVzb2x2ZXIuU2ltcGxlVHJhdmVyc2FibGVSZXNvbHZlcjsKLQotaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uKjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVmFsaWRhdGlvblBhcnNlciBUZXN0ZXIuCi0gKgotICogQGF1dGhvciA8QXV0aG9ycyBuYW1lPgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgPHByZT4xMS8yNS8yMDA5PC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlCi0gICAgICBpbXBsZW1lbnRzIEFwYWNoZVZhbGlkYXRvckNvbmZpZ3VyYXRpb24uUHJvcGVydGllcyB7Ci0gICAgcHVibGljIFZhbGlkYXRpb25QYXJzZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFZhbGlkYXRpb25QYXJzZXIgdnAgPSBuZXcgVmFsaWRhdGlvblBhcnNlcigic2FtcGxlLXZhbGlkYXRpb24ueG1sIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodnAuZ2V0SW5wdXRTdHJlYW0oInNhbXBsZS12YWxpZGF0aW9uLnhtbCIpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdnAuZ2V0SW5wdXRTdHJlYW0oIk1FVEEtSU5GL01BTklGRVNULk1GIik7IC8vIHRoaXMgaXMgYXZhaWxhYmxlIGluIG11bHRpcGxlIGphcnMgaG9wZWZ1bGx5Ci0gICAgICAgICAgICBmYWlsKCJleGNlcHRpb24gbm90IHRocm93biIpOwotICAgICAgICB9IGNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gdmV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHZleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiTW9yZSB0aGFuICIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZSgpIHsKLSAgICAgICAgVmFsaWRhdGlvblBhcnNlciB2cCA9IG5ldyBWYWxpZGF0aW9uUGFyc2VyKCJzYW1wbGUtdmFsaWRhdGlvbi54bWwiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkltcGwgY29uZmlnID0KLSAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb25JbXBsKG51bGwsIG5ldyBBcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXIoKSk7Ci0gICAgICAgIHZwLnByb2Nlc3NWYWxpZGF0aW9uQ29uZmlnKGNvbmZpZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUZyb21YbWwoKSB7Ci0gICAgICAgIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5LmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSBpbnN0YW5jZW9mIFRlc3RNZXNzYWdlSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5Ci0gICAgICAgICAgICAgIC5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIGluc3RhbmNlb2YgVGVzdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5LmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSBpbnN0YW5jZW9mIFNpbXBsZVRyYXZlcnNhYmxlUmVzb2x2ZXIpOwotICAgICAgICBWYWxpZGF0b3IgdmFsaWRhdG9yID0gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgVmFsaWRhdG9yRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotICAgICAgICBBcGFjaGVWYWxpZGF0b3JDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0gICAgICAgICAgICAgIFZhbGlkYXRpb24uYnlQcm92aWRlcihBcGFjaGVWYWxpZGF0aW9uUHJvdmlkZXIuY2xhc3MpLmNvbmZpZ3VyZSgpOwotICAgICAgICBjb25maWcuYWRkUHJvcGVydHkoVkFMSURBVElPTl9YTUxfUEFUSCwgInNhbXBsZS12YWxpZGF0aW9uLnhtbCIpOwotICAgICAgICByZXR1cm4gY29uZmlnLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxFbnRpdHlTYW1wbGUoKSB7Ci0gICAgICAgIFhtbEVudGl0eVNhbXBsZUJlYW4gYmVhbiA9IG5ldyBYbWxFbnRpdHlTYW1wbGVCZWFuKCk7Ci0gICAgICAgIGJlYW4uc2V0Rmlyc3ROYW1lKCJ0b29vb29vb29vb29vb29vb29vb29vb29vb29vIGxvbmciKTsKLSAgICAgICAgYmVhbi5zZXRWYWx1ZUNvZGUoImlsbGVnYWwiKTsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGdldEZhY3RvcnkoKS5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248WG1sRW50aXR5U2FtcGxlQmVhbj4+IHJlc3VsdHMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhbik7Ci0gICAgICAgIGFzc2VydFRydWUoIXJlc3VsdHMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLnNpemUoKSA9PSAzKTsKLQotICAgICAgICBiZWFuLnNldFppcENvZGUoIjEyMyIpOwotICAgICAgICBiZWFuLnNldFZhbHVlQ29kZSgiMjAiKTsKLSAgICAgICAgYmVhbi5zZXRGaXJzdE5hbWUoInZhbGlkIik7Ci0gICAgICAgIHJlc3VsdHMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhbik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0cy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsaWRhdGlvblBhcnNlclRlc3QuY2xhc3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L3Jlc291cmNlcy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L3Jlc291cmNlcy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkMjY5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9yZXNvdXJjZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIHN0YW5kYXJkIG1lc3NhZ2VzCi1qYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm4ubWVzc2FnZT1tdXN0IG1hdGNoICJ7cmVnZXhwfSIKLQotIyBjdXN0b20gbWVzc2FnZXMgKGV4YW1wbGVzKSBmb3IgdmFsaWRhdGlvbi1hcGktMS4wLkJldGE0Ci10ZXN0LnZhbGlkYXRvci5jcmVkaXRjYXJkPWNyZWRpdCBjYXJkIGlzIG5vdCB2YWxpZAotCi0jIGN1c3RvbSBtZXNzYWdlcyAoZXhhbXBsZXMpIGZvciB2YWxpZGF0aW9uLWFwaS0xLjAuQ1IxCi12YWxpZGF0b3IuY3JlZGl0Y2FyZD1jcmVkaXQgY2FyZCBpcyBub3QgdmFsaWQKLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmEucG9saWN5IGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvcmVzb3VyY2VzL2phdmEucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJiMzQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwtanNyMzAzL3NyYy90ZXN0L3Jlc291cmNlcy9qYXZhLnBvbGljeQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vDQotLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotLy8gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotLy8gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLS8vIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotLy8gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0vLyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLS8vDQotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLS8vDQotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS8vDQotDQotLy8NCi0vLyAkSWQkDQotLy8NCi0vLyBBbGxvd3MgdW5pdCB0ZXN0cyB0byBydW4gd2l0aCBhIEphdmEgU2VjdXJpdHkgTWFuYWdlcg0KLS8vDQotLy8gQ2xvbmVkIGZyb20gaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvY29tbW9ucy9wcm9wZXIvbGFuZy90cnVuay9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YS5wb2xpY3kNCi0vLw0KLS8vIDxhcmdMaW5lPi1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvamF2YS5wb2xpY3k8L2FyZ0xpbmU+DQotLy8NCi0NCi1ncmFudA0KLXsNCi0gIC8vIGxldCBldmVyeW9uZSByZWFkIHRhcmdldCBkaXINCi0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHt1c2VyLmRpcn0vdGFyZ2V0Ly0iLCAicmVhZCI7DQotfTsNCi0NCi0vLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgdGVzdGluZyBpbmZyYXN0cnVjdHVyZSwNCi0vLyBpbmNsdWRpbmcgbWF2ZW47DQotZ3JhbnQgY29kZUJhc2UgImZpbGU6Ly8ke3VzZXIuaG9tZX0vLm0yL3JlcG9zaXRvcnkvb3JnL2FwYWNoZS9tYXZlbi8tIg0KLXsNCi0gIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOw0KLX07DQotDQotLy8ganVuaXQ7DQotZ3JhbnQgY29kZUJhc2UgImZpbGU6Ly8ke3VzZXIuaG9tZX0vLm0yL3JlcG9zaXRvcnkvanVuaXQvLSINCi17DQotICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsNCi19Ow0KLQ0KLS8vIG1vY2tpdG87DQotZ3JhbnQgY29kZUJhc2UgImZpbGU6Ly8ke3VzZXIuaG9tZX0vLm0yL3JlcG9zaXRvcnkvb3JnL21vY2tpdG8vLSINCi17DQotICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsNCi19Ow0KLQ0KLS8vIG9iamVuZXNpcyAodmlhIG1vY2tpdG8pOw0KLWdyYW50IGNvZGVCYXNlICJmaWxlOi8vJHt1c2VyLmhvbWV9Ly5tMi9yZXBvc2l0b3J5L29yZy9vYmplbmVzaXMvLSINCi17DQotICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsNCi19Ow0KLQ0KLS8vIGFuZCBvdXIgb3duIHRlc3RjYXNlcw0KLWdyYW50IGNvZGVCYXNlICJmaWxlOi8vJHt1c2VyLmRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy8tIg0KLXsNCi0gIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOw0KLX07DQotDQotZ3JhbnQgY29kZUJhc2UgImZpbGU6Ly8ke3VzZXIuaG9tZX0vLm0yL3JlcG9zaXRvcnkvb3JnL2FwYWNoZS9idmFsLy0iDQotew0KLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7DQotICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7DQotfTsNCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZTovLyR7dXNlci5kaXJ9L3RhcmdldC9jbGFzc2VzLy0iDQotew0KLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7DQotICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7DQotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7dXNlci5ob21lfS8ubTIvcmVwb3NpdG9yeS8tIiwgInJlYWQiOw0KLX07DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS1jb25zdHJhaW50cy54bWwgYi90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLWNvbnN0cmFpbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNDA1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLWNvbnN0cmFpbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25zdHJhaW50LW1hcHBpbmdzCi0gICAgeG1sbnM9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0KLSAgICAgICAgImh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vbWFwcGluZyB2YWxpZGF0aW9uLW1hcHBpbmctMS4wLnhzZCI+Ci0gIDxkZWZhdWx0LXBhY2thZ2U+b3JnLmFwYWNoZS5idmFsLmpzcjMwMy5leGFtcGxlPC9kZWZhdWx0LXBhY2thZ2U+Ci0KLSAgPGJlYW4gY2xhc3M9IlhtbEVudGl0eVNhbXBsZUJlYW4iIGlnbm9yZS1hbm5vdGF0aW9ucz0iZmFsc2UiPgotICAgIDxjbGFzcyBpZ25vcmUtYW5ub3RhdGlvbnM9InRydWUiLz4KLSAgICA8ZmllbGQgbmFtZT0iemlwQ29kZSI+Ci0gICAgICA8IS0tQEZyZW5jaFppcENvZGUoc2l6ZT0zKS0tPgotICAgICAgPGNvbnN0cmFpbnQgYW5ub3RhdGlvbj0ib3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLkZyZW5jaFppcENvZGUiPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJzaXplIj4KLSAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvZWxlbWVudD4KLSAgICAgIDwvY29uc3RyYWludD4KLQotICAgIDwvZmllbGQ+Ci0gICAgPGZpZWxkIG5hbWU9InZhbHVlQ29kZSI+Ci0gICAgICA8dmFsaWQvPgotICAgICAgPCEtLSBASGFzVmFsdWUoeyAwLCAyMCB9KSAtLT4KLSAgICAgIDxjb25zdHJhaW50IGFubm90YXRpb249Im9yZy5hcGFjaGUuYnZhbC5jb25zdHJhaW50cy5IYXNWYWx1ZSI+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIj4KLSAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgICAgPHZhbHVlPjIwPC92YWx1ZT4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgPC9jb25zdHJhaW50PgotCi0gICAgPC9maWVsZD4KLSAgICA8Z2V0dGVyIG5hbWU9ImZpcnN0TmFtZSI+Ci0gICAgICA8dmFsaWQvPgotICAgICAgPCEtLSBAU2l6ZShtZXNzYWdlPSJTaXplIGlzIGxpbWl0ZWQiLAotICAgICAgICAgICAgICAgICBncm91cHM9e0ZpcnN0LmNsYXNzLCBEZWZhdWx0LmNsYXNzfSwKLSAgICAgICAgICAgICAgICAgbWF4PTEwCi0gICAgICAgICAgICkKLSAgICAgIC0tPgotICAgICAgPGNvbnN0cmFpbnQgYW5ub3RhdGlvbj0iamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplIj4KLSAgICAgICAgPG1lc3NhZ2U+U2l6ZSBpcyBsaW1pdGVkPC9tZXNzYWdlPgotICAgICAgICA8Z3JvdXBzPgotICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmJ2YWwuanNyMzAzLmV4YW1wbGUuRmlyc3Q8L3ZhbHVlPgotICAgICAgICAgIDx2YWx1ZT5qYXZheC52YWxpZGF0aW9uLmdyb3Vwcy5EZWZhdWx0PC92YWx1ZT4KLSAgICAgICAgPC9ncm91cHM+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9Im1heCI+MTA8L2VsZW1lbnQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0KLSAgICA8L2dldHRlcj4KLQotICA8L2JlYW4+Ci0KLSAgPGNvbnN0cmFpbnQtZGVmaW5pdGlvbiBhbm5vdGF0aW9uPSJqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemUiPgotICAgICAgPHZhbGlkYXRlZC1ieSBpbmNsdWRlLWV4aXN0aW5nLXZhbGlkYXRvcnM9ImZhbHNlIj4KLSAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5idmFsLmNvbnN0cmFpbnRzLlNpemVWYWxpZGF0b3JGb3JTdHJpbmc8L3ZhbHVlPgotICAgICAgPC92YWxpZGF0ZWQtYnk+Ci0gIDwvY29uc3RyYWludC1kZWZpbml0aW9uPgotCi08L2NvbnN0cmFpbnQtbWFwcGluZ3M+CmRpZmYgLS1naXQgYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLXZhbGlkYXRpb24ueG1sIGIvdHJ1bmsvYnZhbC1qc3IzMDMvc3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS12YWxpZGF0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwYTUzNS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLWpzcjMwMy9zcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLXZhbGlkYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHZhbGlkYXRpb24tY29uZmlnCi0gICAgeG1sbnM9Imh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vY29uZmlndXJhdGlvbiIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0KLSAgICAgICAgImh0dHA6Ly9qYm9zcy5vcmcveG1sL25zL2phdmF4L3ZhbGlkYXRpb24vY29uZmlndXJhdGlvbiB2YWxpZGF0aW9uLWNvbmZpZ3VyYXRpb24tMS4wLnhzZCI+Ci0gIDxkZWZhdWx0LXByb3ZpZGVyPm9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyPC9kZWZhdWx0LXByb3ZpZGVyPgotICA8bWVzc2FnZS1pbnRlcnBvbGF0b3I+b3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuVGVzdE1lc3NhZ2VJbnRlcnBvbGF0b3I8L21lc3NhZ2UtaW50ZXJwb2xhdG9yPgotICA8dHJhdmVyc2FibGUtcmVzb2x2ZXI+b3JnLmFwYWNoZS5idmFsLmpzcjMwMy5yZXNvbHZlci5TaW1wbGVUcmF2ZXJzYWJsZVJlc29sdmVyPC90cmF2ZXJzYWJsZS1yZXNvbHZlcj4KLSAgPGNvbnN0cmFpbnQtdmFsaWRhdG9yLWZhY3Rvcnk+b3JnLmFwYWNoZS5idmFsLmpzcjMwMy54bWwuVGVzdENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5PC9jb25zdHJhaW50LXZhbGlkYXRvci1mYWN0b3J5PgotICA8Y29uc3RyYWludC1tYXBwaW5nPnNhbXBsZS1jb25zdHJhaW50cy54bWw8L2NvbnN0cmFpbnQtbWFwcGluZz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QtcHJvcCI+dGVzdC1wcm9wLXZhbHVlPC9wcm9wZXJ0eT4KLTwvdmFsaWRhdGlvbi1jb25maWc+CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXRjay9wb20ueG1sIGIvdHJ1bmsvYnZhbC10Y2svcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MTNmZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXRjay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5idmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+YnZhbC10Y2stcnVubmVyPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBCVmFsIDo6IGJ2YWwtdGNrIChUQ0sgUnVubmVyKTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QWdncmVnYXRlcyBkZXBlbmRlbmNpZXMgYW5kIHJ1bnMgdGhlIEpTUi0zMDMgVENLPC9kZXNjcmlwdGlvbj4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5idmFsLmJ1bmRsZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqYm9zcy5ob21lPi9vcHQvamJvc3MtNS4xLjAuR0E8L2pib3NzLmhvbWU+Ci0gICAgICAgIDx2YWxpZGF0aW9uLnByb3ZpZGVyPm9yZy5hcGFjaGUuYnZhbC5qc3IzMDMuQXBhY2hlVmFsaWRhdGlvblByb3ZpZGVyPC92YWxpZGF0aW9uLnByb3ZpZGVyPgotICAgICAgICA8cmVtb3RlLmRlYnVnIC8+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRG9uJ3QgcHVibGlzaCB0aGVzZSBhcnRpZmFjdHMgdG8gY2VudHJhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmluZGJ1Z3MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4ncyBjb25maWd1cmF0aW9uIGlzIHVzZWQgdG8gc3RvcmUgRWNsaXBzZSBtMmUgc2V0dGluZ3Mgb25seS4gSXQgaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGUgTWF2ZW4gYnVpbGQgaXRzZWxmLi0tPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm0yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uRmlsdGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uUmFuZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyLjEsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyc2lvblJhbmdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZ25vcmUgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgPC9idWlsZD4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+dGNrPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+dGNrPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDwhLS0gVXNlIHRoZSBnZXJvbmltby12YWxpZGF0aW9uIHNwZWMgaW5zdGVhZAotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC52YWxpZGF0aW9uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXZhbGlkYXRpb25fMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcudGVzdG5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0bmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmpkazE1PC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj41Ljg8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlLmpzcjMwMy50Y2s8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjMwMy10Y2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC42LkdBPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLnRlc3QtaGFybmVzczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amJvc3MtdGVzdC1oYXJuZXNzLWpib3NzLWFzLTUxPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgb3V0ZGF0ZWQgVVJMcyBmb3IgamJvc3MgcmVwbyBpZHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5yZXBvc2l0b3J5Lmpib3NzLm9yZzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkpCb3NzIFB1YmxpYyBNYXZlbiBSZXBvc2l0b3J5IEdyb3VwPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHBzOi8vcmVwb3NpdG9yeS5qYm9zcy5vcmcvbmV4dXMvY29udGVudC9ncm91cHMvcHVibGljLzwvdXJsPgotICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmRlZmF1bHQ8L2xheW91dD4KLSAgICAgICAgICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx1cGRhdGVQb2xpY3k+bmV2ZXI8L3VwZGF0ZVBvbGljeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjaGVja3N1bVBvbGljeT5mYWlsPC9jaGVja3N1bVBvbGljeT4KLSAgICAgICAgICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5uZXZlcjwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrc3VtUG9saWN5Pndhcm48L2NoZWNrc3VtUG9saWN5PgotICAgICAgICAgICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYm9zczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkpCb3NzIFB1YmxpYyBNYXZlbiBSZXBvc2l0b3J5IEdyb3VwIChhZ2Fpbik8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5Lmpib3NzLm9yZy9uZXh1cy9jb250ZW50L2dyb3Vwcy9wdWJsaWMvPC91cmw+Ci0gICAgICAgICAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5uZXZlcjwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGNoZWNrc3VtUG9saWN5PmZhaWw8L2NoZWNrc3VtUG9saWN5PgotICAgICAgICAgICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dXBkYXRlUG9saWN5Pm5ldmVyPC91cGRhdGVQb2xpY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y2hlY2tzdW1Qb2xpY3k+d2FybjwvY2hlY2tzdW1Qb2xpY3k+Ci0gICAgICAgICAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgIDxpZD5zbmFwc2hvdHMuamJvc3Mub3JnPC9pZD4KLSAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5Lmpib3NzLm9yZy9uZXh1cy9jb250ZW50L3JlcG9zaXRvcmllcy9zbmFwc2hvdHMvPC91cmw+Ci0gICAgICAgICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgICAgPGlkPmpib3NzLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICAgICAgICA8dXJsPmh0dHBzOi8vcmVwb3NpdG9yeS5qYm9zcy5vcmcvbmV4dXMvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzLzwvdXJsPgotICAgICAgICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICAgICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDwvcmVwb3NpdG9yaWVzPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpcFZlcnNpb24+dHJ1ZTwvc3RyaXBWZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZS5qc3IzMDMudGNrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDMtdGNrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT54bWw8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPnN1aXRlPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlPmZhbHNlPC9vdmVyV3JpdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB1c2UgZ2Vyb25pbW8tdmFsaWRhdGlvbiBzcGVjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGU+dHJ1ZTwvb3ZlcldyaXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdmFsaWRhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT50cnVlPC9vdmVyV3JpdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJ2YWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuYnZhbC5idW5kbGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZT50cnVlPC9vdmVyV3JpdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGU+dHJ1ZTwvb3ZlcldyaXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1iZWFudXRpbHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtYmVhbnV0aWxzLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGU+dHJ1ZTwvb3ZlcldyaXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SXRlbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy54c3RyZWFtPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54c3RyZWFtPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlPnRydWU8L292ZXJXcml0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kZXBlbmRlbmN5L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWZhY3RJdGVtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdEl0ZW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1aXRlWG1sRmlsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWl0ZVhtbEZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS9qc3IzMDMtdGNrLXN1aXRlLnhtbDwvc3VpdGVYbWxGaWxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VpdGVYbWxGaWxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ya01vZGU+b25jZTwvZm9ya01vZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnZhbGlkYXRpb24ucHJvdmlkZXI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHt2YWxpZGF0aW9uLnByb3ZpZGVyfTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1yZXBvcnQ8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlcG9ydC1vbmx5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9zdXJlZmlyZS1yZXBvcnRzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dE5hbWU+dGVzdC1yZXBvcnQ8L291dHB1dE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLQotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5pbmNvbnRhaW5lci1kZWJ1ZzwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlYnVnPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8cmVtb3RlLmRlYnVnPi1Ybm9hZ2VudCAtRGphdmEuY29tcGlsZXI9Tk9ORSAtWGRlYnVnIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDUKLSAgICAgICAgICAgICAgICA8L3JlbW90ZS5kZWJ1Zz4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmluY29udGFpbmVyPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+aW5jb250YWluZXI8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWl0ZVhtbEZpbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VpdGVYbWxGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvanNyMzAzLXRjay1zdWl0ZS54bWw8L3N1aXRlWG1sRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N1aXRlWG1sRmlsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnZhbGlkYXRpb24ucHJvdmlkZXI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHt2YWxpZGF0aW9uLnByb3ZpZGVyfTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5qYm9zcy50ZXN0aGFybmVzcy5zdGFuZGFsb25lPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmZhbHNlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amJvc3MuaG9tZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke2pib3NzLmhvbWV9PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmpib3NzLnRlc3RoYXJuZXNzLmNvbnRhaW5lci5qYXZhT3B0czwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4tWG1zMTI4bSAtWG14NTEybSAtWFg6TWF4UGVybVNpemU9MjU2bSAtRG9yZy5qYm9zcy5yZXNvbHZlci53YXJuaW5nPXRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRHZhbGlkYXRpb24ucHJvdmlkZXI9JHt2YWxpZGF0aW9uLnByb3ZpZGVyfSAke3JlbW90ZS5kZWJ1Z30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5qYm9zcy50ZXN0aGFybmVzcy5jb250YWluZXIuZm9yY2VSZXN0YXJ0PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuamJvc3MudGVzdGhhcm5lc3MucnVuSW50ZWdyYXRpb25UZXN0czwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmpib3NzLnRlc3RoYXJuZXNzLmxpYnJhcnlEaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dGFyZ2V0L2RlcGVuZGVuY3kvbGliPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmpib3NzLnRlc3RoYXJuZXNzLm91dHB1dERpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50YXJnZXQ8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPndyaXRlLWFydGlmYWN0cy10by1kaXNrPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZHVtcEFydGlmYWN0czwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1qc3ItMzAzLWFydGlmYWN0czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aFNjb3BlPnRlc3Q8L2NsYXNzcGF0aFNjb3BlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmpib3NzLnRlc3RoYXJuZXNzLmFwaS5UQ0s8L21haW5DbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGtleT5kdW1wQXJ0aWZhY3RzPC9rZXk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxrZXk+b3JnLmpib3NzLnRlc3RoYXJuZXNzLm91dHB1dERpcmVjdG9yeTwva2V5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRhcmdldC9qc3IzMDMtYXJ0aWZhY3RzPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGtleT5vcmcuamJvc3MudGVzdGhhcm5lc3MubGlicmFyeURpcmVjdG9yeTwva2V5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRhcmdldC9qc3IzMDMtYXJ0aWZhY3RzL2RlcGVuZGVuY2llczwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90cnVuay9idmFsLXRjay9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvamJvc3MtdGVzdC1oYXJuZXNzLnByb3BlcnRpZXMgYi90cnVuay9idmFsLXRjay9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvamJvc3MtdGVzdC1oYXJuZXNzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWE1ZGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC10Y2svc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2pib3NzLXRlc3QtaGFybmVzcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLW9yZy5qYm9zcy50ZXN0aGFybmVzcy5zcGkuU3RhbmRhbG9uZUNvbnRhaW5lcnM9b3JnLmhpYmVybmF0ZS5qc3IzMDMudGNrLnV0aWwuU3RhbmRhbG9uZUNvbnRhaW5lcnNJbXBsCi1vcmcuamJvc3MudGVzdGhhcm5lc3MuYXBpLlRlc3RMYXVuY2hlcj1vcmcuamJvc3MudGVzdGhhcm5lc3MuaW1wbC5ydW5uZXIuc2VydmxldC5TZXJ2bGV0VGVzdExhdW5jaGVyCi1vcmcuamJvc3MudGVzdGhhcm5lc3MudGVzdFBhY2thZ2U9b3JnLmhpYmVybmF0ZS5qc3IzMDMudGNrLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC10Y2svc3JjL3Rlc3QvcmVzb3VyY2VzL2puZGkucHJvcGVydGllcyBiL3RydW5rL2J2YWwtdGNrL3NyYy90ZXN0L3Jlc291cmNlcy9qbmRpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzI0NmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC10Y2svc3JjL3Rlc3QvcmVzb3VyY2VzL2puZGkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jamJvc3MgSk5ESSBwcm9wZXJ0aWVzCi1qYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWw9b3JnLmpucC5pbnRlcmZhY2VzLk5hbWluZ0NvbnRleHRGYWN0b3J5Ci1qYXZhLm5hbWluZy5wcm92aWRlci51cmw9am5wOi8vbG9jYWxob3N0OjEwOTkKLWphdmEubmFtaW5nLmZhY3RvcnkudXJsLnBrZ3M9b3JnLmpib3NzLm5hbWluZzpvcmcuam5wLmludGVyZmFjZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLXRjay9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoueG1sIGIvdHJ1bmsvYnZhbC10Y2svc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlMDFhYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXRjay9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgbG9nNGo6Y29uZmlndXJhdGlvbiBTWVNURU0gImxvZzRqLmR0ZCI+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsb2c0ajpjb25maWd1cmF0aW9uIHhtbG5zOmxvZzRqPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2xvZzRqLyIgZGVidWc9ImZhbHNlIj4KLQotICAgIDxhcHBlbmRlciBuYW1lPSJDT05TT0xFIiBjbGFzcz0ib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiPgotICAgICAgICA8cGFyYW0gbmFtZT0iVGFyZ2V0IiB2YWx1ZT0iU3lzdGVtLm91dCIvPgotICAgICAgICA8bGF5b3V0IGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiPgotICAgICAgICAgICAgPCEtLSBUaGUgZGVmYXVsdCBwYXR0ZXJuOiBEYXRlIFByaW9yaXR5IFtDYXRlZ29yeV0gTWVzc2FnZVxuIC0tPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9IkNvbnZlcnNpb25QYXR0ZXJuIiB2YWx1ZT0iJWR7QUJTT0xVVEV9ICUtNXAgWyVjezJ9XSAlbSVuIi8+Ci0gICAgICAgIDwvbGF5b3V0PgotICAgICAgICA8ZmlsdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnZhcmlhLlN0cmluZ01hdGNoRmlsdGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJBY2NlcHRPbk1hdGNoIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJTdHJpbmdUb01hdGNoIiB2YWx1ZT0iRmFpbHVyZSB3aGlsZSBub3RpZnlpbmcgYW4gb2JzZXJ2ZXIgb2YgZXZlbnQgW2FdIi8+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgICAgICA8ZmlsdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmxvZzRqLnZhcmlhLlN0cmluZ01hdGNoRmlsdGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJBY2NlcHRPbk1hdGNoIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJTdHJpbmdUb01hdGNoIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJFcnJvciBkZXN0cm95aW5nIFJlcXVlc3Qgc2NvcGVkIHVubmFtZWQgc2ltcGxlIGJlYW4gb3JnLmpib3NzLmpzcjI5OS50Y2sudGVzdHMuaW1wbGVtZW50YXRpb24uc2ltcGxlLmxpZmVjeWNsZS5Db2QiLz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9hcHBlbmRlcj4KLQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIENhdGVnb3JpZXMgIyMjIyMjIyMjIyMjIyMjIyMgIC0tPgotICAgIDxjYXRlZ29yeSBuYW1lPSJvcmcuYXBhY2hlIj4KLSAgICAgICAgPHByaW9yaXR5IHZhbHVlPSJJTkZPIi8+Ci0gICAgPC9jYXRlZ29yeT4KLQotICAgIDxjYXRlZ29yeSBuYW1lPSJvcmcuaGliZXJuYXRlIj4KLSAgICAgICAgPHByaW9yaXR5IHZhbHVlPSJJTkZPIi8+Ci0gICAgPC9jYXRlZ29yeT4KLQotICAgIDxjYXRlZ29yeSBuYW1lPSJvcmcuamJvc3MudGVzdGhhcm5lc3MiPgotICAgICAgICA8cHJpb3JpdHkgdmFsdWU9IklORk8iLz4KLSAgICA8L2NhdGVnb3J5PgotCi0gICAgPHJvb3Q+Ci0gICAgICAgIDxwcmlvcml0eSB2YWx1ZT0iSU5GTyIvPgotICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iQ09OU09MRSIvPgotICAgIDwvcm9vdD4KLQotPC9sb2c0ajpjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL2ZpbmRidWdzLWV4Y2x1ZGUtZmlsdGVyLnhtbCBiL3RydW5rL2J2YWwteHN0cmVhbS9maW5kYnVncy1leGNsdWRlLWZpbHRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjQxYjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL2ZpbmRidWdzLWV4Y2x1ZGUtZmlsdGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tCi0gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGZhbHNlIHBvc2l0aXZlIGJ1Z3MgZGV0ZWN0ZWQgYnkgZmluZGJ1Z3MuIFRoZWlyCi0gIGZhbHNlIHBvc2l0aXZlIG5hdHVyZSBoYXMgYmVlbiBhbmFseXplZCBpbmRpdmlkdWFsbHkgYW5kIHRoZXkgaGF2ZSBiZWVuCi0gIHB1dCBoZXJlIHRvIGluc3RydWN0IGZpbmRidWdzIGl0IG11c3QgaWdub3JlIHRoZW0uCi0tLT4KLTxGaW5kQnVnc0ZpbHRlcj4KLSAgPCEtLSBub3QgYSBwcm9ibGVtIC0tPgotICA8TWF0Y2g+Ci0gICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUuYnZhbC54bWwuWE1MTWV0YUJlYW5NYW5hZ2VyIiAvPgotICAgIDxNZXRob2QgbmFtZT0iY29tcHV0ZVJlbGF0ZWRNZXRhQmVhbiIgcGFyYW1zPSJvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5LGphdmEubGFuZy5TdHJpbmciIHJldHVybnM9InZvaWQiIC8+Ci0gICAgPEJ1ZyBwYXR0ZXJuPSJOUF9MT0FEX09GX0tOT1dOX05VTExfVkFMVUUiIC8+Ci0gIDwvTWF0Y2g+Ci08L0ZpbmRCdWdzRmlsdGVyPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3BvbS54bWwgYi90cnVuay9idmFsLXhzdHJlYW0vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NmE1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tCi0JTWF2ZW4gcmVsZWFzZSBwbHVnaW4gcmVxdWlyZXMgdGhlIHByb2plY3QgdGFnIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5idmFsLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4wLjQ8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxhcnRpZmFjdElkPmJ2YWwteHN0cmVhbTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+QXBhY2hlIEJWYWwgOjogYnZhbC14c3RyZWFtIChvcHRpb25hbCk8L25hbWU+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgPGRlc2NyaXB0aW9uPkJWYWwgWE1MIE1ldGFkYXRhIHdpdGggWFN0cmVhbTwvZGVzY3JpcHRpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYnZhbDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmJ2YWwtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20udGhvdWdodHdvcmtzLnhzdHJlYW08L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD54c3RyZWFtPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tIFRlc3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c2xmNGotc2ltcGxlPC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpjbC1vdmVyLXNsZjRqPC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8IS0tIGNyZWF0ZSBtYWluQ2xhc3MgYXR0cmlidXRlIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmRlZmF1bHQtamFyPC9pZD4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUuYnZhbC51dGlsLkJWYWxWZXJzaW9uPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLXRlc3RzPC9pZD4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGV4Y2x1ZGVGaWx0ZXJGaWxlPmZpbmRidWdzLWV4Y2x1ZGUtZmlsdGVyLnhtbDwvZXhjbHVkZUZpbHRlckZpbGU+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL0VNYWlsVmFsaWRhdGlvbi5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL0VNYWlsVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNGY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9yb3V0aW5lcy9FTWFpbFZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogZXhhbXBsZSB2YWxpZGF0aW9uIGZvciBlbWFpbCBhZGRyZXNzZXMgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb248YnIvPgotICovCi1wdWJsaWMgY2xhc3MgRU1haWxWYWxpZGF0aW9uIGltcGxlbWVudHMgVmFsaWRhdGlvbiB7Ci0KLSAgICBwcml2YXRlIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuIHBhdHRlcm4gPSBFTWFpbFZhbGlkYXRpb25VdGlscy5ERUZBVUxUX0VNQUlMX1BBVFRFUk47Ci0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGUoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXRQcm9wZXJ0eVZhbHVlKCkgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBpZiAoIUVNYWlsVmFsaWRhdGlvblV0aWxzLmlzVmFsaWQoY29udGV4dC5nZXRQcm9wZXJ0eVZhbHVlKCksIGdldFBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0TGlzdGVuZXIoKS5hZGRFcnJvcihSZWFzb25zLkVNQUlMX0FERFJFU1MsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBhdHRlcm4gZ2V0UGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHBhdHRlcm47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihQYXR0ZXJuIHBhdHRlcm4pIHsKLSAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9yb3V0aW5lcy9OT1BWYWxpZGF0aW9uLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvTk9QVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYzZTNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9yb3V0aW5lcy9OT1BWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwucm91dGluZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogRE8gTk9USElORyBWQUxJREFUSU9OIChjYW4gYmUgdXNlZCB0byB0dXJuIG9mZiBzdGFuZGFyZCB2YWxpZGF0aW9uKTxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOT1BWYWxpZGF0aW9uIGltcGxlbWVudHMgVmFsaWRhdGlvbiB7Ci0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGUoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL1JlYXNvbnMuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC9yb3V0aW5lcy9SZWFzb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzA4MWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL1JlYXNvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlczsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogU3RhbmRhcmRSZWFzb25zIGZvciB2YWxpZGF0aW9uIGVycm9ycyBmb3VuZCBpbgotICoge0BsaW5rIG9yZy5hcGFjaGUuYnZhbC5WYWxpZGF0aW9uUmVzdWx0c308YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYXNvbnMgZXh0ZW5kcyBGZWF0dXJlcy5Qcm9wZXJ0eSB7Ci0gICAgLy8gVGhlIHJlYXNvbnMgaW5oZXJpdGVkIGZyb20gRmVhdHVyZXMgYXJlIFZBTElEQVRJT04gZmVhdHVyZXMgb25seS4KLSAgICAvLyBJTkZPIGZlYXR1cmVzIGFyZSBub3QgbWVhbnQgdG8gYmUgdmFsaWRhdGVkLgotCi0gICAgLy8gQWRkIG1vcmUgcmVhc29ucyBoZXJlLgotICAgIFN0cmluZyBFTUFJTF9BRERSRVNTID0gImVtYWlsQWRkcmVzcyI7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvU3RhbmRhcmRWYWxpZGF0aW9uLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvU3RhbmRhcmRWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OGYzYjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL1N0YW5kYXJkVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMuUHJvcGVydHkuTUFOREFUT1JZOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMuUHJvcGVydHkuTUFYX0xFTkdUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzLlByb3BlcnR5Lk1BWF9WQUxVRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzLlByb3BlcnR5Lk1JTl9MRU5HVEg7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eS5NSU5fVkFMVUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eS5SRUdfRVhQOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMuUHJvcGVydHkuVElNRV9MQUc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuVmFsaWRhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC54bWwuWE1MTWV0YVZhbHVlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIHZhbGlkYXRpb25zIGZvciBwcm9wZXJ0aWVzIQotICogWW91IGNhbiBzdWJjbGFzcyB0aGlzIGNsYXNzIGFuZCByZXBsYWNlIHRoZSBpbXBsZW1lbnRhdGlvbgotICogaW4gdGhlIGJlYW5JbmZvLXhtbCBieSBwcm92aWRpbmcgaXQgYSB2YWxpZGF0aW9uICJzdGFuZGFyZCI8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRWYWxpZGF0aW9uIGltcGxlbWVudHMgVmFsaWRhdGlvbiB7Ci0KLSAgICAvKioga2V5IGZvciB0aGlzIHZhbGlkYXRpb24gaW4gdGhlIHZhbGlkYXRpb24gbGlzdCBvZiB0aGUgYmVhbkluZm9zICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiAic3RhbmRhcmQiOwotICAgIH0KLQotICAgIHB1YmxpYyA8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZShWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0KSB7Ci0gICAgICAgIHZhbGlkYXRlTWFuZGF0b3J5KGNvbnRleHQpOwotICAgICAgICB2YWxpZGF0ZU1heExlbmd0aChjb250ZXh0KTsKLSAgICAgICAgdmFsaWRhdGVNaW5MZW5ndGgoY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlTWF4VmFsdWUoY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlTWluVmFsdWUoY29udGV4dCk7Ci0gICAgICAgIHZhbGlkYXRlUmVnRXhwKGNvbnRleHQpOwotICAgICAgICB2YWxpZGF0ZVRpbWVMYWcoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIHZhbGlkYXRlVGltZUxhZyhWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBsYWcgPSAoU3RyaW5nKSBjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpLmdldEZlYXR1cmUoVElNRV9MQUcpOwotICAgICAgICBpZiAobGFnID09IG51bGwpIHJldHVybjsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbG9uZyBkYXRlID0gKChEYXRlKSBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKSkuZ2V0VGltZSgpOwotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAoWE1MTWV0YVZhbHVlLlRJTUVMQUdfRnV0dXJlLmVxdWFscyhsYWcpKSB7Ci0gICAgICAgICAgICBpZiAoZGF0ZSA8IG5vdykgewotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TGlzdGVuZXIoKS5hZGRFcnJvcihUSU1FX0xBRywgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoWE1MTWV0YVZhbHVlLlRJTUVMQUdfUGFzdC5lcXVhbHMobGFnKSkgewotICAgICAgICAgICAgaWYgKGRhdGUgPiBub3cpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldExpc3RlbmVyKCkuYWRkRXJyb3IoVElNRV9MQUcsIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB0aW1lbGFnICIgKyBsYWcgKyAiIGF0ICIgKyBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdfRVhQX1BBVFRFUk4gPSAiY2FjaGVkUmVnRXhwUGF0dGVybiI7Ci0KLSAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVSZWdFeHAoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBmaW5hbCBNZXRhUHJvcGVydHkgbWV0YSA9IGNvbnRleHQuZ2V0TWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByZWdFeHAgPSAoU3RyaW5nKSBtZXRhLmdldEZlYXR1cmUoUkVHX0VYUCk7Ci0gICAgICAgIGlmIChyZWdFeHAgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBpZiAoY29udGV4dC5nZXRQcm9wZXJ0eVZhbHVlKCkgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IChQYXR0ZXJuKSBtZXRhLmdldEZlYXR1cmUoUkVHX0VYUF9QQVRURVJOKTsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHJlZ0V4cCk7Ci0gICAgICAgICAgICAgICAgbWV0YS5wdXRGZWF0dXJlKFJFR19FWFBfUEFUVEVSTiwgcGF0dGVybik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhdHRlcm4ubWF0Y2hlcih2YWx1ZSkubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRMaXN0ZW5lcigpLmFkZEVycm9yKFJFR19FWFAsIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIG1hbGZvcm1lZC4gcmVnZXhwICIgKyByZWdFeHAgKyAiIGF0ICIgKyBjb250ZXh0LCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZU1pblZhbHVlKFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIENvbXBhcmFibGU8T2JqZWN0PiBtaW5WYWx1ZSA9IChDb21wYXJhYmxlPE9iamVjdD4pIGNvbnRleHQuZ2V0TWV0YVByb3BlcnR5KCkuZ2V0RmVhdHVyZShNSU5fVkFMVUUpOwotICAgICAgICBpZiAobWluVmFsdWUgPT0gbnVsbCB8fCBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGlmIChjb21wYXJlKGNvbnRleHQsIG1pblZhbHVlLCBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKSkgPiAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldExpc3RlbmVyKCkuYWRkRXJyb3IoTUlOX1ZBTFVFLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIFZhbGlkYXRpb25MaXN0ZW5lcj4gdm9pZCB2YWxpZGF0ZU1heFZhbHVlKFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIENvbXBhcmFibGU8T2JqZWN0PiBtYXhWYWx1ZSA9IChDb21wYXJhYmxlPE9iamVjdD4pIGNvbnRleHQuZ2V0TWV0YVByb3BlcnR5KCkuZ2V0RmVhdHVyZShNQVhfVkFMVUUpOwotICAgICAgICBpZiAobWF4VmFsdWUgPT0gbnVsbCB8fCBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGlmIChjb21wYXJlKGNvbnRleHQsIG1heFZhbHVlLCBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKSkgPCAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldExpc3RlbmVyKCkuYWRkRXJyb3IoTUFYX1ZBTFVFLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IGludCBjb21wYXJlKFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQsIENvbXBhcmFibGU8T2JqZWN0PiBjb25zdHJhaW50VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY3VycmVudFZhbHVlKSB7Ci0gICAgICAgIGludCByOwotICAgICAgICBpZiAoY29uc3RyYWludFZhbHVlLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShjdXJyZW50VmFsdWUuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHIgPSBjb25zdHJhaW50VmFsdWUuY29tcGFyZVRvKGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgIGRvdWJsZSBkdiA9ICgoTnVtYmVyKSBjdXJyZW50VmFsdWUpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWR2ID0gKChOdW1iZXIpIGNvbnN0cmFpbnRWYWx1ZSkuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIHIgPSBtZHYgPiBkdiA/IDEgOiAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIgPSBTdHJpbmcudmFsdWVPZihjb25zdHJhaW50VmFsdWUpLmNvbXBhcmVUbyhTdHJpbmcudmFsdWVPZihjdXJyZW50VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVNYXhMZW5ndGgoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBJbnRlZ2VyIG1heExlbmd0aCA9IChJbnRlZ2VyKSBjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpCi0gICAgICAgICAgICAgIC5nZXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5Lk1BWF9MRU5HVEgpOwotICAgICAgICBpZiAobWF4TGVuZ3RoID09IG51bGwpIHJldHVybjsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgbGVuZ3RoID0gKChTdHJpbmcpIHZhbHVlKS5sZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoQ29sbGVjdGlvbjw/PikgdmFsdWUpLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuZ3RoID4gbWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldExpc3RlbmVyKCkuYWRkRXJyb3IoTUFYX0xFTkdUSCwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVNaW5MZW5ndGgoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBJbnRlZ2VyIG1heExlbmd0aCA9IChJbnRlZ2VyKSBjb250ZXh0LmdldE1ldGFQcm9wZXJ0eSgpCi0gICAgICAgICAgICAgIC5nZXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5Lk1JTl9MRU5HVEgpOwotICAgICAgICBpZiAobWF4TGVuZ3RoID09IG51bGwpIHJldHVybjsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0UHJvcGVydHlWYWx1ZSgpID09IG51bGwpIHJldHVybjsKLQotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBjb250ZXh0LmdldFByb3BlcnR5VmFsdWUoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgbGVuZ3RoID0gKChTdHJpbmcpIHZhbHVlKS5sZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoQ29sbGVjdGlvbjw/PikgdmFsdWUpLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuZ3RoIDwgbWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250ZXh0LmdldExpc3RlbmVyKCkuYWRkRXJyb3IoTUlOX0xFTkdUSCwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgdmFsaWRhdGVNYW5kYXRvcnkoVmFsaWRhdGlvbkNvbnRleHQ8VD4gY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXRNZXRhUHJvcGVydHkoKS5pc01hbmRhdG9yeSgpKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQcm9wZXJ0eVZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TGlzdGVuZXIoKS5hZGRFcnJvcihNQU5EQVRPUlksIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGFuZGFyZFZhbGlkYXRpb24gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhbmRhcmRWYWxpZGF0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9NZXRhQmVhbkVucmljaGVyLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL01ldGFCZWFuRW5yaWNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MzhiMy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL01ldGFCZWFuRW5yaWNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IEludGVyZmFjZSB0byBtZXJnZSBtZXRhIGJlYW5zPGJyLz4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhQmVhbkVucmljaGVyIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbmZvcyAtIHRoZSBwYXRjaGVzIHRvIGFwcGx5Ci0gICAgICogQHJldHVybiBhbGwgTWV0YUJlYW5zIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBhIHhtbCBkZXNjcmlwdG9yIGFuZAotICAgICAqICAgICAgICAgYWRkaXRpb25hbCB0aGUgTWV0YUJlYW5zIGxvYWRlZCBieSB0aGUgZ2l2ZW4gbG9hZGVycy4KLSAgICAgKiAgICAgICAgIFRoZSBnaXZlbiBsb2FkZXJzIG1heSBhbHNvIHJldHVybiBwYXRjaGVzIGZvciBNZXRhQmVhbnMgdGhhdCBoYXZlCi0gICAgICogICAgICAgICBhbHNvIGJlZW4gcmV0dXJuZWQgYnkgb3RoZXIgbG9hZGVycy4gVGhlIGJlYW5zIHdpdGggcGF0Y2hlcyBmb3IKLSAgICAgKiAgICAgICAgIHJlZmVyZW5jZXMgdG8gcGF0Y2hlZCBiZWFucyB3aWxsIGJlIGNvcGllZC4KLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBNZXRhQmVhbj4gZW5yaWNoQ29waWVzKFhNTE1ldGFCZWFuSW5mb3MuLi4gaW5mb3MpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxGZWF0dXJlc0NhcGFibGUuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MRmVhdHVyZXNDYXBhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWJmODguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxGZWF0dXJlc0NhcGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUltcGxpY2l0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlc0NhcGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgWE1MRmVhdHVyZXNDYXBhYmxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAWFN0cmVhbUltcGxpY2l0Ci0gICAgcHJpdmF0ZSBMaXN0PFhNTE1ldGFGZWF0dXJlPiBmZWF0dXJlczsKLSAgICBAWFN0cmVhbUltcGxpY2l0KGl0ZW1GaWVsZE5hbWUgPSAidmFsaWRhdG9yIikKLSAgICBwcml2YXRlIExpc3Q8WE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZT4gdmFsaWRhdG9yczsKLQotICAgIHB1YmxpYyBMaXN0PFhNTE1ldGFGZWF0dXJlPiBnZXRGZWF0dXJlcygpIHsKLSAgICAgICAgcmV0dXJuIGZlYXR1cmVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZlYXR1cmVzKExpc3Q8WE1MTWV0YUZlYXR1cmU+IGZlYXR1cmVzKSB7Ci0gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRGZWF0dXJlKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBYTUxNZXRhRmVhdHVyZSBhbm5vID0gZmluZEZlYXR1cmUoa2V5KTsKLSAgICAgICAgaWYgKGZlYXR1cmVzID09IG51bGwpIGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxYTUxNZXRhRmVhdHVyZT4oKTsKLSAgICAgICAgaWYgKGFubm8gPT0gbnVsbCkgewotICAgICAgICAgICAgZmVhdHVyZXMuYWRkKG5ldyBYTUxNZXRhRmVhdHVyZShrZXksIHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbm5vLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZlYXR1cmUoU3RyaW5nIGtleSkgewotICAgICAgICBYTUxNZXRhRmVhdHVyZSBhbm5vID0gZmluZEZlYXR1cmUoa2V5KTsKLSAgICAgICAgaWYgKGFubm8gIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0RmVhdHVyZXMoKS5yZW1vdmUoYW5ubyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGtleSkgewotICAgICAgICBYTUxNZXRhRmVhdHVyZSBhbm5vID0gZmluZEZlYXR1cmUoa2V5KTsKLSAgICAgICAgcmV0dXJuIGFubm8gPT0gbnVsbCA/IG51bGwgOiBhbm5vLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYTUxNZXRhRmVhdHVyZSBmaW5kRmVhdHVyZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChmZWF0dXJlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgZm9yIChYTUxNZXRhRmVhdHVyZSBhbm5vIDogZmVhdHVyZXMpIHsKLSAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKGFubm8uZ2V0S2V5KCkpKSByZXR1cm4gYW5ubzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxYTUxNZXRhVmFsaWRhdG9yUmVmZXJlbmNlPiBnZXRWYWxpZGF0b3JzKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKExpc3Q8WE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZT4gdmFsaWRhdG9ycykgewotICAgICAgICB0aGlzLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQpIHsKLSAgICAgICAgaWYgKHZhbGlkYXRvcnMgPT0gbnVsbCkgdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3Q8WE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZT4oKTsKLSAgICAgICAgdmFsaWRhdG9ycy5hZGQobmV3IFhNTE1ldGFWYWxpZGF0b3JSZWZlcmVuY2UodmFsaWRhdG9ySWQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXJnZUZlYXR1cmVzSW50byhGZWF0dXJlc0NhcGFibGUgZmMpIHsKLSAgICAgICAgaWYgKGdldEZlYXR1cmVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmMub3B0aW1pemVSZWFkKGZhbHNlKTsKLSAgICAgICAgICAgIGZvciAoWE1MTWV0YUZlYXR1cmUgZWFjaCA6IGdldEZlYXR1cmVzKCkpIHsKLSAgICAgICAgICAgICAgICBmYy5wdXRGZWF0dXJlKGVhY2guZ2V0S2V5KCksIGVhY2guZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYy5vcHRpbWl6ZVJlYWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1hcHBlci5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyODRiNy4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5YU3RyZWFtOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWFwcGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxNYXBwZXIgaW5zdGFuY2UgPSBuZXcgWE1MTWFwcGVyKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFhTdHJlYW0geFN0cmVhbTsKLQotICAgIHByaXZhdGUgWE1MTWFwcGVyKCkgewotICAgICAgICB4U3RyZWFtID0gbmV3IFhTdHJlYW0oKTsKLSAgICAgICAgeFN0cmVhbS5wcm9jZXNzQW5ub3RhdGlvbnMobmV3IENsYXNzW10ge1hNTEZlYXR1cmVzQ2FwYWJsZS5jbGFzcywKLSAgICAgICAgICAgICAgICBYTUxNZXRhRmVhdHVyZS5jbGFzcywgWE1MTWV0YUJlYW4uY2xhc3MsIFhNTE1ldGFCZWFuSW5mb3MuY2xhc3MsCi0gICAgICAgICAgICAgICAgWE1MTWV0YUJlYW5SZWZlcmVuY2UuY2xhc3MsIFhNTE1ldGFFbGVtZW50LmNsYXNzLCBYTUxNZXRhUHJvcGVydHkuY2xhc3MsCi0gICAgICAgICAgICAgICAgWE1MTWV0YVZhbGlkYXRvci5jbGFzcywgWE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZS5jbGFzc30pOwotICAgICAgICB4U3RyZWFtLnNldE1vZGUoWFN0cmVhbS5OT19SRUZFUkVOQ0VTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTE1hcHBlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBYU3RyZWFtIGdldFhTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiB4U3RyZWFtOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW4uamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MTZkZi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtQWxpYXM7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1Bc0F0dHJpYnV0ZTsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUltcGxpY2l0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotQFhTdHJlYW1BbGlhcygiYmVhbiIpCi1wdWJsaWMgY2xhc3MgWE1MTWV0YUJlYW4gZXh0ZW5kcyBYTUxGZWF0dXJlc0NhcGFibGUgewotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUoKQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUoKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZSgpCi0gICAgcHJpdmF0ZSBTdHJpbmcgaW1wbDsKLSAgICBAWFN0cmVhbUltcGxpY2l0Ci0gICAgcHJpdmF0ZSBMaXN0PFhNTE1ldGFQcm9wZXJ0eT4gcHJvcGVydGllczsKLSAgICBAWFN0cmVhbUltcGxpY2l0Ci0gICAgcHJpdmF0ZSBMaXN0PFhNTE1ldGFCZWFuUmVmZXJlbmNlPiBiZWFuUmVsYXRpb25zOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbXBsKCkgewotICAgICAgICByZXR1cm4gaW1wbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbXBsKFN0cmluZyBpbXBsKSB7Ci0gICAgICAgIHRoaXMuaW1wbCA9IGltcGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8WE1MTWV0YVByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKExpc3Q8WE1MTWV0YVByb3BlcnR5PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoWE1MTWV0YVByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFhNTE1ldGFQcm9wZXJ0eT4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dFByb3BlcnR5KFhNTE1ldGFQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTE1ldGFQcm9wZXJ0eSBwcm9wID0gZmluZFByb3BlcnR5KHByb3BlcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUocHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUHJvcGVydHkocHJvcGVydHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhUHJvcGVydHkgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgWE1MTWV0YVByb3BlcnR5IHByb3AgPSBmaW5kUHJvcGVydHkobmFtZSk7Ci0gICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKHByb3ApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRQcm9wZXJ0eShuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhNTE1ldGFQcm9wZXJ0eSBmaW5kUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIGZvciAoWE1MTWV0YVByb3BlcnR5IHByb3AgOiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMocHJvcC5nZXROYW1lKCkpKSByZXR1cm4gcHJvcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxYTUxNZXRhQmVhblJlZmVyZW5jZT4gZ2V0QmVhblJlZnMoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuUmVsYXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5SZWZzKExpc3Q8WE1MTWV0YUJlYW5SZWZlcmVuY2U+IGJlYW5SZWxhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5iZWFuUmVsYXRpb25zID0gYmVhblJlbGF0aW9uczsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJlYW5SZWYoWE1MTWV0YUJlYW5SZWZlcmVuY2UgYmVhblJlbGF0aW9uKSB7Ci0gICAgICAgIGlmIChiZWFuUmVsYXRpb25zID09IG51bGwpIGJlYW5SZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFhNTE1ldGFCZWFuUmVmZXJlbmNlPigpOwotICAgICAgICBiZWFuUmVsYXRpb25zLmFkZChiZWFuUmVsYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEJlYW5SZWYoWE1MTWV0YUJlYW5SZWZlcmVuY2UgYmVhblJlbGF0aW9uKSB7Ci0gICAgICAgIGlmIChiZWFuUmVsYXRpb24uZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTE1ldGFCZWFuUmVmZXJlbmNlIHJlbGF0aW9uID0gZmluZEJlYW5SZWYoYmVhblJlbGF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAocmVsYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJlYW5SZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGRCZWFuUmVmKGJlYW5SZWxhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTE1ldGFCZWFuUmVmZXJlbmNlIHJlbW92ZUJlYW5SZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgWE1MTWV0YUJlYW5SZWZlcmVuY2UgcmVsYXRpb24gPSBmaW5kQmVhblJlZihuYW1lKTsKLSAgICAgICAgaWYgKHJlbGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJlYW5SZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVsYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFhNTE1ldGFCZWFuUmVmZXJlbmNlIGdldEJlYW5SZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRCZWFuUmVmKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgWE1MTWV0YUJlYW5SZWZlcmVuY2UgZmluZEJlYW5SZWYoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGJlYW5SZWxhdGlvbnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIGZvciAoWE1MTWV0YUJlYW5SZWZlcmVuY2UgcmVsYXRpb24gOiBiZWFuUmVsYXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMocmVsYXRpb24uZ2V0TmFtZSgpKSkgcmV0dXJuIHJlbGF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkJ1aWxkZXIuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjkxODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLkludHJvc3BlY3Rvck1ldGFCZWFuRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnI+Ci0gKiBVc2VyOiByb21hbi5zdHVtbTxicj4KLSAqIERhdGU6IDE3LjA2LjIwMTA8YnI+Ci0gKiBUaW1lOiAxMDoxMDo0Njxicj4KLSAqLwotcHVibGljIGNsYXNzIFhNTE1ldGFCZWFuQnVpbGRlciBleHRlbmRzIE1ldGFCZWFuQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBYTUxNZXRhQmVhbkZhY3RvcnkgeG1sRmFjdG9yeTsKLQotICAgIHB1YmxpYyBYTUxNZXRhQmVhbkJ1aWxkZXIoTWV0YUJlYW5GYWN0b3J5W10gZmFjdG9yaWVzKSB7Ci0gICAgICAgIHNldEZhY3RvcmllcyhmYWN0b3JpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhQmVhbkJ1aWxkZXIoKSB7Ci0gICAgICAgIHNldEZhY3RvcmllcyhuZXcgTWV0YUJlYW5GYWN0b3J5W10geyBuZXcgSW50cm9zcGVjdG9yTWV0YUJlYW5GYWN0b3J5KCksIG5ldyBYTUxNZXRhQmVhbkZhY3RvcnkoKSB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3JpZXMoTWV0YUJlYW5GYWN0b3J5W10gZmFjdG9yaWVzKSB7Ci0gICAgICAgIHN1cGVyLnNldEZhY3RvcmllcyhmYWN0b3JpZXMpOwotICAgICAgICB1cGRhdGVYbWxGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTG9hZGVyKFhNTE1ldGFCZWFuTG9hZGVyIGxvYWRlcikgewotICAgICAgICBhc3NlcnRYbWxGYWN0b3J5KCk7Ci0gICAgICAgIHhtbEZhY3RvcnkuYWRkTG9hZGVyKGxvYWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFCZWFuIGJ1aWxkRm9ySWQoU3RyaW5nIGJlYW5JbmZvSWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBYTUxNZXRhQmVhbkZhY3RvcnkuVmlzaXRvciB2OwotICAgICAgICBhc3NlcnRYbWxGYWN0b3J5KCk7Ci0gICAgICAgIHhtbEZhY3RvcnkudmlzaXRYTUxCZWFuTWV0YShiZWFuSW5mb0lkLCB2ID0gbmV3IFhNTE1ldGFCZWFuRmFjdG9yeS5WaXNpdG9yKCkgewotICAgICAgICAgICAgcHJpdmF0ZSBNZXRhQmVhbiBtZXRhOwotCi0gICAgICAgICAgICBwdWJsaWMgTWV0YUJlYW4gZ2V0TWV0YUJlYW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFhNTE1ldGFCZWFuIHhtbE1ldGEsIFhNTE1ldGFCZWFuSW5mb3MgeG1sSW5mb3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGlmIChtZXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YSA9IGNyZWF0ZU1ldGFCZWFuKHhtbE1ldGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxGYWN0b3J5LmVucmljaE1ldGFCZWFuKG1ldGEsIG5ldyBYTUxNZXRhQmVhbkZhY3RvcnkuWE1MUmVzdWx0KHhtbE1ldGEsIHhtbEluZm9zKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIGlmICh2LmdldE1ldGFCZWFuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWV0YUJlYW4gIiArIGJlYW5JbmZvSWQgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2LmdldE1ldGFCZWFuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBidWlsZEFsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBNZXRhQmVhbj4gYWxsID0gc3VwZXIuYnVpbGRBbGwoKTsKLSAgICAgICAgaWYgKHhtbEZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sRmFjdG9yeS52aXNpdFhNTEJlYW5NZXRhKG51bGwsIG5ldyBYTUxNZXRhQmVhbkZhY3RvcnkuVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChYTUxNZXRhQmVhbiBlbXB0eSwgWE1MTWV0YUJlYW5JbmZvcyB4bWxJbmZvcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4bWxJbmZvcy5nZXRCZWFucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGVtcHR5IGZpbGUsIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICBYTUxNZXRhQmVhbkZhY3RvcnkuWE1MUmVzdWx0IGNhcnJpZXIgPSBuZXcgWE1MTWV0YUJlYW5GYWN0b3J5LlhNTFJlc3VsdChudWxsLCB4bWxJbmZvcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChYTUxNZXRhQmVhbiB4bWxNZXRhIDogeG1sSW5mb3MuZ2V0QmVhbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUJlYW4gbWV0YSA9IGFsbC5nZXQoeG1sTWV0YS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gY3JlYXRlTWV0YUJlYW4oeG1sTWV0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLnB1dCh4bWxNZXRhLmdldElkKCksIG1ldGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2Fycmllci54bWxNZXRhID0geG1sTWV0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZhY3RvcnkuZW5yaWNoTWV0YUJlYW4obWV0YSwgY2Fycmllcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgTWV0YUJlYW4gZ2V0TWV0YUJlYW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWV0YUJlYW4+IGVucmljaENvcGllcyhNYXA8U3RyaW5nLCBNZXRhQmVhbj4gYWxsLCBYTUxNZXRhQmVhbkluZm9zLi4uIGluZm9zQXJyYXkpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRYbWxGYWN0b3J5KCk7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBjb3BpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGFCZWFuPihhbGwuc2l6ZSgpKTsKLSAgICAgICAgYm9vbGVhbiBub3RoaW5nID0gdHJ1ZTsKLSAgICAgICAgWE1MTWV0YUJlYW5GYWN0b3J5LlhNTFJlc3VsdCBjYXJyaWVyID0gbmV3IFhNTE1ldGFCZWFuRmFjdG9yeS5YTUxSZXN1bHQoKTsKLSAgICAgICAgZm9yIChYTUxNZXRhQmVhbkluZm9zIHhtbE1ldGFCZWFuSW5mb3MgOiBpbmZvc0FycmF5KSB7Ci0gICAgICAgICAgICBjYXJyaWVyLnhtbEluZm9zID0geG1sTWV0YUJlYW5JbmZvczsKLSAgICAgICAgICAgIGlmICh4bWxNZXRhQmVhbkluZm9zID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoWE1MTWV0YUJlYW4geG1sTWV0YSA6IHhtbE1ldGFCZWFuSW5mb3MuZ2V0QmVhbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBub3RoaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGFCZWFuIGNvcHkgPSBjb3BpZXMuZ2V0KHhtbE1ldGEuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IG51bGwpIHsgLy8gaXN0IG5vY2ggbmljaHQga29waWVydAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUJlYW4gbWV0YSA9IGFsbC5nZXQoeG1sTWV0YS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhID09IG51bGwpIHsgLy8gZ2lidCBlcyBuaWNodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBjcmVhdGVNZXRhQmVhbih4bWxNZXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGdpYnQgZXMsIGpldHp0IGtvcGllcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IG1ldGEuY29weSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29waWVzLnB1dCh4bWxNZXRhLmdldElkKCksIGNvcHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhcnJpZXIueG1sTWV0YSA9IHhtbE1ldGE7Ci0gICAgICAgICAgICAgICAgICAgIHhtbEZhY3RvcnkuZW5yaWNoTWV0YUJlYW4oY29weSwgY2Fycmllcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHhtbEZhY3RvcnkuaGFuZGxlTG9hZEV4Y2VwdGlvbih4bWxNZXRhQmVhbkluZm9zLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobm90aGluZykKLSAgICAgICAgICAgIHJldHVybiBhbGw7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWV0YUJlYW4+IGVudHJ5IDogYWxsLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBhbGxlIHVudmVyYWVuZGVydGVuIHdlcmRlbiBBVUNIIEtPUElFUlQgKG51ciB6d2FyIG51ciwgd2VnZW4KLSAgICAgICAgICAgICAqIHBvdGVudGllbGxlciBDcm9zc1JlZmVyZW56ZW4gZHVyY2ggUmVsYXRpb25zaGlwcykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFjb3BpZXMuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuaGFzUmVsYXRpb25zaGlwcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcGllcy5wdXQoZW50cnkuZ2V0S2V5KCksIChNZXRhQmVhbikgZW50cnkuZ2V0VmFsdWUoKS5jb3B5KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIHJlbGF0aW9uc2hpcDogZG8gbm90IGNsb25lKCkKLSAgICAgICAgICAgICAgICAgICAgY29waWVzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3BpZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRhQmVhbiBjcmVhdGVNZXRhQmVhbihYTUxNZXRhQmVhbiB4bWxNZXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkRm9yQ2xhc3MoZmluZExvY2FsQ2xhc3MoeG1sTWV0YS5nZXRJbXBsKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWG1sRmFjdG9yeSgpIHsKLSAgICAgICAgZm9yIChNZXRhQmVhbkZhY3RvcnkgZWFjaCA6IGdldEZhY3RvcmllcygpKSB7Ci0gICAgICAgICAgICBpZiAoZWFjaCBpbnN0YW5jZW9mIFhNTE1ldGFCZWFuRmFjdG9yeSkgeyAvLyB1c2UgdGhlIGZpcnN0IG9uZSEKLSAgICAgICAgICAgICAgICB4bWxGYWN0b3J5ID0gKFhNTE1ldGFCZWFuRmFjdG9yeSkgZWFjaDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgeG1sRmFjdG9yeSA9IG51bGw7IC8vIG5vbmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW5GYWN0b3J5IGdldFhtbEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB4bWxGYWN0b3J5OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRYbWxGYWN0b3J5KCkgewotICAgICAgICBpZiAoeG1sRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyB4bWxGYWN0b3J5IGF2YWlsYWJsZSIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkZhY3RvcnkuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDU0ZWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eS5KQVZBU0NSSVBUX1ZBTElEQVRJT05fRlVOQ1RJT05TOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlc0NhcGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnJvdXRpbmVzLlN0YW5kYXJkVmFsaWRhdGlvbjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogQ3JlYXRlIG9yIGVucmljaCBNZXRhQmVhbnMgZnJvbSBhcGFjaGUgYmVhbkluZm9zIHhtbDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXRhQmVhbkZhY3RvcnkgaW1wbGVtZW50cyBNZXRhQmVhbkZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFhNTE1ldGFCZWFuRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gdXNlIExpbmtlZEhhc2hNYXAgdG8ga2VlcCBzZXF1ZW5jZSBvZiBsb2FkZXJzCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8WE1MTWV0YUJlYW5Mb2FkZXIsIFhNTE1ldGFCZWFuSW5mb3M+IHJlc291cmNlcyA9Ci0gICAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8WE1MTWV0YUJlYW5Mb2FkZXIsIFhNTE1ldGFCZWFuSW5mb3M+KCk7Ci0KLSAgICBwcml2YXRlIFN0YW5kYXJkVmFsaWRhdGlvbiBzdGFuZGFyZFZhbGlkYXRpb24gPSBTdGFuZGFyZFZhbGlkYXRpb24uZ2V0SW5zdGFuY2UoKTsKLQotICAgIHB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0geG1sTWV0YSAgLSBudWxsIG9yIHRoZSBiZWFuIGZvdW5kCi0gICAgICAgICAqIEBwYXJhbSB4bWxJbmZvcyAtIGFsbCBpbmZvcyBpbiBhIHNpbmdsZSB1bml0ICh4bWwgZmlsZSkKLSAgICAgICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgdmlzaXQoWE1MTWV0YUJlYW4geG1sTWV0YSwgWE1MTWV0YUJlYW5JbmZvcyB4bWxJbmZvcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgICAgICBNZXRhQmVhbiBnZXRNZXRhQmVhbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWE1MUmVzdWx0IHsKLSAgICAgICAgcHVibGljIFhNTE1ldGFCZWFuIHhtbE1ldGE7Ci0gICAgICAgIHB1YmxpYyBYTUxNZXRhQmVhbkluZm9zIHhtbEluZm9zOwotCi0gICAgICAgIHB1YmxpYyBYTUxSZXN1bHQoWE1MTWV0YUJlYW4gbWV0YUJlYW4sIFhNTE1ldGFCZWFuSW5mb3MgbWV0YUluZm9zKSB7Ci0gICAgICAgICAgICB0aGlzLnhtbE1ldGEgPSBtZXRhQmVhbjsKLSAgICAgICAgICAgIHRoaXMueG1sSW5mb3MgPSBtZXRhSW5mb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWE1MUmVzdWx0KCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRNZXRhQmVhbihmaW5hbCBNZXRhQmVhbiBtZXRhQmVhbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKG1ldGFCZWFuLmdldElkKCkgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgdmlzaXRYTUxCZWFuTWV0YShtZXRhQmVhbi5nZXRJZCgpLCBuZXcgVmlzaXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFhNTE1ldGFCZWFuIHhtbE1ldGEsIFhNTE1ldGFCZWFuSW5mb3MgeG1sSW5mb3MpCi0gICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBlbnJpY2hNZXRhQmVhbihtZXRhQmVhbiwgbmV3IFhNTFJlc3VsdCh4bWxNZXRhLCB4bWxJbmZvcykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWV0YUJlYW4gZ2V0TWV0YUJlYW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFCZWFuOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvKiogWE1MTWV0YUJlYW5Mb2FkZXIgYXJlIHVzZWQgdG8ga25vdyAibG9jYXRpb25zIiB3aGVyZSB0byBnZXQgQmVhbkluZm9zIGZyb20uICovCi0gICAgcHVibGljIENvbGxlY3Rpb248WE1MTWV0YUJlYW5Mb2FkZXI+IGdldExvYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZXMua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTG9hZGVyKFhNTE1ldGFCZWFuTG9hZGVyIGxvYWRlcikgewotICAgICAgICByZXNvdXJjZXMucHV0KGxvYWRlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0YW5kYXJkVmFsaWRhdGlvbiBnZXRTdGFuZGFyZFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBzdGFuZGFyZFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgLyoqIGN1c3RvbWl6ZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3RhbmRhcmRWYWxpZGF0aW9uIGZvciB0aGlzIGJ1aWxkZXIuICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmRWYWxpZGF0aW9uKFN0YW5kYXJkVmFsaWRhdGlvbiBzdGFuZGFyZFZhbGlkYXRpb24pIHsKLSAgICAgICAgdGhpcy5zdGFuZGFyZFZhbGlkYXRpb24gPSBzdGFuZGFyZFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5yaWNoTWV0YUJlYW4oTWV0YUJlYW4gbWV0YSwgWE1MUmVzdWx0IHJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXN1bHQueG1sTWV0YS5nZXRJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGEuc2V0SWQocmVzdWx0LnhtbE1ldGEuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC54bWxNZXRhLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRhLnNldE5hbWUocmVzdWx0LnhtbE1ldGEuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotLyogICAgICAgIGlmIChtZXRhLmdldEJlYW5DbGFzcygpID09IG51bGwgJiYgcmVzdWx0LnhtbE1ldGEuZ2V0SW1wbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGEuc2V0QmVhbkNsYXNzKGZpbmRMb2NhbENsYXNzKHJlc3VsdC54bWxNZXRhLmdldEltcGwoKSkpOwotICAgICAgICB9Ki8KLSAgICAgICAgcmVzdWx0LnhtbE1ldGEubWVyZ2VGZWF0dXJlc0ludG8obWV0YSk7Ci0gICAgICAgIGVucmljaFZhbGlkYXRpb25zKG1ldGEsIHJlc3VsdC54bWxNZXRhLCByZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgaWYgKHJlc3VsdC54bWxNZXRhLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFhNTE1ldGFQcm9wZXJ0eSB4bWxQcm9wIDogcmVzdWx0LnhtbE1ldGEuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICAgICAgZW5yaWNoRWxlbWVudChtZXRhLCB4bWxQcm9wLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQueG1sTWV0YS5nZXRCZWFuUmVmcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoWE1MTWV0YUJlYW5SZWZlcmVuY2UgeG1sUmVmIDogcmVzdWx0LnhtbE1ldGEuZ2V0QmVhblJlZnMoKSkgewotICAgICAgICAgICAgICAgIGVucmljaEVsZW1lbnQobWV0YSwgeG1sUmVmLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBlbnJpY2hWYWxpZGF0aW9ucyhGZWF0dXJlc0NhcGFibGUgcHJvcCwgWE1MRmVhdHVyZXNDYXBhYmxlIHhtbFByb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MUmVzdWx0IHJlc3VsdCwgYm9vbGVhbiBhZGRTdGFuZGFyZCkKLSAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHhtbFByb3AuZ2V0VmFsaWRhdG9ycygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG9ic29sZXRlIGNvZGU/IHJlbW92ZSBmcm9tIGhlcmUgLS0tPgotICAgICAgICAgICAgU3RyaW5nW10gZnVuYyA9IHByb3AuZ2V0RmVhdHVyZShKQVZBU0NSSVBUX1ZBTElEQVRJT05fRlVOQ1RJT05TKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBqc1ZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICB4bWxQcm9wLmdldFZhbGlkYXRvcnMoKS5zaXplKCkgKyAoZnVuYyA9PSBudWxsID8gMCA6IGZ1bmMubGVuZ3RoKSk7Ci0gICAgICAgICAgICBpZiAoZnVuYyAhPSBudWxsICYmIGZ1bmMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGpzVmFsaWRhdG9ycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChmdW5jKSk7Ci0gICAgICAgICAgICB9ICAvLyA8LS0tIHRvIGhlcmUKLSAgICAgICAgICAgIGJvb2xlYW4gdXNlU3RhbmRhcmQgPSBwcm9wIGluc3RhbmNlb2YgTWV0YVByb3BlcnR5OwotICAgICAgICAgICAgZm9yIChYTUxNZXRhVmFsaWRhdG9yUmVmZXJlbmNlIHZhbFJlZiA6IHhtbFByb3AuZ2V0VmFsaWRhdG9ycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YW5kYXJkVmFsaWRhdGlvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgdmFsUmVmLmdldFJlZklkKCkuZXF1YWxzKHN0YW5kYXJkVmFsaWRhdGlvbi5nZXRWYWxpZGF0aW9uSWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlU3RhbmRhcmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWE1MTWV0YVZhbGlkYXRvciB2YWxpZGF0b3IgPQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC54bWxJbmZvcy5nZXRWYWxpZGF0b3IodmFsUmVmLmdldFJlZklkKCkpOwotICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLmdldFZhbGlkYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmFkZFZhbGlkYXRpb24odmFsaWRhdG9yLmdldFZhbGlkYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvci5nZXRKc0Z1bmN0aW9uKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAhanNWYWxpZGF0b3JzLmNvbnRhaW5zKHZhbGlkYXRvci5nZXRKc0Z1bmN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqc1ZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvci5nZXRKc0Z1bmN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFqc1ZhbGlkYXRvcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcC5wdXRGZWF0dXJlKEpBVkFTQ1JJUFRfVkFMSURBVElPTl9GVU5DVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAganNWYWxpZGF0b3JzLnRvQXJyYXkobmV3IFN0cmluZ1tqc1ZhbGlkYXRvcnMuc2l6ZSgpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVzZVN0YW5kYXJkICYmIHN0YW5kYXJkVmFsaWRhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wLmhhc1ZhbGlkYXRpb24oc3RhbmRhcmRWYWxpZGF0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgcHJvcC5hZGRWYWxpZGF0aW9uKHN0YW5kYXJkVmFsaWRhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYWRkU3RhbmRhcmQgJiYgc3RhbmRhcmRWYWxpZGF0aW9uICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIXByb3AuaGFzVmFsaWRhdGlvbihzdGFuZGFyZFZhbGlkYXRpb24pKSB7Ci0gICAgICAgICAgICBwcm9wLmFkZFZhbGlkYXRpb24oc3RhbmRhcmRWYWxpZGF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRhUHJvcGVydHkgZW5yaWNoRWxlbWVudChNZXRhQmVhbiBtZXRhLCBYTUxNZXRhRWxlbWVudCB4bWxQcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSZXN1bHQgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0YVByb3BlcnR5IHByb3AgPSBtZXRhLmdldFByb3BlcnR5KHhtbFByb3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcCA9IG5ldyBNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgICAgIHByb3Auc2V0TmFtZSh4bWxQcm9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBtZXRhLnB1dFByb3BlcnR5KHhtbFByb3AuZ2V0TmFtZSgpLCBwcm9wKTsKLSAgICAgICAgfQotICAgICAgICB4bWxQcm9wLm1lcmdlSW50byhwcm9wKTsKLSAgICAgICAgZW5yaWNoVmFsaWRhdGlvbnMocHJvcCwgeG1sUHJvcCwgcmVzdWx0LCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHByb3A7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhNTEJlYW5NZXRhKFN0cmluZyBiZWFuSWQsIFZpc2l0b3IgdmlzaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFhNTE1ldGFCZWFuTG9hZGVyLCBYTUxNZXRhQmVhbkluZm9zPiBlbnRyeSA6IHJlc291cmNlcwotICAgICAgICAgICAgICAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGxvYWQgd2hlbiBub3QgYWxyZWFkeSBsb2FkZWQKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShlbnRyeS5nZXRLZXkoKS5sb2FkKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTG9hZEV4Y2VwdGlvbihlbnRyeS5nZXRLZXkoKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgeyAvLyBzZWFyY2ggaW4gbG9hZGVkIGluZm9zIGZvciB0aGUgJ25hbWUnCi0gICAgICAgICAgICAgICAgaWYgKGJlYW5JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQobnVsbCwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MTWV0YUJlYW4gZm91bmQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldEJlYW4oYmVhbklkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoZm91bmQsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZmluZCBhIGJlYW4gYnkgdGhlIGJlYW4taWQgKD1iZWFuLm5hbWUpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgb3IgdGhlIGJlYW4gZm91bmQgZnJvbSB0aGUgZmlyc3QgbG9hZGVyIHRoYXQgaGFzIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxSZXN1bHQgZmluZFhNTEJlYW5NZXRhKFN0cmluZyBiZWFuSWQpIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8WE1MTWV0YUJlYW5Mb2FkZXIsIFhNTE1ldGFCZWFuSW5mb3M+IGVudHJ5IDogcmVzb3VyY2VzCi0gICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9hZCB3aGVuIG5vdCBhbHJlYWR5IGxvYWRlZAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKGVudHJ5LmdldEtleSgpLmxvYWQoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVMb2FkRXhjZXB0aW9uKGVudHJ5LmdldEtleSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7IC8vIHNlYXJjaCBpbiBsb2FkZWQgaW5mb3MgZm9yIHRoZSAnbmFtZScKLSAgICAgICAgICAgICAgICBYTUxNZXRhQmVhbiBmb3VuZCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0QmVhbihiZWFuSWQpOwotICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWE1MUmVzdWx0KGZvdW5kLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZCEKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVMb2FkRXhjZXB0aW9uKE9iamVjdCBsb2FkZXIsIElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsIFN0cmluZy5mb3JtYXQoIkVycm9yIGxvYWRpbmcgJXMiLCBsb2FkZXIpLCBlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5JbmZvcy5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkluZm9zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmFjODguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkluZm9zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1BbGlhczsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUFzQXR0cmlidXRlOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtSW1wbGljaXQ7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1PbWl0RmllbGQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IHJvb3QgZWxlbWVudCBvZiBhIHhtbC1iZWFuSW5mb3MgZG9jdW1lbnQ8YnIvPgotICovCi1AWFN0cmVhbUFsaWFzKCJiZWFuSW5mb3MiKQotcHVibGljIGNsYXNzIFhNTE1ldGFCZWFuSW5mb3MgewotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLSAgICBAWFN0cmVhbUltcGxpY2l0Ci0gICAgcHJpdmF0ZSBMaXN0PFhNTE1ldGFWYWxpZGF0b3I+IHZhbGlkYXRvcnM7Ci0gICAgQFhTdHJlYW1JbXBsaWNpdAotICAgIHByaXZhdGUgTGlzdDxYTUxNZXRhQmVhbj4gYmVhbnM7Ci0gICAgQFhTdHJlYW1PbWl0RmllbGQKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFhNTE1ldGFCZWFuPiBiZWFuTG9va3VwOwotICAgIEBYU3RyZWFtT21pdEZpZWxkCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBYTUxNZXRhVmFsaWRhdG9yPiB2YWxpZGF0aW9uTG9va3VwOwotCi0gICAgLyoqCi0gICAgICogdXNlZCBmb3IgaWRlbnRpZmljYXRpb24sIG1heSBiZSBlbXB0eSwgaWYgdGhlcmUgaXMgbm8gZGF0YWJhc2Ugb3JpZ2luIGZvciB0aGlzIG9iamVjdC4KLSAgICAgKiBjb3VsZCBhbHNvIGNvbnRhaW4gYSBmaWxlLW5hbWUgLSBjYW4gYmUgdXNlZCBmbGV4aWJsZS4uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHVzZWQgZm9yIGNoYW5nZS1kZXRlY3Rpb24sIHdoZW4gc29tZSBvdGhlciBjb21wb25lbnQgY2FjaGVzIE1ldGFCZWFucyBiYXNlZCBvbiB0aGlzCi0gICAgICogb2JqZWN0LiB3aGVuIHRoZSB2ZXJzaW9uIGNoYW5nZXMsIHRoZSBjYWNoZSBjb3VsZCBjb21wYXJlIHRvIGl0cyB2ZXJzaW9uIHN0YXRlIGFuZCByZWNvbXB1dGUuCi0gICAgICogY2FuIGJlIHVzZWQgZmxleGlibGUuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxYTUxNZXRhVmFsaWRhdG9yPiBnZXRWYWxpZGF0b3JzKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JzKExpc3Q8WE1MTWV0YVZhbGlkYXRvcj4gdmFsaWRhdG9ycykgewotICAgICAgICB0aGlzLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFhNTE1ldGFCZWFuPiBnZXRCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIGJlYW5zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5zKExpc3Q8WE1MTWV0YUJlYW4+IGJlYW5zKSB7Ci0gICAgICAgIHRoaXMuYmVhbnMgPSBiZWFuczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW4gZ2V0QmVhbihTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGJlYW5zID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBpZiAoYmVhbkxvb2t1cCA9PSBudWxsKSBpbml0QmVhbkxvb2t1cCgpOwotICAgICAgICByZXR1cm4gYmVhbkxvb2t1cC5nZXQoaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0QmVhbkxvb2t1cCgpIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFhNTE1ldGFCZWFuPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFhNTE1ldGFCZWFuPihiZWFucy5zaXplKCkpOwotICAgICAgICBmb3IgKFhNTE1ldGFCZWFuIGJlYW4gOiBiZWFucykgewotICAgICAgICAgICAgbWFwLnB1dChiZWFuLmdldElkKCksIGJlYW4pOwotICAgICAgICB9Ci0gICAgICAgIGJlYW5Mb29rdXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBYTUxNZXRhQmVhbj4obWFwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRpb25Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFhNTE1ldGFWYWxpZGF0b3I+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgWE1MTWV0YVZhbGlkYXRvcj4odmFsaWRhdG9ycy5zaXplKCkpOwotICAgICAgICBmb3IgKFhNTE1ldGFWYWxpZGF0b3IgeHYgOiB2YWxpZGF0b3JzKSB7Ci0gICAgICAgICAgICBpZiAoeHYuZ2V0SmF2YSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uIHZhbGlkYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFZhbGlkYXRpb24pIENsYXNzVXRpbHMuZ2V0Q2xhc3MoeHYuZ2V0SmF2YSgpKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIHh2LnNldFZhbGlkYXRpb24odmFsaWRhdGlvbik7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dCh4di5nZXRJZCgpLCB4dik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmFsaWRhdGlvbkxvb2t1cCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFhNTE1ldGFWYWxpZGF0b3I+KG1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQmVhbihYTUxNZXRhQmVhbiBiZWFuKSB7Ci0gICAgICAgIGlmIChiZWFucyA9PSBudWxsKSBiZWFucyA9IG5ldyBBcnJheUxpc3Q8WE1MTWV0YUJlYW4+KCk7Ci0gICAgICAgIGJlYW5zLmFkZChiZWFuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWV0YVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoU3RyaW5nIGlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbGlkYXRvcnMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uTG9va3VwID09IG51bGwpIGluaXRWYWxpZGF0aW9uTG9va3VwKCk7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uTG9va3VwLmdldChpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVmFsaWRhdG9yKFhNTE1ldGFWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgIGlmICh2YWxpZGF0b3JzID09IG51bGwpIHZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PFhNTE1ldGFWYWxpZGF0b3I+KCk7Ci0gICAgICAgIHZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkxvYWRlci5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTFjNzRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5Mb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiBYTUxNZXRhQmVhbkxvYWRlciBhcmUgdXNlZCB0byBrbm93ICJsb2NhdGlvbnMiIHdoZXJlIHRvIGdldCBCZWFuSW5mb3MgZnJvbS48YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTE1ldGFCZWFuTG9hZGVyIHsKLSAgICBYTUxNZXRhQmVhbkluZm9zIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuTWFuYWdlci5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiOGQ1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC51dGlsLlByaXZpbGVnZWRBY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuRmVhdHVyZXMuUHJvcGVydHkuUkVGX0JFQU5fSUQ7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IGludGVybmFsIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGNvbnN0cnVjdCBtZXRhYmVhbnMgd2l0aAotICogZmFjdG9yaWVzIGFuZCBmcm9tIHhzdHJlYW0geG1sIGZpbGVzLiBZb3UgY2FuIHJlZ2lzdGVyIGRpZmZlcmVudAotICogWE1MTWV0YUJlYW5Mb2FkZXJzIChzZWUgYWRkTG9hZGVyKCkpIHRvIHJlZ2lzdGVyIHhzdHJlYW0teG1sLWZpbGVzIHRoYXQKLSAqIGNvbnRhaW4gbWV0YS1kYXRhLiBZb3UgY2FuIG1lcmdlICsgdW5pZnkgbWV0YSBkYXRhIHdpdGggbWV0aG9kCi0gKiBlbnJpY2hDb3BpZXMoKS4gPGJyLz4KLSAqIFVzZXI6IHJvbWFuLnN0dW1tPGJyPgotICogRGF0ZTogMTcuMDYuMjAxMDxicj4KLSAqIFRpbWU6IDA5OjQ3OjE0PGJyPgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWV0YUJlYW5NYW5hZ2VyIGV4dGVuZHMgTWV0YUJlYW5NYW5hZ2VyIGltcGxlbWVudHMgWE1MTWV0YUJlYW5SZWdpc3RyeSwgTWV0YUJlYW5FbnJpY2hlciB7Ci0gICAgcHVibGljIFhNTE1ldGFCZWFuTWFuYWdlcigpIHsKLSAgICAgICAgdGhpcyhuZXcgWE1MTWV0YUJlYW5CdWlsZGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhQmVhbk1hbmFnZXIoWE1MTWV0YUJlYW5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgc3VwZXIoYnVpbGRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VMb2FkZXIoU3RyaW5nIHJlc291cmNlKSB7Ci0gICAgICAgIGFkZExvYWRlcihuZXcgWE1MTWV0YUJlYW5VUkxMb2FkZXIoUHJpdmlsZWdlZEFjdGlvbnMuZ2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKSkuZ2V0UmVzb3VyY2UocmVzb3VyY2UpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExvYWRlcihYTUxNZXRhQmVhbkxvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgKChYTUxNZXRhQmVhbkJ1aWxkZXIpIGJ1aWxkZXIpLmFkZExvYWRlcihsb2FkZXIpOwotICAgICAgICBjYWNoZS5jbGVhcigpOyAvLyBjbGVhciBiZWNhdXNlIG5ldyBsb2FkZXJzIGNhbiBhZmZlY3QgQUxMIE1ldGFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGNyZWF0ZWQhCi0gICAgICAgIGNvbXBsZXRlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGluZm9zCi0gICAgICogICAgICAgICAgICAtIHRoZSBwYXRjaGVzIHRvIGFwcGx5Ci0gICAgICogQHJldHVybiBhbGwgTWV0YUJlYW5zIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBhIHhtbCBkZXNjcmlwdG9yIGFuZAotICAgICAqICAgICAgICAgYWRkaXRpb25hbCB0aGUgTWV0YUJlYW5zIGxvYWRlZCBieSB0aGUgZ2l2ZW4gbG9hZGVycy4gVGhlIGdpdmVuCi0gICAgICogICAgICAgICBsb2FkZXJzIG1heSBhbHNvIHJldHVybiBwYXRjaGVzIGZvciBNZXRhQmVhbnMgdGhhdCBoYXZlIGFsc28gYmVlbgotICAgICAqICAgICAgICAgcmV0dXJuZWQgYnkgb3RoZXIgbG9hZGVycy4gVGhlIGJlYW5zIHdpdGggcGF0Y2hlcyBmb3IgcmVmZXJlbmNlcwotICAgICAqICAgICAgICAgdG8gcGF0Y2hlZCBiZWFucyB3aWxsIGJlIGNvcGllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTWV0YUJlYW4+IGVucmljaENvcGllcyhYTUxNZXRhQmVhbkluZm9zLi4uIGluZm9zKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBjYWNoZWQgPSBmaW5kQWxsKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNZXRhQmVhbj4gcGF0Y2hlZCA9ICgoWE1MTWV0YUJlYW5CdWlsZGVyKSBidWlsZGVyKS5lbnJpY2hDb3BpZXMoY2FjaGVkLCBpbmZvcyk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbnRyeSA6IHBhdGNoZWQudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBNZXRhQmVhbiBtZXRhID0gKE1ldGFCZWFuKSBlbnRyeTsKLSAgICAgICAgICAgICAgICBjb21wdXRlUmVsYXRpb25zaGlwcyhtZXRhLCBwYXRjaGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXRjaGVkOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIGRvIG5vdCB3cmFwIHJ1bnRpbWUgZXhjZXB0aW9ucwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXJyb3IgZW5yaWNoaW5nIGJlYW5JbmZvcyIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybiBhbGwgTWV0YUJlYW5zIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBhIHhtbCBkZXNjcmlwdG9yOiBrZXkgPQotICAgICAqICAgICAgICAgYmVhbi5pZCwgdmFsdWUgPSBNZXRhQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNZXRhQmVhbj4gZmluZEFsbCgpIHsKLSAgICAgICAgaWYgKCFjb21wbGV0ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNZXRhQmVhbj4gYWxsQnVpbHQgPSBidWlsZGVyLmJ1aWxkQWxsKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZXRhQmVhbiBtZXRhIDogYWxsQnVpbHQudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0YUJlYW4gY2FjaGVkID0gY2FjaGUuZmluZEZvcklkKG1ldGEuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2FjaGUobWV0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWV0YUJlYW4+IG1hcCA9IGNhY2hlLmZpbmRBbGwoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvZW50cnkgOiBtYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0YUJlYW4gbWV0YSA9IChNZXRhQmVhbikgb2VudHJ5OwotICAgICAgICAgICAgICAgICAgICBjb21wdXRlUmVsYXRpb25zaGlwcyhtZXRhLCBtYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGU7IC8vIGRvIG5vdCB3cmFwIHJ1bnRpbWUgZXhjZXB0aW9ucwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBiZWFuSW5mb3MiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjYWNoZS5maW5kQWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVsYXRpb25zaGlwcyhNZXRhQmVhbiBiZWFuSW5mbywgTWFwPFN0cmluZywgTWV0YUJlYW4+IGNhY2hlZCkgewotICAgICAgICBmb3IgKE1ldGFQcm9wZXJ0eSBwcm9wIDogYmVhbkluZm8uZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYmVhblJlZiA9IChTdHJpbmcpIHByb3AuZ2V0RmVhdHVyZShSRUZfQkVBTl9JRCk7Ci0gICAgICAgICAgICBpZiAoYmVhblJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcC5zZXRNZXRhQmVhbihjYWNoZWQuZ2V0KGJlYW5SZWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZWxhdGVkTWV0YUJlYW4oTWV0YVByb3BlcnR5IHByb3AsIFN0cmluZyBiZWFuUmVmKSB7Ci0gICAgICAgIGlmIChiZWFuUmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3Auc2V0TWV0YUJlYW4oZmluZEZvcklkKGJlYW5SZWYpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmNvbXB1dGVSZWxhdGVkTWV0YUJlYW4ocHJvcCwgYmVhblJlZik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuTWFuYWdlckZhY3RvcnkuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5NYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzkxMGU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5NYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZpbmRlcjsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyPgotICogVXNlcjogcm9tYW4uc3R1bW08YnI+Ci0gKiBEYXRlOiAxNy4wNi4yMDEwPGJyPgotICogVGltZTogMTA6MDY6Mzc8YnI+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXRhQmVhbk1hbmFnZXJGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBYTUxNZXRhQmVhbk1hbmFnZXIgbWFuYWdlciA9IG5ldyBYTUxNZXRhQmVhbk1hbmFnZXIoKTsKLSAgICAgLyoqCi0gICAgICogZ2xvYmFsIG1ldGEgYmVhbiBmaW5kZXIuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0YUJlYW5GaW5kZXIgZ2V0RmluZGVyKCkgewotICAgICAgICByZXR1cm4gbWFuYWdlcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHNldCBnbG9iYWwgbWV0YSBiZWFuIG1hbmFnZXIsIHRoYXQgaXMgcmVzcG9uc2libGUKLSAgICAgKiBmb3IgZmluZGluZywgY2FjaGluZywgeG1sIHJlZ2lzdHJ5IGFuZCBlbnJpY2htZW50IGFsZ29yaXRobS4KLSAgICAgKiBAcGFyYW0gZmluZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1hbmFnZXIoWE1MTWV0YUJlYW5NYW5hZ2VyIGZpbmRlcikgewotICAgICAgICBtYW5hZ2VyID0gZmluZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdsb2JhbCBtZXRhIGJlYW4gcmVnaXN0cnkKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxNZXRhQmVhblJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgewotICAgICAgICByZXR1cm4gbWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnbG9iYWwgbWV0YSBiZWFuIGVucmljaGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWV0YUJlYW5FbnJpY2hlciBnZXRFbnJpY2hlcigpIHsKLSAgICAgICAgcmV0dXJuIG1hbmFnZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhblJlZmVyZW5jZS5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZmYWRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUFsaWFzOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtQXNBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBYU3RyZWFtQWxpYXMoInJlbGF0aW9uc2hpcCIpCi1wdWJsaWMgY2xhc3MgWE1MTWV0YUJlYW5SZWZlcmVuY2UgZXh0ZW5kcyBYTUxNZXRhRWxlbWVudCB7Ci0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZQotICAgIHByaXZhdGUgU3RyaW5nIGJlYW5JZDsKLQotICAgIHB1YmxpYyBYTUxNZXRhQmVhblJlZmVyZW5jZShTdHJpbmcgcmVmSWQpIHsKLSAgICAgICAgdGhpcy5iZWFuSWQgPSByZWZJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW5SZWZlcmVuY2UoKSB7Ci0gICAgfQotCi0gICAgLyoqIGlkIG9mIHJlZmVyZW5jZWQgdGFyZ2V0IGJlYW4gb2YgdGhlIHJlbGF0aW9uc2hpcCAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbklkKCkgewotICAgICAgICByZXR1cm4gYmVhbklkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5JZChTdHJpbmcgYmVhbklkKSB7Ci0gICAgICAgIHRoaXMuYmVhbklkID0gYmVhbklkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lcmdlSW50byhNZXRhUHJvcGVydHkgcHJvcCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBzdXBlci5tZXJnZUludG8ocHJvcCk7ICAgLy8gY2FsbCBzdXBlciEKLSAgICAgICAgaWYgKGdldEJlYW5JZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3AucHV0RmVhdHVyZShGZWF0dXJlcy5Qcm9wZXJ0eS5SRUZfQkVBTl9JRCwgZ2V0QmVhbklkKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhblJlZ2lzdHJ5LmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxMWY5OC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IEludGVyZmFjZSBvZiB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgYWxsIFhNTE1ldGFCZWFuTG9hZGVycyA8YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTE1ldGFCZWFuUmVnaXN0cnkgewotICAgIC8qKgotICAgICAqIGFkZCBhIGxvYWRlciBmb3IgeG1sIGJlYW4gaW5mb3MuCi0gICAgICogdGhlIHJlZ2lzdHJ5IHNob3VsZCB1c2UgdGhlIGxvYWRlciBpbiB0aGUgc2VxdWVuY2UgdGhleSBoYXZlIGJlZW4gYWRkZWQuCi0gICAgICovCi0gICAgdm9pZCBhZGRMb2FkZXIoWE1MTWV0YUJlYW5Mb2FkZXIgbG9hZGVyKTsKLQotICAgIC8qKgotICAgICAqIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgYSBsb2FkZXIgZm9yIGEgeG1sIGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIC0gcGF0aCBvZiB4bWwgZmlsZSBpbiBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICB2b2lkIGFkZFJlc291cmNlTG9hZGVyKFN0cmluZyByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuVVJMTG9hZGVyLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuVVJMTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZDczNWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhblVSTExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXRhQmVhblVSTExvYWRlciBpbXBsZW1lbnRzIFhNTE1ldGFCZWFuTG9hZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFVSTCB1cmw7Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW5VUkxMb2FkZXIoVVJMIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVVJMIHJlcXVpcmVkIik7Ci0gICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhQmVhbkluZm9zIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MTWV0YUJlYW5JbmZvcyBiZWFuSW5mb3MgPSAoWE1MTWV0YUJlYW5JbmZvcykgWE1MTWFwcGVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFhTdHJlYW0oKS5mcm9tWE1MKHN0cmVhbSk7Ci0gICAgICAgICAgICBiZWFuSW5mb3Muc2V0SWQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgICAgcmV0dXJuIGJlYW5JbmZvczsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhRWxlbWVudC5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzUzYTc5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1Bc0F0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5DbGFzc1V0aWxzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlcy5Qcm9wZXJ0eS4qOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWV0YUVsZW1lbnQgZXh0ZW5kcyBYTUxGZWF0dXJlc0NhcGFibGUgewotICAgIC8qKiBTZXJpYWxpemF0aW9uIHZlcnNpb24gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUoKQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZSgpCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFuZGF0b3J5OwotCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZSgpCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIG1pbkxlbmd0aDsKLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlKCkKLSAgICBwcml2YXRlIEludGVnZXIgbWF4TGVuZ3RoOwotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUoKQotICAgIHByaXZhdGUgQm9vbGVhbiByZWFkb25seTsKLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlKCkKLSAgICBwcml2YXRlIEJvb2xlYW4gaGlkZGVuOwotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUoKQotICAgIHByaXZhdGUgQm9vbGVhbiBkZW5pZWQ7Ci0gICAgLyoqCi0gICAgICogbm9ybWFsbHkgdGhlIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICogaW4gY2FzZSwgbm8gaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgZ2l2ZW4sIHRoZSB4bWwgY2FuCi0gICAgICogY29udGFpbiB0aGUgdHlwZSBkaXJlY3RseS4KLSAgICAgKi8KLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlKCkKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYW5kYXRvcnkoKSB7Ci0gICAgICAgIHJldHVybiBtYW5kYXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFuZGF0b3J5KFN0cmluZyBtYW5kYXRvcnkpIHsKLSAgICAgICAgdGhpcy5tYW5kYXRvcnkgPSBtYW5kYXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0TWluTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbWluTGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbkxlbmd0aChJbnRlZ2VyIG1pbkxlbmd0aCkgewotICAgICAgICB0aGlzLm1pbkxlbmd0aCA9IG1pbkxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRNYXhMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBtYXhMZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoKEludGVnZXIgbWF4TGVuZ3RoKSB7Ci0gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGdldFJlYWRvbmx5KCkgewotICAgICAgICByZXR1cm4gcmVhZG9ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVhZG9ubHkoQm9vbGVhbiByZWFkb25seSkgewotICAgICAgICB0aGlzLnJlYWRvbmx5ID0gcmVhZG9ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0RGVuaWVkKCkgewotICAgICAgICByZXR1cm4gZGVuaWVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlbmllZChCb29sZWFuIGRlbmllZCkgewotICAgICAgICB0aGlzLmRlbmllZCA9IGRlbmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRIaWRkZW4oKSB7Ci0gICAgICAgIHJldHVybiBoaWRkZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZGVuKEJvb2xlYW4gaGlkZGVuKSB7Ci0gICAgICAgIHRoaXMuaGlkZGVuID0gaGlkZGVuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lcmdlSW50byhNZXRhUHJvcGVydHkgcHJvcCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBtZXJnZUZlYXR1cmVzSW50byhwcm9wKTsKLSAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsICYmIGdldFR5cGUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHByb3Auc2V0VHlwZShDbGFzc1V0aWxzLmdldENsYXNzKGdldFR5cGUoKSkpOyAvLyBlbmhhbmNlbWVudDogb3IgdXNlIGdldEdlbmVyaWNUeXBlKCkgPwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRIaWRkZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoSElEREVOLCBnZXRIaWRkZW4oKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldE1hbmRhdG9yeSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3AucHV0RmVhdHVyZShNQU5EQVRPUlksIGdldE1hbmRhdG9yeSgpLmVxdWFscygidHJ1ZSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TWF4TGVuZ3RoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcC5wdXRGZWF0dXJlKE1BWF9MRU5HVEgsIGdldE1heExlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TWluTGVuZ3RoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcC5wdXRGZWF0dXJlKE1JTl9MRU5HVEgsIGdldE1pbkxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0UmVhZG9ubHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoUkVBRE9OTFksIGdldFJlYWRvbmx5KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXREZW5pZWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoREVOSUVELCBnZXREZW5pZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFGZWF0dXJlLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDAwMDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtQWxpYXM7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1Bc0F0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1AWFN0cmVhbUFsaWFzKCJmZWF0dXJlIikKLXB1YmxpYyBjbGFzcyBYTUxNZXRhRmVhdHVyZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZQotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlCi0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUZlYXR1cmUoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTE1ldGFGZWF0dXJlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhUHJvcGVydHkuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzQ3NzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1BbGlhczsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUFzQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzLlByb3BlcnR5Lio7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBYU3RyZWFtQWxpYXMoInByb3BlcnR5IikKLXB1YmxpYyBjbGFzcyBYTUxNZXRhUHJvcGVydHkgZXh0ZW5kcyBYTUxNZXRhRWxlbWVudCB7Ci0gICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogaWYgeW91IG5lZWQgb3RoZXIgdHlwZXMgKExvbmcsIGRvdWJsZSwgU3RyaW5nKSBmb3IgbWF4VmFsdWUgYW5kCi0gICAgICogbWluVmFsdWUsIGNvbmZpZ3VyZSB2aWEKLSAgICAgKiA8cHJlPgotICAgICAqICZsdDtmZWF0dXJlIGtleT0ibWF4VmFsdWUiPgotICAgICAqICAgJmx0O3ZhbHVlIGNsYXNzPSJqYXZhLmxhbmcuTG9uZyI+MTAwMCZsdDsvdmFsdWU+Ci0gICAgICogJmx0Oy9mZWF0dXJlPgotICAgICAqIDwvcHJlPgotICAgICAqIGluc3RlYWQgd2l0aCBleHBsaWNpdCB0eXBpbmcuCi0gICAgICovCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZSgpCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIG1heFZhbHVlOyAvLyBYU3RyZWFtIHJlcXVpcmVzIGEgbm9uLWFic3RyYWN0IHR5cGUgdG8gcGFyc2UgWE1MCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZSgpCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIG1pblZhbHVlOyAvLyBYU3RyZWFtIHJlcXVpcmVzIGEgbm9uLWFic3RyYWN0IHR5cGUgdG8gcGFyc2UgWE1MCi0KLSAgICBwcml2YXRlIFN0cmluZyByZWdleHA7Ci0KLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlKCkKLSAgICBwcml2YXRlIFN0cmluZyB0aW1lTGFnOwotCi0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRNYXhWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1heFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1heFZhbHVlKEludGVnZXIgbWF4VmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldE1pblZhbHVlKCkgewotICAgICAgICByZXR1cm4gbWluVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWluVmFsdWUoSW50ZWdlciBtaW5WYWx1ZSkgewotICAgICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdleHAoKSB7Ci0gICAgICAgIHJldHVybiByZWdleHA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVnZXhwKFN0cmluZyByZWdleHApIHsKLSAgICAgICAgdGhpcy5yZWdleHAgPSByZWdleHA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaW1lTGFnKCkgewotICAgICAgICByZXR1cm4gdGltZUxhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lTGFnKFN0cmluZyB0aW1lTGFnKSB7Ci0gICAgICAgIHRoaXMudGltZUxhZyA9IHRpbWVMYWc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWVyZ2VJbnRvKE1ldGFQcm9wZXJ0eSBwcm9wKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLm1lcmdlSW50byhwcm9wKTsgICAvLyBjYWxsIHN1cGVyIQotICAgICAgICBpZiAoZ2V0TWF4VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoTUFYX1ZBTFVFLCBnZXRNYXhWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TWluVmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnB1dEZlYXR1cmUoTUlOX1ZBTFVFLCBnZXRNaW5WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0UmVnZXhwKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcC5wdXRGZWF0dXJlKFJFR19FWFAsIGdldFJlZ2V4cCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0VGltZUxhZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3AucHV0RmVhdHVyZShUSU1FX0xBRywgZ2V0VGltZUxhZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OWQ4YTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1BbGlhczsKLWltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uYW5ub3RhdGlvbnMuWFN0cmVhbUFzQXR0cmlidXRlOwotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtT21pdEZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLUBYU3RyZWFtQWxpYXMoInZhbGlkYXRvciIpCi1wdWJsaWMgY2xhc3MgWE1MTWV0YVZhbGlkYXRvciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBAWFN0cmVhbU9taXRGaWVsZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIEBYU3RyZWFtQXNBdHRyaWJ1dGUKLSAgICBwcml2YXRlIFN0cmluZyBqYXZhOyAgLy8gaW1wbGVtZW50YXRpb24gb2YgVmFsaWRhdGlvbgotCi0gICAgQFhTdHJlYW1Bc0F0dHJpYnV0ZQotICAgIHByaXZhdGUgU3RyaW5nIGpzRnVuY3Rpb247IC8vIG5hbWUgb2YgamF2YSBzY3JpcHQgZnVuY3Rpb24KLQotICAgIEBYU3RyZWFtT21pdEZpZWxkCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgVmFsaWRhdGlvbiB2YWxpZGF0aW9uOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhKCkgewotICAgICAgICByZXR1cm4gamF2YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhKFN0cmluZyBqYXZhKSB7Ci0gICAgICAgIHRoaXMuamF2YSA9IGphdmE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbihWYWxpZGF0aW9uIHZhbGlkYXRpb24pIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gdmFsaWRhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvbiBnZXRWYWxpZGF0aW9uKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEpzRnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBqc0Z1bmN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEpzRnVuY3Rpb24oU3RyaW5nIGpzRnVuY3Rpb24pIHsKLSAgICAgICAgdGhpcy5qc0Z1bmN0aW9uID0ganNGdW5jdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFWYWxpZGF0b3JSZWZlcmVuY2UuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjYyN2M1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5hbm5vdGF0aW9ucy5YU3RyZWFtQWxpYXM7Ci1pbXBvcnQgY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtLmFubm90YXRpb25zLlhTdHJlYW1Bc0F0dHJpYnV0ZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1AWFN0cmVhbUFsaWFzKCJ2YWxpZGF0b3ItcmVmIikKLXB1YmxpYyBjbGFzcyBYTUxNZXRhVmFsaWRhdG9yUmVmZXJlbmNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAvKiogU2VyaWFsaXphdGlvbiB2ZXJzaW9uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAWFN0cmVhbUFzQXR0cmlidXRlCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVmSWQ7Ci0KLSAgICBwdWJsaWMgWE1MTWV0YVZhbGlkYXRvclJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5yZWZJZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxNZXRhVmFsaWRhdG9yUmVmZXJlbmNlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmSWQoKSB7Ci0gICAgICAgIHJldHVybiByZWZJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZJZChTdHJpbmcgcmVmSWQpIHsKLSAgICAgICAgdGhpcy5yZWZJZCA9IHJlZklkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVZhbHVlLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGEwNmVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTE1ldGFWYWx1ZSB7Ci0gICAgLy8ga2V5cyBmb3IgQW5ub3RhdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PS0VZX1dpZGdldCA9ICJXSURHRVQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9LRVlfVGFibGVDb2x1bW4gPSAiVEFCTEVfQ09MVU1OIjsKLQotICAgIC8vIHZhbHVlcyBmb3IgVElNRUxBRwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVMQUdfUGFzdCA9ICJQQVNUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FTEFHX0Z1dHVyZSA9ICJGVVRVUkUiOwotCi0gICAgLy8gdmFsdWVzIGZvciBNQU5EQVRPUlkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5EQVRPUlkgPSAidHJ1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUwgPSAiZmFsc2UiOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvQnVzaW5lc3NFbnVtLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS9CdXNpbmVzc0VudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NzcxZC4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS9CdXNpbmVzc0VudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leGFtcGxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgZW51bSBCdXNpbmVzc0VudW0gewotICAgIFZBTFVFMSwgVkFMVUUyLCBWQUxVRTMKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leGFtcGxlL0J1c2luZXNzT2JqZWN0LmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS9CdXNpbmVzc09iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUxMWQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leGFtcGxlL0J1c2luZXNzT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpcHRpb246IDxici8+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCdXNpbmVzc09iamVjdCB7Ci0gICAgcHJpdmF0ZSBsb25nIHVzZXJJZDsKLSAgICBwcml2YXRlIGludCBudW1lcmljVmFsdWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lLCBsYXN0TmFtZSwgdGl0bGU7Ci0gICAgcHJpdmF0ZSBEYXRlIGRhdGVCaXJ0aDsKLSAgICBwcml2YXRlIFRpbWVzdGFtcCB2YWxpZFRvOwotICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOwotICAgIHByaXZhdGUgQnVzaW5lc3NFbnVtIGNob2ljZTsKLSAgICBwcml2YXRlIEJ1c2luZXNzT2JqZWN0QWRkcmVzcyBhZGRyZXNzOwotICAgIHByaXZhdGUgTGlzdDxCdXNpbmVzc09iamVjdEFkZHJlc3M+IGFkZHJlc3NlczsKLQotICAgIHB1YmxpYyBCdXNpbmVzc0VudW0gZ2V0Q2hvaWNlKCkgewotICAgICAgICByZXR1cm4gY2hvaWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZShCdXNpbmVzc0VudW0gY2hvaWNlKSB7Ci0gICAgICAgIHRoaXMuY2hvaWNlID0gY2hvaWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGdldERhdGVCaXJ0aCgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGVCaXJ0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlQmlydGgoRGF0ZSBkYXRlQmlydGgpIHsKLSAgICAgICAgdGhpcy5kYXRlQmlydGggPSBkYXRlQmlydGg7Ci0gICAgfQotCi0gICAgcHVibGljIFRpbWVzdGFtcCBnZXRWYWxpZFRvKCkgewotICAgICAgICByZXR1cm4gdmFsaWRUbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZFRvKFRpbWVzdGFtcCB2YWxpZFRvKSB7Ci0gICAgICAgIHRoaXMudmFsaWRUbyA9IHZhbGlkVG87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKLSAgICAgICAgcmV0dXJuIGVtYWlsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgewotICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1c2luZXNzT2JqZWN0QWRkcmVzcyBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKEJ1c2luZXNzT2JqZWN0QWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnVtZXJpY1ZhbHVlKGludCBuZXdOdW1lcmljVmFsdWUpIHsKLSAgICAgICAgbnVtZXJpY1ZhbHVlID0gbmV3TnVtZXJpY1ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtZXJpY1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gbnVtZXJpY1ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgZmlyc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsYXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpIHsKLSAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFVzZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VySWQobG9uZyB1c2VySWQpIHsKLSAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QnVzaW5lc3NPYmplY3RBZGRyZXNzPiBnZXRBZGRyZXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2VzKExpc3Q8QnVzaW5lc3NPYmplY3RBZGRyZXNzPiBhZGRyZXNzZXMpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzZXMgPSBhZGRyZXNzZXM7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvQnVzaW5lc3NPYmplY3RBZGRyZXNzLmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS9CdXNpbmVzc09iamVjdEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2YzE4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS9CdXNpbmVzc09iamVjdEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leGFtcGxlOwotCi0vKioKLSAqIERlc2NyaXB0aW9uOiA8YnIvPgotICovCi1wdWJsaWMgY2xhc3MgQnVzaW5lc3NPYmplY3RBZGRyZXNzIHsKLSAgICBwcml2YXRlIFN0cmluZyBjaXR5LCBjb3VudHJ5OwotICAgIHByaXZhdGUgQnVzaW5lc3NPYmplY3Qgb3duZXI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBjb3VudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvdW50cnkoU3RyaW5nIGNvdW50cnkpIHsKLSAgICAgICAgdGhpcy5jb3VudHJ5ID0gY291bnRyeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVzaW5lc3NPYmplY3QgZ2V0T3duZXIoKSB7Ci0gICAgICAgIHJldHVybiBvd25lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPd25lcihCdXNpbmVzc09iamVjdCBvd25lcikgewotICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvQnVzaW5lc3NPYmplY3RCZWFuSW5mby5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvQnVzaW5lc3NPYmplY3RCZWFuSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIwNmU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC9leGFtcGxlL0J1c2luZXNzT2JqZWN0QmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5leGFtcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5TaW1wbGVCZWFuSW5mbzsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyLz4KLSAqLwotcHVibGljIGNsYXNzIEJ1c2luZXNzT2JqZWN0QmVhbkluZm8gZXh0ZW5kcyBTaW1wbGVCZWFuSW5mbyB7Ci0gICAgQ2xhc3M8Pz4gdGFyZ2V0Q2xhc3MgPSBCdXNpbmVzc09iamVjdC5jbGFzczsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCZWFuSW5mb1tdIGdldEFkZGl0aW9uYWxCZWFuSW5mbygpIHsKLSAgICAgICAgRXhwbGljaXRCZWFuSW5mbyBiaSA9IG5ldyBFeHBsaWNpdEJlYW5JbmZvKCk7Ci0gICAgICAgIGJpLnNldFByb3BlcnR5RGVzY3JpcHRvcnMoX2dldFByb3BlcnR5RGVzY3JpcHRvcnMoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgQmVhbkluZm9bXXtiaX07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGVzY3JpcHRvcltdIF9nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG51bWVyaWNWYWx1ZSA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoIm51bWVyaWNWYWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldENsYXNzLCAiZ2V0TnVtZXJpY1ZhbHVlIiwgInNldE51bWVyaWNWYWx1ZSIpOwotICAgICAgICAgICAgbnVtZXJpY1ZhbHVlLnNldFZhbHVlKEZlYXR1cmVzLlByb3BlcnR5Lk1BWF9WQUxVRSwgbmV3IEludGVnZXIoMTAwKSk7Ci0gICAgICAgICAgICBudW1lcmljVmFsdWUuc2V0VmFsdWUoRmVhdHVyZXMuUHJvcGVydHkuTUlOX1ZBTFVFLCBuZXcgSW50ZWdlcigtMTAwKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGVzY3JpcHRvcltde251bWVyaWNWYWx1ZX07Ci0gICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNsYXNzIEV4cGxpY2l0QmVhbkluZm8gZXh0ZW5kcyBTaW1wbGVCZWFuSW5mbyB7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RGVzY3JpcHRvcnMoUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycykgewotICAgICAgICB0aGlzLnByb3BlcnR5RGVzY3JpcHRvcnMgPSBwcm9wZXJ0eURlc2NyaXB0b3JzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvU3RhbmRhcmRWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL3JvdXRpbmVzL1N0YW5kYXJkVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlZTNkYi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwvcm91dGluZXMvU3RhbmRhcmRWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5CZWFuVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLkZlYXR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5NZXRhUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5WYWxpZGF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnhtbC5YTUxNZXRhVmFsdWU7Ci0KLWltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBTdGFuZGFyZFZhbGlkYXRpb24gVGVzdGVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgVmFsaWRhdGlvbkxpc3RlbmVyIHsKLSAgICBwcml2YXRlIFN0YW5kYXJkVmFsaWRhdGlvbiB2YWxpZGF0aW9uOwotICAgIHByaXZhdGUgQmVhblZhbGlkYXRpb25Db250ZXh0PFN0YW5kYXJkVmFsaWRhdGlvblRlc3Q+IGNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVhc29ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTWV0YVByb3BlcnR5IG1ldGFQcm9wZXJ0eTsKLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdWYWx1ZTsKLSAgICBwcml2YXRlIERhdGUgZGF0ZVZhbHVlOwotICAgIHByaXZhdGUgaW50IGludFZhbHVlOwotCi0gICAgcHVibGljIFN0YW5kYXJkVmFsaWRhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdmFsaWRhdGlvbiA9IG5ldyBTdGFuZGFyZFZhbGlkYXRpb24oKTsKLSAgICAgICAgY29udGV4dCA9IG5ldyBCZWFuVmFsaWRhdGlvbkNvbnRleHQ8U3RhbmRhcmRWYWxpZGF0aW9uVGVzdD4odGhpcyk7Ci0gICAgICAgIG1ldGFQcm9wZXJ0eSA9IG5ldyBNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgY29udGV4dC5zZXRCZWFuKHRoaXMsIG51bGwpOwotICAgICAgICBjb250ZXh0LnNldE1ldGFQcm9wZXJ0eShtZXRhUHJvcGVydHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1hbmRhdG9yeSgpIHsKLSAgICAgICAgbWV0YVByb3BlcnR5LnNldE5hbWUoInN0cmluZ1ZhbHVlIik7Ci0KLSAgICAgICAgLy8gdGVzdCBub3QtbnVsbCB2YWx1ZSB0aGF0IGlzIG1hbmRhdG9yeQotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TWFuZGF0b3J5KHRydWUpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICJzb21lIHZhbHVlIjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1hbmRhdG9yeShjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8gdGVzdCBudWxsIHZhbHVlIHRoYXQgaXMgbWFuZGF0b3J5Ci0gICAgICAgIGNvbnRleHQudW5rbm93blZhbHVlKCk7Ci0gICAgICAgIHN0cmluZ1ZhbHVlID0gbnVsbDsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1hbmRhdG9yeShjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuTUFOREFUT1JZKSk7Ci0KLSAgICAgICAgLy8gdGVzdCBudWxsIHZhbHVlIHRoYXQgaXMgTk9UIG1hbmRhdG9yeQotICAgICAgICBjb250ZXh0LnVua25vd25WYWx1ZSgpOwotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TWFuZGF0b3J5KGZhbHNlKTsKLSAgICAgICAgcmVhc29ucy5jbGVhcigpOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlTWFuZGF0b3J5KGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVNYXhMZW5ndGgoKSB7Ci0gICAgICAgIG1ldGFQcm9wZXJ0eS5zZXROYW1lKCJzdHJpbmdWYWx1ZSIpOwotICAgICAgICBtZXRhUHJvcGVydHkucHV0RmVhdHVyZShGZWF0dXJlcy5Qcm9wZXJ0eS5NQVhfTEVOR1RILCA1KTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiMTIzNCI7Ci0gICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGVNYXhMZW5ndGgoY29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVhc29ucy5pc0VtcHR5KCkpOwotICAgICAgICBjb250ZXh0LnVua25vd25WYWx1ZSgpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICJtdWNoIHRvbyBsb25nIjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1heExlbmd0aChjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuTUFYX0xFTkdUSCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1pbkxlbmd0aCgpIHsKLSAgICAgICAgbWV0YVByb3BlcnR5LnNldE5hbWUoInN0cmluZ1ZhbHVlIik7Ci0gICAgICAgIG1ldGFQcm9wZXJ0eS5wdXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5Lk1JTl9MRU5HVEgsIDUpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICIxMjM0NTYiOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlTWluTGVuZ3RoKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiMTIzIjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1pbkxlbmd0aChjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuTUlOX0xFTkdUSCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1heFZhbHVlKCkgewotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgic3RyaW5nVmFsdWUiKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuTUFYX1ZBTFVFLCAiOTk5OSIpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICIxMTExIjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1heFZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiOTk5OTkiOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlTWF4VmFsdWUoY29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVhc29ucy5jb250YWlucyhSZWFzb25zLk1BWF9WQUxVRSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1pblZhbHVlKCkgewotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgic3RyaW5nVmFsdWUiKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuTUlOX1ZBTFVFLCAiNTU1NSIpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICI4ODg4IjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1pblZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiMzMzMyI7Ci0gICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGVNaW5WYWx1ZShjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuTUlOX1ZBTFVFKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGludFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1pblZhbHVlX01peGVkTnVtYmVyKCkgewotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgiaW50VmFsdWUiKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuTUlOX1ZBTFVFLCBuZXcgTG9uZygwKSk7Ci0gICAgICAgIGludFZhbHVlID0gNTsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1pblZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgaW50VmFsdWUgPSAtMTsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1pblZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuY29udGFpbnMoUmVhc29ucy5NSU5fVkFMVUUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVNaW5WYWx1ZV9EYXRlX1RpbWVzdGFtcCgpIHsKLSAgICAgICAgbWV0YVByb3BlcnR5LnNldE5hbWUoImRhdGVWYWx1ZSIpOwotICAgICAgICBEYXRlIGR0ID0gbmV3IERhdGUoKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuTUlOX1ZBTFVFLCBkdCk7Ci0gICAgICAgIGRhdGVWYWx1ZSA9IG5ldyBUaW1lc3RhbXAoZHQuZ2V0VGltZSgpKzEwMDApOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlTWluVmFsdWUoY29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVhc29ucy5pc0VtcHR5KCkpOwotICAgICAgICBjb250ZXh0LnVua25vd25WYWx1ZSgpOwotICAgICAgICBkYXRlVmFsdWUgPSBuZXcgVGltZXN0YW1wKGR0LmdldFRpbWUoKS0xMDAwKTsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1pblZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuY29udGFpbnMoUmVhc29ucy5NSU5fVkFMVUUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVNYXhWYWx1ZV9BbHBoYWJldGljU3RyaW5nKCkgewotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgic3RyaW5nVmFsdWUiKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuTUFYX1ZBTFVFLCAiQkJCQiIpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9ICJBQUFBIjsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZU1heFZhbHVlKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiQkJCQyI7Ci0gICAgICAgIHZhbGlkYXRpb24udmFsaWRhdGVNYXhWYWx1ZShjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuTUFYX1ZBTFVFKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUmVnRXhwKCkgewotICAgICAgICAvLyByZWdleHAgZm9yIFppcAotICAgICAgICBTdHJpbmcgcmVnZXhwID0gIlthLXpBLVpcXC0gXFxkXSoiOwotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgic3RyaW5nVmFsdWUiKTsKLSAgICAgICAgbWV0YVByb3BlcnR5LnB1dEZlYXR1cmUoRmVhdHVyZXMuUHJvcGVydHkuUkVHX0VYUCwgcmVnZXhwKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiNTM3NzMiOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlUmVnRXhwKGNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgY29udGV4dC51bmtub3duVmFsdWUoKTsKLSAgICAgICAgc3RyaW5nVmFsdWUgPSAiNTM1NS83IjsgLy8gaW52YWxpZCB6aXAgdmFsdWUKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZVJlZ0V4cChjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuUkVHX0VYUCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlIGdldERhdGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGVWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVUaW1lTGFnKCkgewotICAgICAgICBtZXRhUHJvcGVydHkuc2V0TmFtZSgiZGF0ZVZhbHVlIik7Ci0gICAgICAgIG1ldGFQcm9wZXJ0eS5wdXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5LlRJTUVfTEFHLCBYTUxNZXRhVmFsdWUuVElNRUxBR19QYXN0KTsKLQotICAgICAgICBkYXRlVmFsdWUgPSBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIDEwMDAwKTsKLSAgICAgICAgdmFsaWRhdGlvbi52YWxpZGF0ZVRpbWVMYWcoY29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVhc29ucy5pc0VtcHR5KCkpOwotCi0gICAgICAgIG1ldGFQcm9wZXJ0eS5wdXRGZWF0dXJlKEZlYXR1cmVzLlByb3BlcnR5LlRJTUVfTEFHLCBYTUxNZXRhVmFsdWUuVElNRUxBR19GdXR1cmUpOwotICAgICAgICB2YWxpZGF0aW9uLnZhbGlkYXRlVGltZUxhZyhjb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb25zLmNvbnRhaW5zKFJlYXNvbnMuVElNRV9MQUcpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhbmRhcmRWYWxpZGF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUIGV4dGVuZHMgVmFsaWRhdGlvbkxpc3RlbmVyPiB2b2lkIGFkZEVycm9yKFN0cmluZyByZWFzb24sIFZhbGlkYXRpb25Db250ZXh0PFQ+IGNvbnRleHQpIHsKLSAgICAgICAgcmVhc29ucy5hZGQocmVhc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBWYWxpZGF0aW9uTGlzdGVuZXI+IHZvaWQgYWRkRXJyb3IoVmFsaWRhdGlvbkxpc3RlbmVyLkVycm9yIGVycm9yLCBWYWxpZGF0aW9uQ29udGV4dDxUPiBjb250ZXh0KSB7Ci0gICAgICAgIHJlYXNvbnMuYWRkKGVycm9yLmdldFJlYXNvbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvQmVhblZhbGlkYXRvclRlc3QuamF2YSBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvQmVhblZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2ZGExNS4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL0JlYW5WYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5idmFsLnhtbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5CZWFuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5NZXRhQmVhbkZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuVmFsaWRhdGlvblJlc3VsdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3RBZGRyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYnZhbC5tb2RlbC5GZWF0dXJlczsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwubW9kZWwuTWV0YUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLnJvdXRpbmVzLlJlYXNvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEJlYW5WYWxpZGF0b3IgVGVzdGVyLgotICovCi1wdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIEJlYW5WYWxpZGF0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVNYXBBc0JlYW4oKSB7Ci0gICAgICAgIFhNTE1ldGFCZWFuTWFuYWdlckZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5hZGRMb2FkZXIobmV3IFhNTE1ldGFCZWFuVVJMTG9hZGVyKAotICAgICAgICAgICAgICBCdXNpbmVzc09iamVjdC5jbGFzcy5nZXRSZXNvdXJjZSgidGVzdC1iZWFuSW5mb3MueG1sIikpKTsKLQotICAgICAgICBNZXRhQmVhbiBtYiA9IFhNTE1ldGFCZWFuTWFuYWdlckZhY3RvcnkuZ2V0RmluZGVyKCkKLSAgICAgICAgICAgICAgLmZpbmRGb3JJZCgib3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQWRkcmVzcyIpOwotCi0gICAgICAgIC8vIDEuIHZhbGlkYXRlIGEgYmVhbgotICAgICAgICBCdXNpbmVzc09iamVjdEFkZHJlc3MgYWRyID0gbmV3IEJ1c2luZXNzT2JqZWN0QWRkcmVzcygpOwotICAgICAgICBCZWFuVmFsaWRhdG9yPFZhbGlkYXRpb25SZXN1bHRzPiB2YWxpZGF0b3IgPSBuZXcgQmVhblZhbGlkYXRvcjxWYWxpZGF0aW9uUmVzdWx0cz4oKTsKLSAgICAgICAgVmFsaWRhdGlvblJlc3VsdHMgcmVzdWx0cyA9IHZhbGlkYXRvci52YWxpZGF0ZShhZHIsIG1iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsCi0gICAgICAgICAgICAgIHJlc3VsdHMuZ2V0RXJyb3JzQnlSZWFzb24oKS5nZXQoRmVhdHVyZXMuUHJvcGVydHkuTUFOREFUT1JZKS5zaXplKCkpOwotCi0gICAgICAgIC8vIDIuIHZhbGlkYXRlIGEgbWFwIHdpdGggdGhlIHNhbWUgbWV0YWJlYW4KLSAgICAgICAgdmFsaWRhdG9yLnNldFRyZWF0TWFwc0xpa2VCZWFucyh0cnVlKTsKLSAgICAgICAgcmVzdWx0cyA9IHZhbGlkYXRvci52YWxpZGF0ZShuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSwgbWIpOwotICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLAotICAgICAgICAgICAgICByZXN1bHRzLmdldEVycm9yc0J5UmVhc29uKCkuZ2V0KEZlYXR1cmVzLlByb3BlcnR5Lk1BTkRBVE9SWSkuc2l6ZSgpKTsKLQotICAgICAgICAvLyAzLiB2YWxpZGF0ZSBhcyBlbXB0eSBtYXAgKGpzcjMwMyBiZWhhdmlvcikKLSAgICAgICAgdmFsaWRhdG9yLnNldFRyZWF0TWFwc0xpa2VCZWFucyhmYWxzZSk7Ci0gICAgICAgIHJlc3VsdHMgPSB2YWxpZGF0b3IudmFsaWRhdGUobmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCksIG1iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmlzRW1wdHkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgewotICAgICAgICBNZXRhQmVhbkZpbmRlciBmaW5kZXIgPSBYTUxNZXRhQmVhbk1hbmFnZXJGYWN0b3J5LmdldEZpbmRlcigpOwotICAgICAgICBYTUxNZXRhQmVhbk1hbmFnZXJGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuYWRkTG9hZGVyKG5ldyBYTUxNZXRhQmVhblVSTExvYWRlcigKLSAgICAgICAgICAgICAgQnVzaW5lc3NPYmplY3QuY2xhc3MuZ2V0UmVzb3VyY2UoInRlc3QtYmVhbkluZm9zLnhtbCIpKSk7Ci0gICAgICAgIE1ldGFCZWFuIGluZm8gPSBmaW5kZXIuZmluZEZvckNsYXNzKEJ1c2luZXNzT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgQnVzaW5lc3NPYmplY3Qgb2JqZWN0ID0gbmV3IEJ1c2luZXNzT2JqZWN0KCk7Ci0gICAgICAgIG9iamVjdC5zZXRBZGRyZXNzKG5ldyBCdXNpbmVzc09iamVjdEFkZHJlc3MoKSk7Ci0gICAgICAgIG9iamVjdC5nZXRBZGRyZXNzKCkuc2V0T3duZXIob2JqZWN0KTsKLSAgICAgICAgQmVhblZhbGlkYXRvcjxWYWxpZGF0aW9uUmVzdWx0cz4gdmFsaWRhdG9yID0gbmV3IEJlYW5WYWxpZGF0b3I8VmFsaWRhdGlvblJlc3VsdHM+KCk7Ci0gICAgICAgIFZhbGlkYXRpb25SZXN1bHRzIHJlc3VsdHMgPSB2YWxpZGF0b3IudmFsaWRhdGUob2JqZWN0LCBpbmZvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmhhc0Vycm9yRm9yUmVhc29uKFJlYXNvbnMuTUFOREFUT1JZKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0cy5oYXNFcnJvcihvYmplY3QsIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRzLmhhc0Vycm9yKG9iamVjdC5nZXRBZGRyZXNzKCksIG51bGwpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0eShvYmplY3QsIGluZm8uZ2V0UHJvcGVydHkoImZpcnN0TmFtZSIpKS5oYXNFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0LCAiZmlyc3ROYW1lIikpOwotCi0gICAgICAgIG9iamVjdC5zZXRVc2VySWQoMUwpOwotICAgICAgICBvYmplY3Quc2V0Rmlyc3ROYW1lKCJIYW5zIik7Ci0gICAgICAgIG9iamVjdC5zZXRMYXN0TmFtZSgiVGVzdGVyIik7Ci0gICAgICAgIG9iamVjdC5zZXRBZGRyZXNzKG5ldyBCdXNpbmVzc09iamVjdEFkZHJlc3MoKSk7Ci0gICAgICAgIG9iamVjdC5nZXRBZGRyZXNzKCkuc2V0T3duZXIob2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodmFsaWRhdG9yLnZhbGlkYXRlKG9iamVjdCwgaW5mbykuaXNFbXB0eSgpKTsKLQotICAgICAgICBvYmplY3QuZ2V0QWRkcmVzcygpLnNldENvdW50cnkoIjAxMjM0NTY3ODkwMTIzNDU2NzgiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UodmFsaWRhdG9yLnZhbGlkYXRlKG9iamVjdCwgaW5mbykuaXNFbXB0eSgpKTsKLQotICAgICAgICBvYmplY3QuZ2V0QWRkcmVzcygpLnNldENvdW50cnkoIkdlcm1hbnkiKTsKLSAgICAgICAgb2JqZWN0LnNldEFkZHJlc3NlcyhuZXcgQXJyYXlMaXN0PEJ1c2luZXNzT2JqZWN0QWRkcmVzcz4oKSk7Ci0gICAgICAgIG9iamVjdC5nZXRBZGRyZXNzZXMoKS5hZGQob2JqZWN0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIG9iamVjdC5nZXRBZGRyZXNzZXMoKS5hZGQob2JqZWN0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIG9iamVjdC5nZXRBZGRyZXNzZXMoKS5hZGQob2JqZWN0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsaWRhdG9yLnZhbGlkYXRlKG9iamVjdCwgaW5mbykuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyA0dGggYWRkcmVzcyBpcyB0b28gbXVjaCEKLSAgICAgICAgb2JqZWN0LmdldEFkZHJlc3NlcygpLmFkZChvYmplY3QuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoCi0gICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShvYmplY3QsIGluZm8pLmlzRW1wdHkoKSk7IC8vIGNhcmRpbmFsaXR5IGVycm9yIGZvdW5kCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShCZWFuVmFsaWRhdG9yVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkluZm9zVGVzdC5qYXZhIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbkluZm9zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZkM2RjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYnZhbC94bWwvWE1MTWV0YUJlYW5JbmZvc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmJ2YWwueG1sOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuZXhhbXBsZS5CdXNpbmVzc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuZXhhbXBsZS5CdXNpbmVzc09iamVjdEFkZHJlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogWE1MTWV0YUJlYW4gVGVzdGVyLgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWV0YUJlYW5JbmZvc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW5JbmZvc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuSW5mb3NUb1hNTCgpIHsKLSAgICAgICAgWE1MTWV0YUJlYW5JbmZvcyBpbmZvcyA9IG5ldyBYTUxNZXRhQmVhbkluZm9zKCk7Ci0gICAgICAgIGluZm9zLnNldEJlYW5zKG5ldyBBcnJheUxpc3Q8WE1MTWV0YUJlYW4+KCkpOwotICAgICAgICBpbmZvcy5zZXRWYWxpZGF0b3JzKG5ldyBBcnJheUxpc3Q8WE1MTWV0YVZhbGlkYXRvcj4oKSk7Ci0KLSAgICAgICAgWE1MTWV0YVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgWE1MTWV0YVZhbGlkYXRvcigpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SWQoIm1hbmRhdG9yeSIpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SmF2YSgib3JnLmFwYWNoZS5idmFsLk1hbmRhdG9yeVZhbGlkYXRvciIpOwotCi0gICAgICAgIGluZm9zLmdldFZhbGlkYXRvcnMoKS5hZGQodmFsaWRhdG9yKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSBuZXcgWE1MTWV0YVZhbGlkYXRvcigpOwotICAgICAgICB2YWxpZGF0b3Iuc2V0SWQoImVtYWlsIik7Ci0gICAgICAgIHZhbGlkYXRvci5zZXRKYXZhKCJvcmcuYXBhY2hlLmJ2YWwuRU1haWxWYWxpZGF0aW9uIik7Ci0KLSAgICAgICAgaW5mb3MuZ2V0VmFsaWRhdG9ycygpLmFkZCh2YWxpZGF0b3IpOwotCi0gICAgICAgIFhNTE1ldGFCZWFuIGJlYW4gPSBuZXcgWE1MTWV0YUJlYW4oKTsKLSAgICAgICAgYmVhbi5wdXRGZWF0dXJlKCJET01BSU4iLCAiVGVzdFByb2ZpbGUiKTsKLSAgICAgICAgYmVhbi5wdXRGZWF0dXJlKCJsYWJlbC1rZXkiLCAiYnVzaW5lc3Mtb2JqZWN0LWxhYmVsIik7Ci0gICAgICAgIGJlYW4uc2V0SWQoIlVzZXIiKTsKLSAgICAgICAgYmVhbi5zZXRJbXBsKEJ1c2luZXNzT2JqZWN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGJlYW4uc2V0UHJvcGVydGllcyhuZXcgQXJyYXlMaXN0PFhNTE1ldGFQcm9wZXJ0eT4oKSk7Ci0gICAgICAgIFhNTE1ldGFQcm9wZXJ0eSBwcm9wZXJ0eSA9IG5ldyBYTUxNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TmFtZSgidXNlcklkIik7Ci0gICAgICAgIHByb3BlcnR5LnNldE1hbmRhdG9yeShYTUxNZXRhVmFsdWUuTUFOREFUT1JZKTsKLSAgICAgICAgYmVhbi5nZXRQcm9wZXJ0aWVzKCkuYWRkKHByb3BlcnR5KTsKLQotICAgICAgICBwcm9wZXJ0eSA9IG5ldyBYTUxNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TmFtZSgiZmlyc3ROYW1lIik7Ci0gICAgICAgIHByb3BlcnR5LnNldE1hbmRhdG9yeShYTUxNZXRhVmFsdWUuTUFOREFUT1JZKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TWF4TGVuZ3RoKDEwMCk7Ci0gICAgICAgIGJlYW4uZ2V0UHJvcGVydGllcygpLmFkZChwcm9wZXJ0eSk7Ci0KLSAgICAgICAgcHJvcGVydHkgPSBuZXcgWE1MTWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIHByb3BlcnR5LnNldE5hbWUoImxhc3ROYW1lIik7Ci0gICAgICAgIHByb3BlcnR5LnNldE1hbmRhdG9yeShYTUxNZXRhVmFsdWUuTUFOREFUT1JZKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TWF4TGVuZ3RoKDEwMCk7Ci0gICAgICAgIGJlYW4uZ2V0UHJvcGVydGllcygpLmFkZChwcm9wZXJ0eSk7Ci0KLSAgICAgICAgcHJvcGVydHkgPSBuZXcgWE1MTWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIHByb3BlcnR5LnNldE5hbWUoInRpdGxlIik7Ci0gICAgICAgIHByb3BlcnR5LnNldE1hbmRhdG9yeShYTUxNZXRhVmFsdWUuT1BUSU9OQUwpOwotICAgICAgICBwcm9wZXJ0eS5zZXRNYXhMZW5ndGgoMTApOwotICAgICAgICBiZWFuLmdldFByb3BlcnRpZXMoKS5hZGQocHJvcGVydHkpOwotCi0gICAgICAgIHByb3BlcnR5ID0gbmV3IFhNTE1ldGFQcm9wZXJ0eSgpOwotICAgICAgICBwcm9wZXJ0eS5zZXROYW1lKCJkYXRlQmlydGgiKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TWFuZGF0b3J5KFhNTE1ldGFWYWx1ZS5PUFRJT05BTCk7Ci0gICAgICAgIHByb3BlcnR5LnNldFRpbWVMYWcoWE1MTWV0YVZhbHVlLlRJTUVMQUdfUGFzdCk7Ci0gICAgICAgIGJlYW4uZ2V0UHJvcGVydGllcygpLmFkZChwcm9wZXJ0eSk7Ci0KLSAgICAgICAgcHJvcGVydHkgPSBuZXcgWE1MTWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIHByb3BlcnR5LnNldE5hbWUoInZhbGlkVG8iKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TWFuZGF0b3J5KFhNTE1ldGFWYWx1ZS5PUFRJT05BTCk7Ci0gICAgICAgIHByb3BlcnR5LnNldFRpbWVMYWcoWE1MTWV0YVZhbHVlLlRJTUVMQUdfRnV0dXJlKTsKLSAgICAgICAgYmVhbi5nZXRQcm9wZXJ0aWVzKCkuYWRkKHByb3BlcnR5KTsKLQotICAgICAgICBwcm9wZXJ0eSA9IG5ldyBYTUxNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TmFtZSgiZW1haWwiKTsKLSAgICAgICAgcHJvcGVydHkucHV0RmVhdHVyZShYTUxNZXRhVmFsdWUuQU5OT0tFWV9XaWRnZXQsICJlbnRyeSIpOwotICAgICAgICBwcm9wZXJ0eS5wdXRGZWF0dXJlKFhNTE1ldGFWYWx1ZS5BTk5PS0VZX1RhYmxlQ29sdW1uLCB0cnVlKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtYXR0ZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9ybWF0dGVyTWFwLnB1dCgibG9jYWxlIiwgIkRFIik7Ci0gICAgICAgIGZvcm1hdHRlck1hcC5wdXQoInN0eWxlIiwgImluZm8iKTsKLSAgICAgICAgcHJvcGVydHkucHV0RmVhdHVyZSgiYWpheC1mb3JtYXR0ZXIiLCBmb3JtYXR0ZXJNYXApOwotICAgICAgICBwcm9wZXJ0eS5hZGRWYWxpZGF0b3IoImVtYWlsIik7Ci0gICAgICAgIGJlYW4uZ2V0UHJvcGVydGllcygpLmFkZChwcm9wZXJ0eSk7Ci0KLSAgICAgICAgaW5mb3MuZ2V0QmVhbnMoKS5hZGQoYmVhbik7Ci0KLSAgICAgICAgWE1MTWV0YUJlYW4gYmVhbjIgPSBuZXcgWE1MTWV0YUJlYW4oKTsKLSAgICAgICAgYmVhbjIuc2V0SWQoIkFkZHJlc3MiKTsKLSAgICAgICAgYmVhbjIuc2V0SW1wbChCdXNpbmVzc09iamVjdEFkZHJlc3MuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHJvcGVydHkgPSBuZXcgWE1MTWV0YVByb3BlcnR5KCk7Ci0gICAgICAgIHByb3BlcnR5LnNldE5hbWUoImNpdHkiKTsKLSAgICAgICAgYmVhbjIucHV0UHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICBwcm9wZXJ0eSA9IG5ldyBYTUxNZXRhUHJvcGVydHkoKTsKLSAgICAgICAgcHJvcGVydHkuc2V0TmFtZSgiY291bnRyeSIpOwotICAgICAgICBwcm9wZXJ0eS5zZXRNYXhMZW5ndGgoMTApOwotICAgICAgICBwcm9wZXJ0eS5zZXRNYW5kYXRvcnkoWE1MTWV0YVZhbHVlLk1BTkRBVE9SWSk7Ci0gICAgICAgIGJlYW4yLnB1dFByb3BlcnR5KHByb3BlcnR5KTsKLQotICAgICAgICBYTUxNZXRhQmVhblJlZmVyZW5jZSByZWxhdGlvbiA9IG5ldyBYTUxNZXRhQmVhblJlZmVyZW5jZSgpOwotICAgICAgICByZWxhdGlvbi5zZXROYW1lKCJhZGRyZXNzIik7Ci0gICAgICAgIHJlbGF0aW9uLnNldEJlYW5JZCgiQWRkcmVzcyIpOwotICAgICAgICByZWxhdGlvbi5zZXRNYW5kYXRvcnkoWE1MTWV0YVZhbHVlLk9QVElPTkFMKTsKLS8vICAgICAgICByZWxhdGlvbi5zZXREaXNwbGF5TmFtZSgiVXNlckFkZHJlc3MiKTsKLSAgICAgICAgYmVhbi5wdXRCZWFuUmVmKHJlbGF0aW9uKTsKLQotICAgICAgICBpbmZvcy5nZXRCZWFucygpLmFkZChiZWFuMik7Ci0KLSAgICAgICAgU3RyaW5nIHhtbCA9IFhNTE1hcHBlci5nZXRJbnN0YW5jZSgpLmdldFhTdHJlYW0oKS50b1hNTChpbmZvcyk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHhtbCk7Ci0gICAgICAgIFhNTE1ldGFCZWFuSW5mb3MgaW5mb3MyID0KLSAgICAgICAgICAgICAgKFhNTE1ldGFCZWFuSW5mb3MpIFhNTE1hcHBlci5nZXRJbnN0YW5jZSgpLmdldFhTdHJlYW0oKS5mcm9tWE1MKHhtbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpbmZvczIuZ2V0QmVhbnMoKS5zaXplKCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1heFZhbHVlUGFyc2luZygpIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9ICJcbiIgKwotICAgICAgICAgICAgICAiPGJlYW5JbmZvcz4gIDxiZWFuIGlkPVwib3JnLmFwYWNoZS5idmFsLnRlc3QubW9kZWwuUHJvZmlsZVwiPlxuIiArCi0gICAgICAgICAgICAgICIgICAgPHByb3BlcnR5IG5hbWU9XCJhY3RpdmF0aW9uRGF5XCIgbWluVmFsdWU9XCIxXCIgbWF4VmFsdWU9XCIzMVwiLz5cbiIgKwotICAgICAgICAgICAgICAiICAgIDxwcm9wZXJ0eSBuYW1lPVwiYWN0aXZhdGlvbk1vbnRoXCIgbWluVmFsdWU9XCIxXCIgbWF4VmFsdWU9XCIxMlwiLz5cbiIgKwotICAgICAgICAgICAgICAiICA8L2JlYW4+PC9iZWFuSW5mb3M+IjsKLSAgICAgICAgWE1MTWV0YUJlYW5JbmZvcyBiZWFuSW5mb3MgPSAoWE1MTWV0YUJlYW5JbmZvcykgWE1MTWFwcGVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgLmdldFhTdHJlYW0oKS5mcm9tWE1MKHhtbCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGJlYW5JbmZvcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzEpLAotICAgICAgICAgICAgICBiZWFuSW5mb3MuZ2V0QmVhbnMoKS5nZXQoMCkuZ2V0UHJvcGVydHkoImFjdGl2YXRpb25EYXkiKS5nZXRNYXhWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwKLSAgICAgICAgICAgICAgYmVhbkluZm9zLmdldEJlYW5zKCkuZ2V0KDApLmdldFByb3BlcnR5KCJhY3RpdmF0aW9uRGF5IikuZ2V0TWluVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShYTUxNZXRhQmVhbkluZm9zVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9idmFsL3htbC9YTUxNZXRhQmVhbk1hbmFnZXJUZXN0LmphdmEgYi90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YzMwNi4uMDAwMDAwMAotLS0gYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2J2YWwveG1sL1hNTE1ldGFCZWFuTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYnZhbC54bWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJ2YWwuTWV0YUJlYW5GaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5idmFsLm1vZGVsLk1ldGFCZWFuOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogPGJyPgotICogVXNlcjogcm9tYW4uc3R1bW08YnI+Ci0gKiBEYXRlOiAxNy4wNi4yMDEwPGJyPgotICogVGltZTogMTA6Mjg6NDg8YnI+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNZXRhQmVhbk1hbmFnZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIFhNTE1ldGFCZWFuTWFuYWdlciBtYm0gPSBuZXcgWE1MTWV0YUJlYW5NYW5hZ2VyKCk7Ci0KLSAgICBwdWJsaWMgWE1MTWV0YUJlYW5NYW5hZ2VyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtYm0uYWRkTG9hZGVyKG5ldyBYTUxNZXRhQmVhblVSTExvYWRlcihCdXNpbmVzc09iamVjdC5jbGFzcy5nZXRSZXNvdXJjZSgidGVzdC1iZWFuSW5mb3MueG1sIikpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnJpY2hDb3BpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPFN0cmluZywgTWV0YUJlYW4+IGNvcGllcyA9Ci0gICAgICAgICAgICBtYm0uZW5yaWNoQ29waWVzKG5ldyBYTUxNZXRhQmVhblVSTExvYWRlcihCdXNpbmVzc09iamVjdC5jbGFzcy5nZXRSZXNvdXJjZSgidGVzdC1iZWFuSW5mb3MtY3VzdG9tLnhtbCIpKQotICAgICAgICAgICAgICAgIC5sb2FkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvcGllcyk7Ci0gICAgICAgIE1ldGFCZWFuIG1iID0gY29waWVzLmdldChCdXNpbmVzc09iamVjdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShtYi5nZXRQcm9wZXJ0eSgibGFzdE5hbWUiKS5pc01hbmRhdG9yeSgpKTsKLSAgICAgICAgTWV0YUJlYW4gbWIyID0gbWJtLmZpbmRGb3JDbGFzcyhCdXNpbmVzc09iamVjdC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydFRydWUobWIyLmdldFByb3BlcnR5KCJsYXN0TmFtZSIpLmlzTWFuZGF0b3J5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5KCkgewotICAgICAgICBNZXRhQmVhbiBtYiA9IG1ibS5maW5kRm9yQ2xhc3MoQnVzaW5lc3NPYmplY3QuY2xhc3MpOwotICAgICAgICBNZXRhQmVhbiBtYjIgPSBtYi5jb3B5KCk7Ci0gICAgICAgIGFzc2VydFRydWUobWIyICE9IG1iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYjIuZ2V0UHJvcGVydHkoImRhdGVCaXJ0aCIpICE9IG1iLmdldFByb3BlcnR5KCJkYXRlQmlydGgiKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEZvckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGFCZWFuRmluZGVyIGZpbmRlciA9IG1ibTsKLSAgICAgICAgTWV0YUJlYW4gaW5mbyA9IGZpbmRlci5maW5kRm9yQ2xhc3MoQnVzaW5lc3NPYmplY3QuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGluZm8pOwotICAgICAgICBhc3NlcnRUcnVlKGluZm8gPT0gaW5mby5nZXRQcm9wZXJ0eSgiYWRkcmVzcyIpLmdldE1ldGFCZWFuKCkuZ2V0UHJvcGVydHkoIm93bmVyIikuZ2V0TWV0YUJlYW4oKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaW5mbyA9PSBpbmZvLmdldFByb3BlcnR5KCJhZGRyZXNzZXMiKS5nZXRNZXRhQmVhbigpLmdldFByb3BlcnR5KCJvd25lciIpLmdldE1ldGFCZWFuKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGluZm8uZ2V0UHJvcGVydHkoImVtYWlsIikuZ2V0SmF2YVNjcmlwdFZhbGlkYXRpb25zKCkubGVuZ3RoID4gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRBbGwoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBhbGwgPSBtYm0uZmluZEFsbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFsbCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGFCZWFuPiBhbGwyID0gbWJtLmZpbmRBbGwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFsbC5zaXplKCksIGFsbDIuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhbGwuZ2V0KEJ1c2luZXNzT2JqZWN0LmNsYXNzLmdldE5hbWUoKSkgPT0gYWxsMi5nZXQoQnVzaW5lc3NPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWxsLmdldChCdXNpbmVzc09iamVjdC5jbGFzcy5nZXROYW1lKCkpICE9IG51bGwpOwotICAgICAgICBNZXRhQmVhbiBiZWFuID0gYWxsLmdldChCdXNpbmVzc09iamVjdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGJlYW4gPT0gYmVhbi5nZXRQcm9wZXJ0eSgiYWRkcmVzcyIpLmdldE1ldGFCZWFuKCkuZ2V0UHJvcGVydHkoIm93bmVyIikuZ2V0TWV0YUJlYW4oKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYmVhbiA9PSBiZWFuLmdldFByb3BlcnR5KCJhZGRyZXNzZXMiKS5nZXRNZXRhQmVhbigpLmdldFByb3BlcnR5KCJvd25lciIpLmdldE1ldGFCZWFuKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoWE1MTWV0YUJlYW5NYW5hZ2VyVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS90ZXN0LWJlYW5JbmZvcy1jdXN0b20ueG1sIGIvdHJ1bmsvYnZhbC14c3RyZWFtL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2J2YWwvZXhhbXBsZS90ZXN0LWJlYW5JbmZvcy1jdXN0b20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY2YjcyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvdGVzdC1iZWFuSW5mb3MtY3VzdG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxiZWFuSW5mb3M+Ci0KLSAgPGJlYW4gaWQ9Im9yZy5hcGFjaGUuYnZhbC5leGFtcGxlLkJ1c2luZXNzT2JqZWN0IgotICAgICAgICBpbXBsPSJvcmcuYXBhY2hlLmJ2YWwuZXhhbXBsZS5CdXNpbmVzc09iamVjdCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imxhc3ROYW1lIiBtYW5kYXRvcnk9ImZhbHNlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InVua25vd25OYW1lIiBtYW5kYXRvcnk9InRydWUiLz4KLSAgPC9iZWFuPgotCi0gIDxiZWFuIGlkPSJVbmtub3duT2JqZWN0IiBpbXBsPSJvcmcuYXBhY2hlLmJ2YWwuVW5rbm93bkNsYXNzIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iZnVsbE5hbWUiIG1hbmRhdG9yeT0idHJ1ZSIvPgotICA8L2JlYW4+Ci08L2JlYW5JbmZvcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idmFsLXhzdHJlYW0vc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvYnZhbC9leGFtcGxlL3Rlc3QtYmVhbkluZm9zLnhtbCBiL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvdGVzdC1iZWFuSW5mb3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzhhYTQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2J2YWwteHN0cmVhbS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS9idmFsL2V4YW1wbGUvdGVzdC1iZWFuSW5mb3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGJlYW5JbmZvcz4KLSAgPHZhbGlkYXRvciBpZD0ic3RhbmRhcmQiIGphdmE9Im9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lcy5OT1BWYWxpZGF0aW9uIgotICAgICAgICAgICAgIGpzRnVuY3Rpb249Im5vb3AiLz4KLSAgPHZhbGlkYXRvciBpZD0iZW1haWwiIGphdmE9Im9yZy5hcGFjaGUuYnZhbC5yb3V0aW5lcy5FTWFpbFZhbGlkYXRpb24iLz4KLSAgPGJlYW4gaWQ9Im9yZy5hcGFjaGUuYnZhbC5leGFtcGxlLkJ1c2luZXNzT2JqZWN0IgotICAgICAgICBpbXBsPSJvcmcuYXBhY2hlLmJ2YWwuZXhhbXBsZS5CdXNpbmVzc09iamVjdCI+Ci0gICAgPGZlYXR1cmUga2V5PSJtYWluS2V5Ij4KLSAgICAgIDx2YWx1ZSBjbGFzcz0ic3RyaW5nIj51c2VySWQ8L3ZhbHVlPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBrZXk9IkRPTUFJTiI+Ci0gICAgICA8dmFsdWUgY2xhc3M9InN0cmluZyI+VGVzdE9iamVjdHM8L3ZhbHVlPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBrZXk9IldJREdFVCI+Ci0gICAgICA8dmFsdWUgY2xhc3M9InN0cmluZyI+ZW50cnk8L3ZhbHVlPgotICAgIDwvZmVhdHVyZT4KLSAgICA8cHJvcGVydHkgbmFtZT0idXNlcklkIiBtYW5kYXRvcnk9InRydWUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZmlyc3ROYW1lIiBtYW5kYXRvcnk9InRydWUiIG1heExlbmd0aD0iMTAwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imxhc3ROYW1lIiBtYW5kYXRvcnk9InRydWUiIG1heExlbmd0aD0iMTAwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIiBtYW5kYXRvcnk9ImZhbHNlIiBtYXhMZW5ndGg9IjEwIi8+Ci0gICAgPHByb3BlcnR5IHRpbWVMYWc9IlBBU1QiIG5hbWU9ImRhdGVCaXJ0aCIgbWFuZGF0b3J5PSJmYWxzZSIvPgotICAgIDxwcm9wZXJ0eSB0aW1lTGFnPSJGVVRVUkUiIG5hbWU9InZhbGlkVG8iIG1hbmRhdG9yeT0iZmFsc2UiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZW1haWwiPgotICAgICAgPGZlYXR1cmUga2V5PSJXSURHRVQiPgotICAgICAgICA8dmFsdWUgY2xhc3M9InN0cmluZyI+ZW50cnk8L3ZhbHVlPgotICAgICAgPC9mZWF0dXJlPgotICAgICAgPGZlYXR1cmUga2V5PSJUQUJMRV9DT0xVTU4iPgotICAgICAgICA8dmFsdWUgY2xhc3M9ImJvb2xlYW4iPnRydWU8L3ZhbHVlPgotICAgICAgPC9mZWF0dXJlPgotICAgICAgPGZlYXR1cmUga2V5PSJhamF4LWZvcm1hdHRlciI+Ci0gICAgICAgIDx2YWx1ZSBjbGFzcz0ibWFwIj4KLSAgICAgICAgICA8ZW50cnk+Ci0gICAgICAgICAgICA8c3RyaW5nPmxvY2FsZTwvc3RyaW5nPgotICAgICAgICAgICAgPHN0cmluZz5ERTwvc3RyaW5nPgotICAgICAgICAgIDwvZW50cnk+Ci0gICAgICAgICAgPGVudHJ5PgotICAgICAgICAgICAgPHN0cmluZz5zdHlsZTwvc3RyaW5nPgotICAgICAgICAgICAgPHN0cmluZz5pbmZvPC9zdHJpbmc+Ci0gICAgICAgICAgPC9lbnRyeT4KLSAgICAgICAgPC92YWx1ZT4KLSAgICAgIDwvZmVhdHVyZT4KLSAgICAgIDx2YWxpZGF0b3IgcmVmSWQ9ImVtYWlsIi8+Ci0gICAgICA8dmFsaWRhdG9yIHJlZklkPSJzdGFuZGFyZCIvPgotICAgIDwvcHJvcGVydHk+Ci0gICAgPHJlbGF0aW9uc2hpcCBiZWFuSWQ9Im9yZy5hcGFjaGUuYnZhbC5leGFtcGxlLkFkZHJlc3MiIG5hbWU9ImFkZHJlc3MiIG1hbmRhdG9yeT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZT0iVXNlckFkZHJlc3MiLz4KLSAgICA8cmVsYXRpb25zaGlwIGJlYW5JZD0ib3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQWRkcmVzcyIgbmFtZT0iYWRkcmVzc2VzIiBtYXhMZW5ndGg9IjMiLz4KLSAgPC9iZWFuPgotICA8YmVhbiBpZD0ib3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQWRkcmVzcyIKLSAgICAgICAgaW1wbD0ib3JnLmFwYWNoZS5idmFsLmV4YW1wbGUuQnVzaW5lc3NPYmplY3RBZGRyZXNzIj4KLSAgICA8ZmVhdHVyZSBrZXk9IkRPTUFJTiI+Ci0gICAgICA8dmFsdWUgY2xhc3M9InN0cmluZyI+VGVzdE9iamVjdHM8L3ZhbHVlPgotICAgIDwvZmVhdHVyZT4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2l0eSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3VudHJ5IiBtYW5kYXRvcnk9InRydWUiIG1heExlbmd0aD0iMTAiLz4KLSAgICA8cmVsYXRpb25zaGlwIG5hbWU9Im93bmVyIiBiZWFuSWQ9Im9yZy5hcGFjaGUuYnZhbC5leGFtcGxlLkJ1c2luZXNzT2JqZWN0IgotICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5PSJ0cnVlIi8+Ci0gIDwvYmVhbj4KLTwvYmVhbkluZm9zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3BvbS54bWwgYi90cnVuay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJhMWI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPjwhLS0KLQlNYXZlbiByZWxlYXNlIHBsdWdpbiByZXF1aXJlcyB0aGUgcHJvamVjdCB0YWcgdG8gYmUgb24gYSBzaW5nbGUgbGluZS4KLS0tPjxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aCAvPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5idmFsPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmJ2YWwtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBCVmFsIDo6IGJ2YWwtcGFyZW50IChQYXJlbnQgUE9NKTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDx2ZXJzaW9uPjAuNDwvdmVyc2lvbj4KLQotICAgIDxkZXNjcmlwdGlvbj5BcGFjaGUgQlZhbCBwYXJlbnQgcG9tPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8c2l0ZS5kZXBsb3kudXJsPnNjcDovL3Blb3BsZS5hcGFjaGUub3JnL2hvbWUvJHt1c2VyLm5hbWV9L3B1YmxpY19odG1sL2J2YWwvJHtwcm9qZWN0LnZlcnNpb259L3N0YWdpbmctc2l0ZTwvc2l0ZS5kZXBsb3kudXJsPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxpbmNlcHRpb25ZZWFyPjIwMTA8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8dXJsPmh0dHA6Ly9idmFsLmFwYWNoZS5vcmcvPC91cmw+Ci0KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYnZhbC90YWdzLzAuNDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9idmFsL3RhZ3MvMC40PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYnZhbC90YWdzLzAuNDwvdXJsPgotICAgIDwvc2NtPgotCi0gICAgPG1haWxpbmdMaXN0cz4KLSAgICAgICAgPG1haWxpbmdMaXN0PgotICAgICAgICAgICAgPG5hbWU+QlZhbCBVc2VyIExpc3Q8L25hbWU+Ci0gICAgICAgICAgICA8c3Vic2NyaWJlPnVzZXItc3Vic2NyaWJlQGJ2YWwuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPnVzZXItdW5zdWJzY3JpYmVAYnZhbC5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgICAgICAgIDxwb3N0Pm1haWx0bzp1c2VyQGJ2YWwuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYnZhbC11c2VyLzwvYXJjaGl2ZT4KLSAgICAgICAgPC9tYWlsaW5nTGlzdD4KLQotICAgICAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICAgICAgICA8bmFtZT5CVmFsIERldmVsb3BlciBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5kZXYtc3Vic2NyaWJlQGJ2YWwuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmRldi11bnN1YnNjcmliZUBidmFsLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgICAgICAgPHBvc3Q+bWFpbHRvOmRldkBidmFsLmFwYWNoZS5vcmc8L3Bvc3Q+Ci0gICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2J2YWwtZGV2LzwvYXJjaGl2ZT4KLSAgICAgICAgPC9tYWlsaW5nTGlzdD4KLQotICAgICAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICAgICAgICA8bmFtZT5CVmFsIENvbW1pdHMgTGlzdDwvbmFtZT4KLSAgICAgICAgICAgIDxzdWJzY3JpYmU+Y29tbWl0cy1zdWJzY3JpYmVAYnZhbC5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8dW5zdWJzY3JpYmU+Y29tbWl0cy11bnN1YnNjcmliZUBidmFsLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgICAgICAgPHBvc3Q+bWFpbHRvOmNvbW1pdHNAYnZhbC5hcGFjaGUub3JnPC9wb3N0PgotICAgICAgICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9idmFsLWNvbW1pdHMvPC9hcmNoaXZlPgotICAgICAgICA8L21haWxpbmdMaXN0PgotICAgIDwvbWFpbGluZ0xpc3RzPgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHVybD5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0JWQUw8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICAgIDxkZXZlbG9wZXJzPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPGlkPmFsbGVlODI4NTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BbGJlcnQgTGVlPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmFsbGVlODI4NUBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxyb2xlcz4KLSAgICAgICAgICAgICAgICA8cm9sZT5QTUMgTWVtYmVyPC9yb2xlPgotICAgICAgICAgICAgPC9yb2xlcz4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8aWQ+Y2FybG9zdmFyYTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5DYXJsb3MgVmFyYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5jYXJsb3N2YXJhQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5kamVuY2tzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkRhdmlkIEplbmNrczwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5kamVuY2tzQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JQk08L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDxyb2xlcz4KLSAgICAgICAgICAgICAgICA8cm9sZT5QTUMgTWVtYmVyPC9yb2xlPgotICAgICAgICAgICAgPC9yb2xlcz4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8aWQ+ZHdvb2RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkRvbmFsZCBXb29kczwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5kd29vZHNAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5ncGV0cmFjZWs8L2lkPgotICAgICAgICAgICAgPG5hbWU+R2VyaGFyZCBQZXRyYWNlazwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5ncGV0cmFjZWtAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklSSUFOIFNvbHV0aW9ucyBHbWJIPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+UE1DIE1lbWJlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPGlkPmpyYmF1ZXI8L2lkPgotICAgICAgICAgICAgPG5hbWU+SmVyZW15IEJhdWVyPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpyYmF1ZXJAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5rZXZhbjwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5LZXZhbiBNaWxsZXI8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+a2V2YW5AYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5scmVzZW5kZTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5MdWNpYW5vIFJlc2VuZGU8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+bHJlc2VuZGVAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5zdHJ1YmVyZzwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5NYXJrIFN0cnViZXJnPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPnN0cnViZXJnQGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5tYmVuc29uPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPk1hdHQgQmVuc29uPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPm1iZW5zb25AYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+UE1DIE1lbWJlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPGlkPm1hdHpldzwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5NYXR0aGlhcyBXZXNzZW5kb3JmPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPm1hdHpld0BhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+S2FhemluZzwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5tbm91cjwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5Nb2hhbW1hZCBOb3VyIEVsLURpbjwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5tbm91ckBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+VGhlYmUgVGVjaG5vbG9neTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5yb21hbnN0dW1tPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPlJvbWFuIFN0dW1tPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPnJvbWFuc3R1bW1AYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPlZpYWJveHggR21iSDwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPlBNQyBNZW1iZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5zaW1vbmV0cmlwb2RpPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPlNpbW9uZSBUcmlwb2RpPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPnNpbW9uZXRyaXBvZGlAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+UE1DIE1lbWJlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgIDwvZGV2ZWxvcGVycz4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c2l0ZT4KLSAgICAgICAgICAgIDxpZD5wZW9wbGUuYXBhY2hlLm9yZzwvaWQ+Ci0gICAgICAgICAgICA8dXJsPiR7c2l0ZS5kZXBsb3kudXJsfTwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzaG93PnBhY2thZ2U8L3Nob3c+Ci0gICAgICAgICAgICAgICAgICAgIDxxdWlldD50cnVlPC9xdWlldD4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhZWUvNi9kb2NzL2FwaTwvbGluaz4KLSAgICAgICAgICAgICAgICAgICAgPC9saW5rcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmphdmFkb2M8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PnRlc3QtamF2YWRvYzwvcmVwb3J0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgotICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KLSAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amRlcGVuZC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPCEtLQotICAgICAgICBkZWZhdWx0IHZlcnNpb25zIGZvciBkZXBlbmRlbmNpZXMgdGhhdCBjaGlsZCBtb2R1bGVzIG1heSBpbmNsdWRlCi0gICAgLS0+Ci0gICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPCEtLSBEZWZhdWx0IG9mIEFwYWNoZSBHZXJvbmltbyB2ZXJzaW9uIG9mIHRoZSBTcGVjIEFQSSAtLT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tdmFsaWRhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8IS0tIE9wdGlvbmFsIHByb2ZpbGUgdG8gdXNlIFNwZWMgUkkgQVBJIC0tPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMC5HQTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwhLS0gSlBBMiBzcGVjIHJlcXVpcmVkIGZvciBKUEEgVHJhdmVyc2FibGVSZXNvbHZlciBzdXBwb3J0IC0tPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qcGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+NC44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS44LjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nMzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWJlYW51dGlsczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWJlYW51dGlscy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuOC4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20udGhvdWdodHdvcmtzLnhzdHJlYW08L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eHN0cmVhbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjMuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwhLS0gT3B0aW9uYWwgLSBvbmx5IHVzZWQgYnkgYnZhbC1qc29uIC0tPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmZyZWVtYXJrZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZnJlZW1hcmtlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8IS0tIE9wdGlvbmFsIC0gb25seSB1c2VkIGJ5IGJ2YWwtZ3VpY2UgLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5pbmplY3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmluamVjdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWljZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAtcmMyPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPCEtLSBBZGRlZCBtYWlubHkgZm9yIHRlc3RpbmcgLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS42LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotc2ltcGxlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZGVmYXVsdEdvYWw+aW5zdGFsbDwvZGVmYXVsdEdvYWw+Ci0KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+JHtwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nfTwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLUJ1aWxkPiR7YnVpbGROdW1iZXJ9PC9JbXBsZW1lbnRhdGlvbi1CdWlsZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWNpZmljYXRpb24tVGl0bGU+SlNSLTMwMyBCZWFuIFZhbGlkYXRpb248L1NwZWNpZmljYXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTcGVjaWZpY2F0aW9uLVZlbmRvcj5TdW4gTWljcm9zeXN0ZW1zLCBJbmMuPC9TcGVjaWZpY2F0aW9uLVZlbmRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWNpZmljYXRpb24tVmVyc2lvbj4xLjA8L1NwZWNpZmljYXRpb24tVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPiR7cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZ308L2VuY29kaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxwYXJhbT4ke2phdmFkb2MuYWRkaXRpb25hbHBhcmFtfTwvYWRkaXRpb25hbHBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFnZ3JlZ2F0ZT50cnVlPC9hZ2dyZWdhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3VicGFja2FnZXM+b3JnLmFwYWNoZTwvc3VicGFja2FnZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyYm9zZT5mYWxzZTwvdmVyYm9zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhtZW1vcnk+NTEybTwvbWF4bWVtb3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2FwaTwvbGluaz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2phdmFlZS82L2RvY3MvYXBpPC9saW5rPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rcz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cHJvY2Vzcy1yZW1vdGUtcmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlOmFwYWNoZS1qYXItcmVzb3VyY2UtYnVuZGxlOjEuNDwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpkZXBlbmQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAtYmV0YS0yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPiR7cHJvamVjdC5uYW1lfTwvSW1wbGVtZW50YXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9JbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPiR7cHJvamVjdC51cmx9PC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aWFuYWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dmVyaWZ5LWxlZ2FsLWZpbGVzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmFpbCB0aGUgYnVpbGQgaWYgYW55IGFydGlmYWN0cyBhcmUgbWlzc2luZyBsZWdhbCBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmljdD50cnVlPC9zdHJpY3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnJhdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXJhdC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjAuNzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2hlY2s8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVTdWJQcm9qZWN0cz5mYWxzZTwvZXhjbHVkZVN1YlByb2plY3RzPgotICAgICAgICAgICAgICAgICAgICAgICAgPG51bVVuYXBwcm92ZWRMaWNlbnNlcz4wPC9udW1VbmFwcHJvdmVkTGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHZW5lcmFsIGluZm9ybWF0aW9uYWwgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+UkVBRE1FLnR4dDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5DSEFOR0VTLnR4dDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlZCBjb250ZW50IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPnJlbGVhc2UucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5ERVBFTkRFTkNJRVM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovLiovKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5sb2c8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovbWF2ZW4tZWNsaXBzZS54bWw8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovcmF0LnR4dDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKiovKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmlwcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLml3czwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy12ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjEuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBpbmhlcml0ZWQgZnJvbSBhcGFjaGUtMTAucG9tLCBidXQgbmVlZCBjb25maWcgdXBkYXRlcyAtLT4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx1c2VSZWxlYXNlUHJvZmlsZT5mYWxzZTwvdXNlUmVsZWFzZVByb2ZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+ZGVwbG95IHNpdGUgc2l0ZS1kZXBsb3k8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tUGFwYWNoZS1yZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXV0b1ZlcnNpb25TdWJtb2R1bGVzPnRydWU8L2F1dG9WZXJzaW9uU3VibW9kdWxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcmVwYXJhdGlvbkdvYWxzPmNsZWFuIGluc3RhbGw8L3ByZXBhcmF0aW9uR29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmZpbmRidWdzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkbnVtYmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWJldGEtNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmVuZm9yY2U8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVxdWlyZU1hdmVuVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPlsyLjIuMSwpPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcXVpcmVNYXZlblZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlSmF2YVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj5bMS41LCk8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVxdWlyZUphdmFWZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5yYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXJhdC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MC43PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmlhbmFsLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZG51bWJlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxnZXRSZXZpc2lvbk9ubHlPbmNlPnRydWU8L2dldFJldmlzaW9uT25seU9uY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXZpc2lvbk9uU2NtRmFpbHVyZT5vZmZsaW5lPC9yZXZpc2lvbk9uU2NtRmFpbHVyZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNyZWF0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2U8L2lkPgotICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwhLS0gRG9uJ3QgaW5jbHVkZSBpbiBhbGwgYnVpbGRzIGZvciBub3cKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmluZGJ1Z3MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAtLT4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5idmFsLWNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5idmFsLXhzdHJlYW08L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5idmFsLWpzcjMwMzwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJ1bmRsZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJ2YWwtanNvbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJ2YWwtZ3VpY2U8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5idmFsLXRjazwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmJ2YWwtZXh0cmFzPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotPC9wcm9qZWN0Pgo=