LyoNCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQogKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCiAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqDQogKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQogKg0KICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogKi8NCnBhY2thZ2Ugb3Blbm5scC50b29scy5wYXJzZV90aGlja2V0LmFwcHM7DQoNCg0KaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQppbXBvcnQgamF2YS51dGlsLkFycmF5czsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCg0KaW1wb3J0IG9wZW5ubHAudG9vbHMuc2ltaWxhcml0eS5hcHBzLkhpdEJhc2U7DQppbXBvcnQgb3Blbm5scC50b29scy5zaW1pbGFyaXR5LmFwcHMuUmVsYXRlZFNlbnRlbmNlRmluZGVyOw0KaW1wb3J0IG9wZW5ubHAudG9vbHMuc2ltaWxhcml0eS5hcHBzLlN0b3J5RGlzY291cnNlTmF2aWdhdG9yOw0KaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCg0KDQpwdWJsaWMgY2xhc3MgU3RvcnlEaXNjb3Vyc2VOYXZpZ2F0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KCVJlbGF0ZWRTZW50ZW5jZUZpbmRlciBmaW5kZXIgPSBuZXcgUmVsYXRlZFNlbnRlbmNlRmluZGVyKCk7DQoNCgkNCglwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkRXh0ZWRuc2lvbktleXdvcmRzKCl7DQoJCVN0cmluZ1tdIHJlcyA9IG5ldyBTdG9yeURpc2NvdXJzZU5hdmlnYXRvcigpLm9idGFpbkFkZGl0aW9uYWxLZXl3b3Jkc0ZvckFuRW50aXR5KCJBbGJlcnQgRWluc3RlaW4iKTsNCgkJU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy5hc0xpc3QocmVzKSk7DQoJCWFzc2VydFRydWUocmVzLmxlbmd0aD4wKTsNCgkJYXNzZXJ0VHJ1ZShBcnJheXMuYXNMaXN0KHJlcykudG9TdHJpbmcoKS5pbmRleE9mKCJwaHlzaWNzIik+LTEpOw0KCQlhc3NlcnRUcnVlKEFycmF5cy5hc0xpc3QocmVzKS50b1N0cmluZygpLmluZGV4T2YoInJlbGF0aXZpdHkiKT4tMSk7DQoJCQ0KCQkNCgkJDQoJfSANCg0KfQ0KDQovL1tBbGJlcnQgRWluc3RlaW4gKC/mbGJydCBhbnN0YW4vOyBHZXJtYW4uIGFsYnQgYW50YW4gKCBsaXN0ZW4pOyAxNCBNYXJjaCAxODc5IDE4IEFwcmlsIDE5NTUpIHdhcyBhIEdlcm1hbi1ib3JuIHRoZW9yZXRpY2FsIHBoeXNpY2lzdCB3aG8gZGV2ZWxvcGVkIHRoZSBnZW5lcmFsIHRoZW9yeSBvZiByZWxhdGl2aXR5LCBvbmUgb2YgdGhlIHR3byBwaWxsYXJzIG9mIG1vZGVybiBwaHlzaWNzIChhbG9uZ3NpZGUgcXVhbnR1bSBtZWNoYW5pY3MpLiAyIDMgV2hpbGUgYmVzdCBrbm93biBmb3IgaGlzIG1hc3NlbmVyZ3kgZXF1aXZhbGVuY2UgZm9ybXVsYSBFID0gbWMyICh3aGljaCBoYXMgYmVlbiBkdWJiZWQgInRoZSB3b3JsZCdzIG1vc3QgZmFtb3VzIGVxdWF0aW9uIiksIDQgaGUgcmVjZWl2ZWQgdGhlIDE5MjEgTm9iZWwgUHJpemUgaW4gUGh5c2ljcyAiZm9yIGhpcyBzZXJ2aWNlcyB0byB0aGVvcmV0aWNhbCBwaHlzaWNzLCBhbmQgZXNwZWNpYWxseSBmb3IgaGlzIGRpc2NvdmVyeSBvZiB0aGUgbGF3IG9mIHRoZSBwaG90b2VsZWN0cmljIGVmZmVjdCIuIDUgVGhlIGxhdHRlciB3YXMgcGl2b3RhbCBpbiBlc3RhYmxpc2hpbmcgcXVhbnR1bSB0aGVvcnkuIG51bGxOZWFyIHRoZSBiZWdpbm5pbmcgb2YgaGlzIGNhcmVlciwgRWluc3RlaW4gdGhvdWdodCB0aGF0IE5ld3RvbmlhbiBtZWNoYW5pY3Mgd2FzIG5vIGxvbmdlciBlbm91Z2ggdG8gcmVjb25jaWxlIHRoZSBsYXdzIG9mIGNsYXNzaWNhbCBtZWNoYW5pY3Mgd2l0aCB0aGUgbGF3cyBvZiB0aGUgZWxlY3Ryb21hZ25ldGljIGZpZWxkLiBUaGlzIGxlZCB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgaGlzIHNwZWNpYWwgdGhlb3J5IG9mIHJlbGF0aXZpdHkuLA0K