ZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9ERVBFTkRFTkNJRVMgYi9idW5kbGVwbHVnaW4vREVQRU5ERU5DSUVTCmluZGV4IGI2N2NmZTkuLmExMWU2MTkgMTAwNjQ0Ci0tLSBhL2J1bmRsZXBsdWdpbi9ERVBFTkRFTkNJRVMKKysrIGIvYnVuZGxlcGx1Z2luL0RFUEVOREVOQ0lFUwpAQCAtMTIsNyArMTIsNyBAQAogCiBUaGlzIHByb2R1Y3QgdXNlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgUGV0ZXIgS3JpZW5zCiAoaHR0cDovL3d3dy5hcXV0ZS5iaXovQ29kZS9CbmQpCi1Db3B5cmlnaHQgMjAwNi0yMDEzIGFRdXRlLCBBbGwgcmlnaHRzIHJlc2VydmVkCitDb3B5cmlnaHQgMjAwNi0yMDE0IGFRdXRlLCBBbGwgcmlnaHRzIHJlc2VydmVkCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wLgogCiBUaGlzIHByb2R1Y3QgdXNlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKQEAgLTIzLDYgKzIzLDggQEAKIFRoZSBDb2RlaGF1cyAoaHR0cDovL3d3dy5jb2RlaGF1cy5vcmcpCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wLgogCitUaGlzIHByb2R1Y3QgdXNlcyBpY29ucyBkZXZlbG9wZWQgYXQKK3RoZSBFY2xpcHNlIFByb2plY3QgKGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvCiAKIElJSS4gTGljZW5zZSBTdW1tYXJ5CiAtIEFwYWNoZSBMaWNlbnNlIDIuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL05PVElDRSBiL2J1bmRsZXBsdWdpbi9OT1RJQ0UKaW5kZXggNTdiYTlhNS4uZmZkMmU2NCAxMDA2NDQKLS0tIGEvYnVuZGxlcGx1Z2luL05PVElDRQorKysgYi9idW5kbGVwbHVnaW4vTk9USUNFCkBAIC0xLDYgKzEsNiBAQAogQXBhY2hlIEZlbGl4IEJ1bmRsZSBNYXZlbiBQbHVnaW4KLUNvcHlyaWdodCAyMDA2LTIwMTMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitDb3B5cmlnaHQgMjAwNi0yMDE0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgogCiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0CiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIDIuMC4KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSAyLjAuKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3BvbS54bWwgYi9idW5kbGVwbHVnaW4vcG9tLnhtbAppbmRleCBlNTgyNmQzLi4yMmFmZDQxIDEwMDY0NAotLS0gYS9idW5kbGVwbHVnaW4vcG9tLnhtbAorKysgYi9idW5kbGVwbHVnaW4vcG9tLnhtbApAQCAtOTAsNiArOTAsMTYgQEAKICAgIDx2ZXJzaW9uPjMuMC4xMDwvdmVyc2lvbj4KICAgPC9kZXBlbmRlbmN5PgogICA8ZGVwZW5kZW5jeT4KKyAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+CisgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaW5rLWFwaTwvYXJ0aWZhY3RJZD4KKyAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgPC9kZXBlbmRlbmN5PgorICA8ZGVwZW5kZW5jeT4KKyAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+CisgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaXRlLXJlbmRlcmVyPC9hcnRpZmFjdElkPgorICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICA8L2RlcGVuZGVuY3k+CisgIDxkZXBlbmRlbmN5PgogICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQ8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdGVzdGluZy1oYXJuZXNzPC9hcnRpZmFjdElkPgogICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvQWJzdHJhY3RCYXNlbGluZVBsdWdpbi5qYXZhIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvQWJzdHJhY3RCYXNlbGluZVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDI3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9BYnN0cmFjdEJhc2VsaW5lUGx1Z2luLmphdmEKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuZmVsaXguYnVuZGxlcGx1Z2luLmJhc2VsaW5lOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmZhY3RvcnkuQXJ0aWZhY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5BcnRpZmFjdFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLkludmFsaWRWZXJzaW9uU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuT3ZlckNvbnN0cmFpbmVkVmVyc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuVmVyc2lvblJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOworCitpbXBvcnQgYVF1dGUuYm5kLmRpZmZlci5CYXNlbGluZTsKK2ltcG9ydCBhUXV0ZS5ibmQuZGlmZmVyLkJhc2VsaW5lLkluZm87CitpbXBvcnQgYVF1dGUuYm5kLmRpZmZlci5EaWZmUGx1Z2luSW1wbDsKK2ltcG9ydCBhUXV0ZS5ibmQub3NnaS5JbnN0cnVjdGlvbnM7CitpbXBvcnQgYVF1dGUuYm5kLm9zZ2kuSmFyOworaW1wb3J0IGFRdXRlLmJuZC5vc2dpLlByb2Nlc3NvcjsKK2ltcG9ydCBhUXV0ZS5ibmQuc2VydmljZS5kaWZmLkRlbHRhOworaW1wb3J0IGFRdXRlLmJuZC5zZXJ2aWNlLmRpZmYuRGlmZjsKK2ltcG9ydCBhUXV0ZS5ibmQudmVyc2lvbi5WZXJzaW9uOworaW1wb3J0IGFRdXRlLnNlcnZpY2UucmVwb3J0ZXIuUmVwb3J0ZXI7CisKKy8qKgorICogQWJzdHJhY3QgQk5EIEJhc2VsaW5lIGNoZWNrIGJldHdlZW4gdHdvIGJ1bmRsZXMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzZWxpbmVQbHVnaW4KKyAgICBleHRlbmRzIEFic3RyYWN0TW9qbworeworCisgICAgLyoqCisgICAgICogRmxhZyB0byBlYXNpbHkgc2tpcCBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YmFzZWxpbmUuc2tpcH0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNraXA7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZhaWwgb24gZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2Jhc2VsaW5lLmZhaWxPbkVycm9yfSIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvcjsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZmFpbCBvbiB3YXJuaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlbGluZS5mYWlsT25XYXJuaW5nfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uV2FybmluZzsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgorICAgICAqIEByZXF1aXJlZAorICAgICAqIEByZWFkb25seQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBidWlsZERpcmVjdG9yeTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0iCisgICAgICogQHJlcXVpcmVkCisgICAgICogQHJlYWRvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmluYWxOYW1lOworCisgICAgLyoqCisgICAgICogQGNvbXBvbmVudAorICAgICAqLworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlc29sdmVyIHJlc29sdmVyOworCisgICAgLyoqCisgICAgICogQGNvbXBvbmVudAorICAgICAqLworICAgIHByb3RlY3RlZCBBcnRpZmFjdEZhY3RvcnkgZmFjdG9yeTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtsb2NhbFJlcG9zaXRvcnl9IgorICAgICAqIEByZXF1aXJlZAorICAgICAqIEByZWFkb25seQorICAgICAqLworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworCisgICAgLyoqCisgICAgICogQGNvbXBvbmVudAorICAgICAqLworICAgIHByaXZhdGUgQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSBtZXRhZGF0YVNvdXJjZTsKKworICAgIC8qKgorICAgICAqIFZlcnNpb24gdG8gY29tcGFyZSB0aGUgY3VycmVudCBjb2RlIGFnYWluc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7Y29tcGFyaXNvblZlcnNpb259IiBkZWZhdWx0LXZhbHVlPSIoLCR7cHJvamVjdC52ZXJzaW9ufSkiCisgICAgICogQHJlcXVpcmVkCisgICAgICogQHJlYWRvbmx5CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21wYXJpc29uVmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBwYWNrYWdlcyBmaWx0ZXIsIGlmIGVtcHR5IHRoZSB3aG9sZSBidW5kbGUgd2lsbCBiZSB0cmF2ZXJzZWQuIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIE9TR2kgcGFja2FnZQorICAgICAqIGluc3RydWN0aW9ucyBub3RhdGlvbiwgZS5nLiA8Y29kZT4hb3JnLmFwYWNoZS5mZWxpeC5idW5kbGVwbHVnaW48L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gZmlsdGVyczsKKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICggc2tpcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldExvZygpLmluZm8oICJTa2lwcGluZyBCYXNlbGluZSBleGVjdXRpb24iICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgdGhlIGJ1bmRsZXMgdGhhdCBoYXZlIHRvIGJlIGNvbXBhcmVkCisKKyAgICAgICAgZmluYWwgSmFyIGN1cnJlbnRCdW5kbGUgPSBnZXRDdXJyZW50QnVuZGxlKCk7CisgICAgICAgIGlmICggY3VycmVudEJ1bmRsZSA9PSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyggIk5vdCBnZW5lcmF0aW5nIEJhc2VsaW5lIHJlcG9ydCBhcyB0aGVyZSBpcyBubyBidW5kbGUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9qZWN0IiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSmFyIHByZXZpb3VzQnVuZGxlID0gZ2V0UHJldmlvdXNCdW5kbGUoKTsKKyAgICAgICAgaWYgKCBwcmV2aW91c0J1bmRsZSA9PSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyggIk5vdCBnZW5lcmF0aW5nIEJhc2VsaW5lIHJlcG9ydCBhcyB0aGVyZSBpcyBubyBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHRvIGNvbXBhcmUgYWdhaW5zdCIgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByZXBhcmluZyB0aGUgZmlsdGVycworCisgICAgICAgIGZpbmFsIEluc3RydWN0aW9ucyBwYWNrYWdlRmlsdGVyczsKKyAgICAgICAgaWYgKCBmaWx0ZXJzID09IG51bGwgfHwgZmlsdGVycy5sZW5ndGggPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhY2thZ2VGaWx0ZXJzID0gbmV3IEluc3RydWN0aW9ucygpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFja2FnZUZpbHRlcnMgPSBuZXcgSW5zdHJ1Y3Rpb25zKCBBcnJheXMuYXNMaXN0KCBmaWx0ZXJzICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdvIQorCisgICAgICAgIGluaXQoKTsKKworICAgICAgICBTdHJpbmcgZ2VuZXJhdGlvbkRhdGUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCggInl5eXktTU0tZGQnVCdISDptbSdaJyIgKS5mb3JtYXQoIG5ldyBEYXRlKCkgKTsKKyAgICAgICAgUmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgUHJvY2Vzc29yKCk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxJbmZvPiBpbmZvU2V0ID0gbmV3IEJhc2VsaW5lKCByZXBvcnRlciwgbmV3IERpZmZQbHVnaW5JbXBsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmFzZWxpbmUoIGN1cnJlbnRCdW5kbGUsIHByZXZpb3VzQnVuZGxlLCBwYWNrYWdlRmlsdGVycyApOworCisgICAgICAgICAgICBzdGFydEJhc2VsaW5lKCBnZW5lcmF0aW9uRGF0ZSwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCksIHByb2plY3QuZ2V0VmVyc2lvbigpLCBjb21wYXJpc29uVmVyc2lvbiApOworCisgICAgICAgICAgICBmaW5hbCBJbmZvW10gaW5mb3MgPSBpbmZvU2V0LnRvQXJyYXkoIG5ldyBJbmZvW2luZm9TZXQuc2l6ZSgpXSApOworICAgICAgICAgICAgQXJyYXlzLnNvcnQoIGluZm9zLCBuZXcgSW5mb0NvbXBhcmF0b3IoKSApOworCisgICAgICAgICAgICBmb3IgKCBJbmZvIGluZm8gOiBpbmZvcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlmZk1lc3NhZ2UgZGlmZk1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgIFZlcnNpb24gbmV3ZXJWZXJzaW9uID0gaW5mby5uZXdlclZlcnNpb247CisgICAgICAgICAgICAgICAgVmVyc2lvbiBzdWdnZXN0ZWRWZXJzaW9uID0gaW5mby5zdWdnZXN0ZWRWZXJzaW9uOworCisgICAgICAgICAgICAgICAgaWYgKCBzdWdnZXN0ZWRWZXJzaW9uICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBuZXdlclZlcnNpb24uY29tcGFyZVRvKCBzdWdnZXN0ZWRWZXJzaW9uICkgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1lc3NhZ2UgPSBuZXcgRGlmZk1lc3NhZ2UoICJFeGNlc3NpdmUgdmVyc2lvbiBpbmNyZWFzZSIsIERpZmZNZXNzYWdlLlR5cGUud2FybmluZyApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIud2FybmluZyggIiVzOiAlczsgZGV0ZWN0ZWQgJXMsIHN1Z2dlc3RlZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnBhY2thZ2VOYW1lLCBkaWZmTWVzc2FnZSwgaW5mby5uZXdlclZlcnNpb24sIGluZm8uc3VnZ2VzdGVkVmVyc2lvbiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBuZXdlclZlcnNpb24uY29tcGFyZVRvKCBzdWdnZXN0ZWRWZXJzaW9uICkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1lc3NhZ2UgPSBuZXcgRGlmZk1lc3NhZ2UoICJWZXJzaW9uIGluY3JlYXNlIHJlcXVpcmVkIiwgRGlmZk1lc3NhZ2UuVHlwZS5lcnJvciApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIuZXJyb3IoICIlczogJXM7IGRldGVjdGVkICVzLCBzdWdnZXN0ZWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWUsIGRpZmZNZXNzYWdlLCBpbmZvLm5ld2VyVmVyc2lvbiwgaW5mby5zdWdnZXN0ZWRWZXJzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBEaWZmIHBhY2thZ2VEaWZmID0gaW5mby5wYWNrYWdlRGlmZjsKKworICAgICAgICAgICAgICAgIERlbHRhIGRlbHRhID0gcGFja2FnZURpZmYuZ2V0RGVsdGEoKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGRlbHRhICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVU5DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIHN1Z2dlc3RlZFZlcnNpb24uZ2V0TWFqb3IoKSAhPSBuZXdlclZlcnNpb24uZ2V0TWFqb3IoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCBzdWdnZXN0ZWRWZXJzaW9uLmdldE1pY3JvKCkgIT0gbmV3ZXJWZXJzaW9uLmdldE1pY3JvKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICggc3VnZ2VzdGVkVmVyc2lvbi5nZXRNaW5vcigpICE9IG5ld2VyVmVyc2lvbi5nZXRNaW5vcigpICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNZXNzYWdlID0gbmV3IERpZmZNZXNzYWdlKCAiVmVyc2lvbiBoYXMgYmVlbiBpbmNyZWFzZWQgYnV0IGFuYWx5c2lzIGRldGVjdGVkIG5vIGNoYW5nZXMiLCBEaWZmTWVzc2FnZS5UeXBlLndhcm5pbmcgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlci53YXJuaW5nKCAiJXM6ICVzOyBkZXRlY3RlZCAlcywgc3VnZ2VzdGVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnBhY2thZ2VOYW1lLCBkaWZmTWVzc2FnZSwgaW5mby5uZXdlclZlcnNpb24sIGluZm8uc3VnZ2VzdGVkVmVyc2lvbiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1lc3NhZ2UgPSBuZXcgRGlmZk1lc3NhZ2UoICJQYWNrYWdlIHJlbW92ZWQiLCBEaWZmTWVzc2FnZS5UeXBlLmluZm8gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnRyYWNlKCAiJXM6ICVzICIsIGluZm8ucGFja2FnZU5hbWUsIGRpZmZNZXNzYWdlICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlDUk86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOT1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUFKT1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQURERUQ6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvaworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBtaXNtYXRjaCA9IGluZm8ubWlzbWF0Y2g7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaW5mby5wYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnREZWx0YSA9IGdldFNob3J0RGVsdGEoIGluZm8ucGFja2FnZURpZmYuZ2V0RGVsdGEoKSApOworICAgICAgICAgICAgICAgIFN0cmluZyBkZWx0YVN0cmluZyA9IFN0cmluZ1V0aWxzLmxvd2VyQ2FzZSggU3RyaW5nLnZhbHVlT2YoIGluZm8ucGFja2FnZURpZmYuZ2V0RGVsdGEoKSApICk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld2VyVmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKCBpbmZvLm5ld2VyVmVyc2lvbiApOworICAgICAgICAgICAgICAgIFN0cmluZyBvbGRlclZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZiggaW5mby5vbGRlclZlcnNpb24gKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3VnZ2VzdGVkVmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKCAoIGluZm8uc3VnZ2VzdGVkVmVyc2lvbiA9PSBudWxsICkgPyAiLSIgOiBpbmZvLnN1Z2dlc3RlZFZlcnNpb24gKTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gYXR0cmlidXRlcyA9IGluZm8uYXR0cmlidXRlczsKKworICAgICAgICAgICAgICAgIHN0YXJ0UGFja2FnZSggbWlzbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VyVmVyc2lvblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZGVyVmVyc2lvblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZFZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgKTsKKworICAgICAgICAgICAgICAgIGlmICggRGVsdGEuUkVNT1ZFRCAhPSBkZWx0YSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb1BhY2thZ2VEaWZmKCBwYWNrYWdlRGlmZiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVuZFBhY2thZ2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5kQmFzZWxpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJJbXBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgYmFzZWxpbmUiLCBlICk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBjbG9zZUphcnMoIGN1cnJlbnRCdW5kbGUsIHByZXZpb3VzQnVuZGxlICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgdG8gZmFpbCBpZiBzb21lIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkCisKKyAgICAgICAgYm9vbGVhbiBmYWlsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCAhcmVwb3J0ZXIuaXNPaygpICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggU3RyaW5nIGVycm9yTWVzc2FnZSA6IHJlcG9ydGVyLmdldEVycm9ycygpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvciggZXJyb3JNZXNzYWdlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZmFpbE9uRXJyb3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgaXQgaGFzIHRvIGZhaWwgaWYgc29tZSB3YXJuaW5nIGhhcyBiZWVuIGRldGVjdGVkCisKKyAgICAgICAgaWYgKCAhcmVwb3J0ZXIuZ2V0V2FybmluZ3MoKS5pc0VtcHR5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBTdHJpbmcgd2FybmluZ01lc3NhZ2UgOiByZXBvcnRlci5nZXRXYXJuaW5ncygpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCB3YXJuaW5nTWVzc2FnZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGZhaWxPbldhcm5pbmcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2V0TG9nKCkuaW5mbyggU3RyaW5nLmZvcm1hdCggIkJhc2VsaW5lIGFuYWxpc3lzIGNvbXBsZXRlLCAlcyBlcnJvcihzKSwgJXMgd2FybmluZyhzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLmdldEVycm9ycygpLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZXIuZ2V0V2FybmluZ3MoKS5zaXplKCkgKSApOworCisgICAgICAgIGlmICggZmFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiggIkJhc2VsaW5lIGZhaWxlZCwgc2VlIGdlbmVyYXRlZCByZXBvcnQiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9QYWNrYWdlRGlmZiggRGlmZiBkaWZmICkKKyAgICB7CisgICAgICAgIGludCBkZXB0aCA9IDE7CisKKyAgICAgICAgZm9yICggRGlmZiBjdXJEaWZmIDogZGlmZi5nZXRDaGlsZHJlbigpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBEZWx0YS5VTkNIQU5HRUQgIT0gY3VyRGlmZi5nZXREZWx0YSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb0RpZmYoIGN1ckRpZmYsIGRlcHRoICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9EaWZmKCBEaWZmIGRpZmYsIGludCBkZXB0aCApCisgICAgeworICAgICAgICBTdHJpbmcgdHlwZSA9IFN0cmluZ1V0aWxzLmxvd2VyQ2FzZSggU3RyaW5nLnZhbHVlT2YoIGRpZmYuZ2V0VHlwZSgpICkgKTsKKyAgICAgICAgU3RyaW5nIHNob3J0RGVsdGEgPSBnZXRTaG9ydERlbHRhKCBkaWZmLmdldERlbHRhKCkgKTsKKyAgICAgICAgU3RyaW5nIGRlbHRhID0gU3RyaW5nVXRpbHMubG93ZXJDYXNlKCBTdHJpbmcudmFsdWVPZiggZGlmZi5nZXREZWx0YSgpICkgKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBkaWZmLmdldE5hbWUoKTsKKworICAgICAgICBzdGFydERpZmYoIGRlcHRoLCB0eXBlLCBuYW1lLCBkZWx0YSwgc2hvcnREZWx0YSApOworCisgICAgICAgIGZvciAoIERpZmYgY3VyRGlmZiA6IGRpZmYuZ2V0Q2hpbGRyZW4oKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggRGVsdGEuVU5DSEFOR0VEICE9IGN1ckRpZmYuZ2V0RGVsdGEoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9EaWZmKCBjdXJEaWZmLCBkZXB0aCArIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVuZERpZmYoIGRlcHRoICk7CisgICAgfQorCisgICAgLy8gZXh0ZW5zaW9ucyBBUElzCisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzdGFydEJhc2VsaW5lKCBTdHJpbmcgZ2VuZXJhdGlvbkRhdGUsIFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgY3VycmVudFZlcnNpb24sIFN0cmluZyBwcmV2aW91c1ZlcnNpb24gKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YXJ0UGFja2FnZSggYm9vbGVhbiBtaXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3ZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9sZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWdnZXN0ZWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlmZk1lc3NhZ2UgZGlmZk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gYXR0cmlidXRlcyApOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RhcnREaWZmKCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0RGVsdGEgKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZERpZmYoIGludCBkZXB0aCApOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5kUGFja2FnZSgpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5kQmFzZWxpbmUoKTsKKworICAgIC8vIGludGVybmFscworCisgICAgcHJpdmF0ZSBKYXIgZ2V0Q3VycmVudEJ1bmRsZSgpCisgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZXNvbHZpbmcgdGhlIGFRdXRlLmJuZC5vc2dpLkphciB2aWEgdGhlIHByb2R1Y2VkIGFydGlmYWN0IHJhdGhlciB0aGFuIHdoYXQgaXMgcHJvZHVjZWQgaW4gdGhlIHRhcmdldC9jbGFzc2VzCisgICAgICAgICAqIGRpcmVjdG9yeSB3b3VsZCBtYWtlIHRoZSBNb2pvIHdvcmtpbmcgYWxzbyBpbiBwcm9qZWN0cyB3aGVyZSB0aGUgYnVuZGxlLXBsdWdpbiBpcyB1c2VkIGp1c3QgdG8gZ2VuZXJhdGUgdGhlCisgICAgICAgICAqIG1hbmlmZXN0IGZpbGUgYW5kIHRoZSBmaW5hbCBqYXIgaXMgYXNzZW1ibGVkIHZpYSB0aGUgamFyLXBsdWdpbgorICAgICAgICAgKi8KKyAgICAgICAgRmlsZSBjdXJyZW50QnVuZGxlID0gbmV3IEZpbGUoIGJ1aWxkRGlyZWN0b3J5LCBnZXRCdW5kbGVOYW1lKCkgKTsKKyAgICAgICAgaWYgKCAhY3VycmVudEJ1bmRsZS5leGlzdHMoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCAiUHJvZHVjZWQgYnVuZGxlIG5vdCBmb3VuZDogIiArIGN1cnJlbnRCdW5kbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9wZW5KYXIoIGN1cnJlbnRCdW5kbGUgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEphciBnZXRQcmV2aW91c0J1bmRsZSgpCisgICAgICAgIHRocm93cyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gRmluZCB0aGUgcHJldmlvdXMgdmVyc2lvbiBKQVIgYW5kIHJlc29sdmUgaXQsIGFuZCBpdCdzIGRlcGVuZGVuY2llcworICAgICAgICBmaW5hbCBWZXJzaW9uUmFuZ2UgcmFuZ2U7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByYW5nZSA9IFZlcnNpb25SYW5nZS5jcmVhdGVGcm9tVmVyc2lvblNwZWMoIGNvbXBhcmlzb25WZXJzaW9uICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiggIkludmFsaWQgY29tcGFyaXNvbiB2ZXJzaW9uOiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFydGlmYWN0IHByZXZpb3VzQXJ0aWZhY3Q7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2aW91c0FydGlmYWN0ID0KKyAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZURlcGVuZGVuY3lBcnRpZmFjdCggcHJvamVjdC5nZXRHcm91cElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQYWNrYWdpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSApOworCisgICAgICAgICAgICBpZiAoICFwcmV2aW91c0FydGlmYWN0LmdldFZlcnNpb25SYW5nZSgpLmlzU2VsZWN0ZWRWZXJzaW9uS25vd24oIHByZXZpb3VzQXJ0aWZhY3QgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoICJTZWFyY2hpbmcgZm9yIHZlcnNpb25zIGluIHJhbmdlOiAiICsgcHJldmlvdXNBcnRpZmFjdC5nZXRWZXJzaW9uUmFuZ2UoKSApOworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCisgICAgICAgICAgICAgICAgLy8gdHlwZSBpcyBrb253bgorICAgICAgICAgICAgICAgIExpc3Q8QXJ0aWZhY3RWZXJzaW9uPiBhdmFpbGFibGVWZXJzaW9ucyA9CisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhU291cmNlLnJldHJpZXZlQXZhaWxhYmxlVmVyc2lvbnMoIHByZXZpb3VzQXJ0aWZhY3QsIGxvY2FsUmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRSZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllcygpICk7CisgICAgICAgICAgICAgICAgZmlsdGVyU25hcHNob3RzKCBhdmFpbGFibGVWZXJzaW9ucyApOworICAgICAgICAgICAgICAgIEFydGlmYWN0VmVyc2lvbiB2ZXJzaW9uID0gcmFuZ2UubWF0Y2hWZXJzaW9uKCBhdmFpbGFibGVWZXJzaW9ucyApOworICAgICAgICAgICAgICAgIGlmICggdmVyc2lvbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQXJ0aWZhY3Quc2VsZWN0VmVyc2lvbiggdmVyc2lvbi50b1N0cmluZygpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoICggT3ZlckNvbnN0cmFpbmVkVmVyc2lvbkV4Y2VwdGlvbiBvY3ZlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCAiSW52YWxpZCBjb21wYXJpc29uIHZlcnNpb246ICIgKyBvY3ZlLmdldE1lc3NhZ2UoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBhbXJlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciBkZXRlcm1pbmluZyBwcmV2aW91cyB2ZXJzaW9uOiAiICsgYW1yZS5nZXRNZXNzYWdlKCksIGFtcmUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcHJldmlvdXNBcnRpZmFjdC5nZXRWZXJzaW9uKCkgPT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldExvZygpLmluZm8oICJVbmFibGUgdG8gZmluZCBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaW4gdGhlIHJlcG9zaXRvcnkiICk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKCBwcmV2aW91c0FydGlmYWN0LCBwcm9qZWN0LmdldFJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzKCksIGxvY2FsUmVwb3NpdG9yeSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGFyZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiQXJ0aWZhY3QgIiArIHByZXZpb3VzQXJ0aWZhY3QgKyAiIGNhbm5vdCBiZSByZXNvbHZlZCIsIGFyZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggQXJ0aWZhY3ROb3RGb3VuZEV4Y2VwdGlvbiBhbmZlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJBcnRpZmFjdCAiICsgcHJldmlvdXNBcnRpZmFjdAorICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCBvbiBsb2NhbC9yZW1vdGUgcmVwb3NpdG9yaWVzIiwgYW5mZSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9wZW5KYXIoIHByZXZpb3VzQXJ0aWZhY3QuZ2V0RmlsZSgpICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbHRlclNuYXBzaG90cyggTGlzdDxBcnRpZmFjdFZlcnNpb24+IHZlcnNpb25zICkKKyAgICB7CisgICAgICAgIGZvciAoIEl0ZXJhdG9yPEFydGlmYWN0VmVyc2lvbj4gdmVyc2lvbkl0ZXJhdG9yID0gdmVyc2lvbnMuaXRlcmF0b3IoKTsgdmVyc2lvbkl0ZXJhdG9yLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBBcnRpZmFjdFZlcnNpb24gdmVyc2lvbiA9IHZlcnNpb25JdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoICJTTkFQU0hPVCIuZXF1YWxzKCB2ZXJzaW9uLmdldFF1YWxpZmllcigpICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcnNpb25JdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEphciBvcGVuSmFyKCBGaWxlIGZpbGUgKQorICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmFyKCBmaWxlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIEpBUiBkaXJlY3Rvcnk6ICIgKyBmaWxlLCBlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlSmFycyggSmFyLi4uamFycyApCisgICAgeworICAgICAgICBmb3IgKCBKYXIgamFyIDogamFycyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGphci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpCisgICAgeworICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZXh0ZW5zaW9uID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEFydGlmYWN0SGFuZGxlcigpLmdldEV4dGVuc2lvbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBleHRlbnNpb24gPSBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5pc0VtcHR5KCBleHRlbnNpb24gKSB8fCAiYnVuZGxlIi5lcXVhbHMoIGV4dGVuc2lvbiApIHx8ICJwb20iLmVxdWFscyggZXh0ZW5zaW9uICkgKQorICAgICAgICB7CisgICAgICAgICAgICBleHRlbnNpb24gPSAiamFyIjsgLy8ganVzdCBpbiBjYXNlIG1hdmVuIGdldHMgY29uZnVzZWQKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjbGFzc2lmaWVyID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldENsYXNzaWZpZXIoKTsKKyAgICAgICAgaWYgKCBudWxsICE9IGNsYXNzaWZpZXIgJiYgY2xhc3NpZmllci50cmltKCkubGVuZ3RoKCkgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZpbmFsTmFtZSArICctJyArIGNsYXNzaWZpZXIgKyAnLicgKyBleHRlbnNpb247CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmluYWxOYW1lICsgJy4nICsgZXh0ZW5zaW9uOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaG9ydERlbHRhKCBEZWx0YSBkZWx0YSApCisgICAgeworICAgICAgICBzd2l0Y2ggKCBkZWx0YSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQURERUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICIrIjsKKworICAgICAgICAgICAgY2FzZSBDSEFOR0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAifiI7CisKKyAgICAgICAgICAgIGNhc2UgTUFKT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuICI+IjsKKworICAgICAgICAgICAgY2FzZSBNSUNSTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjB4QjUiOworCisgICAgICAgICAgICBjYXNlIE1JTk9SOgorICAgICAgICAgICAgICAgIHJldHVybiAiPCI7CisKKyAgICAgICAgICAgIGNhc2UgUkVNT1ZFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIi0iOworCisgICAgICAgICAgICBjYXNlIFVOQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiAiOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFN0cmluZyBkZWx0YVN0cmluZyA9IGRlbHRhLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKCBkZWx0YVN0cmluZy5jaGFyQXQoIDAgKSApOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9CYXNlbGluZVBsdWdpbi5qYXZhIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvQmFzZWxpbmVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTZlYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvQmFzZWxpbmVQbHVnaW4uamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5mZWxpeC5idW5kbGVwbHVnaW4uYmFzZWxpbmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlByZXR0eVByaW50WE1MV3JpdGVyOworCisvKioKKyAqIEJORCBCYXNlbGluZSBjaGVjayBiZXR3ZWVuIHR3byBidW5kbGVzLgorICoKKyAqIEBnb2FsIGJhc2VsaW5lCisgKiBAcGhhc2UgdmVyaWZ5CisgKiBAdGhyZWFkU2FmZSB0cnVlCisgKiBAc2luY2UgMi40LjEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJhc2VsaW5lUGx1Z2luCisgICAgZXh0ZW5kcyBBYnN0cmFjdEJhc2VsaW5lUGx1Z2luCit7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUEFUVEVSTiA9ICIlcyAlLTUwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyI7CisKKyAgICAvKioKKyAgICAgKiBBbiBYTUwgb3V0cHV0IGZpbGUgdG8gcmVuZGVyIHRvIDxjb2RlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Jhc2VsaW5lLnhtbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Jhc2VsaW5lLnhtbCIKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgeG1sT3V0cHV0RmlsZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gbG9nIHRoZSByZXN1bHRzIHRvIHRoZSBjb25zb2xlIG9yIG5vdCwgdHJ1ZSBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2xvZ1Jlc3VsdHN9IiBkZWZhdWx0LXZhbHVlPSJ0cnVlIgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2dSZXN1bHRzOworCisgICAgcHJpdmF0ZSBGaWxlV3JpdGVyIHhtbEZpbGVXcml0ZXI7CisKKyAgICBwcml2YXRlIFByZXR0eVByaW50WE1MV3JpdGVyIHhtbFdyaXRlcjsKKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgICAgaWYgKCB4bWxPdXRwdXRGaWxlICE9IG51bGwgKQorICAgICAgICB7CisgICAgICAgICAgICB4bWxPdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtbEZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlciggeG1sT3V0cHV0RmlsZSApOworICAgICAgICAgICAgICAgIHhtbFdyaXRlciA9IG5ldyBQcmV0dHlQcmludFhNTFdyaXRlciggeG1sRmlsZVdyaXRlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCAiTm8gWE1MIHJlcG9ydCB3aWxsIGJlIHByb2R1Y2VkLCBjYW5ub3Qgd3JpdGUgZGF0YSB0byAiICsgeG1sT3V0cHV0RmlsZSwgZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRCYXNlbGluZSggU3RyaW5nIGdlbmVyYXRpb25EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidW5kbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJldmlvdXNWZXJzaW9uICkKKyAgICB7CisgICAgICAgIGlmICggaXNMb2dnaW5nUmVzdWx0cygpICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nKCAiQmFzZWxpbmUgUmVwb3J0IC0gR2VuZXJhdGVkIGJ5IEFwYWNoZSBGZWxpeCBNYXZlbiBCdW5kbGUgUGx1Z2luIG9uICVzIGJhc2VkIG9uIEJuZCAtIHNlZSBodHRwOi8vd3d3LmFxdXRlLmJpei9CbmQvQm5kIiwKKyAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbkRhdGUgKTsKKyAgICAgICAgICAgIGxvZyggIkNvbXBhcmluZyBidW5kbGUgJXMgdmVyc2lvbiAlcyB0byB2ZXJzaW9uICVzIiwgYnVuZGxlTmFtZSwgY3VycmVudFZlcnNpb24sIHByZXZpb3VzVmVyc2lvbiApOworICAgICAgICAgICAgbG9nKCAiIiApOworICAgICAgICAgICAgbG9nKCBUQUJMRV9QQVRURVJOLAorICAgICAgICAgICAgICAgICAiICIsCisgICAgICAgICAgICAgICAgICJQQUNLQUdFX05BTUUiLAorICAgICAgICAgICAgICAgICAiREVMVEEiLAorICAgICAgICAgICAgICAgICAiQ1VSX1ZFUiIsCisgICAgICAgICAgICAgICAgICJCQVNFX1ZFUiIsCisgICAgICAgICAgICAgICAgICJSRUNfVkVSIiwKKyAgICAgICAgICAgICAgICAgIldBUk5JTkdTIiwKKyAgICAgICAgICAgICAgICAgIkFUVFJJQlVURVMiICk7CisgICAgICAgICAgICBsb2coIFRBQkxFX1BBVFRFUk4sCisgICAgICAgICAgICAgICAgICI9IiwKKyAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiwKKyAgICAgICAgICAgICAgICAgIj09PT09PT09PT0iLAorICAgICAgICAgICAgICAgICAiPT09PT09PT09PSIsCisgICAgICAgICAgICAgICAgICI9PT09PT09PT09IiwKKyAgICAgICAgICAgICAgICAgIj09PT09PT09PT0iLAorICAgICAgICAgICAgICAgICAiPT09PT09PT09PSIsCisgICAgICAgICAgICAgICAgICI9PT09PT09PT09IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpc1Byb2R1Y2luZ1htbCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgeG1sV3JpdGVyLnN0YXJ0RWxlbWVudCggImJhc2VsaW5lIiApOworICAgICAgICAgICAgeG1sV3JpdGVyLmFkZEF0dHJpYnV0ZSggInZlcnNpb24iLCAiMS4wLjAiICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAidmVuZG9yIiwgIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgKTsKKyAgICAgICAgICAgIHhtbFdyaXRlci5hZGRBdHRyaWJ1dGUoICJ2ZW5kb3JVUkwiLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgKTsKKyAgICAgICAgICAgIHhtbFdyaXRlci5hZGRBdHRyaWJ1dGUoICJnZW5lcmF0b3IiLCAiQXBhY2hlIEZlbGl4IE1hdmVuIEJ1bmRsZSBQbHVnaW4iICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAiZ2VuZXJhdG9yVVJMIiwgImh0dHA6Ly9mZWxpeC5hcGFjaGUub3JnL3NpdGUvYXBhY2hlLWZlbGl4LW1hdmVuLWJ1bmRsZS1wbHVnaW4tYm5kLmh0bWwiICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAiYW5hbHl6ZXIiLCAiQm5kIiApOworICAgICAgICAgICAgeG1sV3JpdGVyLmFkZEF0dHJpYnV0ZSggImFuYWx5emVyVVJMIiwgImh0dHA6Ly93d3cuYXF1dGUuYml6L0JuZC9CbmQiICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAiZ2VuZXJhdGVkT24iLCBnZW5lcmF0aW9uRGF0ZSApOworICAgICAgICAgICAgeG1sV3JpdGVyLmFkZEF0dHJpYnV0ZSggImJ1bmRsZU5hbWUiLCBidW5kbGVOYW1lICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAiY3VycmVudFZlcnNpb24iLCBjdXJyZW50VmVyc2lvbiApOworICAgICAgICAgICAgeG1sV3JpdGVyLmFkZEF0dHJpYnV0ZSggInByZXZpb3VzVmVyc2lvbiIsIHByZXZpb3VzVmVyc2lvbiApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRQYWNrYWdlKCBib29sZWFuIG1pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2hvcnREZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdlclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2xkZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1Z2dlc3RlZFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWZmTWVzc2FnZSBkaWZmTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBhdHRyaWJ1dGVzICkKKyAgICB7CisgICAgICAgIGlmICggaXNMb2dnaW5nUmVzdWx0cygpICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nKCBUQUJMRV9QQVRURVJOLAorICAgICAgICAgICAgICAgICBtaXNtYXRjaCA/ICcqJyA6IHNob3J0RGVsdGEsCisgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgIGRlbHRhLAorICAgICAgICAgICAgICAgICBuZXdlclZlcnNpb24sCisgICAgICAgICAgICAgICAgIG9sZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgZGlmZk1lc3NhZ2UgIT0gbnVsbCA/IGRpZmZNZXNzYWdlIDogJy0nLAorICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzUHJvZHVjaW5nWG1sKCkgKQorICAgICAgICB7CisgICAgICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCAicGFja2FnZSIgKTsKKyAgICAgICAgICAgIHhtbFdyaXRlci5hZGRBdHRyaWJ1dGUoICJuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgeG1sV3JpdGVyLmFkZEF0dHJpYnV0ZSggImRlbHRhIiwgZGVsdGEgKTsKKyAgICAgICAgICAgIHNpbXBsZUVsZW1lbnQoICJtaXNtYXRjaCIsIFN0cmluZy52YWx1ZU9mKCBtaXNtYXRjaCApICk7CisgICAgICAgICAgICBzaW1wbGVFbGVtZW50KCAibmV3ZXJWZXJzaW9uIiwgbmV3ZXJWZXJzaW9uICk7CisgICAgICAgICAgICBzaW1wbGVFbGVtZW50KCAib2xkZXJWZXJzaW9uIiwgb2xkZXJWZXJzaW9uICk7CisgICAgICAgICAgICBzaW1wbGVFbGVtZW50KCAic3VnZ2VzdGVkVmVyc2lvbiIsIHN1Z2dlc3RlZFZlcnNpb24gKTsKKworICAgICAgICAgICAgaWYgKCBkaWZmTWVzc2FnZSAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbGVtZW50KCBkaWZmTWVzc2FnZS5nZXRUeXBlKCkubmFtZSgpLCBkaWZmTWVzc2FnZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeG1sV3JpdGVyLnN0YXJ0RWxlbWVudCggImF0dHJpYnV0ZXMiICk7CisgICAgICAgICAgICBmb3IgKCBFbnRyeTxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlIDogYXR0cmlidXRlcy5lbnRyeVNldCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAoICc6JyA9PSBhdHRyaWJ1dGVOYW1lLmNoYXJBdCggYXR0cmlidXRlTmFtZS5sZW5ndGgoKSAtIDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoIDAsIGF0dHJpYnV0ZU5hbWUubGVuZ3RoKCkgLSAxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnN0YXJ0RWxlbWVudCggYXR0cmlidXRlTmFtZSApOworICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVRleHQoIGF0dHJpYnV0ZVZhbHVlICk7CisgICAgICAgICAgICAgICAgeG1sV3JpdGVyLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhtbFdyaXRlci5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydERpZmYoIGludCBkZXB0aCwgU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVsdGEsIFN0cmluZyBzaG9ydERlbHRhICkKKyAgICB7CisgICAgICAgIGlmICggaXNMb2dnaW5nUmVzdWx0cygpICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nKCAiJS0iICsgKGRlcHRoICogNCkgKyAicyAlcyAlcyAlcyIsCisgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICBzaG9ydERlbHRhLAorICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICBuYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzUHJvZHVjaW5nWG1sKCkgKQorICAgICAgICB7CisgICAgICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCB0eXBlICk7CisgICAgICAgICAgICB4bWxXcml0ZXIuYWRkQXR0cmlidXRlKCAibmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgIHhtbFdyaXRlci5hZGRBdHRyaWJ1dGUoICJkZWx0YSIsIGRlbHRhICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmREaWZmKCBpbnQgZGVwdGggKQorICAgIHsKKyAgICAgICAgaWYgKCBpc1Byb2R1Y2luZ1htbCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgeG1sV3JpdGVyLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZFBhY2thZ2UoKQorICAgIHsKKyAgICAgICAgaWYgKCBpc0xvZ2dpbmdSZXN1bHRzKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBsb2coICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggaXNQcm9kdWNpbmdYbWwoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhtbFdyaXRlci5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmRCYXNlbGluZSgpCisgICAgeworICAgICAgICBpZiAoIHhtbFdyaXRlciAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgeG1sV3JpdGVyLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIElPVXRpbC5jbG9zZSggeG1sRmlsZVdyaXRlciApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJvZHVjaW5nWG1sKCkKKyAgICB7CisgICAgICAgIHJldHVybiB4bWxGaWxlV3JpdGVyIT0gbnVsbCAmJiB4bWxXcml0ZXIgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dnaW5nUmVzdWx0cygpCisgICAgeworICAgICAgICByZXR1cm4gbG9nUmVzdWx0cyAmJiBnZXRMb2coKS5pc0luZm9FbmFibGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZyggU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uYXJncyApCisgICAgeworICAgICAgICBnZXRMb2coKS5pbmZvKCBTdHJpbmcuZm9ybWF0KCBmb3JtYXQsIGFyZ3MgKSApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaW1wbGVFbGVtZW50KCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKyAgICB7CisgICAgICAgIHhtbFdyaXRlci5zdGFydEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgeG1sV3JpdGVyLndyaXRlVGV4dCggdmFsdWUgKTsKKyAgICAgICAgeG1sV3JpdGVyLmVuZEVsZW1lbnQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL0Jhc2VsaW5lUmVwb3J0LmphdmEgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9CYXNlbGluZVJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTllNDIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9CYXNlbGluZVJlcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmZlbGl4LmJ1bmRsZXBsdWdpbi5iYXNlbGluZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5NYXZlblJlcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5NYXZlblJlcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOworCisvKioKKyAqIEJORCBCYXNlbGluZSByZXBvcnQuCisgKgorICogQGdvYWwgYmFzZWxpbmUtcmVwb3J0CisgKiBAcGhhc2Ugc2l0ZQorICogQHRocmVhZFNhZmUgdHJ1ZQorICogQHNpbmNlIDIuNC4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCYXNlbGluZVJlcG9ydAorICAgIGV4dGVuZHMgQWJzdHJhY3RCYXNlbGluZVBsdWdpbgorICAgIGltcGxlbWVudHMgTWF2ZW5SZXBvcnQKK3sKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RGlyZWN0b3J5fSIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OworCisgICAgcHJpdmF0ZSBTaW5rIHNpbms7CisKKyAgICBwcml2YXRlIExvY2FsZSBsb2NhbGU7CisKKyAgICBwcml2YXRlIGludCBjdXJyZW50RGVwdGggPSAwOworCisgICAgLy8gQWJzdHJhY3RCYXNlbGluZVBsdWdpbiBldmVudHMKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgZmFpbE9uV2FybmluZyA9IGZhbHNlOworCisgICAgICAgIGZpbmFsIEZpbGUgYmFzZWxpbmVJbWFnZXNEaXJlY3RvcnkgPSBuZXcgRmlsZSggb3V0cHV0RGlyZWN0b3J5LCAiaW1hZ2VzL2Jhc2VsaW5lIiApOworICAgICAgICBiYXNlbGluZUltYWdlc0RpcmVjdG9yeS5ta2RpcnMoKTsKKworICAgICAgICBmb3IgKCBTdHJpbmcgcmVzb3VyY2VOYW1lIDogbmV3IFN0cmluZ1tdeyAiYWNjZXNzLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm5vdGF0ZWQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFubm90YXRpb24uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bmRsZS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0YW50LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvci5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5kcy5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcGxlbWVudHMuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZm8uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nLmdpZiIgfSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNvdXJjZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSggcmVzb3VyY2VOYW1lICk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKCBiYXNlbGluZUltYWdlc0RpcmVjdG9yeSwgcmVzb3VyY2VOYW1lICk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCB0YXJnZXRGaWxlICk7CisgICAgICAgICAgICAgICAgSU9VdGlsLmNvcHkoIHNvdXJjZSwgdGFyZ2V0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oICJJbXBvc3NpYmxlIHRvIGNvcHkgIiArIHJlc291cmNlTmFtZSArICIgaW1hZ2UsIG1heWJlIHRoZSBzaXRlIHdvbid0IGJlIHByb3Blcmx5IHJlbmRlcmVkLiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHNvdXJjZSApOworICAgICAgICAgICAgICAgIElPVXRpbC5jbG9zZSggdGFyZ2V0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydEJhc2VsaW5lKCBTdHJpbmcgZ2VuZXJhdGlvbkRhdGUsIFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgY3VycmVudFZlcnNpb24sIFN0cmluZyBwcmV2aW91c1ZlcnNpb24gKQorICAgIHsKKyAgICAgICAgc2luay5oZWFkKCk7CisgICAgICAgIHNpbmsudGl0bGUoKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5iYXNlbGluZS50aXRsZSIgKTsKKyAgICAgICAgc2luay50ZXh0KCB0aXRsZSApOworICAgICAgICBzaW5rLnRpdGxlXygpOworICAgICAgICBzaW5rLmhlYWRfKCk7CisKKyAgICAgICAgc2luay5ib2R5KCk7CisKKyAgICAgICAgc2luay5zZWN0aW9uMSgpOworICAgICAgICBzaW5rLnNlY3Rpb25UaXRsZTEoKTsKKyAgICAgICAgc2luay50ZXh0KCB0aXRsZSApOworICAgICAgICBzaW5rLnNlY3Rpb25UaXRsZTFfKCk7CisKKyAgICAgICAgc2luay5wYXJhZ3JhcGgoKTsKKyAgICAgICAgc2luay50ZXh0KCBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5iYXNlbGluZS5ibmRsaW5rIiApICsgIiAiICk7CisgICAgICAgIHNpbmsubGluayggImh0dHA6Ly93d3cuYXF1dGUuYml6L0JuZC9CbmQiICk7CisgICAgICAgIHNpbmsudGV4dCggIkJuZCIgKTsKKyAgICAgICAgc2luay5saW5rXygpOworICAgICAgICBzaW5rLnRleHQoICIuIiApOworICAgICAgICBzaW5rLnBhcmFncmFwaF8oKTsKKworICAgICAgICBzaW5rLnBhcmFncmFwaCgpOworICAgICAgICBzaW5rLnRleHQoIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LmJhc2VsaW5lLmJ1bmRsZSIgKSArICIgIiApOworICAgICAgICBzaW5rLmZpZ3VyZSgpOworICAgICAgICBzaW5rLmZpZ3VyZUdyYXBoaWNzKCAiaW1hZ2VzL2Jhc2VsaW5lL2J1bmRsZS5naWYiICk7CisgICAgICAgIHNpbmsuZmlndXJlXygpOworICAgICAgICBzaW5rLnRleHQoICIgIiApOworICAgICAgICBzaW5rLmJvbGQoKTsKKyAgICAgICAgc2luay50ZXh0KCBidW5kbGVOYW1lICk7CisgICAgICAgIHNpbmsuYm9sZF8oKTsKKyAgICAgICAgc2luay5saXN0SXRlbV8oKTsKKworICAgICAgICBzaW5rLnBhcmFncmFwaCgpOworICAgICAgICBzaW5rLnRleHQoIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LmJhc2VsaW5lLnZlcnNpb24uY3VycmVudCIgKSArICIgIiApOworICAgICAgICBzaW5rLmJvbGQoKTsKKyAgICAgICAgc2luay50ZXh0KCBjdXJyZW50VmVyc2lvbiApOworICAgICAgICBzaW5rLmJvbGRfKCk7CisgICAgICAgIHNpbmsucGFyYWdyYXBoXygpOworCisgICAgICAgIHNpbmsucGFyYWdyYXBoKCk7CisgICAgICAgIHNpbmsudGV4dCggZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQuYmFzZWxpbmUudmVyc2lvbi5jb21wYXJpc29uIiApICsgIiAiICk7CisgICAgICAgIHNpbmsuYm9sZCgpOworICAgICAgICBzaW5rLnRleHQoIGNvbXBhcmlzb25WZXJzaW9uICk7CisgICAgICAgIHNpbmsuYm9sZF8oKTsKKyAgICAgICAgc2luay5wYXJhZ3JhcGhfKCk7CisKKyAgICAgICAgc2luay5wYXJhZ3JhcGgoKTsKKyAgICAgICAgc2luay50ZXh0KCBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5iYXNlbGluZS5nZW5lcmF0aW9uZGF0ZSIgKSArICIgIiApOworICAgICAgICBzaW5rLmJvbGQoKTsKKyAgICAgICAgc2luay50ZXh0KCBnZW5lcmF0aW9uRGF0ZSApOworICAgICAgICBzaW5rLmJvbGRfKCk7CisgICAgICAgIHNpbmsucGFyYWdyYXBoXygpOworCisgICAgICAgIHNpbmsuc2VjdGlvbjFfKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRQYWNrYWdlKCBib29sZWFuIG1pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3ZXJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9sZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWdnZXN0ZWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlmZk1lc3NhZ2UgZGlmZk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gYXR0cmlidXRlcyApCisgICAgeworICAgICAgICBzaW5rLmxpc3QoKTsKKworICAgICAgICBzaW5rLmxpc3RJdGVtKCk7CisKKyAgICAgICAgc2luay5maWd1cmUoKTsKKyAgICAgICAgc2luay5maWd1cmVHcmFwaGljcyggIi4vaW1hZ2VzL2Jhc2VsaW5lL3BhY2thZ2UuZ2lmIiApOworICAgICAgICBzaW5rLmZpZ3VyZV8oKTsKKyAgICAgICAgc2luay50ZXh0KCAiICIgKTsKKyAgICAgICAgc2luay5tb25vc3BhY2VkKCk7CisgICAgICAgIHNpbmsudGV4dCggcGFja2FnZU5hbWUgKTsKKyAgICAgICAgc2luay5tb25vc3BhY2VkXygpOworCisgICAgICAgIGlmICggZGlmZk1lc3NhZ2UgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpbmsudGV4dCggIiAiICk7CisgICAgICAgICAgICBzaW5rLmZpZ3VyZSgpOworICAgICAgICAgICAgc2luay5maWd1cmVHcmFwaGljcyggIi4vaW1hZ2VzL2Jhc2VsaW5lLyIgKyBkaWZmTWVzc2FnZS5nZXRUeXBlKCkubmFtZSgpICsgIi5naWYiICk7CisgICAgICAgICAgICBzaW5rLmZpZ3VyZV8oKTsKKyAgICAgICAgICAgIHNpbmsudGV4dCggIiAiICk7CisgICAgICAgICAgICBzaW5rLml0YWxpYygpOworICAgICAgICAgICAgc2luay50ZXh0KCBkaWZmTWVzc2FnZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIHNpbmsuaXRhbGljXygpOworICAgICAgICAgICAgc2luay50ZXh0KCAiIChuZXdlciB2ZXJzaW9uOiAiICk7CisgICAgICAgICAgICBzaW5rLm1vbm9zcGFjZWQoKTsKKyAgICAgICAgICAgIHNpbmsudGV4dCggbmV3ZXJWZXJzaW9uICk7CisgICAgICAgICAgICBzaW5rLm1vbm9zcGFjZWRfKCk7CisgICAgICAgICAgICBzaW5rLnRleHQoICIsIG9sZGVyIHZlcnNpb246ICIgKTsKKyAgICAgICAgICAgIHNpbmsubW9ub3NwYWNlZCgpOworICAgICAgICAgICAgc2luay50ZXh0KCBvbGRlclZlcnNpb24gKTsKKyAgICAgICAgICAgIHNpbmsubW9ub3NwYWNlZF8oKTsKKyAgICAgICAgICAgIHNpbmsudGV4dCggIiwgc3VnZ2VzdGVkIHZlcnNpb246ICIgKTsKKyAgICAgICAgICAgIHNpbmsubW9ub3NwYWNlZCgpOworICAgICAgICAgICAgc2luay50ZXh0KCBzdWdnZXN0ZWRWZXJzaW9uICk7CisgICAgICAgICAgICBzaW5rLm1vbm9zcGFjZWRfKCk7CisgICAgICAgICAgICBzaW5rLnRleHQoICIpIiApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnREaWZmKCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0RGVsdGEgKQorICAgIHsKKyAgICAgICAgaWYgKCBjdXJyZW50RGVwdGggPCBkZXB0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpbmsubGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudERlcHRoID0gZGVwdGg7CisKKyAgICAgICAgc2luay5saXN0SXRlbSgpOworICAgICAgICBzaW5rLmZpZ3VyZSgpOworICAgICAgICBzaW5rLmZpZ3VyZUdyYXBoaWNzKCAiaW1hZ2VzL2Jhc2VsaW5lLyIgKyB0eXBlICsgIi5naWYiICk7CisgICAgICAgIHNpbmsuZmlndXJlXygpOworICAgICAgICBzaW5rLnRleHQoICIgIiApOworCisgICAgICAgIHNpbmsubW9ub3NwYWNlZCgpOworICAgICAgICBzaW5rLnRleHQoIG5hbWUgKTsKKyAgICAgICAgc2luay5tb25vc3BhY2VkXygpOworCisgICAgICAgIHNpbmsudGV4dCggIiAiICk7CisKKyAgICAgICAgc2luay5pdGFsaWMoKTsKKyAgICAgICAgc2luay50ZXh0KCBkZWx0YSApOworICAgICAgICBzaW5rLml0YWxpY18oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmREaWZmKCBpbnQgZGVwdGggKQorICAgIHsKKyAgICAgICAgc2luay5saXN0SXRlbV8oKTsKKworICAgICAgICBpZiAoIGN1cnJlbnREZXB0aCA+IGRlcHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgc2luay5saXN0XygpOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudERlcHRoID0gZGVwdGg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZW5kUGFja2FnZSgpCisgICAgeworICAgICAgICBpZiAoIGN1cnJlbnREZXB0aCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzaW5rLmxpc3RfKCk7CisgICAgICAgICAgICBjdXJyZW50RGVwdGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgc2luay5saXN0SXRlbV8oKTsKKyAgICAgICAgc2luay5saXN0XygpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVuZEJhc2VsaW5lKCkKKyAgICB7CisgICAgICAgIHNpbmsuYm9keV8oKTsKKyAgICAgICAgc2luay5mbHVzaCgpOworICAgICAgICBzaW5rLmNsb3NlKCk7CisgICAgfQorCisgICAgLy8gTWF2ZW5SZXBvcnQgbWV0aG9kcworCisgICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVSZXBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFza2lwICYmIG91dHB1dERpcmVjdG9yeSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCBAU3VwcHJlc3NXYXJuaW5ncyggImRlcHJlY2F0aW9uIiApIG9yZy5jb2RlaGF1cy5kb3hpYS5zaW5rLlNpbmsgc2luaywgTG9jYWxlIGxvY2FsZSApCisgICAgICAgIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy5zaW5rID0gc2luazsKKyAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0TG9nKCkud2FybiggIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2R1Y2luZyB0aGUgcmVwb3J0IHBhZ2UsIHNlZSBuZXN0ZWQgZXhjZXB0aW9ucyIsIGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNYXZlblJlcG9ydC5DQVRFR09SWV9QUk9KRUNUX1JFUE9SVFM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiggTG9jYWxlIGxvY2FsZSApCisgICAgeworICAgICAgICByZXR1cm4gZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQuYmFzZWxpbmUuZGVzY3JpcHRpb24iICk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCBMb2NhbGUgbG9jYWxlICkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5iYXNlbGluZS5uYW1lIiApOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKCBMb2NhbGUgbG9jYWxlICkKKyAgICB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoICJiYXNlbGluZS1yZXBvcnQiLCBsb2NhbGUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gImJhc2VsaW5lLXJlcG9ydCI7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0UmVwb3J0T3V0cHV0RGlyZWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbFJlcG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3J0T3V0cHV0RGlyZWN0b3J5KCBGaWxlIG91dHB1dERpcmVjdG9yeSApCisgICAgeworICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL0RpZmZNZXNzYWdlLmphdmEgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9EaWZmTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9EaWZmTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuZmVsaXguYnVuZGxlcGx1Z2luLmJhc2VsaW5lOworCitmaW5hbCBjbGFzcyBEaWZmTWVzc2FnZQoreworCisgICAgcHVibGljIGVudW0gVHlwZSB7IGVycm9yLCB3YXJuaW5nLCBpbmZvIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisKKyAgICBwdWJsaWMgRGlmZk1lc3NhZ2UoIFN0cmluZyBtZXNzYWdlLCBUeXBlIHR5cGUgKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvSW5mb0NvbXBhcmF0b3IuamF2YSBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL0luZm9Db21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxOTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL0luZm9Db21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5mZWxpeC5idW5kbGVwbHVnaW4uYmFzZWxpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IGFRdXRlLmJuZC5kaWZmZXIuQmFzZWxpbmUuSW5mbzsKKworZmluYWwgY2xhc3MgSW5mb0NvbXBhcmF0b3IKKyAgICBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SW5mbz4KK3sKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZSggSW5mbyBpbmZvMSwgSW5mbyBpbmZvMiApCisgICAgeworICAgICAgICByZXR1cm4gaW5mbzEucGFja2FnZU5hbWUuY29tcGFyZVRvKCBpbmZvMi5wYWNrYWdlTmFtZSApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9iYXNlbGluZS1yZXBvcnQucHJvcGVydGllcyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmFzZWxpbmUtcmVwb3J0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyNGMzNAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvYmFzZWxpbmUtcmVwb3J0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXBvcnQuYmFzZWxpbmUubmFtZT1CYXNlbGluZQorcmVwb3J0LmJhc2VsaW5lLmRlc2NyaXB0aW9uPUJORCBCYXNlbGluZSBjaGVjayBiZXR3ZWVuIHR3byBidW5kbGVzCityZXBvcnQuYmFzZWxpbmUudGl0bGU9QmFzZWxpbmUgUmVzdWx0cworcmVwb3J0LmJhc2VsaW5lLmJuZGxpbms9VGhlIGZvbGxvd2luZyBkb2N1bWVudCBjb250YWlucyB0aGUgcmVzdWx0cyBvZgorcmVwb3J0LmJhc2VsaW5lLmJ1bmRsZT1CdW5kbGUgTmFtZToKK3JlcG9ydC5iYXNlbGluZS52ZXJzaW9uLmN1cnJlbnQ9Q3VycmVudCBWZXJzaW9uOgorcmVwb3J0LmJhc2VsaW5lLnZlcnNpb24uY29tcGFyaXNvbj1Db21wYXJpc29uIFZlcnNpb246CityZXBvcnQuYmFzZWxpbmUuZ2VuZXJhdGlvbmRhdGU9R2VuZXJhdGVkIG9uOgpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9hY2Nlc3MuZ2lmIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9hY2Nlc3MuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDEwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2FjY2Vzcy5naWYKQEAgLTAsMCArMSBAQAorR0lGODlhEA0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Fubm90YXRlZC5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Fubm90YXRlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvYW5ub3RhdGVkLmdpZgpAQCAtMCwwICsxIEBACitHSUY4OWEQDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvYW5ub3RhdGlvbi5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Fubm90YXRpb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDEwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Fubm90YXRpb24uZ2lmCkBAIC0wLDAgKzEgQEAKK0dJRjg5YRANClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9idW5kbGUuZ2lmIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9idW5kbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDEwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2J1bmRsZS5naWYKQEAgLTAsMCArMSBAQAorR0lGODlhEA0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2NsYXNzLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvY2xhc3MuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2NsYXNzLmdpZgpAQCAtMCwwICsxLDQgQEAKK0dJRjg5YRAKKworoISlgvmCQBYKKwRxBhMBClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9jb25zdGFudC5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2NvbnN0YW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJkZjIzCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9jb25zdGFudC5naWYKQEAgLTAsMCArMSwzIEBACitHSUY4OWEQCisKK28geZglAx6iEplEKggeY2B4GAYMoQIxQCiEgCMhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9lbnVtLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvZW51bS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxZDhmZgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvZW51bS5naWYKQEAgLTAsMCArMSwzIEBACitHSUY4OWEQCisFeAmQZioiIhuQg0IcCisREWYnnKAeYQ0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Vycm9yLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvZXJyb3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTAwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2Vycm9yLmdpZgpAQCAtMCwwICsxIEBACitHSUY4OWEUDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvZXh0ZW5kcy5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2V4dGVuZHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDRiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2V4dGVuZHMuZ2lmCkBAIC0wLDAgKzEsMyBAQAorR0lGODlhEAortIsLt48M/+J//+KA/O/Fq38FrYAGrIEGr4QHkWYKKyqtWlOtq4plksJkLK4NClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9maWVsZC5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2ZpZWxkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQxMDJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9maWVsZC5naWYKQEAgLTAsMCArMSBAQAorR0lGODlhEA0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2ltcGxlbWVudHMuZ2lmIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9pbXBsZW1lbnRzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQxMDJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9pbXBsZW1lbnRzLmdpZgpAQCAtMCwwICsxIEBACitHSUY4OWEQDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvaW5mby5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2luZm8uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDQ4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2luZm8uZ2lmCkBAIC0wLDAgKzEgQEAKK0dJRjg5YRAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2ludGVyZmFjZS5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL2ludGVyZmFjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvaW50ZXJmYWNlLmdpZgpAQCAtMCwwICsxLDIgQEAKK0dJRjg5YRAKKw0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL21ldGhvZC5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL21ldGhvZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvbWV0aG9kLmdpZgpAQCAtMCwwICsxIEBACitHSUY4OWEQDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvcGFja2FnZS5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3BhY2thZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDQ4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3BhY2thZ2UuZ2lmCkBAIC0wLDAgKzEgQEAKK0dJRjg5YRAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3Jlc291cmNlLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvcmVzb3VyY2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDEwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3Jlc291cmNlLmdpZgpAQCAtMCwwICsxIEBACitHSUY4OWEQDQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvcmV0dXJuLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvcmV0dXJuLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQxMDJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS9yZXR1cm4uZ2lmCkBAIC0wLDAgKzEgQEAKK0dJRjg5YRANClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL2ZlbGl4L2J1bmRsZXBsdWdpbi9iYXNlbGluZS92ZXJzaW9uLmdpZiBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvdmVyc2lvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwNDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvdmVyc2lvbi5naWYKQEAgLTAsMCArMSBAQAorR0lGODlhEApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9mZWxpeC9idW5kbGVwbHVnaW4vYmFzZWxpbmUvd2FybmluZy5naWYgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3dhcm5pbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGVhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVwbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvZmVsaXgvYnVuZGxlcGx1Z2luL2Jhc2VsaW5lL3dhcm5pbmcuZ2lmCkBAIC0wLDAgKzEsMiBAQAorR0lGODlhEAoryyQRKNGLGwEMg4QBHUUcAw8PDmgODQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK