phanindhar1

Untitled

May 10th, 2024
632
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 113.04 KB | None | 0 0
  1. cGFja2FnZSBjb20uZWR3YXJkam9uZXMuaHI7CgppbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKaW1wb3J0IGphdmEuc3FsLkRhdGU7CmltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOwppbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CmltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CmltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CmltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLlNldDsKaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWFpbC5FbWFpbEV4Y2VwdGlvbjsKCmltcG9ydCBjb20uZWR3YXJkam9uZXMuaHIudXRpbC5QU0NvbmZpZ0ZpbGU7CmltcG9ydCBjb20uZWR3YXJkam9uZXMuaHJtLmJhdGNoLnV0aWwuVGV4dEVtYWlsOwoKCi8qKgogKiBAYXV0aG9yIE5laWwgQWRyaWFuCiAqCiAqIFRoaXMgcHJvZ3JhbSBzZW5kcyBmaWxlcyB0byB0aGUgdmVuZG9yIExhd0xvZ2l4IHRvIHB1dCBkYXRhIGludG8gdGhlIEd1YXJkaWFuIHN5c3RlbS4gVGhlIEd1YXJkaWFuCiAqIHN5c3RlbSBoYW5kbGVzIHRoZSBJLTkgZm9ybXMgdGhhdCBoYXZlIHRvIGJlIGZpbGxlZCBvdXQgYnkgYWxsIFVTIGhpcmVzL3JlaGlyZXMuIEEgZmlsZSBpcyBzZW50CiAqIHRvIHNlbmQgVVMgaGlyZS9yZWhpcmVzIHRvIHRoZSB2ZW5kb3IsIGFsb25nIHdpdGggYW5vdGhlciBmaWxlIHRvIG5vdGlmeSB0aGUgdmVuZG9yIHdoZW4gdGhhdCBhc3NvY2lhdGUKICogdGVybWluYXRlcy4gVGhpcyBpcyB0byBwdXJnZSB0aGVpciBJLTkgZnJvbSB0aGUgc3lzdGVtIGFmdGVyIGEgc3BlY2lmaWVkIHRpbWUuIFRoZXJlIGlzIGFsc28gYSB1c2VyCiAqIGZpbGUgc2VudCB0aGF0IHNldHMgdXAgdGhlIHVzZXJzIG9mIHRoZSBHdWFyZGlhbiBzeXN0ZW0uIFRoaXMgaW5jbHVkZXMgYWQtaG9jIGhvbWUgb2ZmaWNlIHVzZXJzIHdobwogKiBoYXZlIHRoZSBJOUFETUlOIGFuZCBJOVVTRVIgcm9sZXMgYW5kIGFsbCBVUyBGQXMgYW5kIEJPQXMuIFNpbmNlIHRoZSB2ZW5kb3Igb25seSBhY2NlcHRzIGRlbHRhcwogKiB0d28gdHJhY2tpbmcgdGFibGVzIHdlcmUgY3JlYXRlZCB0byB0cmFjayB3aGF0IHdhcyBsYXN0IHNlbnQgdG8gdGhlIHZlbmRvci4gT24gZWFjaCBydW4gb2YgdGhlIHByb2dyYW0KICogaXQgY29tcGFyZXMgZXZlcnlvbmUncyBjdXJyZW50IGluZm9ybWF0aW9uIHRvIHdoYXQgd2FzIGxhc3Qgc2VudCB0byB0aGUgdmVuZG9yLiBJZiB0aGVyZSBpcyBhIGNoYW5nZQogKiB0aGUgZGF0YSBpcyB3cml0dGVuIHRvIG9uZSBvZiB0aGUgdGhyZWUgZmlsZXMgYW5kIHRoZW4gU0ZUUGVkIHRvIHRoZSB2ZW5kb3IuCiAqCiAqIEEgZmlsZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBoaXJlcy9yZWhpcmVzIHdpdGggcGhvbmUgbnVtYmVyIGluZm9ybWF0aW9uLiBUaGlzIGZpbGUgaXMgcHV0IGluIGEKICogZGlyZWN0b3J5IGZvciBWb2ljZSBPcGVyYXRpb25zIHNvIHRoYXQgdGhlaXIgYXV0b21hdGVkIGRpYWxlciBjYW4gY2FsbCB0aGVzZSBhc3NvY2lhdGVzIHJlbWluZGluZyB0aGVtCiAqIHRvIGZpbGwgb3V0IHRoZSBJLTkuCiAqCiAqIFJldmlzaW9uIEhpc3Rvcnk6CiAqIDAzLzI1LzEzIC0gTmVpbCBBZHJpYW4KICogQ2hhbmdlZCB0aGUgZS1tYWlsIGFkZHJlc3MgZm9yIHRoZSB1c2VycyB0byBiZSBoYXJkIGNvZGVkIGFzIHRoZWlyIGovcCMgZS1tYWlsIGFkZHJlc3MgaW5zdGVhZAogKiBvZiByZXRyaWV2aW5nIGl0IGZyb20gUGVvcGxlQmFzZS4KICoKICogMDEvMjkvMTQgLSBOZWlsIEFkcmlhbgogKiBBZGRlZCBhIGZpbGUgdG8gYmUgc2VudCB0byBWb2ljZSBPcGVyYXRpb25zIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCBhbGwgaGlyZXMvcmVoaXJlcyByZW1pbmRpbmcgdGhlbQogKiB0byBmaWxsIG91dCB0aGVpciBJLTkuCiAqCiAqIDEyLzI3LzE5IC0gU2hlbGx5IFBlY2sKICogTW9kaWZpZWQgc3FsIGluIHRoZSBtZXRob2QgcHJvY2Vzc0Fzc29jaWF0ZVVwZGF0ZXMoKSB0byB1c2Ugai5lZmZkdCB3aGVuIHNlbGVjdGluZyBmcm9tIHRoZSBsb2NhdGlvbiB0YWJsZSBpbgogKiB0aGUgdG9wIHBvcnRpb24gb2YgdGhlIHVuaW9uIHdoZXJlIGl0cyBnZXR0aW5nIGN1cnJlbnQgcm93LgogKiBBZGRlZCBzeXNvdXRzIGluIGVhY2ggb2YgdGhlIHdyaXRlIG1ldGhvZHMgdG8gZGlzcGxheSB0aGUgZW1wbGlkIG9mIHRoZSBhc3NvY2lhdGUgYmVpbmcgd3JpdHRlbi4KICogQWRkZWQgY29kZSB0byBzZW5kIGFuIGVtYWlsIHdoZW4gdGhlIGJpcnRoIGRhdGUgaXMgbnVsbC4gIFRoaXMgd2lsbCBzZW5kIGFuIGVtYWlsIHRvIEhSIFJlY29yZHMgYW5kIHRoZQogKiBwZXJzb24gd2lsbCBub3QgYmUgc2VudCB0byB0aGUgSS05IFZlbmRvci4gIE9uY2UgdGhlIGJpcnRoIGRhdGUgaXMgdXBkYXRlZCB0aGVuIHRoZSBwcm9ncmFtIHdpbGwgcGljawogKiB1cCB0aGUgYXNzb2NpYXRlIG9uIHRoZSBuZXh0IHJ1bi4KICoKICovCnB1YmxpYyBjbGFzcyBJOVByb2Nlc3NvciB7CgogICAgcHJpdmF0ZSBzdGF0aWMgUFNDb25maWdGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgUFNDb25maWdGaWxlKCk7CgogICAgcHJpdmF0ZSBzdGF0aWMgQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaHJDb25uZWN0aW9uU3RyaW5nOwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhyVXNlcklkOwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhyUGFzc3dvcmQ7CgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG91dHB1dERlc3Q7CgogICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZSBwcm9jZXNzRHQ7CiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG92ZXJyaWRlUHJvY2Vzc0R0ID0gZmFsc2U7CgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtYWlsUmVjaXBpZW50czsKCiAgICBzdGF0aWMgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0TU1ERFlZWVkgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSIpOwoKICAgIHByaXZhdGUgc3RhdGljIEZpbGVXcml0ZXIgbmV3SGlyZUZpbGU7CiAgICBwcml2YXRlIHN0YXRpYyBGaWxlV3JpdGVyIHVwZGF0ZUhpcmVGaWxlOwogICAgcHJpdmF0ZSBzdGF0aWMgRmlsZVdyaXRlciB1c2VyRmlsZTsKICAgIHByaXZhdGUgc3RhdGljIEZpbGVXcml0ZXIgcGhvbmVDYWxsRmlsZTsKCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3SGlyZUZpbGVOYW1lOwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVwZGF0ZUhpcmVGaWxlTmFtZTsKICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB1c2VyRmlsZU5hbWU7CiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGhvbmVDYWxsRmlsZU5hbWU7CgogICAgcHJvdGVjdGVkIHN0YXRpYyBTZXQ8U3RyaW5nPiBlVmVyaWZ5U3RhdGVzOwoKICAgIHByaXZhdGUgc3RhdGljIGludCBuZXdIaXJlUmVjb3JkQ291bnQgICAgPSAwOwogICAgcHJpdmF0ZSBzdGF0aWMgaW50IHVwZGF0ZUhpcmVSZWNvcmRDb3VudCA9IDA7CiAgICBwcml2YXRlIHN0YXRpYyBpbnQgdXNlclVwZGF0ZVJlY29yZENvdW50ID0gMDsKICAgIHByaXZhdGUgc3RhdGljIGludCBwaG9uZUNhbGxSZWNvcmRDb3VudCAgPSAwOwoKICAgIHByaXZhdGUgc3RhdGljIGludCBtYXhUaHJlc2hvbGROZXdIaXJlICAgID0gMDsKICAgIHByaXZhdGUgc3RhdGljIGludCBtYXhUaHJlc2hvbGRVcGRhdGVIaXJlID0gMDsKICAgIHByaXZhdGUgc3RhdGljIGludCBtYXhUaHJlc2hvbGRVc2VyVXBkYXRlID0gMDsKICAgIHByaXZhdGUgc3RhdGljIGludCBtYXhUaHJlc2hvbGRQaG9uZUNhbGwgID0gMDsKCiAgICBzdGF0aWMgewogICAgICAgIGRhdGVGb3JtYXRNTUREWVlZWS5zZXRMZW5pZW50KGZhbHNlKTsKICAgICAgICBkYXRlRm9ybWF0TU1ERFlZWVkuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVTL0NlbnRyYWwiKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdXAgdGhlIHByb2dyYW0gYW5kIHBlcmZvcm0gdGhlIEktOSBhc3NvY2lhdGUgYW5kIHVzZXIgcHJvY2Vzc2luZy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdzKTsKCiAgICAgICAgICAgIGdldENvbmZpZ0ZpbGVWYXJpYWJsZXMoKTsKICAgICAgICAgICAgc2V0VXBEQkNvbm5lY3Rpb24oKTsKICAgICAgICAgICAgZ2V0RGF0YUNhdGFsb2dWYWx1ZXMoKTsKCiAgICAgICAgICAgIHZhbGlkYXRlUHJvY2Vzc0R0KCk7CgogICAgICAgICAgICBjcmVhdGVGaWxlcygpOwoKICAgICAgICAgICAgcHJvY2Vzc0Fzc29jaWF0ZVVwZGF0ZXMoKTsKICAgICAgICAgICAgcHJvY2Vzc1VzZXJVcGRhdGVzKCk7CgogICAgICAgICAgICBhZGRUcmFpbGVyVG9QaG9uZUNhbGxGaWxlKCk7CiAgICAgICAgICAgIGNsb3NlRmlsZXMoKTsKCiAgICAgICAgICAgIGFkZFJlY29yZENvdW50VG9WZW5kb3JGaWxlcygpOwogICAgICAgICAgICBjaGVja1RocmVzaG9sZHMoKTsKCiAgICAgICAgICAgIHVwZGF0ZURhdGFDYXRhbG9nKCk7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29ubi5jb21taXQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb21taXQgZmFpbGVkISIsIGUpOwogICAgICAgICAgICB9CgogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSBjb25uLnJvbGxiYWNrKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlJvbGxiYWNrIGZhaWxlZCEiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgY29ubi5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIHRoZSB0aHJlZSBvdXRwdXQgZmlsZXMgYW5kIHdyaXRlcyB0aGUgaGVhZGVycyB0byBzZW5kIHRvIHRoZSB2ZW5kb3IgTGF3TG9naXguIExhdGVyIHRoZSBmaWxlcyB3aWxsIGJlCiAgICAgKiByZW5hbWVkIHRvIGluY2x1ZGUgdGhlIHJlY29yZCBjb3VudCBpbiB0aGUgZmlsZW5hbWUuCiAgICAgKgogICAgICogIFdTX1N1Ym1pdE5ld0hpcmVfTU1ERFlZLnR4dCAtIEZpbGUgdG8gc2VuZCBoaXJlcy9yZWhpcmVzIHRvIHRoZSB2ZW5kb3IsIHRoaXMgY3JlYXRlcyB0aGUgSS05IGluIHRoZSBzeXN0ZW0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxzbyBzZW5kcyB0aGUgYXNzb2NpYXRlIGFuIGUtbWFpbCB0byBsZXQgdGhlbSBrbm93IHRoZXkgbmVlZCB0byBjb21wbGV0ZSB0aGVpciBJLTkuCiAgICAgKgogICAgICogIFdTX0VNUF9VcGRhdGVFTVBfTU1ERFlZLnR4dCAtIEZpbGUgdG8gc2VuZCB0ZXJtaW5hdGlvbnMgdG8gdGhlIHZlbmRvciwgdGhpcyB0ZXJtaW5hdGVzIHRoZSBhc3NvY2lhdGVzIHNlbnQgaW4gdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfU3VibWl0TmV3SGlyZV9NTUREWVkudHh0IGZpbGUuIFRoaXMgc2V0cyB0aGUgSS05IHRvIGJlIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHZlbmRvciBzeXN0ZW0uCiAgICAgKgogICAgICogIFdTX1VTUl9VcGRhdGVVU1JfTU1ERFlZLnR4dCAtIEZpbGUgdG8gc2VuZCB1c2VycyBvZiB0aGUgR3VhcmRpYW4gKEktOSkgc3lzdGVtIHRvIHRoZSB2ZW5kb3IuIFRoaXMgaW5jbHVkZXMgdXNlcnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gYXJlIGJlaW5nIGFkZGVkIGFuZCByZW1vdmVkLiBUaGlzIGFsc28gaW5jbHVkZXMgdXBkYXRlcyB0byB0aGUgdXNlcidzIGRhdGEuCiAgICAgKgogICAgICogQWxzbyBjcmVhdGVzIHRoZSBmaWxlIHRvIGJlIHNlbnQgdG8gVm9pY2UgT3BlcmF0aW9ucy4KICAgICAqCiAgICAgKiAgSTlDQUxMX0xJU1QuY3N2IC0gTGlzdCBvZiBoaXJlcy9yZWhpcmVzIHRoYXQgd2lsbCBiZSBzZW50IHRvIFZvaWNlIE9wZXJhdGlvbnMgd2l0aCBwaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gdG8KICAgICAqICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGwgYW5kIHJlbWluZCB0aGVtIHRvIGNvbXBsZXRlIHRoZWlyIEktOS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVGaWxlcygpIHsKCiAgICAgICAgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0TU1ERFlZID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NZGR5eSIpOwogICAgICAgIGRhdGVGb3JtYXRNTUREWVkuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVTL0NlbnRyYWwiKSk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIG5ld0hpcmVGaWxlTmFtZSA9ICJXU19TdWJtaXROZXdIaXJlXyIgKyBkYXRlRm9ybWF0TU1ERFlZLmZvcm1hdChuZXcgamF2YS51dGlsLkRhdGUoKSkgKyAiLnR4dCI7CiAgICAgICAgICAgIG5ld0hpcmVGaWxlID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RGVzdCArIG5ld0hpcmVGaWxlTmFtZSk7CgogICAgICAgICAgICBuZXdIaXJlRmlsZS53cml0ZSgiXCJJRFwiLFwiTGFzdFwiLFwiRmlyc3RcIixcIkRPQlwiLFwiRGF0ZUhpcmVkXCIsXCJNaWRkbGVcIixcIk1haWRlblwiLFwiVGl0bGVcIixcIlNvY2lhbFwiLCIgKwogICAgICAgICAgICAgICAgICAgICJcIkFkZHJlc3MxXCIsXCJBZGRyZXNzMlwiLFwiQXBhcnRtZW50XCIsXCJDaXR5XCIsXCJTdGF0ZVwiLFwiWmlwXCIsXCJDb3VudHJ5XCIsXCJOZXdJRFwiLFwiTE9DXCIsXCJPQ0NcIiwiICsKICAgICAgICAgICAgICAgICAgICAiXCJCVU5cIixcIkxOR1wiLFwiRW1haWxcIixcIkNyZWF0ZUxvZ2luXCIsXCJQaG9uZTFcIixcIlBob25lMlwiLFwiUGhvbmUzXCIsXCJFeHQxXCIsXCJFeHQyXCIsXCJFeHQzXCIsIiArCiAgICAgICAgICAgICAgICAgICAgIlwiUEhOVHlwZTFcIixcIlBITlR5cGUyXCIsXCJQSE5UeXBlM1wiLFwiRGF0ZUZpcmVkXCIsXCJMT0NfTnVtYmVyXCIsXCJMT0NfTmFtZVwiLFwiT0NDX05hbWVcIixcIkJVTl9OYW1lXCIsIiArCiAgICAgICAgICAgICAgICAgICAgIlwiUmVtb3RlSGlyZVwiLFwiUmVtb3RlSFJcIixcIkNyZWF0ZUk5XCIsXCJDdXN0b21fMVwiLFwiQ3VzdG9tXzJcIixcIkN1c3RvbV8zXCIsXCJDdXN0b21fNFwiLFwiQ3VzdG9tXzVcIiwiICsKICAgICAgICAgICAgICAgICAgICAiXCJDdXN0b21fNlwiLFwiQ3VzdG9tXzdcIixcIkN1c3RvbV84XCJcbiIpOwogICAgICAgICAgICBwaG9uZUNhbGxGaWxlTmFtZSA9ICJJOUNBTExfTElTVC5jc3YiOwogICAgICAgICAgICBwaG9uZUNhbGxGaWxlID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RGVzdCArIHBob25lQ2FsbEZpbGVOYW1lKTsKCiAgICAgICAgICAgIHBob25lQ2FsbEZpbGUud3JpdGUoIkhFQURFUixJOUNBTExfTElTVCwiICsgZGF0ZUZvcm1hdE1NRERZWVlZLmZvcm1hdChuZXcgamF2YS51dGlsLkRhdGUoKSkucmVwbGFjZSgiLyIsICIiKSArICJcbiIpOwogICAgICAgICAgICAqLwoKICAgICAgICAgICAgdXBkYXRlSGlyZUZpbGVOYW1lID0gIldTX0VNUF9VcGRhdGVFTVBfIiArIGRhdGVGb3JtYXRNTUREWVkuZm9ybWF0KG5ldyBqYXZhLnV0aWwuRGF0ZSgpKSArICIudHh0IjsKICAgICAgICAgICAgdXBkYXRlSGlyZUZpbGUgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXREZXN0ICsgdXBkYXRlSGlyZUZpbGVOYW1lKTsKCiAgICAgICAgICAgIHVwZGF0ZUhpcmVGaWxlLndyaXRlKCJcIklEXCIsXCJMYXN0XCIsXCJGaXJzdFwiLFwiRE9CXCIsXCJEYXRlSGlyZWRcIixcIk1pZGRsZVwiLFwiTWFpZGVuXCIsXCJUaXRsZVwiLFwiU29jaWFsXCIsIiArCiAgICAgICAgICAgICAgICAgICAgIlwiQWRkcmVzczFcIixcIkFkZHJlc3MyXCIsXCJBcGFydG1lbnRcIixcIkNpdHlcIixcIlN0YXRlXCIsXCJaaXBcIixcIkNvdW50cnlcIixcIk5ld0lEXCIsXCJMT0NcIixcIk9DQ1wiLCIgKwogICAgICAgICAgICAgICAgICAgICJcIkJVTlwiLFwiTE5HXCIsXCJFbWFpbFwiLFwiQ3JlYXRlTG9naW5cIixcIlBob25lMVwiLFwiUGhvbmUyXCIsXCJQaG9uZTNcIixcIkV4dDFcIixcIkV4dDJcIixcIkV4dDNcIiwiICsKICAgICAgICAgICAgICAgICAgICAiXCJQSE5UeXBlMVwiLFwiUEhOVHlwZTJcIixcIlBITlR5cGUzXCIsXCJEYXRlRmlyZWRcIixcIkxPQ19OdW1iZXJcIixcIkxPQ19OYW1lXCIsXCJPQ0NfTmFtZVwiLFwiQlVOX05hbWVcIiwiICsKICAgICAgICAgICAgICAgICAgICAiXCJSZW1vdGVIaXJlXCIsXCJSZW1vdGVIUlwiLFwiQ3JlYXRlSTlcIixcIkN1c3RvbV8xXCIsXCJDdXN0b21fMlwiLFwiQ3VzdG9tXzNcIixcIkN1c3RvbV80XCIsXCJDdXN0b21fNVwiLCIgKwogICAgICAgICAgICAgICAgICAgICJcIkN1c3RvbV82XCIsXCJDdXN0b21fN1wiLFwiQ3VzdG9tXzhcIlxuIik7CgogICAgICAgICAgICB1c2VyRmlsZU5hbWUgPSAiV1NfVVNSX1VwZGF0ZVVTUl8iICsgZGF0ZUZvcm1hdE1NRERZWS5mb3JtYXQobmV3IGphdmEudXRpbC5EYXRlKCkpICsgIi50eHQiOwogICAgICAgICAgICB1c2VyRmlsZSA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dERlc3QgKyB1c2VyRmlsZU5hbWUpOwoKICAgICAgICAgICAgdXNlckZpbGUud3JpdGUoIlwiVXNlcklEXCIsXCJFbWFpbEFkZHJlc3NcIixcIlVwZGF0ZVR5cGVcIixcIlVzZXJMYXN0XCIsXCJVc2VyRmlyc3RcIixcIlVzZXJNaWRkbGVcIixcIkxPQ051bWJlclwiLCIgKwogICAgICAgICAgICAgICAgICAgICJcIkxPQ05hbWVcIixcIk9DQ0NsYXNzXCIsXCJIUkdyb3VwXCIsXCJOZXdVc2VySURcIixcIk5ld0VtYWlsQWRkcmVzc1wiLFwiTmV3VXNlckxhc3RcIixcIk5ld1VzZXJGaXJzdFwiLCIgKwogICAgICAgICAgICAgICAgICAgICJcIlVzZXJUaXRsZVwiLFwiVXNlckxvZ2luXCIsXCJXb3JrUGhvbmVcIixcIldvcmtFeHRcIixcIkhvbWVQaG9uZVwiLFwiSG9tZUV4dFwiLFwiQ2VsbFBob25lXCIsXCJDZWxsRXh0XCIsIiArCiAgICAgICAgICAgICAgICAgICAgIlwiVXNlckFkbWluXCIsXCJFVmVyaWZ5QWNjZXNzXCIsXCJFbnRlckVsZWN0cm9uaWNcIixcIkVudGVyQXJjaGl2YWxcIixcIkVudGVyUGFwZXJcIixcIkFwcHJvdmVcIixcIkFtZW5kXCIsIiArCiAgICAgICAgICAgICAgICAgICAgIlwiQXBwcm92ZUFtZW5kZWRcIixcIkV4ZW1wdElzc3Vlc1wiLFwiTG9jYXRpb25QZXJtaXNzaW9uc1wiLFwiTG9jYXRpb25Qcml2aWxlZ2VcIixcIkNvbXBhbnlOYW1lXCIsXCIiICsKICAgICAgICAgICAgICAgICAgICAiVXNlclBhc3N3b3JkXCIsXCJTZW5kRW1haWxcIixcIlVzZXJUeXBlXCIsXCJIUlR5cGVcIixcIlVzZXJUcmFpbmVyXCIsXCJVc2VyUmVkaXJlY3RcIixcIkZpZWxkNDFcIixcIiIgKwogICAgICAgICAgICAgICAgICAgICJEZWZhdWx0SFJcIixcIkZlYXR1cmVkRXhwZXJ0XCIsXCJWaWV3Q2hhcnRzXCIsXCJGaWVsZDQ1XCIsXCJMTUNyZWF0ZUVtcGxveWVlXCIsXCJMTVZpZXdPdXRzaWRlXCIsXCIiICsKICAgICAgICAgICAgICAgICAgICAiTE1EZWZhdWx0TE9DXCIsXCJMTURlZmF1bHRPQ0NcIixcIkxNRGVmYXVsdEJVTlwiLFwiTE1EZWZhdWx0TGFuZ1wiLFwiTE1EZWZhdWx0STlcIlxuIik7CgoKCiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIG9wZW4vd3JpdGUgb3V0cHV0IGZpbGVzIiwgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2xvc2UgdGhlIG91dHB1dCBmaWxlcy4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZUZpbGVzKCkgewoKICAgICAgICB0cnkgewogICAgICAgICAgICB1cGRhdGVIaXJlRmlsZS5jbG9zZSgpOwogICAgICAgICAgICB1c2VyRmlsZS5jbG9zZSgpOwogICAgICAgICAgICAvKgogICAgICAgICAgICBuZXdIaXJlRmlsZS5jbG9zZSgpOwogICAgICAgICAgICBwaG9uZUNhbGxGaWxlLmNsb3NlKCk7CiAgICAgICAgICAgICovCiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNsb3NlIG91dHB1dCBmaWxlcyIsIGUpOwogICAgICAgIH0KCiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgZmlsZSB3ZSBzZW5kIHRvIFZvaWNlIE9wZXJhdGlvbnMgY2FuIGhhdmUgYSB0cmFpbGVyIG9uIGl0LCBzbyB0aGF0IHdpbGwKICAgICAqIGJlIGNyZWF0ZWQgaGVyZS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUcmFpbGVyVG9QaG9uZUNhbGxGaWxlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBob25lQ2FsbEZpbGUud3JpdGUoIlRSQUlMRVIsIiArIHBob25lQ2FsbFJlY29yZENvdW50KTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgdHJhaWxlciByZWNvcmQgdG8gdGhlIG91dHB1dCBmaWxlIiwgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhlIHZlbmRvciB3b24ndCBhY2NlcHQgYSB0cmFpbGVyIGJ1dCB3aWxsIGFjY2VwdCBhIHJlY29yZCBjb3VudCBpbiB0aGUgbmFtZQogICAgICogb2YgdGhlIGZpbGUuIFJlbmFtZSB0aGUgZmlsZSB0byBpbmNsdWRlIHRoZSByZWNvcmQgY291bnQuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVjb3JkQ291bnRUb1ZlbmRvckZpbGVzKCkgewoKICAgICAgICAvKgogICAgICAgIFN0cmluZyBuZXdGaWxlTmFtZSA9IG5ld0hpcmVGaWxlTmFtZS5zdWJzdHJpbmcoMCwgbmV3SGlyZUZpbGVOYW1lLmxlbmd0aCgpIC0gNCkgKyAiXyIgKyBTdHJpbmcuZm9ybWF0KCIlMDVkIixuZXdIaXJlUmVjb3JkQ291bnQpICsgIi50eHQiOwogICAgICAgIHJlbmFtZUZpbGUobmV3SGlyZUZpbGVOYW1lLCBuZXdGaWxlTmFtZSk7CiAgICAgICAgbmV3SGlyZUZpbGVOYW1lID0gbmV3RmlsZU5hbWU7CiAgICAgICAgKi8KCiAgICAgICAgbmV3RmlsZU5hbWUgPSB1cGRhdGVIaXJlRmlsZU5hbWUuc3Vic3RyaW5nKDAsIHVwZGF0ZUhpcmVGaWxlTmFtZS5sZW5ndGgoKSAtIDQpICsgIl8iICsgU3RyaW5nLmZvcm1hdCgiJTA1ZCIsdXBkYXRlSGlyZVJlY29yZENvdW50KSArICIudHh0IjsKICAgICAgICByZW5hbWVGaWxlKHVwZGF0ZUhpcmVGaWxlTmFtZSwgbmV3RmlsZU5hbWUpOwogICAgICAgIHVwZGF0ZUhpcmVGaWxlTmFtZSA9IG5ld0ZpbGVOYW1lOwoKICAgICAgICBuZXdGaWxlTmFtZSA9IHVzZXJGaWxlTmFtZS5zdWJzdHJpbmcoMCwgdXNlckZpbGVOYW1lLmxlbmd0aCgpIC0gNCkgKyAiXyIgKyBTdHJpbmcuZm9ybWF0KCIlMDVkIix1c2VyVXBkYXRlUmVjb3JkQ291bnQpICsgIi50eHQiOwogICAgICAgIHJlbmFtZUZpbGUodXNlckZpbGVOYW1lLCBuZXdGaWxlTmFtZSk7CiAgICAgICAgdXNlckZpbGVOYW1lID0gbmV3RmlsZU5hbWU7CgogICAgfQoKICAgIC8qKgogICAgICogUmVuYW1lcyB0aGUgb3JpZ2luYWwgZmlsZSBieSBtYWtpbmcgYSBjb3B5IG9mIGl0IGFuZCB0aGVuIGRlbGV0aW5nIGl0LgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbmFtZUZpbGUoU3RyaW5nIG9yaWdpbmFsRmlsZU5hbWUsIFN0cmluZyBuZXdGaWxlTmFtZSkgewoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbmFtaW5nIGZpbGU6ICIgKyBvcmlnaW5hbEZpbGVOYW1lKTsKCiAgICAgICAgRmlsZSBvcmlnaW5hbEZpbGUgPSBuZXcgRmlsZShvdXRwdXREZXN0ICsgb3JpZ2luYWxGaWxlTmFtZSk7CiAgICAgICAgRmlsZSByZW5hbWVkRmlsZSA9IG5ldyBGaWxlKG91dHB1dERlc3QgKyBuZXdGaWxlTmFtZSk7CgogICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW5wdXRGaWxlID0gbnVsbDsKICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBkZXN0RmlsZSA9IG51bGw7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlucHV0RmlsZSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ob3JpZ2luYWxGaWxlKSk7CiAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlbmFtZWRGaWxlKSk7CgogICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CiAgICAgICAgICAgIGludCBsZW5ndGg7CgogICAgICAgICAgICB3aGlsZSgobGVuZ3RoID0gaW5wdXRGaWxlLnJlYWQoYnVmZmVyKSkgPiAwKXsKICAgICAgICAgICAgICAgIGRlc3RGaWxlLndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKICAgICAgICAgICAgfQoKICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlbmFtZSBmaWxlIiwgZSk7CiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmFpbGVkIHRvIHJlbmFtZSBmaWxlIiwgZSk7CiAgICAgICAgfSAgZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWxlICE9IG51bGwpIGlucHV0RmlsZS5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsKSBkZXN0RmlsZS5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgICAgIGlmICghb3JpZ2luYWxGaWxlLmRlbGV0ZSgpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlIG9yaWdpbmFsIGZpbGUiKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayB0aGUgZmlsZSBjb250cm9sIHRocmVzaG9sZHMuIE9ubHkgYSBtYXhpbXVtIHJlY29yZCB0aHJlc2hvbGQgaXMgY2hlY2tlZAogICAgICogc2luY2Ugb24gc29tZSBkYXlzIHRoZSBmaWxlcyB3aWxsIGhhdmUgbm8gcmVjb3Jkcy4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1RocmVzaG9sZHMoKSB7CgogICAgICAgIGJvb2xlYW4gdGhyZXNob2xkRXhjZWVkZWQgPSBmYWxzZTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgY291bnQgZm9yICIgKyB1cGRhdGVIaXJlRmlsZU5hbWUgKyAiOiAiICsgdXBkYXRlSGlyZVJlY29yZENvdW50KTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVzaG9sZCBmb3IgIiArIHVwZGF0ZUhpcmVGaWxlTmFtZSArICI6ICIgKyBtYXhUaHJlc2hvbGRVcGRhdGVIaXJlKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZCBjb3VudCBmb3IgIiArIHVzZXJGaWxlTmFtZSArICI6ICIgKyB1c2VyVXBkYXRlUmVjb3JkQ291bnQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZXNob2xkIGZvciAiICsgdXNlckZpbGVOYW1lICsgIjogIiArIG1heFRocmVzaG9sZFVzZXJVcGRhdGUpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIC8qCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgY291bnQgZm9yICIgKyBwaG9uZUNhbGxGaWxlTmFtZSArICI6ICIgKyBwaG9uZUNhbGxSZWNvcmRDb3VudCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlc2hvbGQgZm9yICIgKyBwaG9uZUNhbGxGaWxlTmFtZSArICI6ICIgKyBtYXhUaHJlc2hvbGRQaG9uZUNhbGwpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3JkIGNvdW50IGZvciAiICsgbmV3SGlyZUZpbGVOYW1lICsgIjogIiArIG5ld0hpcmVSZWNvcmRDb3VudCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlc2hvbGQgZm9yICIgKyBuZXdIaXJlRmlsZU5hbWUgKyAiOiAiICsgbWF4VGhyZXNob2xkTmV3SGlyZSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CgogICAgICAgIGlmIChuZXdIaXJlUmVjb3JkQ291bnQgPiBtYXhUaHJlc2hvbGROZXdIaXJlKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhyZXNob2xkIGV4Y2VlZGVkIGZvcjogIiArIG5ld0hpcmVGaWxlTmFtZSk7CiAgICAgICAgICAgIHRocmVzaG9sZEV4Y2VlZGVkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChwaG9uZUNhbGxSZWNvcmRDb3VudCA+IG1heFRocmVzaG9sZFBob25lQ2FsbCkgewogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRocmVzaG9sZCBleGNlZWRlZCBmb3I6ICIgKyBwaG9uZUNhbGxGaWxlTmFtZSk7CiAgICAgICAgICAgIHRocmVzaG9sZEV4Y2VlZGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgaWYgKHVwZGF0ZUhpcmVSZWNvcmRDb3VudCA+IG1heFRocmVzaG9sZFVwZGF0ZUhpcmUpIHsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaHJlc2hvbGQgZXhjZWVkZWQgZm9yOiAiICsgdXBkYXRlSGlyZUZpbGVOYW1lKTsKICAgICAgICAgICAgdGhyZXNob2xkRXhjZWVkZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzZXJVcGRhdGVSZWNvcmRDb3VudCA+IG1heFRocmVzaG9sZFVzZXJVcGRhdGUpIHsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaHJlc2hvbGQgZXhjZWVkZWQgZm9yOiAiICsgdXNlckZpbGVOYW1lKTsKICAgICAgICAgICAgdGhyZXNob2xkRXhjZWVkZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRocmVzaG9sZEV4Y2VlZGVkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJPbmUgb3IgbW9yZSBmaWxlIHRocmVzaG9sZCBsaW1pdHMgZXhjZWVkZWQiKTsKICAgICAgICB9CgogICAgfQoKICAgIC8qKgogICAgICogU2VsZWN0IGJhY2sgYWxsIHRoZSBoaXJlcywgcmVoaXJlcywgdGVybWluYXRpb25zLCBhbmQgcmV0aXJlbWVudHMgZW50ZXJlZCBzaW5jZSB0aGUKICAgICAqIGltcGxlbWVudGF0aW9uIGRhdGUgb3IgaW4gdGhlIGZ1dHVyZSBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gc2VudCB0bwogICAgICogdGhlIHZlbmRvciBvciBub3QuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0Fzc29jaWF0ZVVwZGF0ZXMoKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwogICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGouZW1wbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsai5hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxqLmxhc3RfaGlyZV9kdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLGoudGVybWluYXRpb25fZHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsai5qb2Jjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxsLnN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLHAuZWRqX2FjZjJfbGlkX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJmcm9tIHBzX2pvYiAgICAgICAgICBqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAscHNfbG9jYXRpb25fdGJsIGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICxwc19lZGpfcGVyc29uYWwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ3aGVyZSBqLnBlcl9vcmcgICAgICAgPSAnRU1QJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGouam9iX2luZGljYXRvciA9ICdQJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5hY3Rpb25fZHQgICAgPj0gdG9fZGF0ZSgnMDMvMjIvMjAxMycsJ01NL0REL1lZWVknKSAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmVmZmR0ID0gKHNlbGVjdCBtYXgoajIuZWZmZHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBmcm9tIHBzX2pvYiBqMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgd2hlcmUgajIuZW1wbGlkICAgPSBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lbXBsX3JjZCA9IGouZW1wbF9yY2QgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmFjdGlvbiAgaW4gKCdISVInLCdSRUgnLCdURVInLCdSRVQnKSAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuZWZmZHQgICA8PSBzeXNkYXRlKSAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmVmZnNlcSA9IChzZWxlY3QgbWF4KGoyLmVmZnNlcSkgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2IgajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHdoZXJlIGoyLmVtcGxpZCAgID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgajIuZW1wbF9yY2QgPSBqLmVtcGxfcmNkICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5hY3Rpb24gIGluICgnSElSJywnUkVIJywnVEVSJywnUkVUJykgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVmZmR0ICAgID0gai5lZmZkdCkgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLnNldGlkICAgID0gai5zZXRpZF9sb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGwubG9jYXRpb24gPSBqLmxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbC5jb3VudHJ5ICA9ICdVU0EnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLmVmZmR0ID0gKHNlbGVjdCBtYXgobDIuZWZmZHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBmcm9tIHBzX2xvY2F0aW9uX3RibCBsMiAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgd2hlcmUgbDIuc2V0aWQgICAgPSBsLnNldGlkICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBsMi5sb2NhdGlvbiA9IGwubG9jYXRpb24gICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGwyLmVmZmR0ICAgPD0gai5lZmZkdCkgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgcC5lbXBsaWQgPSBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBub3QgZXhpc3RzIChzZWxlY3QgJ3gnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2IgajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHdoZXJlIGoyLmVtcGxpZCAgID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgajIuZW1wbF9yY2QgPSBqLmVtcGxfcmNkICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5hY3Rpb24gICA9ICdSRUgnICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVmZmR0ICAgID4gc3lzZGF0ZSkgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ1bmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgInNlbGVjdCBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLGouYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsai5sYXN0X2hpcmVfZHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxqLnRlcm1pbmF0aW9uX2R0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLGouam9iY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsbC5zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxwLmVkal9hY2YyX2xpZF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiZnJvbSBwc19qb2IgICAgICAgICAgaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX2xvY2F0aW9uX3RibCBsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAscHNfZWRqX3BlcnNvbmFsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAid2hlcmUgai5wZXJfb3JnICAgICAgID0gJ0VNUCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmpvYl9pbmRpY2F0b3IgPSAnUCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGouYWN0aW9uX2R0ICAgID49IHRvX2RhdGUoJzAzLzIyLzIwMTMnLCdNTS9ERC9ZWVlZJykgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5lZmZkdCA9IChzZWxlY3QgbWluKGoyLmVmZmR0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2IgajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHdoZXJlIGoyLmVtcGxpZCAgID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuZW1wbF9yY2QgPSBqLmVtcGxfcmNkICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5hY3Rpb24gIGluICgnSElSJywnUkVIJykgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVmZmR0ICAgID4gc3lzZGF0ZSkgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5lZmZzZXEgPSAoc2VsZWN0IG1pbihqMi5lZmZzZXEpICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGZyb20gcHNfam9iIGoyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB3aGVyZSBqMi5lbXBsaWQgICA9IGouZW1wbGlkICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVtcGxfcmNkID0gai5lbXBsX3JjZCAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgajIuYWN0aW9uICBpbiAoJ0hJUicsJ1JFSCcpICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lZmZkdCAgICA9IGouZWZmZHQpICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbC5zZXRpZCAgICA9IGouc2V0aWRfbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLmxvY2F0aW9uID0gai5sb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGwuY291bnRyeSAgPSAnVVNBJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbC5lZmZkdCA9IChzZWxlY3QgbWF4KGwyLmVmZmR0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgZnJvbSBwc19sb2NhdGlvbl90YmwgbDIgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHdoZXJlIGwyLnNldGlkICAgID0gbC5zZXRpZCAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgbDIubG9jYXRpb24gPSBsLmxvY2F0aW9uICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBsMi5lZmZkdCAgIDw9IGouZWZmZHQpICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIHAuZW1wbGlkID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAib3JkZXIgYnkgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdG10ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CgogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEgPSBuZXcgQXNzb2NpYXRlRGF0YSgpOwoKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0RW1wbGlkKHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldEFjdGlvbihycy5nZXRTdHJpbmcoMikpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRMYXN0SGlyZUR0KHJzLmdldERhdGUoMykpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRUZXJtRHQocnMuZ2V0RGF0ZSg0KSk7CiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldEpvYmNvZGUocnMuZ2V0U3RyaW5nKDUpKTsKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0TG9jYXRpb25CeVN0YXRlKHJzLmdldFN0cmluZyg2KSk7CiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldEFjZjJJZChycy5nZXRTdHJpbmcoNykpOwoKICAgICAgICAgICAgICAgIGRldGVybWluZUFzc29jaWF0ZUNoYW5nZXMoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNRTCBlcnJvciByZXRyaWV2aW5nIGFzc29jaWF0ZSBkYXRhIiwgZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSBycy5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIFNlbGVjdCBiYWNrIGFsbCBhY3RpdmUgVVMgRkFzIGFuZCBCT0FzIGFzIHdlbGwgYXMgYW55b25lIHdpdGggdGhlIEk5VVNFUiBvcgogICAgICogSTlBRE1JTiByb2xlLiBUaGVzZSBhc3NvY2lhdGVzIHdpbGwgYmUgdGhlIHVzZXJzIG9mIHRoZSBHdWFyZGlhbiBzeXN0ZW0uIENvbXBhcmUKICAgICAqIHRoZXNlIHVzZXJzIGFnYWluc3QgdGhlIHRyYWNraW5nIHRhYmxlIHRvIGRldGVybWluZSB3aG8gbmVlZHMgdG8gaGF2ZSB0aGVpciBhY2Nlc3MKICAgICAqIGFkZGVkLCB1cGRhdGVkLCBvciBkZWxldGVkIGZyb20gdGhlIEd1YXJkaWFuIHN5c3RlbS4KICAgICAqCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1VzZXJVcGRhdGVzKCkgewoKICAgICAgICB1cGRhdGVVc2VyVHJhY2tpbmdUYWJsZUZsYWdzKCk7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwogICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGouZW1wbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsai5qb2Jjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxsLnN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLHAuZWRqX2FjZjJfbGlkX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsJ0k5VVNFUicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgImZyb20gcHNfam9iICAgICAgICAgIGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICxwc19sb2NhdGlvbl90YmwgbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX2Vkal9wZXJzb25hbCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIndoZXJlIGoucGVyX29yZyAgICAgICA9ICdFTVAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5qb2JfaW5kaWNhdG9yID0gJ1AnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmhyX3N0YXR1cyAgICAgPSAnQScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIHN1YnN0cihqLnBheWdyb3VwLDAsMSkgaW4gKCdJJywnQicpICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5lZmZkdCA9IChzZWxlY3QgbWF4KGoyLmVmZmR0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2IgajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHdoZXJlIGoyLmVtcGxpZCAgID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuZW1wbF9yY2QgPSBqLmVtcGxfcmNkICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lZmZkdCAgIDw9IHN5c2RhdGUpICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGouZWZmc2VxID0gKHNlbGVjdCBtYXgoajIuZWZmc2VxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBmcm9tIHBzX2pvYiBqMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgd2hlcmUgajIuZW1wbGlkICAgPSBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lbXBsX3JjZCA9IGouZW1wbF9yY2QgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVmZmR0ICAgID0gai5lZmZkdCkgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLnNldGlkICAgID0gai5zZXRpZF9sb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGwubG9jYXRpb24gPSBqLmxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbC5jb3VudHJ5ICA9ICdVU0EnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLmVmZmR0ID0gKHNlbGVjdCBtYXgobDIuZWZmZHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBmcm9tIHBzX2xvY2F0aW9uX3RibCBsMiAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgd2hlcmUgbDIuc2V0aWQgICAgPSBsLnNldGlkICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBsMi5sb2NhdGlvbiA9IGwubG9jYXRpb24gICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGwyLmVmZmR0ICAgPD0gc3lzZGF0ZSkgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgcC5lbXBsaWQgPSBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ1bmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgInNlbGVjdCBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLGouam9iY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsbC5zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxwLmVkal9hY2YyX2xpZF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLHIuZWRqX3JlZ19yb2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJmcm9tIHBzX2pvYiAgICAgICAgICAgIGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAscHNfbG9jYXRpb25fdGJsICAgbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICxwc19lZGpfcGVyc29uYWwgICBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX2Vkal9hZGRsX3JvbGVzIHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIndoZXJlIGoucGVyX29yZyAgICAgICA9ICdFTVAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5qb2JfaW5kaWNhdG9yID0gJ1AnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmhyX3N0YXR1cyAgICAgPSAnQScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGouZWZmZHQgPSAoc2VsZWN0IG1heChqMi5lZmZkdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGZyb20gcHNfam9iIGoyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB3aGVyZSBqMi5lbXBsaWQgICA9IGouZW1wbGlkICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGoyLmVtcGxfcmNkID0gai5lbXBsX3JjZCAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuZWZmZHQgICA8PSBzeXNkYXRlKSAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmVmZnNlcSA9IChzZWxlY3QgbWF4KGoyLmVmZnNlcSkgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2IgajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHdoZXJlIGoyLmVtcGxpZCAgID0gai5lbXBsaWQgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgajIuZW1wbF9yY2QgPSBqLmVtcGxfcmNkICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lZmZkdCAgICA9IGouZWZmZHQpICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbC5zZXRpZCAgICA9IGouc2V0aWRfbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBsLmxvY2F0aW9uID0gai5sb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIGwuZWZmZHQgPSAoc2VsZWN0IG1heChsMi5lZmZkdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGZyb20gcHNfbG9jYXRpb25fdGJsIGwyICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB3aGVyZSBsMi5zZXRpZCAgICA9IGwuc2V0aWQgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgYW5kIGwyLmxvY2F0aW9uID0gbC5sb2NhdGlvbiAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgbDIuZWZmZHQgICA8PSBzeXNkYXRlKSAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBwLmVtcGxpZCAgICAgICAgICAgPSBqLmVtcGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIHIuZW1wbGlkICAgICAgICAgICA9IGouZW1wbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgci5lZGpfcmVnX3JvbGUgICAgaW4gKCdJOUFETUlOJywnSTlVU0VSJykgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCByLmVkal9yZXNwX2FyZWFfY2QgPSAnRklSTScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIHIuYmVnaW5fZHQgICAgICAgIDw9IHN5c2RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgKCAgIHIuZW5kX2R0IGlzIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgb3Igci5lbmRfZHQgID4gc3lzZGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIm9yZGVyIGJ5IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RtdCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChzcWwpOwoKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgQXNzb2NpYXRlRGF0YSBhc3NvY2lhdGVEYXRhID0gbmV3IEFzc29jaWF0ZURhdGEoKTsKCiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldEVtcGxpZChycy5nZXRTdHJpbmcoMSkpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRKb2Jjb2RlKHJzLmdldFN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldExvY2F0aW9uQnlTdGF0ZShycy5nZXRTdHJpbmcoMykpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRBY2YySWQocnMuZ2V0U3RyaW5nKDQpKTsKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0QWRtaW4ocnMuZ2V0U3RyaW5nKDUpLmVxdWFscygiSTlBRE1JTiIpKTsKCiAgICAgICAgICAgICAgICBkZXRlcm1pbmVVc2VyQ2hhbmdlcyhhc3NvY2lhdGVEYXRhKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJUcmFja2luZ1RhYmxlRmxhZyhhc3NvY2lhdGVEYXRhLCAiQSIpOwogICAgICAgICAgICB9CgogICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTUUwgZXJyb3IgcmV0cmlldmluZyB1c2VyIGRhdGEiLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHJzLmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgICAgIHByb2Nlc3NSZXRpcmVkVXNlcnMoKTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBDaGFuZ2UgdGhlIHByb2Nlc3MgZmxhZyBvbiB0aGUgdXNlciB0cmFja2luZyB0YWJsZSB0byBhIHNwYWNlIHdoZXJlCiAgICAgKiBpdCBpcyBub3QgYW4gUiAoUmV0aXJlZCkuIEF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBhbnlvbmUgd2hvIGlzIHN0aWxsIGEgc3BhY2UKICAgICAqIG11c3QgaGF2ZSBiZWNvbWUgaW5hY3RpdmUgKG5vIGxvbmdlciBhIHVzZXIpIHNpbmNlIHRoZSBsYXN0IHJ1bi4gVGhlc2UgYXNzb2NpYXRlcwogICAgICogd2lsbCBuZWVkIHRvIGJlIHB1dCBvbiB0aGUgZmlsZSB0byBoYXZlIHRoZWlyIGFjY2VzcyByZXZva2VkLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVVzZXJUcmFja2luZ1RhYmxlRmxhZ3MoKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gInVwZGF0ZSBwc19lZGpfaTlfdXNlciAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgIHNldCBlZGpfcHJvY19jaGdfY2QgID0gJyAnICIgKwogICAgICAgICAgICAgICAgIiB3aGVyZSBlZGpfcHJvY19jaGdfY2QgPD4gJ1InICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHVwZGF0aW5nIHRoZSBmbGFncyBvbiB0aGUgdXNlciB0cmFja2luZyB0YWJsZSIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KCiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIHRoZSB1c2VyJ3MgY3VycmVudCBkYXRhIGFnYWluc3QgdGhlIGxhc3QgZGF0YSB0aGF0IHdlIHNlbnQgdG8gdGhlIHZlbmRvcgogICAgICogb24gdGhlIHRyYWNraW5nIHRhYmxlLiBJZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgdGhlbiB3ZSBuZWVkIHRvIHdyaXRlIHRoZSB1cGRhdGVkCiAgICAgKiBkYXRhIHRvIHRoZSB1c2VyIGZpbGUgdG8gc2VuZCB0byB0aGUgdmVuZG9yLgogICAgICoKICAgICAqIEBwYXJhbSB1c2VyRGF0YSB0aGUgdXNlcidzIGN1cnJlbnQgZGF0YSB0byBjb21wYXJlIGFnYWluc3QgdGhlIGxhc3QgZGF0YSB3ZSBzZW50IHRvIHRoZSB2ZW5kb3IKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZXRlcm1pbmVVc2VyQ2hhbmdlcyhBc3NvY2lhdGVEYXRhIHVzZXJEYXRhKSB7CgogICAgICAgIFN0cmluZyBlbXBsaWQgPSB1c2VyRGF0YS5nZXRFbXBsaWQoKTsKICAgICAgICBTdHJpbmcgdXBkYXRlVHlwZTsKCiAgICAgICAgQXNzb2NpYXRlRGF0YSB0cmFja2luZ0RhdGEgPSBnZXRVc2VyVHJhY2tpbmdEYXRhKGVtcGxpZCk7CgogICAgICAgIGdldFVzZXJQZXJzb25hbEluZm8odXNlckRhdGEpOwoKICAgICAgICAvLyBJZiB0aGVyZSB3YXNuJ3QgYSByb3cgb24gdGhlIHRyYWNraW5nIHRhYmxlIGZvciB0aGlzIHVzZXIgdGhlbiB0aGV5J3ZlIG5vdCBiZWVuIHNlbnQgeWV0LAogICAgICAgIC8vIHNlbmQgdGhlIGRhdGEgYW5kIHVwZGF0ZSB0aGUgdHJhY2tpbmcgdGFibGUuCiAgICAgICAgaWYgKHRyYWNraW5nRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgIGluc2VydFVzZXJUcmFja2luZ1RhYmxlKHVzZXJEYXRhKTsKICAgICAgICAgICAgd3JpdGVVc2VyUmVjb3JkKHVzZXJEYXRhLCB0cmFja2luZ0RhdGEsICJBZGQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gT25seSB3cml0ZSB0byB0aGUgdXNlciBmaWxlIGlmIG9uZSBvZiB0aGUgdmFsdWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgcnVuCiAgICAgICAgaWYgKCF1c2VyRGF0YS5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHModHJhY2tpbmdEYXRhLmdldEVtYWlsQWRkcmVzcygpKSB8fAogICAgICAgICAgICAgICAgIXVzZXJEYXRhLmdldExhc3ROYW1lKCkuZXF1YWxzKHRyYWNraW5nRGF0YS5nZXRMYXN0TmFtZSgpKSB8fAogICAgICAgICAgICAgICAgIXVzZXJEYXRhLmdldEZpcnN0TmFtZSgpLmVxdWFscyh0cmFja2luZ0RhdGEuZ2V0Rmlyc3ROYW1lKCkpIHx8CiAgICAgICAgICAgICAgICAhdXNlckRhdGEuZ2V0TG9jYXRpb24oKS5lcXVhbHModHJhY2tpbmdEYXRhLmdldExvY2F0aW9uKCkpIHx8CiAgICAgICAgICAgICAgICAhdXNlckRhdGEuaXNBZG1pbigpLmVxdWFscyh0cmFja2luZ0RhdGEuaXNBZG1pbigpKSB8fAogICAgICAgICAgICAgICAgIXVzZXJEYXRhLmdldEpvYlRpdGxlKCkuZXF1YWxzKHRyYWNraW5nRGF0YS5nZXRKb2JUaXRsZSgpKSB8fAogICAgICAgICAgICAgICAgdHJhY2tpbmdEYXRhLmdldFByb2Nlc3NDZCgpLmVxdWFscygiUiIpKSB7CgogICAgICAgICAgICAvLyBJZiB0aGUgdHJhY2tpbmcgdGFibGUgY3VycmVudGx5IGhhcyBhIHByb2Nlc3MgY2hhbmdlIGNvZGUgb2YgUiB0aGVuCiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdW5yZXRpcmUgdGhlIHVzZXIsIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVtLgogICAgICAgICAgICBpZiAodHJhY2tpbmdEYXRhLmdldFByb2Nlc3NDZCgpLmVxdWFscygiUiIpKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVUeXBlID0gIlVucmV0aXJlIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVwZGF0ZVR5cGUgPSAiVXBkYXRlIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlVXNlclRyYWNraW5nVGFibGUodXNlckRhdGEpOwogICAgICAgICAgICB3cml0ZVVzZXJSZWNvcmQodXNlckRhdGEsIHRyYWNraW5nRGF0YSwgdXBkYXRlVHlwZSk7CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIEZvciB0aGUgZ2l2ZW4gYXNzb2NpYXRlIGNoZWNrIHRoZSB0cmFja2luZyB0YWJsZSB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhlbQogICAgICogdG8gdGhlIHZlbmRvci4gSWYgbm90LCBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVwZGF0ZSBpcyByZXF1aXJlZCBhbmQgd3JpdGUgdG8gdGhlIGFwcHJvcHJpYXRlCiAgICAgKiBmaWxlLgogICAgICoKICAgICAqIEBwYXJhbSBhc3NvY2lhdGVEYXRhIHRoZSBkYXRhIGZvciB0aGUgYXNzb2NpYXRlIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRldGVybWluZUFzc29jaWF0ZUNoYW5nZXMoQXNzb2NpYXRlRGF0YSBhc3NvY2lhdGVEYXRhKSB7CgogICAgICAgIFN0cmluZyBlbXBsaWQgICA9IGFzc29jaWF0ZURhdGEuZ2V0RW1wbGlkKCk7CiAgICAgICAgU3RyaW5nIGFjdGlvbiAgID0gYXNzb2NpYXRlRGF0YS5nZXRBY3Rpb24oKTsKICAgICAgICBEYXRlIGxhc3RIaXJlRHQgPSBhc3NvY2lhdGVEYXRhLmdldExhc3RIaXJlRHQoKTsKICAgICAgICBEYXRlIHRlcm1EdCAgICAgPSBhc3NvY2lhdGVEYXRhLmdldFRlcm1EdCgpOwoKICAgICAgICBBc3NvY2lhdGVEYXRhIHRyYWNraW5nRGF0YSA9IGdldEFzc29jaWF0ZVRyYWNraW5nRGF0YShlbXBsaWQpOwoKICAgICAgICAvLyBJZiBudWxsLCB0aGVuIHRoZSBhc3NvY2lhdGUgaGFzIG5ldmVyIGJlZW4gc2VudCB0byB0aGUgdmVuZG9yIGJlZm9yZSBzbyBzZW5kIHRoZW0gbm93CiAgICAgICAgLyoKICAgICAgICBpZiAodHJhY2tpbmdEYXRhID09IG51bGwpIHsKCiAgICAgICAgICAgIC8vIElnbm9yZSB0ZXJtaW5hdGlvbnMgd2hlcmUgdGhlIHRyYWNraW5nIGRhdGEgaXMgbnVsbCBzaW5jZQogICAgICAgICAgICAvLyB0aGF0IG1lYW5zIHdlIG5ldmVyIHNlbnQgdGhlIGFzc29jaWF0ZSB0byB0aGUgdmVuZG9yIChoaXJlcyB0aGF0IHdlcmUgYmVmb3JlCiAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uKQogICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscygiVEVSIikgfHwgYWN0aW9uLmVxdWFscygiUkVUIikpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0QXNzb2NpYXRlUGVyc29uYWxJbmZvKGFzc29jaWF0ZURhdGEpOwoKICAgICAgICAgICAgaWYgKGFzc29jaWF0ZURhdGEuZ2V0QmlydGhEdCgpID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGVtYWlsRXJyb3IoYXNzb2NpYXRlRGF0YS5nZXRFbXBsaWQoKSwgIkIiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW5zZXJ0SGlyZVRyYWNraW5nVGFibGUoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgIHdyaXRlTmV3SGlyZVJlY29yZChhc3NvY2lhdGVEYXRhKTsKICAgICAgICAgICAgd3JpdGVQaG9uZUNhbGxSZWNvcmQoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgKi8KCiAgICAgICAgLy8gU2luY2UgdGhlIHRyYWNraW5nRGF0YSB3YXNuJ3QgbnVsbCBpbiB0aGUgcHJldmlvdXMgaWYgc3RhdGVtZW50IGl0IG1lYW5zIHRoZQogICAgICAgIC8vIGFzc29jaWF0ZSdzIGhpcmUgaW5mb3JtYXRpb24gd2FzIGFscmVhZHkgc2VudCB0byB0aGUgdmVuZG9yLiBEb24ndCBzZW5kIHRoZQogICAgICAgIC8vIGhpcmUgaW5mb3JtYXRpb24gYWdhaW4gYnV0IHVwZGF0ZSB0aGUgZGF0YSBpbiB0aGUgdHJhY2tpbmcgdGFibGUgaWYgdGhlIGhpcmUgZGF0ZQogICAgICAgIC8vIHdhcyBjaGFuZ2VkLgogICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKCJISVIiKSkgewogICAgICAgICAgICBpZiAoIWxhc3RIaXJlRHQuZXF1YWxzKHRyYWNraW5nRGF0YS5nZXRMYXN0SGlyZUR0KCkpKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVIaXJlVHJhY2tpbmdUYWJsZShhc3NvY2lhdGVEYXRhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIHJlaGlyZSBkYXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGhpcmUgZGF0ZSBvbiB0aGUgdHJhY2tpbmcgdGFibGUsIHNvbWV0aGluZyBoYXMgY2hhbmdlZC4KICAgICAgICAvLyBJZiB0aGUgdGVybWluYXRpb24gZGF0ZSBvbiB0aGUgdHJhY2tpbmcgdGFibGUgaXMgbnVsbCB0aGVuIHdlIG5ldmVyIHNlbnQgdGhlIHRlcm1pbmF0aW9uIGRhdGUgdG8gdGhlCiAgICAgICAgLy8gdmVuZG9yIGZvciBzb21lIHJlYXNvbiwgc28gbm8gbmVlZCB0byBzZW5kIGEgcmVoaXJlLiBJZiB0aGUgdGVybWluYXRpb24gZGF0ZSBpcyBub3QgbnVsbCwgdGhlbgogICAgICAgIC8vIHNlbmQgdGhlIHJlaGlyZSB0byB0aGUgdmVuZG9yIHNvIHRoZXkgY2FuIGNyZWF0ZSBhIG5ldyBJLTkgZm9yIHRoZSBhc3NvY2lhdGUuCiAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoIlJFSCIpKSB7CiAgICAgICAgICAgIGlmICghbGFzdEhpcmVEdC5lcXVhbHModHJhY2tpbmdEYXRhLmdldExhc3RIaXJlRHQoKSkpIHsKICAgICAgICAgICAgICAgIGlmICh0cmFja2luZ0RhdGEuZ2V0VGVybUR0KCkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhpcmVUcmFja2luZ1RhYmxlKGFzc29jaWF0ZURhdGEpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnZXRBc3NvY2lhdGVQZXJzb25hbEluZm8oYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSGlyZVRyYWNraW5nVGFibGUoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgLy93cml0ZU5ld0hpcmVSZWNvcmQoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgLy93cml0ZVBob25lQ2FsbFJlY29yZChhc3NvY2lhdGVEYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHRlcm1pbmF0aW9uIG9yIHJldGlyZW1lbnQgYW5kIHRoZSB0ZXJtaW5hdGlvbiBkYXRlIGlzIG51bGwgb24gdGhlIHRyYWNraW5nIHRhYmxlCiAgICAgICAgLy8gdGhlbiBzZW5kIGFuIHVwZGF0ZSB0byB0aGUgdmVuZG9yLCBvdGhlcndpc2Ugd2UndmUgYWxyZWFkeSBzZW50IHRoZSB0ZXJtaW5hdGlvbiB0byB0aGUgdmVuZG9yLAogICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBhbiB1cGRhdGUuCiAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoIlRFUiIpIHx8IGFjdGlvbi5lcXVhbHMoIlJFVCIpKSB7CiAgICAgICAgICAgIGlmICh0cmFja2luZ0RhdGEuZ2V0VGVybUR0KCkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdXBkYXRlSGlyZVRyYWNraW5nVGFibGUoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgICAgICB3cml0ZVVwZGF0ZUhpcmVSZWNvcmQoYXNzb2NpYXRlRGF0YSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXRlcm1EdC5lcXVhbHModHJhY2tpbmdEYXRhLmdldFRlcm1EdCgpKSkgewogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUhpcmVUcmFja2luZ1RhYmxlKGFzc29jaWF0ZURhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgcGVyc29uYWwgZGF0YSBmb3IgdGhlIGdpdmVuIGFzc29jaWF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXNzb2NpYXRlRGF0YSB0aGUgYXNzb2NpYXRlJ3MgcGVyc29uYWwgZGF0YQogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFzc29jaWF0ZVBlcnNvbmFsSW5mbyhBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEpIHsKCiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CiAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKCiAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3Qgbi5sYXN0X25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsbi5maXJzdF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsbi5taWRkbGVfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsbi5uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAscC5iaXJ0aGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsaS5uYXRpb25hbF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsai5kZXNjciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsZS5lbWFpbF9hZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJmcm9tIHBzX25hbWVzICAgICAgICAgICBuICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX3BlcnNvbiAgICAgICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX3BlcnNfbmlkICAgICAgICBpICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX2pvYmNvZGVfdGJsICAgICBqICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgLHBzX2VtYWlsX2FkZHJlc3NlcyBlICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ3aGVyZSBuLmVtcGxpZCAgICA9ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBuLm5hbWVfdHlwZSA9ICdQUkknICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBuLmVmZmR0ID0gKHNlbGVjdCBtYXgobjIuZWZmZHQpICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgZnJvbSBwc19uYW1lcyBuMiAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB3aGVyZSBuMi5lbXBsaWQgICAgPSBuLmVtcGxpZCAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBuMi5uYW1lX3R5cGUgPSBuLm5hbWVfdHlwZSAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBuMi5lZmZkdCAgICA8PSBzeXNkYXRlKSAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBwLmVtcGxpZCAgICAgICAgICAgPSBuLmVtcGxpZCAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBpLmVtcGxpZCAgICAgICAgICAgPSBuLmVtcGxpZCAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBpLmNvdW50cnkgICAgICAgICAgPSAnVVNBJyAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBpLm5hdGlvbmFsX2lkX3R5cGUgPSAnUFInICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLnNldGlkICAgICAgICAgICAgPSAnQ09NTU4nICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmpvYmNvZGUgICAgICAgICAgPSA/ICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBqLmVmZmR0ID0gKHNlbGVjdCBtYXgoajIuZWZmZHQpICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgZnJvbSBwc19qb2Jjb2RlX3RibCBqMiAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB3aGVyZSBqMi5zZXRpZCAgID0gai5zZXRpZCAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5qb2Jjb2RlID0gai5qb2Jjb2RlICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIGFuZCBqMi5lZmZkdCAgPD0gc3lzZGF0ZSkgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBlLmVtcGxpZCAgICAgICAoKykgPSBuLmVtcGxpZCAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIGFuZCBlLmVfYWRkcl90eXBlICAoKykgPSAnSE9NRScgICAgICAgICAgICAgICAgICAiOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdG10ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CgogICAgICAgICAgICBzdG10LnNldFN0cmluZygxLCBhc3NvY2lhdGVEYXRhLmdldEVtcGxpZCgpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMiwgYXNzb2NpYXRlRGF0YS5nZXRKb2Jjb2RlKCkpOwogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CgogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRMYXN0TmFtZShycy5nZXRTdHJpbmcoMSkpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRGaXJzdE5hbWUocnMuZ2V0U3RyaW5nKDIpKTsKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0TWlkZGxlTmFtZShycy5nZXRTdHJpbmcoMykpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRGdWxsTmFtZShycy5nZXRTdHJpbmcoNCkpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRCaXJ0aER0KHJzLmdldERhdGUoNSkpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRTU04ocnMuZ2V0U3RyaW5nKDYpKTsKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0Sm9iVGl0bGUocnMuZ2V0U3RyaW5nKDcpKTsKCiAgICAgICAgICAgICAgICBpZiAocnMuZ2V0U3RyaW5nKDgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIERvIG5vdCBzZW5kIHByb2R1Y3Rpb24gZS1tYWlsIGFkZHJlc3NlcyB0byBkZXZlbG9wbWVudCBzaXRlIQogICAgICAgICAgICAgICAgICAgIC8vYXNzb2NpYXRlRGF0YS5zZXRFbWFpbEFkZHJlc3MobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRFbWFpbEFkZHJlc3MocnMuZ2V0U3RyaW5nKDgpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFzc29jaWF0ZSBkb2Vzbid0IGhhdmUgYSBob21lIGUtbWFpbCBhZGRyZXNzIHRoZW4gZS1tYWlsIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhc3NvY2lhdGUgd2lsbCBub3QgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSB2ZW5kb3IgbGV0dGluZyB0aGVtIGtub3cKICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IG11c3QgZmlsbCBvdXQgdGhlIEktOS4KICAgICAgICAgICAgICAgICAgICBlbWFpbEVycm9yKGFzc29jaWF0ZURhdGEuZ2V0RW1wbGlkKCksICJFIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZ2V0QXNzb2NpYXRlUGhvbmVOdW1iZXJzKGFzc29jaWF0ZURhdGEpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHJldHJpZXZpbmcgYXNzb2NpYXRlJ3MgcGVyc29uYWwgZGF0YSIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgcnMuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KCiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHR3byBwaG9uZSBudW1iZXJzIHRvIGFkZCB0byB0aGUgZmlsZSBmb3IgVm9pY2UgT3BlcmF0aW9ucy4gVGhlIGZpcnN0IHBob25lIG51bWJlcgogICAgICogc2hvdWxkIGFsd2F5cyBiZSB0aGUgcHJlZmVycmVkIHBob25lIG51bWJlciwgYW5kIHRoZSBzZWNvbmQgbnVtYmVyIHNob3VsZCBiZSBjaG9zZW4gd2l0aAogICAgICogdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlOiBIT01FLCBDRUxMLCBPVFIgKGlmIG9uZSBpcyBhdmFpbGFibGUpLgogICAgICoKICAgICAqIEBwYXJhbSBhc3NvY2lhdGVEYXRhIHRoZSBhc3NvY2lhdGUgdG8gZ2V0IHBob25lIG51bWJlcnMgZm9yCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QXNzb2NpYXRlUGhvbmVOdW1iZXJzKEFzc29jaWF0ZURhdGEgYXNzb2NpYXRlRGF0YSkgewoKICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBwLnBob25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiZnJvbSBwc19wZXJzb25hbF9waG9uZSBwICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ3aGVyZSBwLmVtcGxpZCA9ID8gICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgYW5kIHAucGhvbmVfdHlwZSBpbiAoJ0hPTUUnLCdDRUxMJywnT1RSJykgIiArCiAgICAgICAgICAgICAgICAib3JkZXIgYnkgZGVjb2RlKHAucHJlZl9waG9uZV9mbGFnLCAnWScsIDEsICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJywgMiksICIgKwogICAgICAgICAgICAgICAgIiAgICAgICAgIGRlY29kZShwLnBob25lX3R5cGUsICdIT01FJywgMSwgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NFTEwnLCAyLCAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT1RSJywgMykgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsIGFzc29jaWF0ZURhdGEuZ2V0RW1wbGlkKCkpOwogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICBTdHJpbmcgZmlyc3RQaG9uZU51bWJlciAgPSAiIjsKICAgICAgICAgICAgU3RyaW5nIHNlY29uZFBob25lTnVtYmVyID0gIiI7CgogICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBmaXJzdFBob25lTnVtYmVyID0gcnMuZ2V0U3RyaW5nKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBzZWNvbmRQaG9uZU51bWJlciA9IHJzLmdldFN0cmluZygxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwgbm9uLW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIG5vdGhpbmcKICAgICAgICAgICAgZmlyc3RQaG9uZU51bWJlciAgPSBmaXJzdFBob25lTnVtYmVyLnJlcGxhY2VBbGwoIlteXFxkXSIsICIiKTsKICAgICAgICAgICAgc2Vjb25kUGhvbmVOdW1iZXIgPSBzZWNvbmRQaG9uZU51bWJlci5yZXBsYWNlQWxsKCJbXlxcZF0iLCAiIik7CgogICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldFByaW1hcnlQaG9uZU51bWJlcihmaXJzdFBob25lTnVtYmVyKTsKICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRTZWNvbmRhcnlQaG9uZU51bWJlcihzZWNvbmRQaG9uZU51bWJlcik7CgoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHJldHJpZXZpbmcgYXNzb2NpYXRlJ3MgcGhvbmUgbnVtYmVyIGRhdGEiLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHJzLmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIHVzZXIgdGhhdCBuZWVkcyB0byBiZSBzZW50IHRvCiAgICAgKiB0aGUgdmVuZG9yLgogICAgICoKICAgICAqIEBwYXJhbSB1c2VyRGF0YSB0aGUgdXNlciB3aG9zZSBwZXJzb25hbCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VXNlclBlcnNvbmFsSW5mbyhBc3NvY2lhdGVEYXRhIHVzZXJEYXRhKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwogICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IG4ubGFzdF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLG4uZmlyc3RfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLGouZGVzY3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiZnJvbSBwc19uYW1lcyAgICAgICBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICxwc19wZXJzb24gICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICxwc19qb2Jjb2RlX3RibCBqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAid2hlcmUgbi5lbXBsaWQgICAgPSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbi5uYW1lX3R5cGUgPSAnUFJJJyAgICAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgbi5lZmZkdCA9IChzZWxlY3QgbWF4KG4yLmVmZmR0KSAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGZyb20gcHNfbmFtZXMgbjIgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgd2hlcmUgbjIuZW1wbGlkICAgID0gbi5lbXBsaWQgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgbjIubmFtZV90eXBlID0gbi5uYW1lX3R5cGUgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgbjIuZWZmZHQgICAgPD0gc3lzZGF0ZSkgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgcC5lbXBsaWQgICAgICAgICAgID0gbi5lbXBsaWQgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5zZXRpZCAgICAgICAgICAgID0gJ0NPTU1OJyAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5qb2Jjb2RlICAgICAgICAgID0gPyAgICAgICAgICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICBhbmQgai5lZmZkdCA9IChzZWxlY3QgbWF4KGoyLmVmZmR0KSAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGZyb20gcHNfam9iY29kZV90YmwgajIgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgd2hlcmUgajIuc2V0aWQgICA9IGouc2V0aWQgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuam9iY29kZSA9IGouam9iY29kZSAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBhbmQgajIuZWZmZHQgIDw9IHN5c2RhdGUpICAgICAgIjsKCgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsIHVzZXJEYXRhLmdldEVtcGxpZCgpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMiwgdXNlckRhdGEuZ2V0Sm9iY29kZSgpKTsKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewoKICAgICAgICAgICAgICAgIHVzZXJEYXRhLnNldExhc3ROYW1lKHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgICAgICB1c2VyRGF0YS5zZXRGaXJzdE5hbWUocnMuZ2V0U3RyaW5nKDIpKTsKICAgICAgICAgICAgICAgIHVzZXJEYXRhLnNldEpvYlRpdGxlKHJzLmdldFN0cmluZygzKSk7CgogICAgICAgICAgICAgICAgLy8gVE9ETyBEbyBub3Qgc2VuZCBwcm9kdWN0aW9uIGUtbWFpbCBhZGRyZXNzZXMgdG8gZGV2ZWxvcG1lbnQgc2l0ZSEKICAgICAgICAgICAgICAgIC8vdXNlckRhdGEuc2V0RW1haWxBZGRyZXNzKG51bGwpOwogICAgICAgICAgICAgICAgdXNlckRhdGEuc2V0RW1haWxBZGRyZXNzKHVzZXJEYXRhLmdldEFjZjJJZCgpLnRvTG93ZXJDYXNlKCkgKyAiQGVkd2FyZGpvbmVzLmNvbSIpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHJldHJpZXZpbmcgdXNlcidzIHBlcnNvbmFsIGRhdGEiLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHJzLmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgfQoKICAgIC8qKgogICAgICogQW55IHJvdyBvbiB0aGUgdXNlciB0cmFja2luZyB0YWJsZSB0aGF0IHN0aWxsIGhhcyBhIHByb2Nlc3MgY2hhbmdlIGNvZGUgb2YgYSBzcGFjZSBhZnRlcgogICAgICogcHJvY2Vzc2luZyBhbGwgYWN0aXZlIHVzZXJzIG1lYW5zIHRoYXQgdGhlIHVzZXIgYmVjYW1lIGluYWN0aXZlIHNpbmNlIHRoZSBsYXN0IHJ1biBvZiB0aGUKICAgICAqIHByb2dyYW0uIFdyaXRlIHRvIHRoZSB1c2VyIGZpbGUgdGhhdCB0aGlzIHVzZXIgc2hvdWxkIGJlIHJldGlyZWQgYW5kIHRoZW4gdXBkYXRlIHRoZQogICAgICogdHJhY2tpbmcgdGFibGUgdG8gaGF2ZSBhIHByb2Nlc3MgY2hhbmdlIGNvZGUgb2YgJ1InIChSZXRpcmVkKSB0byBwcmV2ZW50IHByb2Nlc3NpbmcgaW4gdGhlCiAgICAgKiBmdXR1cmUuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1JldGlyZWRVc2VycygpIHsKCiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CiAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKCiAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgdS5lbXBsaWQgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsdS5lZGpfYWNmMl9saWRfaWQgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsdS5lbWFpbF9hZGRyICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJmcm9tIHBzX2Vkal9pOV91c2VyIHUgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ3aGVyZSB1LmVkal9wcm9jX2NoZ19jZCA9ICcgJyAiOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdG10ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CgogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEgPSBuZXcgQXNzb2NpYXRlRGF0YSgpOwoKICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuc2V0RW1wbGlkKHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLnNldEFjZjJJZChycy5nZXRTdHJpbmcoMikpOwogICAgICAgICAgICAgICAgYXNzb2NpYXRlRGF0YS5zZXRFbWFpbEFkZHJlc3MocnMuZ2V0U3RyaW5nKDMpKTsKCiAgICAgICAgICAgICAgICB3cml0ZVJldGlyZWRVc2VyUmVjb3JkKGFzc29jaWF0ZURhdGEpOwogICAgICAgICAgICAgICAgdXBkYXRlVXNlclRyYWNraW5nVGFibGVGbGFnKGFzc29jaWF0ZURhdGEsICJSIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNRTCBlcnJvciByZXRyaWV2aW5nIHJldGlyZWQgdXNlcnMgZnJvbSB1c2VyIHRyYWNraW5nIHRhYmxlIiwgZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSBycy5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIEluc2VydCB0aGUgYXNzb2NpYXRlJ3MgZGF0YSBpbnRvIHRoZSB0cmFja2luZyB0YWJsZSBzbyB0aGF0IHdlIGtub3cKICAgICAqIHRoZXkgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIHZlbmRvci4KICAgICAqCiAgICAgKiBAcGFyYW0gYXNzb2NpYXRlRGF0YSB0aGUgYXNzb2NpYXRlJ3MgZGF0YSB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydEhpcmVUcmFja2luZ1RhYmxlKEFzc29jaWF0ZURhdGEgYXNzb2NpYXRlRGF0YSkgewoKICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKCiAgICAgICAgU3RyaW5nIHNxbCA9ICJpbnNlcnQgaW50byBwc19lZGpfaTlfaGlyZSAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIoRU1QTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgRURKX0FDRjJfTElEX0lELCAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgTEFTVF9ISVJFX0RULCAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgVEVSTUlOQVRJT05fRFQsICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgRURKX1BST0NfQ0hHX0NELCAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgRURKX0NSRV9UUywgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgRURKX1JFVlNOX1RTKSAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICJ2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIoID8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgID8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgID8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICdBJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIHN5c2RhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgIHN5c2RhdGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAiOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdG10ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsIGFzc29jaWF0ZURhdGEuZ2V0RW1wbGlkKCkpOwogICAgICAgICAgICBzdG10LnNldFN0cmluZygyLCBhc3NvY2lhdGVEYXRhLmdldEFjZjJJZCgpKTsKICAgICAgICAgICAgc3RtdC5zZXREYXRlKDMsIGFzc29jaWF0ZURhdGEuZ2V0TGFzdEhpcmVEdCgpKTsKCiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIGluc2VydGluZyBpbnRvIHRoZSBoaXJlIHRyYWNraW5nIHRhYmxlIiwgZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIEluc2VydCB0aGUgdXNlcidzIGluZm9ybWF0aW9uIGludG8gdGhlIHRyYWNraW5nIHRhYmxlIHNvIHRoZXkgd29uJ3QgYmUgc2VudAogICAgICogYWdhaW4gb24gdGhlIG5leHQgcnVuLgogICAgICoKICAgICAqIEBwYXJhbSB1c2VyRGF0YSB0aGUgZGF0YSBvZiB0aGUgdXNlciB0byBpbnNlcnQgaW50byB0aGUgdHJhY2tpbmcgdGFibGUKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnRVc2VyVHJhY2tpbmdUYWJsZShBc3NvY2lhdGVEYXRhIHVzZXJEYXRhKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gImluc2VydCBpbnRvIHBzX2Vkal9pOV91c2VyICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIihFTVBMSUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFREpfQUNGMl9MSURfSUQsICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFTUFJTF9BRERSLCAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBMQVNUX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBGSVJTVF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBMT0NBVElPTl9OQU1FLCAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFREpfQURNSU5fSU5ELCAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBKT0JUSVRMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFREpfUFJPQ19DSEdfQ0QsICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFREpfQ1JFX1RTLCAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiBFREpfUkVWU05fVFMpICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgInZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiggPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgJ0EnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgc3lzZGF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgc3lzZGF0ZSApICAgICAgICAgICAgICAgICAgICAgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMSwgdXNlckRhdGEuZ2V0RW1wbGlkKCkpOwogICAgICAgICAgICBzdG10LnNldFN0cmluZygyLCB1c2VyRGF0YS5nZXRBY2YySWQoKSk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDMsIHVzZXJEYXRhLmdldEVtYWlsQWRkcmVzcygpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoNCwgdXNlckRhdGEuZ2V0TGFzdE5hbWUoKSk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDUsIHVzZXJEYXRhLmdldEZpcnN0TmFtZSgpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoNiwgdXNlckRhdGEuZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDcsIHVzZXJEYXRhLmlzQWRtaW4oKSA/ICJZIiA6ICJOIik7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDgsIHVzZXJEYXRhLmdldEpvYlRpdGxlKCkpOwoKICAgICAgICAgICAgc3RtdC5leGVjdXRlVXBkYXRlKCk7CgogICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTUUwgZXJyb3IgaW5zZXJ0aW5nIGludG8gdGhlIHVzZXIgdHJhY2tpbmcgdGFibGUiLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgfQoKICAgIC8qKgogICAgICogVXBkYXRlIHRoZSB1c2VyIHRyYWNraW5nIHRhYmxlIHdpdGggdGhlIGxhdGVzdCBkYXRhIGZvciB0aGUgdXNlciwKICAgICAqIHRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCBhIGNoYW5nZSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQKICAgICAqIHRvIHRoZSB2ZW5kb3IuCiAgICAgKgogICAgICogQHBhcmFtIHVzZXJEYXRhIHRoZSB1c2VyJ3MgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVVc2VyVHJhY2tpbmdUYWJsZShBc3NvY2lhdGVEYXRhIHVzZXJEYXRhKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gInVwZGF0ZSBwc19lZGpfaTlfdXNlciAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgIHNldCBFTUFJTF9BRERSICAgICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxMQVNUX05BTUUgICAgICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxGSVJTVF9OQU1FICAgICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxMT0NBVElPTl9OQU1FICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxFREpfQURNSU5fSU5EICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxKT0JUSVRMRSAgICAgICAgPSA/ICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxFREpfUFJPQ19DSEdfQ0QgPSAnQScgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxFREpfUkVWU05fVFMgICAgPSBzeXNkYXRlICIgKwogICAgICAgICAgICAgICAgIndoZXJlIGVtcGxpZCA9ID8gICAgICAgICAgICAgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMSwgdXNlckRhdGEuZ2V0RW1haWxBZGRyZXNzKCkpOwogICAgICAgICAgICBzdG10LnNldFN0cmluZygyLCB1c2VyRGF0YS5nZXRMYXN0TmFtZSgpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMywgdXNlckRhdGEuZ2V0Rmlyc3ROYW1lKCkpOwogICAgICAgICAgICBzdG10LnNldFN0cmluZyg0LCB1c2VyRGF0YS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoNSwgdXNlckRhdGEuaXNBZG1pbigpID8gIlkiIDogIk4iKTsKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoNiwgdXNlckRhdGEuZ2V0Sm9iVGl0bGUoKSk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDcsIHVzZXJEYXRhLmdldEVtcGxpZCgpKTsKCiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHVwZGF0aW5nIHRoZSB1c2VyIHRyYWNraW5nIHRhYmxlIiwgZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgfQoKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgdGhlIEVESl9QUk9DX0NIR19DRCBmaWVsZCBvbiB0aGUgdXNlciB0cmFja2luZyB0YWJsZS4gVGhpcyB3aWxsIGJlIGFuICdBJwogICAgICogaWYgdGhlIHVzZXIgc2hvdWxkIGJlIGFjdGl2ZSBvciB1cGRhdGVkIGluIHRoZSBzeXN0ZW0gb3IgYW4gJ1InIGlmIHRoZSB1c2VyIHNob3VsZAogICAgICogYmUgcmV0aXJlZCBpbiB0aGUgc3lzdGVtLgogICAgICoKICAgICAqIEBwYXJhbSB1c2VyRGF0YSB0aGUgdXNlciB0aGF0IG5lZWRzIHRoZWlyIHByb2Nlc3MgY2hhbmdlIGNvZGUgdXBkYXRlZAogICAgICogQHBhcmFtIHByb2Nlc3NDaGFuZ2VDZCAnQScgaWYgdGhlIHVzZXIncyBwcm9jZXNzIGZsYWcgc2hvdWxkIGJlIHNldCB0byBhY3RpdmUsIG9yCiAgICAgKiAnUicgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHNldCB0byByZXRpcmVkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVXNlclRyYWNraW5nVGFibGVGbGFnKEFzc29jaWF0ZURhdGEgdXNlckRhdGEsIFN0cmluZyBwcm9jZXNzQ2hhbmdlQ2QpIHsKCiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAidXBkYXRlIHBzX2Vkal9pOV91c2VyICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgc2V0IEVESl9QUk9DX0NIR19DRCA9ID8gICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLEVESl9SRVZTTl9UUyAgICA9IHN5c2RhdGUgIiArCiAgICAgICAgICAgICAgICAid2hlcmUgZW1wbGlkID0gPyAgICAgICAgICAgICAgICAgIjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RtdCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChzcWwpOwogICAgICAgICAgICBzdG10LnNldFN0cmluZygxLHByb2Nlc3NDaGFuZ2VDZCk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDIsIHVzZXJEYXRhLmdldEVtcGxpZCgpKTsKCiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHVwZGF0aW5nIHRoZSB1c2VyIHRyYWNraW5nIHRhYmxlIGZsYWciLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgfQoKICAgIC8qKgogICAgICogVXBkYXRlIHRoZSBhc3NvY2lhdGUncyBkYXRhIG9uIHRoZSB0cmFja2luZyB0YWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXNzb2NpYXRlRGF0YSB0aGUgYXNzb2NpYXRlJ3MgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVIaXJlVHJhY2tpbmdUYWJsZShBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEpIHsKCiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAidXBkYXRlIHBzX2Vkal9pOV9oaXJlICAgICAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgc2V0IExBU1RfSElSRV9EVCAgICA9ID8gICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLFRFUk1JTkFUSU9OX0RUICA9ID8gICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLEVESl9QUk9DX0NIR19DRCA9ICdBJyAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLEVESl9SRVZTTl9UUyAgICA9IHN5c2RhdGUgICAgIiArCiAgICAgICAgICAgICAgICAiIHdoZXJlIGVtcGxpZCA9ID8gICAgICAgICAgICAgICAgICAgIjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RtdCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChzcWwpOwogICAgICAgICAgICBzdG10LnNldERhdGUoMSwgYXNzb2NpYXRlRGF0YS5nZXRMYXN0SGlyZUR0KCkpOwogICAgICAgICAgICBzdG10LnNldERhdGUoMiwgYXNzb2NpYXRlRGF0YS5nZXRUZXJtRHQoKSk7CiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDMsIGFzc29jaWF0ZURhdGEuZ2V0RW1wbGlkKCkpOwoKICAgICAgICAgICAgc3RtdC5leGVjdXRlVXBkYXRlKCk7CgogICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTUUwgZXJyb3IgdXBkYXRpbmcgdGhlIGhpcmUgdHJhY2tpbmcgdGFibGUiLCBlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkge30KICAgICAgICB9CgogICAgfQoKICAgIC8qKgogICAgICogV3JpdGUgdGhlIGFzc29jaWF0ZSdzIGRhdGEgdG8gdGhlIG5ldyBoaXJlIGZpbGUuIFRoaXMgcmVjb3JkIHdpbGwgY3JlYXRlIGFuCiAgICAgKiBJLTkgaW4gdGhlIEd1YXJkaWFuIHN5c3RlbSBmb3IgdGhlIGFzc29jaWF0ZSB0byBmaWxsIG91dC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXNzb2NpYXRlRGF0YSB0aGUgYXNzb2NpYXRlJ3MgZGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgZmlsZQogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTmV3SGlyZVJlY29yZChBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEpIHsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIE5ldyBIaXJlIFJlY29yZCBmb3IgYXNzb2NpYXRlOiAiICsgYXNzb2NpYXRlRGF0YS5nZXRFbXBsaWQoKSk7CgogICAgICAgIG5ld0hpcmVSZWNvcmRDb3VudCsrOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBuZXdIaXJlRmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAiXCIiICsgYXNzb2NpYXRlRGF0YS5nZXRBY2YySWQoKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBhc3NvY2lhdGVEYXRhLmdldExhc3ROYW1lKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgYXNzb2NpYXRlRGF0YS5nZXRGaXJzdE5hbWUoKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBkYXRlRm9ybWF0TU1ERFlZWVkuZm9ybWF0KGFzc29jaWF0ZURhdGEuZ2V0QmlydGhEdCgpKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBkYXRlRm9ybWF0TU1ERFlZWVkuZm9ybWF0KGFzc29jaWF0ZURhdGEuZ2V0TGFzdEhpcmVEdCgpKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBhc3NvY2lhdGVEYXRhLmdldE1pZGRsZU5hbWUoKS50cmltKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBhc3NvY2lhdGVEYXRhLmdldEpvYlRpdGxlKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgYXNzb2NpYXRlRGF0YS5nZXRTU04oKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBhc3NvY2lhdGVEYXRhLmdldEVtYWlsQWRkcmVzcygpICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiWWVzXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGFzc29jaWF0ZURhdGEuZ2V0TG9jYXRpb24oKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkFsbCBFbXBsb3llZXNcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIllcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCJcbiIpOwoKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIHRvIG5ldyBoaXJlIGZpbGUiLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZSB0aGUgYXNzb2NpYXRlJ3MgcGhvbmUgbnVtYmVyIHJlY29yZCBvdXQgdG8gdGhlIGZpbGUgZm9yIFZvaWNlIE9wZXJhdGlvbnMuCiAgICAgKiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIHRvIHRoZSBhc3NvY2lhdGUgcmVtaW5kaW5nIHRoZW0gdG8gY29tcGxldGUgdGhlaXIgSS05LgogICAgICoKICAgICAqIEBwYXJhbSBhc3NvY2lhdGVEYXRhIHRoZSBhc3NvY2lhdGUgZGF0YSB3ZSBhcmUgd3JpdGluZyBhIHJlY29yZCBmb3IKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVBob25lQ2FsbFJlY29yZChBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEpIHsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIFBob25lIENhbGwgUmVjb3JkIGZvciBhc3NvY2lhdGU6ICIgKyBhc3NvY2lhdGVEYXRhLmdldEVtcGxpZCgpKTsKCiAgICAgICAgcGhvbmVDYWxsUmVjb3JkQ291bnQrKzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGhvbmVDYWxsRmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLmdldEFjZjJJZCgpICsgIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBhc3NvY2lhdGVEYXRhLmdldEZ1bGxOYW1lKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVEYXRhLmdldFByaW1hcnlQaG9uZU51bWJlcigpICsgIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZURhdGEuZ2V0U2Vjb25kYXJ5UGhvbmVOdW1iZXIoKSArICJcbiIpOwoKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIHRvIHRoZSBwaG9uZSBjYWxsIGZpbGUiLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgYSByZWNvcmQgdG8gdGhlIHVzZXIgdXBkYXRlIGZpbGUuIFRoaXMgaXMgZm9yIGFueSBhZGRzL2RlbGV0ZXMvdXBkYXRlcyBmb3IgdXNlcnMuIElmIHRoZSBsYXN0IG5hbWUsCiAgICAgKiBmaXJzdCBuYW1lLCBvciBlLW1haWwgYWRkcmVzcyBpcyBjaGFuZ2VkIHRoZSBvbGQgdmFsdWUgbXVzdCBiZSBwdXQgaW50byB0aGUgInJlZ3VsYXIiIGZpZWxkIGFuZCB0aGUgbmV3IHZhbHVlCiAgICAgKiBpcyBwbGFjZWQgaW4gdGhlICJOZXciIHZlcnNpb24gb2YgdGhhdCBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gdXNlckRhdGEgdGhlIHVzZXIncyBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZQogICAgICogQHBhcmFtIHRyYWNraW5nRGF0YSB0aGUgZGF0YSB0aGF0IHdlIGxhc3Qgc2VudCB0byB2ZW5kb3IsIHRvIGNvbXBhcmUgb2xkL25ldyB2YWx1ZXMKICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlIEFkZCBvciBVcGRhdGUgZGVwZW5kaW5nIG9uIGlmIHRoaXMgaXMgYSBuZXcgdXNlciBvciBhbiB1cGRhdGUgdG8gYW4gZXhpc3Rpbmcgb25lCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVVc2VyUmVjb3JkKEFzc29jaWF0ZURhdGEgdXNlckRhdGEsIEFzc29jaWF0ZURhdGEgdHJhY2tpbmdEYXRhLCBTdHJpbmcgdXBkYXRlVHlwZSkgewoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgVXNlciBSZWNvcmQgZm9yIGFzc29jaWF0ZTogIiArIHVzZXJEYXRhLmdldEVtcGxpZCgpKTsKCiAgICAgICAgdXNlclVwZGF0ZVJlY29yZENvdW50Kys7CgogICAgICAgIFN0cmluZyB1c2VyTGFzdCAgICAgPSAiIjsKICAgICAgICBTdHJpbmcgdXNlckZpcnN0ICAgID0gIiI7CiAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9ICIiOwoKICAgICAgICBTdHJpbmcgbmV3VXNlckxhc3QgICAgID0gIiI7CiAgICAgICAgU3RyaW5nIG5ld1VzZXJGaXJzdCAgICA9ICIiOwogICAgICAgIFN0cmluZyBuZXdFbWFpbEFkZHJlc3MgPSAiIjsKCiAgICAgICAgLy8gSWYgdHJhY2tpbmcgZGF0YSBpcyBudWxsIHRoaXMgaXMgYSBuZXcgdXNlciBzbyB0aGUgbmV3VXNlckxhc3QsIG5ld1VzZXJGaXJzdCwgYW5kIG5ld0VtYWlsQWRkcmVzcwogICAgICAgIC8vIGZpZWxkcyBzaG91bGQgYmUgYmxhbmsuIElmIHRoZSB0cmFja2luZyBkYXRhIGlzIG5vdCBudWxsLCB0aGVuIGNvbXBhcmUgdGhlIGZpZWxkcyB0byBkZXRlcm1pbmUgaWYKICAgICAgICAvLyBvbmUgb2YgdGhlc2Uga2V5IHZhbHVlcyBjaGFuZ2VkIHRvIHBsYWNlIHRoZW0gaW4gdGhlIGFwcHJvcHJpYXRlIGNvbHVtbi4KICAgICAgICBpZiAodHJhY2tpbmdEYXRhID09IG51bGwpIHsKICAgICAgICAgICAgdXNlckxhc3QgICAgID0gdXNlckRhdGEuZ2V0TGFzdE5hbWUoKTsKICAgICAgICAgICAgdXNlckZpcnN0ICAgID0gdXNlckRhdGEuZ2V0Rmlyc3ROYW1lKCk7CiAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IHVzZXJEYXRhLmdldEVtYWlsQWRkcmVzcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVzZXJMYXN0ICAgICA9IHRyYWNraW5nRGF0YS5nZXRMYXN0TmFtZSgpOwogICAgICAgICAgICB1c2VyRmlyc3QgICAgPSB0cmFja2luZ0RhdGEuZ2V0Rmlyc3ROYW1lKCk7CiAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IHRyYWNraW5nRGF0YS5nZXRFbWFpbEFkZHJlc3MoKTsKCiAgICAgICAgICAgIGlmICghdXNlckRhdGEuZ2V0TGFzdE5hbWUoKS5lcXVhbHModHJhY2tpbmdEYXRhLmdldExhc3ROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICBuZXdVc2VyTGFzdCA9IHVzZXJEYXRhLmdldExhc3ROYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF1c2VyRGF0YS5nZXRGaXJzdE5hbWUoKS5lcXVhbHModHJhY2tpbmdEYXRhLmdldEZpcnN0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgbmV3VXNlckZpcnN0ID0gdXNlckRhdGEuZ2V0Rmlyc3ROYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF1c2VyRGF0YS5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHModHJhY2tpbmdEYXRhLmdldEVtYWlsQWRkcmVzcygpKSkgewogICAgICAgICAgICAgICAgbmV3RW1haWxBZGRyZXNzID0gdXNlckRhdGEuZ2V0RW1haWxBZGRyZXNzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHVzZXJGaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJcIiIgKyB1c2VyRGF0YS5nZXRBY2YySWQoKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBlbWFpbEFkZHJlc3MudHJpbSgpICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHVwZGF0ZVR5cGUgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdXNlckxhc3QgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdXNlckZpcnN0ICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB1c2VyRGF0YS5nZXRMb2NhdGlvbigpLnRyaW0oKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuZXdFbWFpbEFkZHJlc3MudHJpbSgpICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5ld1VzZXJMYXN0ICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5ld1VzZXJGaXJzdCArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB1c2VyRGF0YS5nZXRKb2JUaXRsZSgpICsgIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHVzZXJEYXRhLmdldEFjZjJJZCgpLnRvTG93ZXJDYXNlKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIik7CgogICAgICAgICAgICBpZiAodXNlckRhdGEuaXNBZG1pbigpKSB7CiAgICAgICAgICAgICAgICB1c2VyRmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIlwiWVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIllcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJZXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiWVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIllcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJZXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiWVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIllcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJZXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJOXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiUHJlbWl1bVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkZGXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiWVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIllcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIlxuIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2VyRmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIlwiTlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIk5cIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJOXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiTlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIk5cIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJOXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiTlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIk5cIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJOXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiNFwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJOXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiU3RhbmRhcmRcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJMTVwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIk5cIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJZXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCJcbiIpOwogICAgICAgICAgICB9CgogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgdG8gdXNlciBmaWxlIiwgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV3JpdGUgYSByZWNvcmQgdG8gdGhlIHVzZXIgZmlsZSB0byByZXRpcmUgdGhlIHVzZXIuCiAgICAgKgogICAgICogQHBhcmFtIHVzZXJEYXRhIHRoZSB1c2VyIHRoYXQgc2hvdWxkIGJlIHJldGlyZWQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJldGlyZWRVc2VyUmVjb3JkKEFzc29jaWF0ZURhdGEgdXNlckRhdGEpIHsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIFJldGlyZWQgVXNlciBSZWNvcmQgZm9yIGFzc29jaWF0ZTogIiArIHVzZXJEYXRhLmdldEVtcGxpZCgpKTsKCiAgICAgICAgdXNlclVwZGF0ZVJlY29yZENvdW50Kys7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHVzZXJGaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJcIiIgKyB1c2VyRGF0YS5nZXRBY2YySWQoKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB1c2VyRGF0YS5nZXRFbWFpbEFkZHJlc3MoKS50cmltKCkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJSZXRpcmVcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiXG4iKTsKCiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyByZXRpcmUgcmVjb3JkIHRvIHVzZXIgZmlsZSIsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlIGEgcmVjb3JkIHRvIHRoZSB1cGRhdGUgZW1wbG95ZWUgZmlsZS4gVGhpcyBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBhbiBhc3NvY2lhdGUKICAgICAqIGluIHRoZSBHdWFyZGlhbiBzeXN0ZW0uIFRoaXMgY2F1c2VzIHRoZWlyIEktOSB0byBldmVudHVhbGx5IGJlIHB1cmdlZCBmcm9tIHRoZSBzeXN0ZW0uCiAgICAgKgogICAgICogQHBhcmFtIGFzc29jaWF0ZURhdGEgdGhlIGRhdGEgZm9yIHRoZSBhc3NvY2lhdGUgdGhhdCBzaG91bGQgYmUgdGVybWluYXRlZAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVXBkYXRlSGlyZVJlY29yZChBc3NvY2lhdGVEYXRhIGFzc29jaWF0ZURhdGEpIHsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcml0aW5nIFVwZGF0ZSBIaXJlIFJlY29yZCBmb3IgYXNzb2NpYXRlOiAiICsgYXNzb2NpYXRlRGF0YS5nZXRFbXBsaWQoKSk7CgogICAgICAgIHVwZGF0ZUhpcmVSZWNvcmRDb3VudCsrOwoKICAgICAgICB0cnkgewogICAgICAgICAgICB1cGRhdGVIaXJlRmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAiXCIiICsgYXNzb2NpYXRlRGF0YS5nZXRBY2YySWQoKSArICJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGRhdGVGb3JtYXRNTUREWVlZWS5mb3JtYXQoYXNzb2NpYXRlRGF0YS5nZXRUZXJtRHQoKSkgKyAiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJcIiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIlwiLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiXCJcbiIpOwoKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIHRvIHVwZGF0ZSBoaXJlIGZpbGUiLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRyYWNraW5nIGRhdGEgZm9yIHRoZSBnaXZlbiBlbXBsaWQuIFRoaXMgd2lsbCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYW4gdXBkYXRlCiAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG8gdGhlIHZlbmRvciBvciBub3Qgc2luY2UgdGhlIGxhc3QgcnVuIG9mIHRoZSBwcm9ncmFtLgogICAgICoKICAgICAqIEBwYXJhbSBlbXBsaWQgdGhlIGVtcGxpZCBvZiB0aGUgYXNzb2NpYXRlIHdob3NlIHRyYWNraW5nIGRhdGEgd2UgYXJlIHJldHJpZXZpbmcKICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZnJvbSB0aGUgdHJhY2tpbmcgdGFibGUKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgQXNzb2NpYXRlRGF0YSBnZXRBc3NvY2lhdGVUcmFja2luZ0RhdGEoU3RyaW5nIGVtcGxpZCkgewoKICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBoLmxhc3RfaGlyZV9kdCAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICxoLnRlcm1pbmF0aW9uX2R0ICIgKwogICAgICAgICAgICAgICAgImZyb20gcHNfZWRqX2k5X2hpcmUgaCAgICIgKwogICAgICAgICAgICAgICAgIndoZXJlIGguZW1wbGlkID0gPyAgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsIGVtcGxpZCk7CiAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKCiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIEFzc29jaWF0ZURhdGEgdHJhY2tpbmdEYXRhID0gbmV3IEFzc29jaWF0ZURhdGEoKTsKCiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0RW1wbGlkKGVtcGxpZCk7CiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0TGFzdEhpcmVEdChycy5nZXREYXRlKDEpKTsKICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5zZXRUZXJtRHQocnMuZ2V0RGF0ZSgyKSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNraW5nRGF0YTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTUUwgZXJyb3IgcmV0cmlldmluZyBhc3NvY2lhdGUgdHJhY2tpbmcgZGF0YSIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgcnMuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgbGFzdCBkYXRhIHRoYXQgd2Ugc2VudCB0byB0aGUgdmVuZG9yLgogICAgICoKICAgICAqIEBwYXJhbSBlbXBsaWQgdGhlIGVtcGxpZCBvZiB0aGUgdXNlcidzIHRyYWNraW5nIGRhdGEgdGhhdCB3ZSBuZWVkCiAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgdXNlciBmcm9tIHRoZSB0cmFja2luZyB0YWJsZQogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBBc3NvY2lhdGVEYXRhIGdldFVzZXJUcmFja2luZ0RhdGEoU3RyaW5nIGVtcGxpZCkgewoKICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gbnVsbDsKICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOwoKICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCB1LmVtYWlsX2FkZHIgICAgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsdS5sYXN0X25hbWUgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLHUuZmlyc3RfbmFtZSAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICx1LmxvY2F0aW9uX25hbWUgICAiICsKICAgICAgICAgICAgICAgICIgICAgICAsdS5lZGpfYWRtaW5faW5kICAgIiArCiAgICAgICAgICAgICAgICAiICAgICAgLHUuam9idGl0bGUgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgICAgICx1LmVkal9wcm9jX2NoZ19jZCAiICsKICAgICAgICAgICAgICAgICJmcm9tIHBzX2Vkal9pOV91c2VyIHUgICAgIiArCiAgICAgICAgICAgICAgICAid2hlcmUgdS5lbXBsaWQgPSA/ICAgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsIGVtcGxpZCk7CiAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKCiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIEFzc29jaWF0ZURhdGEgdHJhY2tpbmdEYXRhID0gbmV3IEFzc29jaWF0ZURhdGEoKTsKCiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0RW1wbGlkKGVtcGxpZCk7CiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0RW1haWxBZGRyZXNzKHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0TGFzdE5hbWUocnMuZ2V0U3RyaW5nKDIpKTsKICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5zZXRGaXJzdE5hbWUocnMuZ2V0U3RyaW5nKDMpKTsKICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5zZXRMb2NhdGlvbihycy5nZXRTdHJpbmcoNCkpOwogICAgICAgICAgICAgICAgdHJhY2tpbmdEYXRhLnNldEFkbWluKHJzLmdldFN0cmluZyg1KS5lcXVhbHMoIlkiKSA/IHRydWUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEuc2V0Sm9iVGl0bGUocnMuZ2V0U3RyaW5nKDYpKTsKICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5zZXRQcm9jZXNzQ2QocnMuZ2V0U3RyaW5nKDcpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tpbmdEYXRhOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNRTCBlcnJvciByZXRyaWV2aW5nIHVzZXIgdHJhY2tpbmcgZGF0YSIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgcnMuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIGRhdGEgY2F0YWxvZyB2YWx1ZXMuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RGF0YUNhdGFsb2dWYWx1ZXMoKSB7CgogICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSBudWxsOwogICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGRlc2NybG9uZyAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiAgZnJvbSBwc19lZGpfZGF0YV9jYXRsZyAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgd2hlcmUgZWRqX2ZpbGVuYW1lICA9ICdIUk1fMDk1LmphcicgIiArCiAgICAgICAgICAgICAgICAiICAgYW5kIGVkal9rZXkgICAgICAgPSA/ICAgICAgICAgICAgICI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0bXQgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsICJQUk9DRVNTX0RBVEUiKTsKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NEdFN0cmluZyA9IHJzLmdldFN0cmluZygxKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NEdCA9IG5ldyBEYXRlKGRhdGVGb3JtYXRNTUREWVlZWS5wYXJzZShwcm9jZXNzRHRTdHJpbmcpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUFJPQ0VTU19EQVRFIGRhdGEgY2F0YWxvZyB2YWx1ZSBtaXNzaW5nIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJzLmNsb3NlKCk7CgogICAgICAgICAgICBzdG10LnNldFN0cmluZygxLCAiT1ZFUlJJREVfUFJPQ0VTU19EQVRFIik7CiAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKCiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIG92ZXJyaWRlUHJvY2Vzc0R0ID0gcnMuZ2V0U3RyaW5nKDEpLmVxdWFscygiWSIpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk9WRVJSSURFX1BST0NFU1NfREFURSBkYXRhIGNhdGFsb2cgdmFsdWUgbWlzc2luZyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBycy5jbG9zZSgpOwoKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMSwgIkVNQUlMX1JFQ0lQSUVOVFMiKTsKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgZW1haWxSZWNpcGllbnRzID0gcnMuZ2V0U3RyaW5nKDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVNQUlMX1JFQ0lQSUVOVFMgZGF0YSBjYXRhbG9nIHZhbHVlIG1pc3NpbmciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcnMuY2xvc2UoKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsICJFVkVSSUZZX1NUQVRFUyIpOwogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgZVZlcmlmeVN0YXRlTGlzdCA9IHJzLmdldFN0cmluZygxKTsKCiAgICAgICAgICAgICAgICBpZiAoIWVWZXJpZnlTdGF0ZUxpc3QubWF0Y2hlcygiKFtBLVpdezJ9fChbQS1aXXsyfSwpK1tBLVpdezJ9KSIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVWRVJJRllfU1RBVEVTIGRhdGEgY2F0YWxvZyBub3QgcHJvcGVybHkgZm9ybWF0dGVkIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVWZXJpZnlTdGF0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZVZlcmlmeVN0YXRlTGlzdC5zcGxpdCgiLCIpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRVZFUklGWV9TVEFURVMgZGF0YSBjYXRhbG9nIHZhbHVlIG1pc3NpbmciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcnMuY2xvc2UoKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsICJNQVhfVEhSRVNIT0xEX05FV19ISVJFX0ZJTEUiKTsKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgbWF4VGhyZXNob2xkTmV3SGlyZSA9IEludGVnZXIucGFyc2VJbnQocnMuZ2V0U3RyaW5nKDEpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNQVhfVEhSRVNIT0xEX05FV19ISVJFX0ZJTEUgZGF0YSBjYXRhbG9nIHZhbHVlIG1pc3NpbmciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcnMuY2xvc2UoKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsICJNQVhfVEhSRVNIT0xEX1VQREFURV9ISVJFX0ZJTEUiKTsKICAgICAgICAgICAgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeSgpOwoKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgbWF4VGhyZXNob2xkVXBkYXRlSGlyZSA9IEludGVnZXIucGFyc2VJbnQocnMuZ2V0U3RyaW5nKDEpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNQVhfVEhSRVNIT0xEX1VQREFURV9FTVBfRklMRSBkYXRhIGNhdGFsb2cgdmFsdWUgbWlzc2luZyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBycy5jbG9zZSgpOwoKICAgICAgICAgICAgc3RtdC5zZXRTdHJpbmcoMSwgIk1BWF9USFJFU0hPTERfVVNSX1VQREFURV9GSUxFIik7CiAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKCiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIG1heFRocmVzaG9sZFVzZXJVcGRhdGUgPSBJbnRlZ2VyLnBhcnNlSW50KHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTUFYX1RIUkVTSE9MRF9VU1JfVVBEQVRFX0ZJTEUgZGF0YSBjYXRhbG9nIHZhbHVlIG1pc3NpbmciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcnMuY2xvc2UoKTsKCiAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nKDEsICJNQVhfVEhSRVNIT0xEX1BIT05FX0NBTExfRklMRSIpOwogICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CgogICAgICAgICAgICBpZiAocnMubmV4dCgpKSB7CiAgICAgICAgICAgICAgICBtYXhUaHJlc2hvbGRQaG9uZUNhbGwgPSBJbnRlZ2VyLnBhcnNlSW50KHJzLmdldFN0cmluZygxKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTUFYX1RIUkVTSE9MRF9QSE9ORV9DQUxMX0ZJTEUgZGF0YSBjYXRhbG9nIHZhbHVlIG1pc3NpbmciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcnMuY2xvc2UoKTsKCiAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNRTCBlcnJvciByZXRyaWV2aW5nIGRhdGEgY2F0YWxvZyB2YWx1ZXMiLCBlKTsKICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFBST0NFU1NfREFURSBmcm9tIGRhdGEgY2F0YWxvZyIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocnMgIT0gbnVsbCkgcnMuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KCiAgICB9CgoKICAgIC8qKgogICAgICogU3RvcCB0aGUgcHJvZ3JhbSBpZiB0aGUgcHJvY2VzcyBkYXRlIGlzbid0IHRvZGF5J3MgZGF0ZSB1bmxlc3MgdGhlIG92ZXJyaWRlIGZsYWcKICAgICAqIGluIHRoZSBkYXRhIGNhdGFsb2cgaXMgc2V0IHRvIGEgWS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVByb2Nlc3NEdCgpIHsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblByb2Nlc3MgZGF0ZTogIiArIGRhdGVGb3JtYXRNTUREWVlZWS5mb3JtYXQocHJvY2Vzc0R0KSk7CgogICAgICAgIENhbGVuZGFyIHRvZGF5ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJVUy9DZW50cmFsIikpOwogICAgICAgIHRvZGF5LnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgMCk7CiAgICAgICAgdG9kYXkuc2V0KENhbGVuZGFyLk1JTlVURSwgMCk7CiAgICAgICAgdG9kYXkuc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7CiAgICAgICAgdG9kYXkuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKCiAgICAgICAgaWYgKHByb2Nlc3NEdC5jb21wYXJlVG8odG9kYXkuZ2V0VGltZSgpKSAhPSAwKSB7CiAgICAgICAgICAgIGlmIChvdmVycmlkZVByb2Nlc3NEdCkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIGRhdGUgb3ZlcnJpZGUgaXMgc2V0IHRvIFksIGNvbnRpbnVpbmcgcHJvY2Vzc2luZyIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIGRhdGUgb3ZlcnJpZGUgaXMgc2V0IHRvIE4sIGFib3J0aW5nIHByb2dyYW0iKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9jZXNzIGRhdGUgZG9lc24ndCBlcXVhbHMgdG9kYXkncyBkYXRlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG92ZXJyaWRlIGZsYWcgaW4gdGhlIGRhdGEgY2F0YWxvZyBiYWNrIHRvIGFuICJOIiBhbmQgc2V0IHRoZQogICAgICogcHJvY2VzcyBkYXRlIHRvIGJlIHRvbW9ycm93J3MgZGF0ZS4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIHByb2dyYW0gZnJvbQogICAgICogcnVubmluZyB0d2ljZSBvciBmb3IgdGhlIHdyb25nIGRheS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVEYXRhQ2F0YWxvZygpIHsKCiAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CgogICAgICAgIFN0cmluZyBzcWwgPSAidXBkYXRlIHBzX2Vkal9kYXRhX2NhdGxnICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICIgICBzZXQgZGVzY3Jsb25nICAgICA9ICdOJyAgICAgICAgICAgICAgICAgICAgICIgKwogICAgICAgICAgICAgICAgIiB3aGVyZSBlZGpfZmlsZW5hbWUgID0gJ0hSTV8wOTUuamFyJyAgICAgICAgICAgIiArCiAgICAgICAgICAgICAgICAiICAgYW5kIGVkal9rZXkgICAgICAgPSAnT1ZFUlJJREVfUFJPQ0VTU19EQVRFJyAiOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzdG10ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwogICAgICAgICAgICBzdG10LmNsb3NlKCk7CgogICAgICAgICAgICBDYWxlbmRhciBuZXh0UHJvY2Vzc0R0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJVUy9DZW50cmFsIikpOwoKICAgICAgICAgICAgaWYgKG5leHRQcm9jZXNzRHQuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKSA9PSBDYWxlbmRhci5GUklEQVkpIHsKICAgICAgICAgICAgICAgIG5leHRQcm9jZXNzRHQuYWRkKENhbGVuZGFyLkRBWV9PRl9NT05USCwgMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0UHJvY2Vzc0R0LmFkZChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzcWwgPSAidXBkYXRlIHBzX2Vkal9kYXRhX2NhdGxnICAgICAgICAgICAgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICAgICAiICAgc2V0IGRlc2NybG9uZyAgICA9IHRvX2NoYXIoID8gLCAnTU0vREQvWVlZWScgKSAiICsKICAgICAgICAgICAgICAgICAgICAiIHdoZXJlIGVkal9maWxlbmFtZSA9ICdIUk1fMDk1LmphcicgICAgICAgICAgICAgICAiICsKICAgICAgICAgICAgICAgICAgICAiICAgYW5kIGVkal9rZXkgICAgICA9ICdQUk9DRVNTX0RBVEUnICAgICAgICAgICAgICAiOwoKICAgICAgICAgICAgc3RtdCA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudChzcWwpOwogICAgICAgICAgICBzdG10LnNldERhdGUoMSwgbmV3IERhdGUobmV4dFByb2Nlc3NEdC5nZXRUaW1lKCkuZ2V0VGltZSgpKSk7CiAgICAgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgpOwoKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU1FMIGVycm9yIHVwZGF0aW5nIGRhdGEgY2F0YWxvZyIsIGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7fQogICAgICAgIH0KCiAgICB9CgogICAgLyoqCiAgICAgKiBFLW1haWwgdGhlIGFzc29jaWF0ZXMgbGlzdGVkIGluIHRoZSBkYXRhIGNhdGFsb2cgd2hlbiBhIG5ldyBoaXJlL3JlaGlyZSBkb2Vzbid0IGhhdmUgYSBob21lIGUtbWFpbAogICAgICogYWRkcmVzcyBzcGVjaWZpZWQgaW4gUGVvcGxlU29mdC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBuZXcgaGlyZSB3aWxsIG5vdCByZWNlaXZlIGFuIGUtbWFpbCBmcm9tIHRoZSB2ZW5kb3IKICAgICAqIGxldHRpbmcgdGhlbSBrbm93IHRoZXkgaGF2ZSB0byBmaWxsIG91dCB0aGVpciBJLTkuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1haWxFcnJvcihTdHJpbmcgZW1wbGlkLCBTdHJpbmcgZXJyb3JDb2RlKSB7CgogICAgICAgIFRleHRFbWFpbC5zZXRNYWlsU2VydmVyKCJtYWlsIik7CiAgICAgICAgVGV4dEVtYWlsLnNldERldmxFbWFpbEFkZHJlc3MoIm5laWwuYWRyaWFuQGVkd2FyZGpvbmVzLmNvbSIpOwoKICAgICAgICBUZXh0RW1haWwgZW1haWwgPSBuZXcgVGV4dEVtYWlsKCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVtYWlsLnNldEZyb20oInBzb2Z0cEBlZHdhcmRqb25lcy5jb20iKTsKCiAgICAgICAgICAgIGlmIChlcnJvckNvZGUuZXF1YWxzKCJFIikpIHsKICAgICAgICAgICAgICAgIGVtYWlsLnNldFN1YmplY3QoIkktOSBoaXJlIG1pc3NpbmcgZS1tYWlsIGFkZHJlc3MiKTsKICAgICAgICAgICAgICAgIGVtYWlsLnNldE1zZygiRW1wbGlkICIgKyBlbXBsaWQgKyAiIGlzIG1pc3NpbmcgYSBob21lIGUtbWFpbCBhZGRyZXNzIGluIFBlb3BsZVNvZnQuIFRoZXkgd2lsbCBub3QgcmVjZWl2ZSBhbiBJLTkgbm90aWZpY2F0aW9uLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZXJyb3JDb2RlLmVxdWFscygiQiIpKSB7CiAgICAgICAgICAgICAgICBlbWFpbC5zZXRTdWJqZWN0KCJJLTkgaGlyZSBtaXNzaW5nIGJpcnRoIGRhdGUiKTsKICAgICAgICAgICAgICAgIGVtYWlsLnNldE1zZygiRW1wbGlkICIgKyBlbXBsaWQgKyAiIGlzIG1pc3NpbmcgdGhlIGJpcnRoIGRhdGUgaW4gUGVvcGxlU29mdC4gVGhleSB3aWxsIG5vdCBiZSBzZW50IHRvIHRoZSBJLTkgdmVuZG9yIHVudGlsIHRoZSBiaXJ0aCBkYXRlIGlzIGVudGVyZWQuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVtYWlsLmFkZFRvKGVtYWlsUmVjaXBpZW50cyk7CiAgICAgICAgICAgIGVtYWlsLnNlbmQoKTsKICAgICAgICB9IGNhdGNoIChFbWFpbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gc2VuZCBlcnJvciBlLW1haWwiLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzQ29tbWFuZExpbmVBcmd1bWVudHMoU3RyaW5nW10gYXJncykgewoKICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMykgewogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIjMgYXJndW1lbnRzIGV4cGVjdGVkICguamF2YV92YXJzLCBjb25uZWN0aW9uIHN0cmluZywgb3V0cHV0IGRpcmVjdG9yeSkiKTsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGFyZ3MubGVuZ3RoICsgIiBhcmd1bWVudHMgZm91bmQ6ICIpOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oaSArICI6ICIgKyBhcmdzW2ldKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBjb25maWdGaWxlTmFtZSA9IGFyZ3NbMF07CiAgICAgICAgaHJDb25uZWN0aW9uU3RyaW5nICAgID0gYXJnc1sxXTsKICAgICAgICBvdXRwdXREZXN0ICAgICAgICAgICAgPSBhcmdzWzJdOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50IDA6ICIgKyBjb25maWdGaWxlTmFtZSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcmd1bWVudCAxOiAiICsgaHJDb25uZWN0aW9uU3RyaW5nKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZ3VtZW50IDI6ICIgKyBvdXRwdXREZXN0KTsKCiAgICAgICAgaWYgKCEobmV3IEZpbGUoY29uZmlnRmlsZU5hbWUpKS5leGlzdHMoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUFMgQ29uZmlnIEZpbGU6ICIgKyBjb25maWdGaWxlTmFtZSArICIgbm90IGZvdW5kLiIpOwogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uZmlnRmlsZS5sb2FkRmlsZShjb25maWdGaWxlTmFtZSk7CiAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyAuamF2YV92YXJzIGZpbGUuIiwgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgSFIgdXNlcmlkIGFuZCBwYXNzd29yZCB0byBjb25uZWN0IHRvIHRoZSBQZW9wbGVTb2Z0IGRhdGFiYXNlLgogICAgICoKICAgICAqIEBwYXJhbSBjb25maWdGaWxlIHRoZSBQU0NvbmZpZ0ZpbGUgdG8gcmVhZCBmcm9tLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldENvbmZpZ0ZpbGVWYXJpYWJsZXMoKSB7CgogICAgICAgIGhyVXNlcklkID0gY29uZmlnRmlsZS5nZXRWYXJpYWJsZSgiSkFWQV9IUlVJRCIpOwogICAgICAgIGhyUGFzc3dvcmQgPSBjb25maWdGaWxlLmdldFZhcmlhYmxlKCJKQVZBX0hSUFdEIik7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uZmlndXJhdGlvbiBMb2FkZWQgZnJvbSAuamF2YV92YXJzOiAiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpBVkFfSFJVSUQgICAgICAgICAgICAgIDogIiArIGhyVXNlcklkKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpBVkFfSFJQV0QgICAgICAgICAgICAgIDogKioqKioqIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CgogICAgfQoKICAgIC8qKgogICAgICogQ29ubmVjdCB0byB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBjb25uZWN0aW9uIHN0cmluZyB1c2luZyB0aGUKICAgICAqIGdpdmluZyBuYW1lIGFuZCBwYXNzd29yZC4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVcERCQ29ubmVjdGlvbigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBDbGFzcy5mb3JOYW1lICggIm9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiICk7CiAgICAgICAgICAgIGNvbm4gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oImpkYmM6b3JhY2xlOnRoaW46QCIgKyBockNvbm5lY3Rpb25TdHJpbmcsIGhyVXNlcklkLCBoclBhc3N3b3JkKTsKICAgICAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KGZhbHNlKTsKICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgY29ubmVjdGluZyB0byB0aGUgZGF0YWJhc2UuIiwgZSk7CiAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBmaW5kIG9yYWNsZSBkcml2ZXIgY2xhc3MuIiwgZSk7CiAgICAgICAgfQogICAgfQoKfQ==
Advertisement
Add Comment
Please, Sign In to add comment