ZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9HcmlkRmFpbHVyZUluZm9ybWF0aW9uQXBwbGljYXRpb24uamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9HcmlkRmFpbHVyZUluZm9ybWF0aW9uQXBwbGljYXRpb24uamF2YQppbmRleCBmZmQ2NWMwLi42NWQ1NDRjIDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vR3JpZEZhaWx1cmVJbmZvcm1hdGlvbkFwcGxpY2F0aW9uLmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL0dyaWRGYWlsdXJlSW5mb3JtYXRpb25BcHBsaWNhdGlvbi5qYXZhCkBAIC0yLDYgKzIsNyBAQAogCiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LlNwcmluZ0FwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5hdXRvY29uZmlndXJlLlNwcmluZ0Jvb3RBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuY29udGV4dC5wcm9wZXJ0aWVzLkVuYWJsZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY2xvdWQub3BlbmZlaWduLkVuYWJsZUZlaWduQ2xpZW50czsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEuanBhLnJlcG9zaXRvcnkuY29uZmlnLkVuYWJsZUpwYUF1ZGl0aW5nOwogaW1wb3J0IHNwcmluZ2ZveC5kb2N1bWVudGF0aW9uLnN3YWdnZXIyLmFubm90YXRpb25zLkVuYWJsZVN3YWdnZXIyOwpAQCAtMTAsNiArMTEsNyBAQAogQEVuYWJsZVN3YWdnZXIyCiBARW5hYmxlRmVpZ25DbGllbnRzCiBARW5hYmxlSnBhQXVkaXRpbmcobW9kaWZ5T25DcmVhdGU9dHJ1ZSwgYXVkaXRvckF3YXJlUmVmPSJhdWRpdFByb3ZpZGVyIikKK0BFbmFibGVDb25maWd1cmF0aW9uUHJvcGVydGllcwogcHVibGljIGNsYXNzIEdyaWRGYWlsdXJlSW5mb3JtYXRpb25BcHBsaWNhdGlvbiB7CiAKIApkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC9HZmlHcmlkLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL0dmaUdyaWQuamF2YQppbmRleCBiNGJjMzUzLi42MmMzN2EwIDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL0dmaUdyaWQuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL0dmaUdyaWQuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5iYXNlLlByb2Nlc3NUYXNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5iYXNlLnRhc2tzLkRlY2lzaW9uVGFzazsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uaW1wbC50YXNrcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uc3RhbnRzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OwogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5iYXNlLnRhc2tzLkRlY2lzaW9uVGFzay5PdXRwdXRQb3J0Lk5POwpAQCAtMzAsNiArMzEsNyBAQAogQExvZzRqMgogQENvbXBvbmVudAogcHVibGljIGNsYXNzIEdmaUdyaWQgZXh0ZW5kcyBQcm9jZXNzR3JpZCB7CisKICAgICBwdWJsaWMgR2ZpR3JpZCgpIHRocm93cyBQcm9jZXNzRXhjZXB0aW9uIHsKICAgICAgICAgRGVjaXNpb25UYXNrIGRlY2lkZVBsYW5uZWQgPSBuZXcgRGVjaWRlRmFpbHVyZUluZm9QbGFubmVkKCk7CiAKQEAgLTUzLDggKzU1LDE0IEBACiAgICAgICAgIFByb2Nlc3NUYXNrIHB1Ymxpc2hNZXNzYWdlID0gcmVnaXN0ZXIoIFFVQUxJRklFRCwKICAgICAgICAgICAgICAgICBuZXcgVUlTdG9yZUZhaWx1cmVJbmZvcm1hdGlvblRhc2soICJTdGF0ZSBRVUFMSUZJRUQgVUkgVGFzayIsIHRydWUpKTsKIAorICAgICAgICBQcm9jZXNzVGFzayBzdG9yZUZvcmNlRWRpdFN0YXR1c1F1YWxpZmllZCA9IHJlZ2lzdGVyKCBDSEVDS0VEX0ZPUl9QVUJMSVNIXywgbmV3IFN0b3JlRWRpdFN0YXR1c1Rhc2soIFFVQUxJRklFRCApICk7CisgICAgICAgIFByb2Nlc3NUYXNrIHB1Ymxpc2hNZXNzYWdlVG9DaGFubmVscyA9IG5ldyBQdWJsaXNoRmFpbHVyZVRvQ2hhbm5lbHNUYXNrKCk7CisgICAgICAgIFByb2Nlc3NUYXNrIHN0b3JlUHVibGljYXRpb25TdGF0dXMgPSBuZXcgU3RvcmVQdWJsaXNoU3RhdHVzVGFzayhDb25zdGFudHMuUFVCX1NUQVRVU19WRVJPRUZGRU5UTElDSFQpOworICAgICAgICBQcm9jZXNzVGFzayB1cGRhdGVNZXNzYWdlID0gbmV3IFVJU3RvcmVGYWlsdXJlSW5mb3JtYXRpb25UYXNrKCAiU3RhdGUgVXBkYXRlZCBVSSBUYXNrIiwgdHJ1ZSk7CisKICAgICAgICAgRGVjaXNpb25UYXNrIGRlY2lkZVVwZGF0ZWQgPSBuZXcgRGVjaWRlRmFpbHVyZUluZm9VcGRhdGVkKCk7CiAgICAgICAgIFByb2Nlc3NUYXNrIHN0b3JlRWRpdFN0YXR1c1VwZGF0ZWQgPSBuZXcgU2hvcnRjdXRUYXNrKCBVUERBVEVEICk7CisgICAgICAgIFByb2Nlc3NUYXNrIHJlc2V0UHVibGlzaGVkRmxhZ09uQ2hhbm5lbHMgPSBuZXcgUmVzZXRQdWJsaXNoZWRGbGFnT25DaGFubmVsc1Rhc2soKTsKIAogICAgICAgICBQcm9jZXNzVGFzayBjb21wbGV0ZWRFbmRwb2ludCA9IHJlZ2lzdGVyKCBDT01QTEVURUQsCiAgICAgICAgICAgICAgICAgbmV3IFVJU3RvcmVGYWlsdXJlSW5mb3JtYXRpb25UYXNrKCAiU3RhdGUgQ09NUEVURUQgVUkgVGFzayIsIHRydWUpKTsKQEAgLTgwLDcgKzg4LDEyIEBACiAgICAgICAgIGRlY2lkZVVwZGF0ZWQuY29ubmVjdE91dHB1dFRvKFlFUywgc3RvcmVFZGl0U3RhdHVzVXBkYXRlZCk7CiAgICAgICAgIGRlY2lkZVVwZGF0ZWQuY29ubmVjdE91dHB1dFRvKE5PLCBjb21wbGV0ZWRFbmRwb2ludCk7CiAKLSAgICAgICAgc3RvcmVFZGl0U3RhdHVzVXBkYXRlZC5jb25uZWN0T3V0cHV0VG8ocXVhbGlmeU1lc3NhZ2UpOworICAgICAgICBzdG9yZUZvcmNlRWRpdFN0YXR1c1F1YWxpZmllZC5jb25uZWN0T3V0cHV0VG8ocHVibGlzaE1lc3NhZ2VUb0NoYW5uZWxzKTsKKyAgICAgICAgcHVibGlzaE1lc3NhZ2VUb0NoYW5uZWxzLmNvbm5lY3RPdXRwdXRUbyhzdG9yZVB1YmxpY2F0aW9uU3RhdHVzKTsKKyAgICAgICAgc3RvcmVQdWJsaWNhdGlvblN0YXR1cy5jb25uZWN0T3V0cHV0VG8odXBkYXRlTWVzc2FnZSk7CisKKyAgICAgICAgc3RvcmVFZGl0U3RhdHVzVXBkYXRlZC5jb25uZWN0T3V0cHV0VG8ocmVzZXRQdWJsaXNoZWRGbGFnT25DaGFubmVscyk7CisgICAgICAgIHJlc2V0UHVibGlzaGVkRmxhZ09uQ2hhbm5lbHMuY29ubmVjdE91dHB1dFRvKHF1YWxpZnlNZXNzYWdlKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvR2ZpUHJvY2Vzc0Vudmlyb25tZW50LmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL0dmaVByb2Nlc3NFbnZpcm9ubWVudC5qYXZhCmluZGV4IDJhOTdiNmUuLmM5NDQ2M2EgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvR2ZpUHJvY2Vzc0Vudmlyb25tZW50LmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC9HZmlQcm9jZXNzRW52aXJvbm1lbnQuamF2YQpAQCAtMyw4ICszLDEwIEBACiBpbXBvcnQgbG9tYm9rLkRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tYXBwZXIuRmFpbHVyZUluZm9ybWF0aW9uTWFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ucmVwb3NpdG9yeS5GYWlsdXJlQ2xhc3NpZmljYXRpb25SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ucmVwb3NpdG9yeS5GYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWxSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ucmVwb3NpdG9yeS5GYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ucmVwb3NpdG9yeS5TdGF0dXNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uc2VydmljZS5FeHBvcnRTZXJ2aWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uc2VydmljZS5GYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OwpAQCAtMjcsNCArMjksMTAgQEAKICAgICBAQXV0b3dpcmVkCiAgICAgcHJpdmF0ZSBGYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIgZmFpbHVyZUluZm9ybWF0aW9uTWFwcGVyOwogCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsUmVwb3NpdG9yeSBjaGFubmVsUmVwb3NpdG9yeTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIEV4cG9ydFNlcnZpY2UgZXhwb3J0U2VydmljZTsKKwogfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC9HZmlQcm9jZXNzU3RhdGUuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvR2ZpUHJvY2Vzc1N0YXRlLmphdmEKaW5kZXggODE1MGQ3Zi4uZjI0ODhjOCAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC9HZmlQcm9jZXNzU3RhdGUuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL0dmaVByb2Nlc3NTdGF0ZS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgUVVBTElGSUVEICAgICAgICAgICAgICAgKDUpLAogICAgIFVQREFURUQgICAgICAgICAgICAgICAgICg2KSwKICAgICBDT01QTEVURUQgICAgICAgICAgICAgICAoNyksCisgICAgQ0hFQ0tFRF9GT1JfUFVCTElTSF8gICAgKCAyMCksLy8gTk9TT05BUiB2aXJ0dWFsIHN0YXRlIG5vdCBmb3Igc3RvcmluZyBpbiBkYgogICAgIFVOREVGSU5FRF8gICAgICAgICAgICAgICgtMSk7IC8vIE5PU09OQVIKIAogICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdGF0dXNWYWx1ZTsKQEAgLTU1LDYgKzU2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVVBEQVRFRDsKICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICByZXR1cm4gQ09NUExFVEVEOworICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0hFQ0tFRF9GT1JfUFVCTElTSF87CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBzdGF0dXNWYWx1ZToiK3N0YXR1c1ZhbHVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEXzsKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvUHJvY2Vzc0hlbHBlci5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9Qcm9jZXNzSGVscGVyLmphdmEKaW5kZXggNGEzY2IzYi4uMmUzNWYzNCAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9Qcm9jZXNzSGVscGVyLmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9Qcm9jZXNzSGVscGVyLmphdmEKQEAgLTYsOCArNiwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLkdmaVByb2Nlc3NFbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uaW1wbC5HZmlQcm9jZXNzU3RhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5leGNlcHRpb25zLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5leGNlcHRpb25zLk5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuUmVmRmFpbHVyZUNsYXNzaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuUmVmU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsRmFpbHVyZUluZm9ybWF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24udmlld21vZGVsLkZhaWx1cmVJbmZvcm1hdGlvbkR0bzsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7CkBAIC00OSw0ICs1MSwyOSBAQAogICAgICAgICByZXR1cm4gR2ZpUHJvY2Vzc1N0YXRlLmZyb21WYWx1ZShvcHRSZWZTdGF0dXMuZ2V0KCkuZ2V0SWQoKSk7CiAgICAgfQogCisgICAgcHVibGljIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBzdG9yZUVkaXRTdGF0dXMoIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBkdG8sIEdmaVByb2Nlc3NTdGF0ZSBuZXdTdGF0ZSApIHsKKyAgICAgICAgVVVJRCBzdGF0dXNVdWlkID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzUmVwb3NpdG9yeSgpCisgICAgICAgICAgICAgICAgLmZpbmRCeUlkKG5ld1N0YXRlLmdldFN0YXR1c1ZhbHVlKCkpCisgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCAoKSAtPiBuZXcgTm90Rm91bmRFeGNlcHRpb24oICJzdGF0dXMubm90LmZvdW5kIikpCisgICAgICAgICAgICAgICAgLmdldFV1aWQoKTsKKworICAgICAgICBkdG8uc2V0U3RhdHVzSW50ZXJuSWQoc3RhdHVzVXVpZCk7CisgICAgICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRGYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlKCkuc3RvcmVGYWlsdXJlSW5mbyhkdG8sIEdmaVByb2Nlc3NTdGF0ZS5ORVcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hGYWlsdXJlSW5mb3JtYXRpb24oIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBkdG8gKSB7CisgICAgICAgIFN0cmluZ1tdIGNoYW5uZWxzID0gbmV3IFN0cmluZ1tkdG8uZ2V0UHVibGljYXRpb25DaGFubmVscygpLnNpemUoKV07CisgICAgICAgIGVudmlyb25tZW50LmdldEV4cG9ydFNlcnZpY2UoKS5leHBvcnRGYWlsdXJlSW5mb3JtYXRpb24oZHRvLmdldFV1aWQoKSwKKyAgICAgICAgICAgICAgICBkdG8uZ2V0UHVibGljYXRpb25DaGFubmVscygpLnRvQXJyYXkoY2hhbm5lbHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldFB1Ymxpc2hlZFN0YXRlRm9yQ2hhbm5lbHMoIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBkdG8gKSB7CisgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvbiB0YmxGYWlsdXJlSW5mb3JtYXRpb24gPSBlbnZpcm9ubWVudC5nZXRGYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5KCkuZmluZEJ5VXVpZChkdG8uZ2V0VXVpZCgpKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgTm90Rm91bmRFeGNlcHRpb24oImZhaWx1cmUuaW5mb3JtYXRpb24ubm90LmZvdW5kIikpOworICAgICAgICB0YmxGYWlsdXJlSW5mb3JtYXRpb24uZ2V0UHVibGljYXRpb25DaGFubmVsTGlzdCgpLmZvckVhY2goeCAtPiB7CisgICAgICAgICAgICB4LnNldFB1Ymxpc2hlZChmYWxzZSk7CisgICAgICAgICAgICBlbnZpcm9ubWVudC5nZXRDaGFubmVsUmVwb3NpdG9yeSgpLnNhdmUoeCk7CisgICAgICAgIH0pOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9QdWJsaXNoRmFpbHVyZVRvQ2hhbm5lbHNUYXNrLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL3Rhc2tzL1B1Ymxpc2hGYWlsdXJlVG9DaGFubmVsc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE4NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9QdWJsaXNoRmFpbHVyZVRvQ2hhbm5lbHNUYXNrLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwudGFza3M7CisKK2ltcG9ydCBsb21ib2suZXh0ZXJuLmxvZzRqLkxvZzRqMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uYmFzZS50YXNrcy5TZXJ2aWNlVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uaW1wbC5HZmlQcm9jZXNzU3ViamVjdDsKKworQExvZzRqMgorcHVibGljIGNsYXNzIFB1Ymxpc2hGYWlsdXJlVG9DaGFubmVsc1Rhc2sgZXh0ZW5kcyBTZXJ2aWNlVGFzazxHZmlQcm9jZXNzU3ViamVjdD4geworCisgICAgcHVibGljIFB1Ymxpc2hGYWlsdXJlVG9DaGFubmVsc1Rhc2soKSB7CisgICAgICAgIHN1cGVyKCJNZWxkdW5nIGFuIEthbsOkbGUgdmVyw7ZmZmVudGxpY2hlbiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGVhdmVTdGVwKEdmaVByb2Nlc3NTdWJqZWN0IHN1YmplY3QpIHsKKyAgICAgICAgc3ViamVjdC5nZXRQcm9jZXNzSGVscGVyKCkucHVibGlzaEZhaWx1cmVJbmZvcm1hdGlvbiggc3ViamVjdC5nZXRGYWlsdXJlSW5mb3JtYXRpb25EdG8oKSApOworCisgICAgICAgIGxvZy5kZWJ1ZygiUHVibGlzaEZhaWx1cmVUb0NoYW5uZWxzVGFzayBvbkxlYXZlU3RlcCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvUmVzZXRQdWJsaXNoZWRGbGFnT25DaGFubmVsc1Rhc2suamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvUmVzZXRQdWJsaXNoZWRGbGFnT25DaGFubmVsc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc3ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9SZXNldFB1Ymxpc2hlZEZsYWdPbkNoYW5uZWxzVGFzay5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLnRhc2tzOworCitpbXBvcnQgbG9tYm9rLmV4dGVybi5sb2c0ai5Mb2c0ajI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmJhc2UudGFza3MuU2VydmljZVRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwuR2ZpUHJvY2Vzc1N1YmplY3Q7CisKK0BMb2c0ajIKK3B1YmxpYyBjbGFzcyBSZXNldFB1Ymxpc2hlZEZsYWdPbkNoYW5uZWxzVGFzayBleHRlbmRzIFNlcnZpY2VUYXNrPEdmaVByb2Nlc3NTdWJqZWN0PiB7CisKKyAgICBwdWJsaWMgUmVzZXRQdWJsaXNoZWRGbGFnT25DaGFubmVsc1Rhc2soKSB7CisgICAgICAgIHN1cGVyKCJSZXNldCBwdWJsaXNoZWQgc3RhdGUgb24gY2hhbm5lbHMiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxlYXZlU3RlcChHZmlQcm9jZXNzU3ViamVjdCBzdWJqZWN0KSB7CisgICAgICAgIHN1YmplY3QuZ2V0UHJvY2Vzc0hlbHBlcigpLnJlc2V0UHVibGlzaGVkU3RhdGVGb3JDaGFubmVscyggc3ViamVjdC5nZXRGYWlsdXJlSW5mb3JtYXRpb25EdG8oKSApOworICAgICAgICBsb2cuZGVidWcoIlJlc2V0UHVibGlzaGVkRmxhZ09uQ2hhbm5lbHNUYXNrIG9uTGVhdmVTdGVwIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9TaG9ydGN1dFRhc2suamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvU2hvcnRjdXRUYXNrLmphdmEKaW5kZXggNDY5MDFmZi4uMTdjYmI0NyAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9TaG9ydGN1dFRhc2suamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL3Rhc2tzL1Nob3J0Y3V0VGFzay5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIAogICAgIHB1YmxpYyBTaG9ydGN1dFRhc2soR2ZpUHJvY2Vzc1N0YXRlIHN0YXRlVG9TYXZlKSB7Ci0gICAgICAgIHN1cGVyKCJCZWFyYmVpdHVuZ3NzdGF0dXMtU3RhdHVzIHNldHplbjogIitzdGF0ZVRvU2F2ZSk7CisgICAgICAgIHN1cGVyKCJCZWFyYmVpdHVuZ3NzdGF0dXMtU3RhdHVzIChTaG9ydGN1dCkgc2V0emVuOiAiK3N0YXRlVG9TYXZlKTsKICAgICAgICAgdGhpcy5zdGF0ZVRvU2F2ZSA9IHN0YXRlVG9TYXZlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9TdG9yZUVkaXRTdGF0dXNUYXNrLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vYnBtbi9pbXBsL3Rhc2tzL1N0b3JlRWRpdFN0YXR1c1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGI5Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9TdG9yZUVkaXRTdGF0dXNUYXNrLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwudGFza3M7CisKK2ltcG9ydCBsb21ib2suZXh0ZXJuLmxvZzRqLkxvZzRqMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uYmFzZS50YXNrcy5TZXJ2aWNlVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uaW1wbC5HZmlQcm9jZXNzU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwuR2ZpUHJvY2Vzc1N1YmplY3Q7CisKK0BMb2c0ajIKK3B1YmxpYyBjbGFzcyBTdG9yZUVkaXRTdGF0dXNUYXNrIGV4dGVuZHMgU2VydmljZVRhc2s8R2ZpUHJvY2Vzc1N1YmplY3Q+IHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgR2ZpUHJvY2Vzc1N0YXRlIHN0YXRlVG9TYXZlOworCisKKyAgICBwdWJsaWMgU3RvcmVFZGl0U3RhdHVzVGFzayhHZmlQcm9jZXNzU3RhdGUgc3RhdGVUb1NhdmUpIHsKKyAgICAgICAgc3VwZXIoIkJlYXJiZWl0dW5nc3N0YXR1cy1TdGF0dXMgc2V0emVuOiAiK3N0YXRlVG9TYXZlKTsKKyAgICAgICAgdGhpcy5zdGF0ZVRvU2F2ZSA9IHN0YXRlVG9TYXZlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGVhdmVTdGVwKEdmaVByb2Nlc3NTdWJqZWN0IHN1YmplY3QpIHsKKyAgICAgICAgc3ViamVjdC5zZXRGYWlsdXJlSW5mb3JtYXRpb25EdG8oCisgICAgICAgICAgICBzdWJqZWN0LmdldFByb2Nlc3NIZWxwZXIoKS5zdG9yZUVkaXRTdGF0dXMoIHN1YmplY3QuZ2V0RmFpbHVyZUluZm9ybWF0aW9uRHRvKCksIHN0YXRlVG9TYXZlKQorICAgICAgICApOworICAgICAgICBsb2cuZGVidWcoIlN0b3JFZGl0U3RhdHVzVGFzayBvbkxlYXZlU3RlcCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvU3RvcmVQdWJsaXNoU3RhdHVzVGFzay5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC90YXNrcy9TdG9yZVB1Ymxpc2hTdGF0dXNUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxOWIzZQotLS0gL2Rldi9udWxsCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvdGFza3MvU3RvcmVQdWJsaXNoU3RhdHVzVGFzay5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLnRhc2tzOworCitpbXBvcnQgbG9tYm9rLmV4dGVybi5sb2c0ai5Mb2c0ajI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmJhc2UudGFza3MuU2VydmljZVRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwuR2ZpUHJvY2Vzc1N1YmplY3Q7CisKK0BMb2c0ajIKK3B1YmxpYyBjbGFzcyBTdG9yZVB1Ymxpc2hTdGF0dXNUYXNrIGV4dGVuZHMgU2VydmljZVRhc2s8R2ZpUHJvY2Vzc1N1YmplY3Q+IHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHB1YmxpY2F0aW9uU3RhdHVzVG9TYXZlOworCisKKyAgICBwdWJsaWMgU3RvcmVQdWJsaXNoU3RhdHVzVGFzayhTdHJpbmcgcHVibGljYXRpb25TdGF0dXNUb1NhdmUpIHsKKyAgICAgICAgc3VwZXIoIlZlcsO2ZmZlbnRsaWNodW5nc3N0YXR1cyBzZXR6ZW46ICIrcHVibGljYXRpb25TdGF0dXNUb1NhdmUpOworICAgICAgICB0aGlzLnB1YmxpY2F0aW9uU3RhdHVzVG9TYXZlID0gcHVibGljYXRpb25TdGF0dXNUb1NhdmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MZWF2ZVN0ZXAoR2ZpUHJvY2Vzc1N1YmplY3Qgc3ViamVjdCkgeworICAgICAgICBzdWJqZWN0LmdldEZhaWx1cmVJbmZvcm1hdGlvbkR0bygpLnNldFB1YmxpY2F0aW9uU3RhdHVzKHB1YmxpY2F0aW9uU3RhdHVzVG9TYXZlKTsKKyAgICAgICAgc3ViamVjdC5zZXRGYWlsdXJlSW5mb3JtYXRpb25EdG8oCisgICAgICAgICAgICBzdWJqZWN0LmdldFByb2Nlc3NIZWxwZXIoKS5zdG9yZUZhaWx1cmVGcm9tVmlld01vZGVsKCBzdWJqZWN0LmdldEZhaWx1cmVJbmZvcm1hdGlvbkR0bygpICkKKyAgICAgICAgKTsKKworICAgICAgICBsb2cuZGVidWcoIlN0b3JlUHVibGljYXRpb25TdGF0dXNUYXNrIG9uTGVhdmVTdGVwIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9GRVNldHRpbmdzLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL0ZFU2V0dGluZ3MuamF2YQppbmRleCA5MWFiYjZlLi5iYjFhYTYzIDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL0ZFU2V0dGluZ3MuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL0ZFU2V0dGluZ3MuamF2YQpAQCAtMSwyMCArMSwzMSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZzsKIAoraW1wb3J0IGxvbWJvay5HZXR0ZXI7CitpbXBvcnQgbG9tYm9rLlNldHRlcjsKIGltcG9ydCBsb21ib2suZXh0ZXJuLmxvZzRqLkxvZzRqMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcS5SYWJiaXRNcUNoYW5uZWw7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmNvbnRleHQucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLlByb3BlcnR5U291cmNlOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CiAKLUBMb2c0ajIKLUBDb21wb25lbnQKLUBQcm9wZXJ0eVNvdXJjZSh2YWx1ZT17ImNsYXNzcGF0aDphcHBsaWNhdGlvbi55bWwifSkKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAR2V0dGVyCitAU2V0dGVyCitAQ29uZmlndXJhdGlvbgorQENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKHByZWZpeCA9ICJzcHJpbmcucmFiYml0bXEiLCBpZ25vcmVVbmtub3duRmllbGRzID0gdHJ1ZSkKIHB1YmxpYyBjbGFzcyBGRVNldHRpbmdzIHsKIAotICAgIEBWYWx1ZSgiJHtzcHJpbmcuc2V0dGluZ3MuZXhwb3J0Q2hhbm5lbHM6fSIpCi0gICAgcHVibGljIFN0cmluZ1tdIGV4cG9ydENoYW5uZWxzOworICAgIHByaXZhdGUgTGlzdDxSYWJiaXRNcUNoYW5uZWw+IGNoYW5uZWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKICAgICBAVmFsdWUoIiR7c3ByaW5nLnNldHRpbmdzLm92ZXJ2aWV3TWFwSW5pdGlhbFpvb219IikKICAgICBwdWJsaWMgU3RyaW5nIG92ZXJ2aWV3TWFwSW5pdGlhbFpvb207CiAgICAgQFZhbHVlKCIke3NwcmluZy5zZXR0aW5ncy5kZXRhaWxNYXBJbml0aWFsWm9vbX0iKQogICAgIHB1YmxpYyBTdHJpbmcgZGV0YWlsTWFwSW5pdGlhbFpvb207CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKK30KKwpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9SYWJiaXRNcUNvbmZpZy5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9SYWJiaXRNcUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzUwZjM4Li4wMDAwMDAwCi0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvUmFiYml0TXFDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWc7Ci0KLWltcG9ydCBsb21ib2suRGF0YTsKLWltcG9ydCBsb21ib2suZXh0ZXJuLmxvZzRqLkxvZzRqMjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS4qOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYW1xcC5yYWJiaXQuYW5ub3RhdGlvbi5FbmFibGVSYWJiaXQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLio7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5pbnRlZ3JhdGlvbi5hbm5vdGF0aW9uLlNlcnZpY2VBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5pbnRlZ3JhdGlvbi5jaGFubmVsLkRpcmVjdENoYW5uZWw7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWw7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5tZXNzYWdpbmcuTWVzc2FnZUhhbmRsZXI7Ci0KLS8vQFByb2ZpbGUoIiF0ZXN0IikKLUBDb25maWd1cmF0aW9uCi1ATG9nNGoyCi1ARW5hYmxlUmFiYml0Ci1ARGF0YQotcHVibGljIGNsYXNzIFJhYmJpdE1xQ29uZmlnIHsKLQotICAgIC8vIFJhYmJpdE1RIENvbmZpZ3VyYXRpb25lbiBmw7xyIEZhaWx1cmUtSW5mbyBJbXBvcnQKLSAgICBAVmFsdWUoIiR7c3ByaW5nLnJhYmJpdG1xLmltcG9ydF9leGNoYW5nZX0iKQotICAgIHB1YmxpYyBTdHJpbmcgaW1wb3J0RXhjaGFuZ2VOYW1lOwotICAgIEBWYWx1ZSgiJHtzcHJpbmcucmFiYml0bXEuZmFpbHVyZV9pbXBvcnRfcXVldWV9IikKLSAgICBwdWJsaWMgU3RyaW5nIGZhaWx1cmVJbXBvcnRRdWV1ZU5hbWU7Ci0gICAgQFZhbHVlKCIke3NwcmluZy5yYWJiaXRtcS5mYWlsdXJlX2ltcG9ydF9yb3V0aW5na2V5fSIpCi0gICAgcHVibGljIFN0cmluZyBmYWlsdXJlSW1wb3J0Um91dGluZ0tleU5hbWU7Ci0KLSAgICAvLyBSYWJiaXRNUSBDb25maWd1cmF0aW9uZW4gZsO8ciBNYWlsLUV4cG9ydAotICAgIEBWYWx1ZSgiJHtzcHJpbmcucmFiYml0bXEuZXhwb3J0X2V4Y2hhbmdlfSIpCi0gICAgcHVibGljIFN0cmluZyBleHBvcnRFeGNoYW5nZU5hbWU7Ci0gICAgQFZhbHVlKCIke3NwcmluZy5yYWJiaXRtcS5tYWlsX2V4cG9ydF9xdWV1ZX0iKQotICAgIHB1YmxpYyBTdHJpbmcgbWFpbEV4cG9ydFF1ZXVlTmFtZTsKLSAgICBAVmFsdWUoIiR7c3ByaW5nLnJhYmJpdG1xLm1haWxfZXhwb3J0X3JvdXRpbmdrZXl9IikKLSAgICBwdWJsaWMgU3RyaW5nIG1haWxFeHBvcnRSb3V0aW5nS2V5TmFtZTsKLQotICAgIEBBdXRvd2lyZWQKLSAgICBwcml2YXRlIG9yZy5zcHJpbmdmcmFtZXdvcmsuYW1xcC5yYWJiaXQuY29yZS5SYWJiaXRUZW1wbGF0ZSByYWJiaXRUZW1wbGF0ZTsKLQotICAgIEBCZWFuCi0gICAgcHVibGljIERpcmVjdEV4Y2hhbmdlIGltcG9ydEV4Y2hhbmdlKCkgewotICAgICAgICByZXR1cm4gbmV3IERpcmVjdEV4Y2hhbmdlKGltcG9ydEV4Y2hhbmdlTmFtZSk7Ci0gICAgfQotLy8gICAgQEJlYW4KLS8vICAgIHB1YmxpYyBNZXNzYWdlQ2hhbm5lbCBmYWlsdXJlSW1wb3J0Q2hhbm5lbCgpIHsKLS8vICAgICAgICByZXR1cm4gbmV3IERpcmVjdENoYW5uZWwoKTsKLS8vICAgIH0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBRdWV1ZSBmYWlsdXJlSW1wb3J0UXVldWUoKSB7IHJldHVybiBuZXcgUXVldWUoZmFpbHVyZUltcG9ydFF1ZXVlTmFtZSk7IH0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBCaW5kaW5nIGZhaWx1cmVJbXBvcnRCaW5kaW5nKCkgeyByZXR1cm4gQmluZGluZ0J1aWxkZXIuYmluZChmYWlsdXJlSW1wb3J0UXVldWUoKSkudG8oaW1wb3J0RXhjaGFuZ2UoKSkud2l0aChmYWlsdXJlSW1wb3J0Um91dGluZ0tleU5hbWUpOyB9Ci0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIERpcmVjdEV4Y2hhbmdlIGV4cG9ydEV4Y2hhbmdlKCkgewotICAgICAgICByZXR1cm4gbmV3IERpcmVjdEV4Y2hhbmdlKGV4cG9ydEV4Y2hhbmdlTmFtZSk7Ci0gICAgfQotICAgIEBCZWFuCi0gICAgcHVibGljIE1lc3NhZ2VDaGFubmVsIG1haWxFeHBvcnRDaGFubmVsKCkgeyByZXR1cm4gbmV3IERpcmVjdENoYW5uZWwoKTsgfQotICAgIEBCZWFuCi0gICAgcHVibGljIFF1ZXVlIG1haWxFeHBvcnRRdWV1ZSgpIHsgcmV0dXJuIG5ldyBRdWV1ZShtYWlsRXhwb3J0UXVldWVOYW1lKTsgfQotICAgIEBCZWFuCi0gICAgcHVibGljIEJpbmRpbmcgbWFpbEV4cG9ydEJpbmRpbmcoKSB7IHJldHVybiBCaW5kaW5nQnVpbGRlci5iaW5kKG1haWxFeHBvcnRRdWV1ZSgpKS50byhleHBvcnRFeGNoYW5nZSgpKS53aXRoKG1haWxFeHBvcnRSb3V0aW5nS2V5TmFtZSk7IH0KLQotLy8gICAgQEJlYW4KLS8vICAgIEBTZXJ2aWNlQWN0aXZhdG9yKGlucHV0Q2hhbm5lbCA9ICJmYWlsdXJlSW1wb3J0Q2hhbm5lbCIpCi0vLyAgICBwdWJsaWMgTWVzc2FnZUhhbmRsZXIgZmFpbHVyZU1lc3NhZ2VIYW5kbGVyKCkgewotLy8KLS8vICAgICAgICByZXR1cm4gbWVzc2FnZSAtPiByYWJiaXRUZW1wbGF0ZS5jb252ZXJ0QW5kU2VuZChpbXBvcnRFeGNoYW5nZU5hbWUsIGZhaWx1cmVJbXBvcnRSb3V0aW5nS2V5TmFtZSwgbWVzc2FnZS5nZXRQYXlsb2FkKCksIG1lc3NhZ2UxIC0+IHsKLS8vICAgICAgICAgICAgbWVzc2FnZTEuZ2V0TWVzc2FnZVByb3BlcnRpZXMoKS5nZXRIZWFkZXJzKCkucHV0KCJtZXRhSWQiLCBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXQoIm1ldGFJZCIpKTsKLS8vICAgICAgICAgICAgbWVzc2FnZTEuZ2V0TWVzc2FnZVByb3BlcnRpZXMoKS5nZXRIZWFkZXJzKCkucHV0KCJkZXNjcmlwdGlvbiIsIG1lc3NhZ2UuZ2V0SGVhZGVycygpLmdldCgiZGVzY3JpcHRpb24iKSk7Ci0vLyAgICAgICAgICAgIG1lc3NhZ2UxLmdldE1lc3NhZ2VQcm9wZXJ0aWVzKCkuZ2V0SGVhZGVycygpLnB1dCgic291cmNlIiwgbWVzc2FnZS5nZXRIZWFkZXJzKCkuZ2V0KCJzb3VyY2UiKSk7Ci0vLyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlMTsKLS8vICAgICAgICB9KTsKLS8vICAgIH0KLQotICAgIEBCZWFuCi0gICAgQFNlcnZpY2VBY3RpdmF0b3IoaW5wdXRDaGFubmVsID0gIm1haWxFeHBvcnRDaGFubmVsIikKLSAgICBwdWJsaWMgTWVzc2FnZUhhbmRsZXIgbWFpbE1lc3NhZ2VIYW5kbGVyKCkgewotCi0gICAgICAgIHJldHVybiBtZXNzYWdlIC0+IHJhYmJpdFRlbXBsYXRlLmNvbnZlcnRBbmRTZW5kKGV4cG9ydEV4Y2hhbmdlTmFtZSwgbWFpbEV4cG9ydFJvdXRpbmdLZXlOYW1lLCBtZXNzYWdlLmdldFBheWxvYWQoKSwgbWVzc2FnZTEgLT4gewotICAgICAgICAgICAgbWVzc2FnZTEuZ2V0TWVzc2FnZVByb3BlcnRpZXMoKS5nZXRIZWFkZXJzKCkucHV0KCJtZXRhSWQiLCBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXQoIm1ldGFJZCIpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UxLmdldE1lc3NhZ2VQcm9wZXJ0aWVzKCkuZ2V0SGVhZGVycygpLnB1dCgiZGVzY3JpcHRpb24iLCBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXQoImRlc2NyaXB0aW9uIikpOwotICAgICAgICAgICAgbWVzc2FnZTEuZ2V0TWVzc2FnZVByb3BlcnRpZXMoKS5nZXRIZWFkZXJzKCkucHV0KCJzb3VyY2UiLCBtZXNzYWdlLmdldEhlYWRlcnMoKS5nZXQoInNvdXJjZSIpKTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlMTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvcmFiYml0TXEvUmFiYml0TXFDaGFubmVsLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL3JhYmJpdE1xL1JhYmJpdE1xQ2hhbm5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MGMxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL3JhYmJpdE1xL1JhYmJpdE1xQ2hhbm5lbC5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcucmFiYml0TXE7CisKK2ltcG9ydCBsb21ib2suQWxsQXJnc0NvbnN0cnVjdG9yOworaW1wb3J0IGxvbWJvay5EYXRhOworaW1wb3J0IGxvbWJvay5Ob0FyZ3NDb25zdHJ1Y3RvcjsKKworQEFsbEFyZ3NDb25zdHJ1Y3RvcgorQE5vQXJnc0NvbnN0cnVjdG9yCitARGF0YQorcHVibGljICBjbGFzcyBSYWJiaXRNcUNoYW5uZWwgeworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBTdHJpbmcgZXhwb3J0cXVldWU7CisgICAgcHVibGljIFN0cmluZyBleHBvcnRrZXk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL3JhYmJpdE1xL1JhYmJpdE1xQ29uZmlnLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL3JhYmJpdE1xL1JhYmJpdE1xQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzOWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvcmFiYml0TXEvUmFiYml0TXFDb25maWcuamF2YQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLnJhYmJpdE1xOworCitpbXBvcnQgbG9tYm9rLkRhdGE7CitpbXBvcnQgbG9tYm9rLmV4dGVybi5sb2c0ai5Mb2c0ajI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcucmFiYml0TXEuUmFiYml0TXFDaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLnJhYmJpdE1xLlJhYmJpdE1xUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS4qOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYW1xcC5yYWJiaXQuYW5ub3RhdGlvbi5FbmFibGVSYWJiaXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5hbXFwLnJhYmJpdC5jb3JlLlJhYmJpdEFkbWluOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYW1xcC5yYWJiaXQuY29yZS5SYWJiaXRUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uKjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK0BQcm9maWxlKCIhdGVzdCIpCitAQ29uZmlndXJhdGlvbgorQExvZzRqMgorQEVuYWJsZVJhYmJpdAorQERhdGEKK3B1YmxpYyBjbGFzcyBSYWJiaXRNcUNvbmZpZyB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBSYWJiaXRUZW1wbGF0ZSByYWJiaXRUZW1wbGF0ZTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFJhYmJpdE1xUHJvcGVydGllcyByYWJiaXRNcVByb3BlcnRpZXM7CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHByaXZhdGUgdm9pZCBidWlsZEFsbFF1ZXVlcygpeworCisvLyAgICAgICAgbG9nLndhcm4oIlJhYmJpdE1xSG9zdDogIiArIHJhYmJpdE1xUHJvcGVydGllcy5nZXRIb3N0KCkpOworLy8gICAgICAgIGxvZy53YXJuKCJSYWJiaXRNcUV4Y2hhbmdlOiAiICsgcmFiYml0TXFQcm9wZXJ0aWVzLmdldEV4cG9ydF9leGNoYW5nZSgpKTsKKy8vICAgICAgICBsb2cud2FybigiUmFiYml0TXEgQW56YWhsIENoYW5uZWxzOiAiICsgcmFiYml0TXFQcm9wZXJ0aWVzLmdldENoYW5uZWxzKCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBOZXVlcnN0ZWxsdW5nIEV4Y2hhbmdlIHVuZCBRdWV1ZXMgZmFsbHMgZGllc2UgbmljaHQgdm9yaGFuZGVuIHNpbmQgKHBhc3NpZXJ0IG51ciBkYW5uISkKKyAgICAgICAgUmFiYml0QWRtaW4gYWRtaW4gPSBuZXcgUmFiYml0QWRtaW4ocmFiYml0VGVtcGxhdGUpOworICAgICAgICBEaXJlY3RFeGNoYW5nZSBleGNoYW5nZSA9IG5ldyBEaXJlY3RFeGNoYW5nZShyYWJiaXRNcVByb3BlcnRpZXMuZ2V0RXhwb3J0X2V4Y2hhbmdlKCkpOworICAgICAgICBhZG1pbi5kZWNsYXJlRXhjaGFuZ2UoZXhjaGFuZ2UpOworCisgICAgICAgIGZvcihSYWJiaXRNcUNoYW5uZWwgcmFiYml0TXFjaGFubmVsOiByYWJiaXRNcVByb3BlcnRpZXMuZ2V0Q2hhbm5lbHMoKSkgeworCisgICAgICAgICAgICBRdWV1ZSBxdWV1ZSA9IG5ldyBRdWV1ZShyYWJiaXRNcWNoYW5uZWwuZ2V0RXhwb3J0cXVldWUoKSk7CisgICAgICAgICAgICBhZG1pbi5kZWNsYXJlUXVldWUocXVldWUpOworICAgICAgICAgICAgYWRtaW4uZGVjbGFyZUJpbmRpbmcoQmluZGluZ0J1aWxkZXIuYmluZChxdWV1ZSkudG8oZXhjaGFuZ2UpLndpdGgocmFiYml0TXFjaGFubmVsLmdldEV4cG9ydGtleSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9yYWJiaXRNcS9SYWJiaXRNcVByb3BlcnRpZXMuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvcmFiYml0TXEvUmFiYml0TXFQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2MDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvcmFiYml0TXEvUmFiYml0TXFQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcTsKKworaW1wb3J0IGxvbWJvay5HZXR0ZXI7CitpbXBvcnQgbG9tYm9rLlNldHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcS5SYWJiaXRNcUNoYW5uZWw7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmNvbnRleHQucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK0BHZXR0ZXIKK0BTZXR0ZXIKK0BDb25maWd1cmF0aW9uCitAQ29uZmlndXJhdGlvblByb3BlcnRpZXMocHJlZml4ID0gInNwcmluZy5yYWJiaXRtcSIsIGlnbm9yZVVua25vd25GaWVsZHMgPSB0cnVlKQorcHVibGljIGNsYXNzIFJhYmJpdE1xUHJvcGVydGllcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBob3N0OworICAgIHByaXZhdGUgU3RyaW5nIHBvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBpbXBvcnRfZXhjaGFuZ2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmFpbHVyZV9pbXBvcnRfcXVldWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmFpbHVyZV9pbXBvcnRfcm91dGluZ2tleTsKKworICAgIHByaXZhdGUgU3RyaW5nIGV4cG9ydF9leGNoYW5nZTsKKworICAgIHByaXZhdGUgTGlzdDxSYWJiaXRNcUNoYW5uZWw+IGNoYW5uZWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKK30KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbnN0YW50cy9Db25zdGFudHMuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25zdGFudHMvQ29uc3RhbnRzLmphdmEKaW5kZXggMDljNDc4NC4uZTUwYTFmZiAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbnN0YW50cy9Db25zdGFudHMuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uc3RhbnRzL0NvbnN0YW50cy5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfU0hPUlQgPSAiRSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9JTkZPX1VVSURfTk9UX0VYSVNUSU5HID0gImZhaWx1cmUuaW5mby51dWlkLm5vdC5leGlzdGluZyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX05PVF9FWElTVElORyA9ICJzdGF0dXMubm90LmV4aXN0aW5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJfU1RBVFVTX1ZFUk9FRkZFTlRMSUNIVCA9ICJWZXLDtmZmZW50bGljaHQiOwogCiAgICAgcHJpdmF0ZSBDb25zdGFudHMoKSB7CiAgICAgICAgIC8vIGVtcHR5IENvbnN0cnVjdG9yIGZvciB0aGUgc2FrZSBvZiBTT05BUgpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbnRyb2xsZXIvRmFpbHVyZUluZm9ybWF0aW9uQ29udHJvbGxlci5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbnRyb2xsZXIvRmFpbHVyZUluZm9ybWF0aW9uQ29udHJvbGxlci5qYXZhCmluZGV4IDU3NTRlNjkuLjQ0YzM1MTYgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb250cm9sbGVyL0ZhaWx1cmVJbmZvcm1hdGlvbkNvbnRyb2xsZXIuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29udHJvbGxlci9GYWlsdXJlSW5mb3JtYXRpb25Db250cm9sbGVyLmphdmEKQEAgLTkzLDEzICs5MywyMSBAQAogICAgICAgICAgICAgQEFwaVJlc3BvbnNlKGNvZGUgPSAyMDAsIG1lc3NhZ2UgPSAiU3TDtnJ1bmdzaW5mb3JtYXRpb24gd3VyZGUgYWt0dWFsaXNpZXJ0IiksCiAgICAgICAgICAgICBAQXBpUmVzcG9uc2UoY29kZSA9IDQwMCwgbWVzc2FnZSA9ICJVbmfDvGx0aWdlIEVpbmdhYmUiKSwKICAgICAgICAgICAgIEBBcGlSZXNwb25zZShjb2RlID0gNDA0LCBtZXNzYWdlID0gIk5pY2h0IGdlZnVuZGVuIil9KQotICAgIHB1YmxpYyBSZXNwb25zZUVudGl0eSB1cGRhdGVGYWlsdXJlSW5mbyhAUGF0aFZhcmlhYmxlIFVVSUQgZmFpbHVyZUluZm9VdWlkLCBAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9EdG8pIHsKKyAgICBwdWJsaWMgUmVzcG9uc2VFbnRpdHkgdXBkYXRlRmFpbHVyZUluZm8oCisgICAgICAgICAgICBAUGF0aFZhcmlhYmxlIFVVSUQgZmFpbHVyZUluZm9VdWlkLAorICAgICAgICAgICAgQFJlcXVlc3RQYXJhbSggZGVmYXVsdFZhbHVlID0gImZhbHNlIiApIEBBcGlQYXJhbSggIlNhdmUgYW5kIHB1Ymxpc2ggdGhlIGZhaWx1cmUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBjaGFubmVscyIpIGJvb2xlYW4gc2F2ZUZvclB1Ymxpc2gsCisgICAgICAgICAgICBAVmFsaWRhdGVkIEBSZXF1ZXN0Qm9keSBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9EdG8pIHsKIAogICAgICAgICBpZiAoIWZhaWx1cmVJbmZvRHRvLmdldFV1aWQoKS5lcXVhbHMoZmFpbHVyZUluZm9VdWlkKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oImludmFsaWQudXVpZC5wYXRoLm9iamVjdCIpOwogICAgICAgICB9CiAKLSAgICAgICAgZmFpbHVyZUluZm9ybWF0aW9uU2VydmljZS51cGRhdGVGYWlsdXJlSW5mbyhmYWlsdXJlSW5mb0R0byk7CisgICAgICAgIGlmKCBzYXZlRm9yUHVibGlzaCApIHsKKyAgICAgICAgICAgIGZhaWx1cmVJbmZvcm1hdGlvblNlcnZpY2UudXBkYXRlQW5kUHVibGlzaChmYWlsdXJlSW5mb0R0byk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlLnVwZGF0ZUZhaWx1cmVJbmZvKGZhaWx1cmVJbmZvRHRvKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gUmVzcG9uc2VFbnRpdHkub2soKS5idWlsZCgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL21hcHBlci9GRVNldHRpbmdzTWFwcGVyLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbWFwcGVyL0ZFU2V0dGluZ3NNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4ZTkyNS4uMDAwMDAwMAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbWFwcGVyL0ZFU2V0dGluZ3NNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCi0gKgotICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAotICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCi0gKgotICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tYXBwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5GRVNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24udmlld21vZGVsLkZFU2V0dGluZ3NEdG87Ci1pbXBvcnQgb3JnLm1hcHN0cnVjdC5NYXBwZXI7Ci1pbXBvcnQgb3JnLm1hcHN0cnVjdC5SZXBvcnRpbmdQb2xpY3k7Ci0KLUBNYXBwZXIoY29tcG9uZW50TW9kZWwgPSAic3ByaW5nIiwgdW5tYXBwZWRUYXJnZXRQb2xpY3kgPSBSZXBvcnRpbmdQb2xpY3kuSUdOT1JFKQotcHVibGljIGludGVyZmFjZSBGRVNldHRpbmdzTWFwcGVyIHsKLSAgICBGRVNldHRpbmdzRHRvIHRvRkVTZXR0aW5nc0R0byhGRVNldHRpbmdzIGZlU2V0dGluZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL21hcHBlci9GYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9tYXBwZXIvRmFpbHVyZUluZm9ybWF0aW9uTWFwcGVyLmphdmEKaW5kZXggOTIxNmYxNi4uYWUyNzE0ZiAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL21hcHBlci9GYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbWFwcGVyL0ZhaWx1cmVJbmZvcm1hdGlvbk1hcHBlci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLm1vZGVsLlRibERpc3RyaWJ1dGlvbkdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsRmFpbHVyZUluZm9ybWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsU3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnZpZXdtb2RlbC5GYWlsdXJlSW5mb3JtYXRpb25EdG87CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi52aWV3bW9kZWwuRm9yZWlnbkZhaWx1cmVEYXRhRHRvOwpAQCAtNzcsMTIgKzc4LDE2IEBACiAKICAgICAgICAgZmFpbHVyZUluZm9ybWF0aW9uRHRvLnNldERpc3RyaWJ1dGlvbkdyb3VwVXVpZHMoIHNvdXJjZUxpc3QgIT0gbnVsbCA/IHNvdXJjZUxpc3Quc3RyZWFtKCkubWFwKFRibERpc3RyaWJ1dGlvbkdyb3VwOjpnZXRVdWlkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpIDogbmV3IExpbmtlZExpc3Q8PigpKTsKICAgICB9Ci0KICAgICBAQWZ0ZXJNYXBwaW5nCiAgICAgZGVmYXVsdCB2b2lkIHBvcHVsYXRlU3RhdGlvbklkcyhUYmxGYWlsdXJlSW5mb3JtYXRpb24gc291cmNlLCBATWFwcGluZ1RhcmdldCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9ybWF0aW9uRHRvKXsKICAgICAgICAgTGlzdDxUYmxTdGF0aW9uPiBzb3VyY2VMaXN0ID0gc291cmNlLmdldFN0YXRpb25zKCk7CiAKICAgICAgICAgZmFpbHVyZUluZm9ybWF0aW9uRHRvLnNldFN0YXRpb25JZHMoIHNvdXJjZUxpc3QgIT0gbnVsbCA/IHNvdXJjZUxpc3Quc3RyZWFtKCkubWFwKFRibFN0YXRpb246OmdldFV1aWQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkgOiBuZXcgTGlua2VkTGlzdDw+KCkpOwogICAgIH0KKyAgICBAQWZ0ZXJNYXBwaW5nCisgICAgZGVmYXVsdCB2b2lkIHBvcHVsYXRlUHVibGljYXRpb25DaGFubmVscyhUYmxGYWlsdXJlSW5mb3JtYXRpb24gc291cmNlLCBATWFwcGluZ1RhcmdldCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9ybWF0aW9uRHRvKXsKKyAgICAgICAgTGlzdDxUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw+IHNvdXJjZUxpc3QgPSBzb3VyY2UuZ2V0UHVibGljYXRpb25DaGFubmVsTGlzdCgpOwogCisgICAgICAgIGZhaWx1cmVJbmZvcm1hdGlvbkR0by5zZXRQdWJsaWNhdGlvbkNoYW5uZWxzKCBzb3VyY2VMaXN0ICE9IG51bGwgPyBzb3VyY2VMaXN0LnN0cmVhbSgpLm1hcChUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw6OmdldFB1YmxpY2F0aW9uQ2hhbm5lbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSA6IG5ldyBMaW5rZWRMaXN0PD4oKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL21vZGVsL1RibEZhaWx1cmVJbmZvcm1hdGlvbi5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL21vZGVsL1RibEZhaWx1cmVJbmZvcm1hdGlvbi5qYXZhCmluZGV4IDMyMmNmZmIuLjFkNGU5MWYgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9tb2RlbC9UYmxGYWlsdXJlSW5mb3JtYXRpb24uamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbW9kZWwvVGJsRmFpbHVyZUluZm9ybWF0aW9uLmphdmEKQEAgLTIzLDEwICsyMyw3IEBACiAKIGltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOwogaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC4qOwogCiBARGF0YQogQEVudGl0eQpAQCAtMTMzLDQgKzEzMCw3IEBACiAKICAgICBAT25lVG9PbmUobWFwcGVkQnkgPSAidGJsRmFpbHVyZUluZm9ybWF0aW9uIikKICAgICBwcml2YXRlIFRibEZhaWx1cmVJbmZvcm1hdGlvblJlbWluZGVyTWFpbFNlbnQgZmFpbHVyZUluZm9ybWF0aW9uUmVtaW5kZXJNYWlsU2VudDsKKyAgICBAT25lVG9NYW55KGNhc2NhZGU9Q2FzY2FkZVR5cGUuQUxMLCBtYXBwZWRCeT0idGJsRmFpbHVyZUluZm9ybWF0aW9uIiwgb3JwaGFuUmVtb3ZhbCA9IHRydWUpCisgICAgcHJpdmF0ZSBMaXN0PFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbD4gcHVibGljYXRpb25DaGFubmVsTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCiB9CmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbW9kZWwvVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vbW9kZWwvVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNjM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9tb2RlbC9UYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tb2RlbDsKKworaW1wb3J0IGxvbWJvay5EYXRhOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitARGF0YQorQEVudGl0eQorcHVibGljIGNsYXNzIFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCB7CisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsICBnZW5lcmF0b3IgPSAidGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fcHVibGljYXRpb25fY2hhbm5lbF9zZXEiKQorICAgIEBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lID0gInRibF9mYWlsdXJlX2luZm9ybWF0aW9uX3B1YmxpY2F0aW9uX2NoYW5uZWxfc2VxIiwgc2VxdWVuY2VOYW1lID0gInRibF9mYWlsdXJlX2luZm9ybWF0aW9uX3B1YmxpY2F0aW9uX2NoYW5uZWxfc2VxIiwgYWxsb2NhdGlvblNpemUgPSAxKQorICAgIEBDb2x1bW4obmFtZSA9ICJpZCIsIHVwZGF0YWJsZSA9IGZhbHNlKQorICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIEBNYW55VG9PbmUKKyAgICBASm9pbkNvbHVtbiggbmFtZSA9ICJma190YmxfZmFpbHVyZV9pbmZvcm1hdGlvbiIpCisgICAgLy9ATm90TnVsbAorICAgIHByaXZhdGUgVGJsRmFpbHVyZUluZm9ybWF0aW9uIHRibEZhaWx1cmVJbmZvcm1hdGlvbjsKKyAgICAvL0BOb3ROdWxsCisgICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljYXRpb25DaGFubmVsOworICAgIC8vQE5vdE51bGwKKyAgICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaGVkOworCisKKworLy8gICAgQE1hbnlUb09uZQorLy8gICAgcHJpdmF0ZSBTdXBwbGllciBzdXBwbGllcjsKKworfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3JlcG9zaXRvcnkvRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJSZXBvc2l0b3J5LmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vcmVwb3NpdG9yeS9EaXN0cmlidXRpb25Hcm91cE1lbWJlclJlcG9zaXRvcnkuamF2YQppbmRleCBjZmJjOTY0Li5jZjI3Yzg4IDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vcmVwb3NpdG9yeS9EaXN0cmlidXRpb25Hcm91cE1lbWJlclJlcG9zaXRvcnkuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vcmVwb3NpdG9yeS9EaXN0cmlidXRpb25Hcm91cE1lbWJlclJlcG9zaXRvcnkuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICAgIE9wdGlvbmFsPFRibERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyPiBmaW5kQnlVdWlkKFVVSUQgdXVpZCk7CiAKICAgICBAUXVlcnkoInNlbGVjdCBhIGZyb20gVGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXIgYSB3aGVyZSBhLnRibERpc3RyaWJ1dGlvbkdyb3VwLnV1aWQgPSA6Z3JvdXBVdWlkIikKLSAgICBMaXN0PFRibERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyPiBmaW5kQnlUYmxEaXN0cmlidXRpb25Hcm91cFV1aWQoVVVJRCBncm91cFV1aWQpOworICAgIExpc3Q8VGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXI+IGZpbmRCeVRibERpc3RyaWJ1dGlvbkdyb3VwVXVpZChAUGFyYW0oImdyb3VwVXVpZCIpIFVVSUQgZ3JvdXBVdWlkKTsKIAogICAgIEBRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gVGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXIgYSB3aGVyZSBhLnRibERpc3RyaWJ1dGlvbkdyb3VwLmlkPTpncm91cElkIGFuZCBhLmNvbnRhY3RJZD06Y29udGFjdElkIGFuZCB1dWlkIDw+Om1lbWJlclV1aWQiKQogICAgIExvbmcgY291bnRCeURpc3RyaWJ1dGlvbkdyb3VwSWRBbmRDb250YWN0SWRBbmRJc05vdFNhbWUoIEBQYXJhbSgiZ3JvdXBJZCIpIExvbmcgZ3JvdXBJZCwgQFBhcmFtKCJjb250YWN0SWQiKSBVVUlEIGNvbnRhY3RJZCwgQFBhcmFtKCJtZW1iZXJVdWlkIikgVVVJRCBtZW1iZXJVdWlkKTsKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9yZXBvc2l0b3J5L0ZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbFJlcG9zaXRvcnkuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9yZXBvc2l0b3J5L0ZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbFJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM5YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3JlcG9zaXRvcnkvRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnJlcG9zaXRvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLm1vZGVsLlRibEZhaWx1cmVJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLm1vZGVsLlRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEuanBhLnJlcG9zaXRvcnkuSnBhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5QYWdpbmdBbmRTb3J0aW5nUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuUmVwb3NpdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQFJlcG9zaXRvcnkKK3B1YmxpYyBpbnRlcmZhY2UgRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsUmVwb3NpdG9yeSBleHRlbmRzIEpwYVJlcG9zaXRvcnk8VGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsLCBMb25nID4geworCisgICAgTGlzdDxUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw+IGZpbmRCeVRibEZhaWx1cmVJbmZvcm1hdGlvbihUYmxGYWlsdXJlSW5mb3JtYXRpb24gdGJsRmFpbHVyZUluZm9ybWF0aW9uKTsKKyAgICAvL0xpc3Q8VGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsPiBmaW5kQnlQdWJsaWNhdGlvbkNoYW5uZWwoU3RyaW5nIHB1YmxpY2F0aW9uQ2hhbm5lbCk7CisgICAgaW50IGNvdW50QnlUYmxGYWlsdXJlSW5mb3JtYXRpb25BbmRQdWJsaWNhdGlvbkNoYW5uZWwoVGJsRmFpbHVyZUluZm9ybWF0aW9uIHRibEZhaWx1cmVJbmZvcm1hdGlvbiwgU3RyaW5nIHB1YmxpY2F0aW9uQ2hhbm5lbCk7CisKK30KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0V4cG9ydFNlcnZpY2UuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0V4cG9ydFNlcnZpY2UuamF2YQppbmRleCA0YTk4MTFkLi4zMDFjNmY3IDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9FeHBvcnRTZXJ2aWNlLmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3NlcnZpY2UvRXhwb3J0U2VydmljZS5qYXZhCkBAIC0yLDQwICsyLDQzIEBACiAKIGltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogaW1wb3J0IGxvbWJvay5leHRlcm4ubG9nNGouTG9nNGoyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLlJhYmJpdE1xQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLnJhYmJpdE1xLlJhYmJpdE1xQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcS5SYWJiaXRNcVByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5leGNlcHRpb25zLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5leGNlcHRpb25zLk5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubWFwcGVyLkZhaWx1cmVJbmZvcm1hdGlvbk1hcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5yZXBvc2l0b3J5LkZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5yZXBvc2l0b3J5LkZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi52aWV3bW9kZWwuRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJEdG87CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi52aWV3bW9kZWwuRGlzdHJpYnV0aW9uVGV4dFBsYWNlaG9sZGVyRHRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24udmlld21vZGVsLk1haWxNZXNzYWdlRHRvOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24udmlld21vZGVsLlJhYmJpdE1xTWVzc2FnZUR0bzsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS5CaW5kaW5nQnVpbGRlcjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS5EaXJlY3RFeGNoYW5nZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS5RdWV1ZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAucmFiYml0LmNvcmUuUmFiYml0QWRtaW47CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlF1YWxpZmllcjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuY29udGV4dC5wcm9wZXJ0aWVzLkVuYWJsZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsubWVzc2FnaW5nLnN1cHBvcnQuTWVzc2FnZUJ1aWxkZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uUHJvcGVydHlTb3VyY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmVudi5FbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnZhbGlkYXRpb24uYW5ub3RhdGlvbi5WYWxpZGF0ZWQ7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIEBTZXJ2aWNlCiBATG9nNGoyCiBAVmFsaWRhdGVkCiBARW5hYmxlQ29uZmlndXJhdGlvblByb3BlcnRpZXMKK0BQcm9wZXJ0eVNvdXJjZSh2YWx1ZSA9ICJjbGFzc3BhdGg6Y29uZmlnLSR7c3ByaW5nLnByb2ZpbGVzLmFjdGl2ZX0ueW1sIiwgaWdub3JlUmVzb3VyY2VOb3RGb3VuZCA9IHRydWUpCiBwdWJsaWMgY2xhc3MgRXhwb3J0U2VydmljZSB7CiAKICAgICBAQXV0b3dpcmVkCi0gICAgcHJpdmF0ZSBSYWJiaXRNcUNvbmZpZyByYWJiaXRNcUNvbmZpZzsKKyAgICBwcml2YXRlIFJhYmJpdE1xUHJvcGVydGllcyByYWJiaXRNcVByb3BlcnRpZXM7CiAKICAgICBAQXV0b3dpcmVkCiAgICAgcHJpdmF0ZSBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAucmFiYml0LmNvcmUuUmFiYml0VGVtcGxhdGUgcmFiYml0VGVtcGxhdGU7CkBAIC01MCw4ICs1Myw3IEBACiAgICAgcHJpdmF0ZSBGYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5IGZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnk7CiAKICAgICBAQXV0b3dpcmVkCi0gICAgQFF1YWxpZmllcigibWFpbEV4cG9ydENoYW5uZWwiKQotICAgIHByaXZhdGUgTWVzc2FnZUNoYW5uZWwgbWFpbEV4cG9ydENoYW5uZWw7CisgICAgcHJpdmF0ZSBGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWxSZXBvc2l0b3J5IHB1YmxpY2F0aW9uQ2hhbm5lbFJlcG9zaXRvcnk7CiAKICAgICBAQXV0b3dpcmVkCiAgICAgcHJpdmF0ZSBPYmplY3RNYXBwZXIgb2JqZWN0TWFwcGVyOwpAQCAtNTksMTExICs2MSwxODEgQEAKICAgICBAQXV0b3dpcmVkCiAgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZzsKIAorICAgIHByaXZhdGUgQEF1dG93aXJlZCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJKRUNUX0RBVEVfUEFUVEVSTl9BUFBMSUVEID0gIkVFRUUnLCBkZW4nIGRkLk1NLnl5ICd1bScgSEg6bW06c3MiOwotCi0gICAgU3RyaW5nIG1haWxDaGFubmVsID0gIk1BSUwiOwotICAgIFN0cmluZyBzbXNDaGFubmVsID0gIlNNUyI7Ci0gICAgU3RyaW5nIGZheENoYW5uZWwgPSAiRkFYIjsKLQogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLFN0cmluZz4gY29udGVudFJlcGxhY2VNYXA7CisgICAgcHJvdGVjdGVkIGludCBjb3VudEV4cG9ydGVkTWVzc2FnZXM7CiAKIAotICAgIHB1YmxpYyBib29sZWFuIGV4cG9ydEZhaWx1cmVJbmZvcm1hdGlvbihVVUlEIHV1aWQsIFN0cmluZ1tdY2hhbm5lbHMpewotICAgICAgICBpbnQgY291bnRFeHBvcnRlZE1lc3NhZ2VzID0gMDsKLSAgICAgICAgaWYoQXJyYXlzLmFzTGlzdChjaGFubmVscykuY29udGFpbnMobWFpbENoYW5uZWwpKXsKLSAgICAgICAgICAgIGNoZWNrRXhjaGFuZ2VBbmRRdWV1ZU9uUmFiYml0TXEoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBvcnRGYWlsdXJlSW5mb3JtYXRpb24oVVVJRCB1dWlkLCBTdHJpbmdbXSB0YXJnZXRDaGFubmVscyl7CisgICAgICAgIGNvdW50RXhwb3J0ZWRNZXNzYWdlcyA9IDA7CisKKyAgICAgICAgZm9yKFN0cmluZyB0YXJnZXRDaGFubmVsOiB0YXJnZXRDaGFubmVscyl7CisKKyAgICAgICAgICAgIFJhYmJpdE1xQ2hhbm5lbCByQ2hhbm5lbCA9IGdldEF2YWlsYWJsZVJhYmJpdE1xQ2hhbm5lbCh0YXJnZXRDaGFubmVsKTsKKyAgICAgICAgICAgIGlmKGdldEF2YWlsYWJsZVJhYmJpdE1xQ2hhbm5lbCh0YXJnZXRDaGFubmVsKSA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiY2hhbm5lbC5ub3QuZXhpc3RpbmciKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2hlY2tFeGNoYW5nZUFuZFF1ZXVlT25SYWJiaXRNcShyQ2hhbm5lbC5nZXRFeHBvcnRxdWV1ZSgpLCByQ2hhbm5lbC5nZXRFeHBvcnRrZXkoKSk7CiAKICAgICAgICAgICAgIC8vSG9sZW4gZGVyIFN0w7ZyaW5mbwogICAgICAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8gPSBmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoIHV1aWQgKQogICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coTm90Rm91bmRFeGNlcHRpb246Om5ldyk7CiAKLSAgICAgICAgICAgIC8vSG9sZW4gZGVyIFZlcnRlaWxlcmdydXBwZW4gKFBybyBWZXJ0ZWlsZXJncnVwcGUgZWluZSBNZXNzYWdlIGF1ZiBSYWJiaXRNUSkKLSAgICAgICAgICAgIExpc3Q8VGJsRGlzdHJpYnV0aW9uR3JvdXA+IGRpc3RyaWJ1dGlvbkdyb3VwcyA9IGV4aXN0aW5nVGJsRmFpbHVyZUluZm8uZ2V0RGlzdHJpYnV0aW9uR3JvdXBzKCk7Ci0gICAgICAgICAgICBpZihkaXN0cmlidXRpb25Hcm91cHMgPT0gbnVsbCB8fCBkaXN0cmlidXRpb25Hcm91cHMuaXNFbXB0eSgpKXsKLSAgICAgICAgICAgICAgICBsb2cud2Fybigibm8gZGlzdHJpYnV0aW9uIGdyb3VwIGZvdW5kIGZvciBmYWlsdXJlSW5mbzogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleGlzdGluZ1RibEZhaWx1cmVJbmZvLmdldFV1aWQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWlzQ2hhbm5lbEFscmVhZHlQdWJsaXNoZWQoIHRhcmdldENoYW5uZWwsIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8pKSB7CiAKLSAgICAgICAgICAgIGZvcihUYmxEaXN0cmlidXRpb25Hcm91cCBkaXN0cmlidXRpb25Hcm91cDogZGlzdHJpYnV0aW9uR3JvdXBzKXsKLSAgICAgICAgICAgICAgICBNYWlsTWVzc2FnZUR0byBtYWlsTWVzc2FnZUR0byA9IG5ldyBNYWlsTWVzc2FnZUR0bygpOwotICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlRHRvLnNldEZhaWx1cmVJbmZvcm1hdGlvbkR0byhmYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIudG9GYWlsdXJlSW5mb3JtYXRpb25EdG8oZXhpc3RpbmdUYmxGYWlsdXJlSW5mbykpOwotCi0gICAgICAgICAgICAgICAgLy9WZXJ0ZWlsZXIgbcO8c3NlbiBhdWZnZWzDtnN0IHdlcmRlbiBpbiBlaW56ZWxuZSBNYWlsYWRyZXNzZW4KLSAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZUR0by5zZXRNYWlsRGlzdHJpYnV0aW9uR3JvdXAoZGlzdHJpYnV0aW9uR3JvdXAuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEhvbGVuIGRlciB6dWdlb3JkbmV0ZW4gTWFpbC1BZHJlc3NlbgotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtYWlsQWRkcmVzc2VzPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBMaXN0PERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvPiBtZW1iZXJMaXN0ID0gIGRpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyU2VydmljZS5nZXRNZW1iZXJzQnlHcm91cElkKGRpc3RyaWJ1dGlvbkdyb3VwLmdldFV1aWQoKSk7Ci0gICAgICAgICAgICAgICAgbWVtYmVyTGlzdC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHguZ2V0RW1haWwoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goeCAtPiBtYWlsQWRkcmVzc2VzLmFkZCh4LmdldEVtYWlsKCkpKTsKLSAgICAgICAgICAgICAgICBpZihtYWlsQWRkcmVzc2VzLmlzRW1wdHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJubyBtYWlsIGFkZHJlc3NlcyBmb3VuZCBmb3IgZGlzdHJpYnV0aW9uIGdyb3VwOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXN0cmlidXRpb25Hcm91cC5nZXRVdWlkKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vSG9sZW4gZGVyIFZlcnRlaWxlcmdydXBwZW4gKFBybyBWZXJ0ZWlsZXJncnVwcGUgZWluZSBNZXNzYWdlIGF1ZiBSYWJiaXRNUSkKKyAgICAgICAgICAgICAgICBMaXN0PFRibERpc3RyaWJ1dGlvbkdyb3VwPiBkaXN0cmlidXRpb25Hcm91cHMgPSBleGlzdGluZ1RibEZhaWx1cmVJbmZvLmdldERpc3RyaWJ1dGlvbkdyb3VwcygpOworICAgICAgICAgICAgICAgIGlmIChkaXN0cmlidXRpb25Hcm91cHMgPT0gbnVsbCB8fCBkaXN0cmlidXRpb25Hcm91cHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJubyBkaXN0cmlidXRpb24gZ3JvdXAgZm91bmQgZm9yIGZhaWx1cmVJbmZvOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleGlzdGluZ1RibEZhaWx1cmVJbmZvLmdldFV1aWQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZUR0by5zZXRNYWlsQWRkcmVzc2VzKG1haWxBZGRyZXNzZXMpOwogCi0gICAgICAgICAgICAgICAgLy9Ib2xlbiBkZXMgenVtIFZlcnRlaWxlciB6dWdlaMO2cmlnZW4gVGV4dGVzCi0gICAgICAgICAgICAgICAgLy9FcnNhdHogZGVyIGdla2VubnplaWNobmV0ZW4gU3RlbGxlbiBpbSBUZXh0IG1pdCB2b3JoYW5kZW5lbiBJbmZvcwotICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEJvZHkgPSBkaXN0cmlidXRpb25Hcm91cC5nZXREaXN0cmlidXRpb25UZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZXBhcmVkRW1haWxCb2R5ID0gcHJlcGFyZUVNYWlsQm9keShlbWFpbEJvZHksIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8pOwotICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlRHRvLnNldE1haWx0ZXh0KHByZXBhcmVkRW1haWxCb2R5KTsKLQotICAgICAgICAgICAgICAgIC8vVmVyc2VuZGVuIGRlcyBPYmpla3RzL2RlciBPYmpla3RlIMO8YmVyIFJhYmJpdE1RCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFpbEV4cG9ydENoYW5uZWwuc2VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQnVpbGRlci53aXRoUGF5bG9hZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE1hcHBlci53cml0ZVZhbHVlQXNTdHJpbmcobWFpbE1lc3NhZ2VEdG8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uc2V0SGVhZGVyKCJtZXRhSWQiLCBtYWlsTWVzc2FnZUR0by5nZXRNZXRhSWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLnNldEhlYWRlcigiZGVzY3JpcHRpb24iLCBtYWlsTWVzc2FnZUR0by5nZXREZXNjcmlwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uc2V0SGVhZGVyKCJzb3VyY2UiLCBtYWlsTWVzc2FnZUR0by5nZXRTb3VyY2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50RXhwb3J0ZWRNZXNzYWdlcysrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCJjb3VsZC5ub3QucHVzaC5tYWlsIik7CisgICAgICAgICAgICAgICAgZm9yIChUYmxEaXN0cmlidXRpb25Hcm91cCBkaXN0cmlidXRpb25Hcm91cCA6IGRpc3RyaWJ1dGlvbkdyb3VwcykgeworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlTWVzc2FnZShleGlzdGluZ1RibEZhaWx1cmVJbmZvLCBkaXN0cmlidXRpb25Hcm91cCwgckNoYW5uZWwuZ2V0RXhwb3J0a2V5KCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG1hcmsgY2hhbm5lbCBhcyBwdWJsaXNoZWQKKyAgICAgICAgICAgICAgICBtYXJrQ2hhbm5lbEFzUHVibGlzaGVkKHRhcmdldENoYW5uZWwsIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8pOwogICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZihBcnJheXMuYXNMaXN0KGNoYW5uZWxzKS5jb250YWlucyhzbXNDaGFubmVsKSl7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKEFycmF5cy5hc0xpc3QoY2hhbm5lbHMpLmNvbnRhaW5zKGZheENoYW5uZWwpKXsKLQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNvdW50RXhwb3J0ZWRNZXNzYWdlcyA+IDA7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tFeGNoYW5nZUFuZFF1ZXVlT25SYWJiaXRNcSgpeworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NoYW5uZWxBbHJlYWR5UHVibGlzaGVkKFN0cmluZyB0YXJnZXRDaGFubmVsLCBUYmxGYWlsdXJlSW5mb3JtYXRpb24gZXhpc3RpbmdUYmxGYWlsdXJlSW5mbykgeworICAgICAgICBpZiggZXhpc3RpbmdUYmxGYWlsdXJlSW5mby5nZXRQdWJsaWNhdGlvbkNoYW5uZWxMaXN0KCkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIE9wdGlvbmFsPFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbD4gdGYgPQorICAgICAgICAgICAgICAgIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8uZ2V0UHVibGljYXRpb25DaGFubmVsTGlzdCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlciggeCAtPiB4LmdldFB1YmxpY2F0aW9uQ2hhbm5lbCgpLmVxdWFscyh0YXJnZXRDaGFubmVsKSApCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOworCisgICAgICAgIGlmKCB0Zi5pc1ByZXNlbnQoKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0Zi5nZXQoKS5pc1B1Ymxpc2hlZCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGFubmVsICciK3RhcmdldENoYW5uZWwrIicgaGFzIGFscmVhZHkgYmVlbiBwdWJsaXNoZWQgZm9yIEZhaWx1cmVJbmZvICciKworICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1RibEZhaWx1cmVJbmZvLmdldFV1aWQoKSsiJyBhbmQgaGFzIGJlZW4gc2tpcHBlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1hcmtDaGFubmVsQXNQdWJsaXNoZWQoU3RyaW5nIHRhcmdldENoYW5uZWwsIFRibEZhaWx1cmVJbmZvcm1hdGlvbiBleGlzdGluZ1RibEZhaWx1cmVJbmZvKSB7CisgICAgICAgIE9wdGlvbmFsPFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbD4gcHViQ2hhbm5lbFRvU2F2ZSA9IGV4aXN0aW5nVGJsRmFpbHVyZUluZm8uZ2V0UHVibGljYXRpb25DaGFubmVsTGlzdCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlciggeC0+eC5nZXRQdWJsaWNhdGlvbkNoYW5uZWwoKS5lcXVhbHModGFyZ2V0Q2hhbm5lbCkpCisgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOworCisgICAgICAgIGlmKCBwdWJDaGFubmVsVG9TYXZlLmlzUHJlc2VudCgpICkgeworICAgICAgICAgICAgcHViQ2hhbm5lbFRvU2F2ZS5nZXQoKS5zZXRQdWJsaXNoZWQodHJ1ZSk7CisgICAgICAgICAgICBwdWJsaWNhdGlvbkNoYW5uZWxSZXBvc2l0b3J5LnNhdmUocHViQ2hhbm5lbFRvU2F2ZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsb2cud2FybigiQSBtZXNzYWdlIGNhbm5vdCBiZSBwdWJsaXNoZWQgdG8gYSBjaGFubmVsIHRoYXQgaXMgbm90IHNlbGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmFiYml0TXFDaGFubmVsIGdldEF2YWlsYWJsZVJhYmJpdE1xQ2hhbm5lbChTdHJpbmcgdGFyZ2V0Q2hhbm5lbCl7CisKKyAgICAgICAgTGlzdDxSYWJiaXRNcUNoYW5uZWw+IHJhYmJpdE1xQ2hhbm5lbHMgPSByYWJiaXRNcVByb3BlcnRpZXMuZ2V0Q2hhbm5lbHMoKTsKKyAgICAgICAgTGlzdDxSYWJiaXRNcUNoYW5uZWw+IGZpbHRlcmVkQ2hhbm5lbExpc3Q9IHJhYmJpdE1xQ2hhbm5lbHMuc3RyZWFtKCkuZmlsdGVyKGNoYW5uZWwgLT4gY2hhbm5lbC5nZXROYW1lKCkuY29udGFpbnModGFyZ2V0Q2hhbm5lbCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgaWYoIWZpbHRlcmVkQ2hhbm5lbExpc3QuaXNFbXB0eSgpKXsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZENoYW5uZWxMaXN0LmdldCgwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVNZXNzYWdlKFRibEZhaWx1cmVJbmZvcm1hdGlvbiBleGlzdGluZ1RibEZhaWx1cmVJbmZvLCBUYmxEaXN0cmlidXRpb25Hcm91cCBkaXN0cmlidXRpb25Hcm91cCwgU3RyaW5nIGV4cG9ydEtleSl7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1haWxBZGRyZXNzZXM9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFN0cmluZz4gbW9iaWxlTnVtYmVycz0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgUmFiYml0TXFNZXNzYWdlRHRvIHJhYmJpdE1xTWVzc2FnZUR0byA9IG5ldyBSYWJiaXRNcU1lc3NhZ2VEdG8oKTsKKyAgICAgICAgcmFiYml0TXFNZXNzYWdlRHRvLnNldEZhaWx1cmVJbmZvcm1hdGlvbkR0byhmYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIudG9GYWlsdXJlSW5mb3JtYXRpb25EdG8oZXhpc3RpbmdUYmxGYWlsdXJlSW5mbykpOworCisgICAgICAgIC8vRWludHJhZyBWZXJ0ZWlsZXJncnVwcGUgaW5zIE1lc3NhZ2VEdG8KKyAgICAgICAgcmFiYml0TXFNZXNzYWdlRHRvLnNldERpc3RyaWJ1dGlvbkdyb3VwKGRpc3RyaWJ1dGlvbkdyb3VwLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gIGRlciBkZW0gVmVydGVpbGVyIHp1Z2VvcmRuZXRlbiBQZXJzb25lbgorICAgICAgICBMaXN0PERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvPiBtZW1iZXJMaXN0ID0gIGRpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyU2VydmljZS5nZXRNZW1iZXJzQnlHcm91cElkKGRpc3RyaWJ1dGlvbkdyb3VwLmdldFV1aWQoKSk7CisKKyAgICAgICAgLy9Ib2xlbiBkZXIgTWFpbGFkcmVzc2VuIGRlciBkZW0gVmVydGVpbGVyIHp1Z2VvcmRuZXRlbiBQZXJzb25lbiB1bmQgRWludHJhZyBpbnMgTWVzc2FnZUR0bworICAgICAgICBtZW1iZXJMaXN0LnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHguZ2V0RW1haWwoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKHggLT4gbWFpbEFkZHJlc3Nlcy5hZGQoeC5nZXRFbWFpbCgpKSk7CisKKyAgICAgICAgaWYobWFpbEFkZHJlc3Nlcy5pc0VtcHR5KCkpeworICAgICAgICAgICAgbG9nLndhcm4oIm5vIG1haWwgYWRkcmVzc2VzIGZvdW5kIGZvciBkaXN0cmlidXRpb24gZ3JvdXA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkaXN0cmlidXRpb25Hcm91cC5nZXRVdWlkKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmFiYml0TXFNZXNzYWdlRHRvLnNldE1haWxBZGRyZXNzZXMobWFpbEFkZHJlc3Nlcyk7CisKKyAgICAgICAgLy9Ib2xlbiBkZXIgTW9iaWxudW1tZXJuIGRlciBkZW0gVmVydGVpbGVyIHp1Z2VvcmRuZXRlbiBQZXJzb25lbiB1bmQgRWludHJhZyBpbnMgTWVzc2FnZUR0bworICAgICAgICBtZW1iZXJMaXN0LnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHguZ2V0TW9iaWxlTnVtYmVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAuZm9yRWFjaCh4IC0+IG1vYmlsZU51bWJlcnMuYWRkKHguZ2V0TW9iaWxlTnVtYmVyKCkpKTsKKworICAgICAgICBpZihtb2JpbGVOdW1iZXJzLmlzRW1wdHkoKSl7CisgICAgICAgICAgICBsb2cud2Fybigibm8gbW9iaWxlIG51bWJlcnMgZm91bmQgZm9yIGRpc3RyaWJ1dGlvbiBncm91cDogIgorICAgICAgICAgICAgICAgICAgICArIGRpc3RyaWJ1dGlvbkdyb3VwLmdldFV1aWQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByYWJiaXRNcU1lc3NhZ2VEdG8uc2V0TW9iaWxlTnVtYmVycyhtb2JpbGVOdW1iZXJzKTsKKworICAgICAgICAvL0hvbGVuIGRlcyB6dW0gVmVydGVpbGVyIHp1Z2Vow7ZyaWdlbiBUZXh0ZXMKKyAgICAgICAgLy9FcnNhdHogZGVyIGdla2VubnplaWNobmV0ZW4gU3RlbGxlbiBpbSBUZXh0IG1pdCB2b3JoYW5kZW5lbiBJbmZvcyB1bmQgRWludHJhZyBpbnMgTWVzc2FnZUR0bworICAgICAgICBTdHJpbmcgZGlzdHJpYnV0aW9uVGV4dCA9IGRpc3RyaWJ1dGlvbkdyb3VwLmdldERpc3RyaWJ1dGlvblRleHQoKTsKKyAgICAgICAgU3RyaW5nIHByZXBhcmVkQm9keSA9IHByZXBhcmVCb2R5KGRpc3RyaWJ1dGlvblRleHQsIGV4aXN0aW5nVGJsRmFpbHVyZUluZm8pOworICAgICAgICByYWJiaXRNcU1lc3NhZ2VEdG8uc2V0Qm9keShwcmVwYXJlZEJvZHkpOworCisgICAgICAgIHNlbmRNZXNzYWdlVG9SYWJiaXRNcShyYWJiaXRNcU1lc3NhZ2VEdG8sIGV4cG9ydEtleSk7CisKKyAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvUmFiYml0TXEoUmFiYml0TXFNZXNzYWdlRHRvIHJhYmJpdE1xTWVzc2FnZUR0bywgU3RyaW5nIGV4cG9ydEtleSl7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIHJhYmJpdFRlbXBsYXRlLmNvbnZlcnRBbmRTZW5kKHJhYmJpdE1xUHJvcGVydGllcy5nZXRFeHBvcnRfZXhjaGFuZ2UoKSwgZXhwb3J0S2V5LCBvYmplY3RNYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKHJhYmJpdE1xTWVzc2FnZUR0bykpOworICAgICAgICAgICAgY291bnRFeHBvcnRlZE1lc3NhZ2VzKys7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oImNvdWxkLm5vdC5wdXNoLnJhYmJpdE1xTWVzc2FnZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tFeGNoYW5nZUFuZFF1ZXVlT25SYWJiaXRNcShTdHJpbmcgZXhwb3J0UXVldWUsIFN0cmluZyBleHBvcnRLZXkpewogCiAgICAgICAgIC8vIE5ldWVyc3RlbGx1bmcgRXhjaGFuZ2UgdW5kIFF1ZXVlIGZhbGxzIGRpZXNlIG5pY2h0IHZvcmhhbmRlbiBzaW5kIChwYXNzaWVydCBudXIgZGFubiEpCiAgICAgICAgIFJhYmJpdEFkbWluIGFkbWluID0gbmV3IFJhYmJpdEFkbWluKHJhYmJpdFRlbXBsYXRlKTsKLSAgICAgICAgRGlyZWN0RXhjaGFuZ2UgZXhjaGFuZ2UgPW5ldyBEaXJlY3RFeGNoYW5nZShyYWJiaXRNcUNvbmZpZy5leHBvcnRFeGNoYW5nZU5hbWUpOworICAgICAgICBEaXJlY3RFeGNoYW5nZSBleGNoYW5nZSA9bmV3IERpcmVjdEV4Y2hhbmdlKHJhYmJpdE1xUHJvcGVydGllcy5nZXRFeHBvcnRfZXhjaGFuZ2UoKSk7CiAgICAgICAgIGFkbWluLmRlY2xhcmVFeGNoYW5nZShleGNoYW5nZSk7Ci0gICAgICAgIFF1ZXVlIHF1ZXVlID0gbmV3IFF1ZXVlKHJhYmJpdE1xQ29uZmlnLm1haWxFeHBvcnRRdWV1ZU5hbWUpOworICAgICAgICBRdWV1ZSBxdWV1ZSA9IG5ldyBRdWV1ZShleHBvcnRRdWV1ZSk7CiAgICAgICAgIGFkbWluLmRlY2xhcmVRdWV1ZShxdWV1ZSk7Ci0gICAgICAgIGFkbWluLmRlY2xhcmVCaW5kaW5nKEJpbmRpbmdCdWlsZGVyLmJpbmQocXVldWUpLnRvKGV4Y2hhbmdlKS53aXRoKHJhYmJpdE1xQ29uZmlnLm1haWxFeHBvcnRSb3V0aW5nS2V5TmFtZSkpOworICAgICAgICBhZG1pbi5kZWNsYXJlQmluZGluZyhCaW5kaW5nQnVpbGRlci5iaW5kKHF1ZXVlKS50byhleGNoYW5nZSkud2l0aChleHBvcnRLZXkpKTsKICAgICB9CiAKIAotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlcGFyZUVNYWlsQm9keShTdHJpbmcgZW1haWxCb2R5LCBUYmxGYWlsdXJlSW5mb3JtYXRpb24gdGJsRmFpbHVyZUluZm8pIHsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZXBhcmVCb2R5KFN0cmluZyBib2R5LCBUYmxGYWlsdXJlSW5mb3JtYXRpb24gdGJsRmFpbHVyZUluZm8pIHsKIAogICAgICAgICBjcmVhdGVDb250ZW50UmVwbGFjZUhhc2hNYXAodGJsRmFpbHVyZUluZm8pOwogCiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBzdHJpbmdTdHJpbmdFbnRyeSA6IGNvbnRlbnRSZXBsYWNlTWFwLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgIGlmKHN0cmluZ1N0cmluZ0VudHJ5LmdldEtleSgpICE9IG51bGwgJiYgc3RyaW5nU3RyaW5nRW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW1haWxCb2R5ID0gZW1haWxCb2R5LnJlcGxhY2Uoc3RyaW5nU3RyaW5nRW50cnkuZ2V0S2V5KCksIHN0cmluZ1N0cmluZ0VudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnJlcGxhY2Uoc3RyaW5nU3RyaW5nRW50cnkuZ2V0S2V5KCksIHN0cmluZ1N0cmluZ0VudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGVtYWlsQm9keTsKKyAgICAgICAgcmV0dXJuIGJvZHk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudFJlcGxhY2VIYXNoTWFwKFRibEZhaWx1cmVJbmZvcm1hdGlvbiB0YmxGYWlsdXJlSW5mbyl7CmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9GYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9GYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggNzkxM2EzYS4uZjMyNjJmMSAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3NlcnZpY2UvRmFpbHVyZUluZm9ybWF0aW9uU2VydmljZS5qYXZhCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0ZhaWx1cmVJbmZvcm1hdGlvblNlcnZpY2UuamF2YQpAQCAtODUsNiArODUsOSBAQAogICAgIHByaXZhdGUgRGlzdHJpYnV0aW9uR3JvdXBSZXBvc2l0b3J5IGRpc3RyaWJ1dGlvbkdyb3VwUmVwb3NpdG9yeTsKIAogICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbFJlcG9zaXRvcnkgZmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsUmVwb3NpdG9yeTsKKworICAgIEBBdXRvd2lyZWQKICAgICBwcml2YXRlIEdmaUdyaWQgZ3JpZDsKIAogICAgIEBBdXRvd2lyZWQKQEAgLTk4LDcgKzEwMSw2IEBACiAgICAgICAgIHJldHVybiBlbnJpY2hGYWlsdXJlSW5mbyhmYWlsdXJlSW5mb3JtYXRpb25NYXBwZXIudG9GYWlsdXJlSW5mb3JtYXRpb25EdG8oZXhpc3RpbmdUYmxGYWlsdXJlSW5mbykpOwogICAgIH0KIAotCiAgICAgcHVibGljIFBhZ2U8RmFpbHVyZUluZm9ybWF0aW9uRHRvPiBmaW5kRmFpbHVyZUluZm9ybWF0aW9ucyhQYWdlYWJsZSBwYWdlYWJsZSkgewogICAgICAgICBQYWdlPEZhaWx1cmVJbmZvcm1hdGlvbkR0bz4gcmV0UGFnZSA9IGZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnkKICAgICAgICAgICAgICAgICAuZmluZEJ5VGJsRmFpbHVyZUluZm9ybWF0aW9uQ29uZGVuc2VkSWRJc051bGxPcmRlckJ5RmFpbHVyZUJlZ2luRGVzY0lkQXNjKHBhZ2VhYmxlKQpAQCAtMTQyLDcgKzE0NCwxOCBAQAogCiAgICAgQFRyYW5zYWN0aW9uYWwKICAgICBwdWJsaWMgRmFpbHVyZUluZm9ybWF0aW9uRHRvIHVwZGF0ZUZhaWx1cmVJbmZvKEZhaWx1cmVJbmZvcm1hdGlvbkR0byBmYWlsdXJlSW5mb0R0bykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc0dyaWQoZmFpbHVyZUluZm9EdG8pOworICAgICAgICByZXR1cm4gcHJvY2Vzc0dyaWQoZmFpbHVyZUluZm9EdG8sIG51bGwpOworICAgIH0KKworICAgIEBUcmFuc2FjdGlvbmFsCisgICAgcHVibGljIEZhaWx1cmVJbmZvcm1hdGlvbkR0byB1cGRhdGVBbmRQdWJsaXNoKCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9ybWF0aW9uRHRvKSB7CisgICAgICAgIGlmKCBnZXRSZWZTdGF0dXMoZmFpbHVyZUluZm9ybWF0aW9uRHRvKS5nZXRJZCgpICE9IEdmaVByb2Nlc3NTdGF0ZS5RVUFMSUZJRUQuZ2V0U3RhdHVzVmFsdWUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIlB1Ymxpc2hpbmcgaXMgb25seSBwb3NzaWJsZSB3aXRoIHN0YXRlICdxdWFsaWZpZWQnIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGZhaWx1cmVJbmZvcm1hdGlvbkR0by5nZXRQdWJsaWNhdGlvbkNoYW5uZWxzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJQdWJsaXNoaW5nIGlzIG9ubHkgcG9zc2libGUgd2l0aCBhdCBsZWFzdCBvbmUgc2VsZWN0ZWQgY2hhbm5lbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzR3JpZChmYWlsdXJlSW5mb3JtYXRpb25EdG8sIEdmaVByb2Nlc3NTdGF0ZS5DSEVDS0VEX0ZPUl9QVUJMSVNIXyk7CiAgICAgfQogCiAKQEAgLTE3NCwxNSArMTg3LDIxIEBACiAgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvbiB0YmxGYWlsdXJlSW5mb3JtYXRpb25TYXZlZCA9ICBmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LnNhdmUodGJsRmFpbHVyZUluZm9ybWF0aW9uVG9TYXZlKTsKICAgICAgICAgRmFpbHVyZUluZm9ybWF0aW9uRHRvIGZhaWx1cmVJbmZvcm1hdGlvbkR0byA9IGZhaWx1cmVJbmZvcm1hdGlvbk1hcHBlci50b0ZhaWx1cmVJbmZvcm1hdGlvbkR0byh0YmxGYWlsdXJlSW5mb3JtYXRpb25TYXZlZCk7CiAKKwogICAgICAgICByZXR1cm4gZW5yaWNoRmFpbHVyZUluZm8oZmFpbHVyZUluZm9ybWF0aW9uRHRvKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBwcm9jZXNzR3JpZChGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9EdG8pIHsKLSAgICAgICAgUmVmU3RhdHVzIHJlZlN0YXR1cyA9IGdldFJlZlN0YXR1cyhmYWlsdXJlSW5mb0R0byk7Ci0KKyAgICBwcml2YXRlIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBwcm9jZXNzR3JpZChGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmFpbHVyZUluZm9EdG8sIEdmaVByb2Nlc3NTdGF0ZSBmb3JjZWRTdGF0ZSkgewogICAgICAgICBHZmlQcm9jZXNzU3ViamVjdCBzdWJqZWN0ID0gR2ZpUHJvY2Vzc1N1YmplY3Qub2YoZmFpbHVyZUluZm9EdG8sIHByb2Nlc3NIZWxwZXIgKTsKLSAgICAgICAgc3ViamVjdC5zZXRTdGF0ZUluRGIoR2ZpUHJvY2Vzc1N0YXRlLmZyb21WYWx1ZShyZWZTdGF0dXMuZ2V0SWQoKSkpOwogCisgICAgICAgIGlmKCBmb3JjZWRTdGF0ZSAhPSBudWxsICkgeworICAgICAgICAgICAgc3ViamVjdC5zZXRTdGF0ZUluRGIoZm9yY2VkU3RhdGUpOyAvLyB1c2UgZm9yY2VkIHN0YXRlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGUgZnJvbSBkYgorICAgICAgICAgICAgUmVmU3RhdHVzIHJlZlN0YXR1cyA9IGdldFJlZlN0YXR1cyhmYWlsdXJlSW5mb0R0byk7CisgICAgICAgICAgICBzdWJqZWN0LnNldFN0YXRlSW5EYihHZmlQcm9jZXNzU3RhdGUuZnJvbVZhbHVlKHJlZlN0YXR1cy5nZXRJZCgpKSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdyaWQucmVjb3Zlciggc3ViamVjdCApLnN0YXJ0KHN1YmplY3Q6OmdldFN0YXRlSW5EYik7CiAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NFeGNlcHRpb24gZSkgewpAQCAtMjAyLDMwICsyMjEsOTYgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzZXRGcm9tR3JpZEZhaWx1cmVJbmZvcm1hdGlvbkR0byggVGJsRmFpbHVyZUluZm9ybWF0aW9uIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBzb3VyY2VEdG8gKSB7CiAKLSAgICAgICAgaWYoIHNvdXJjZUR0by5nZXRCcmFuY2hJZCgpICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkJyYW5jaCggYnJhbmNoUmVwb3NpdG9yeQotICAgICAgICAgICAgICAgICAgICAuZmluZEJ5VXVpZChzb3VyY2VEdG8uZ2V0QnJhbmNoSWQoKSkKLSAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiYnJhbmNoLnV1aWQubm90LmV4aXN0aW5nIikpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmQnJhbmNoKG51bGwpOworICAgICAgICByZXNvbHZlQnJhbmNoKGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIHNvdXJjZUR0byk7CisgICAgICAgIHJlc29sdmVGYWlsdXJlQ2xhc3NpZmljYXRpb24oZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgc291cmNlRHRvKTsKKyAgICAgICAgcmVzb2x2ZUZhaWx1cmVUeXBlKGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIHNvdXJjZUR0byk7CisgICAgICAgIHJlc29sdmVTdGF0aWkoZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgc291cmNlRHRvKTsKKyAgICAgICAgcmVzb2x2ZVJhZGl1cyhkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBzb3VyY2VEdG8pOworICAgICAgICByZXNvbHZlRXhwZWN0ZWRSZWFzb24oZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgc291cmNlRHRvKTsKKyAgICAgICAgcmVzb2x2ZUNvbmRlbnNlZChkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBzb3VyY2VEdG8pOworCisgICAgICAgIGlmKHNvdXJjZUR0by5nZXRQdWJsaWNhdGlvbkNoYW5uZWxzKCkgIT0gbnVsbCl7CisgICAgICAgICAgICB1cGRhdGVQdWJsaWNhdGlvbkNoYW5uZWxzKHNvdXJjZUR0bywgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiggc291cmNlRHRvLmdldEZhaWx1cmVDbGFzc2lmaWNhdGlvbklkKCkgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmRmFpbHVyZUNsYXNzaWZpY2F0aW9uKCBmYWlsdXJlQ2xhc3NpZmljYXRpb25SZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRGYWlsdXJlQ2xhc3NpZmljYXRpb25JZCgpKQotICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJmYWlsdXJlLmNsYXNzaWZpY2F0aW9uLnV1aWQubm90LmV4aXN0aW5nIikpKTsKKyAgICAgICAgcmVzb2x2ZVN0YXRpb25JZHMoZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgc291cmNlRHRvKTsKKyAgICAgICAgcmVzb2x2ZURpc3RyaWJ1dGlvbkdyb3VwcyhkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBzb3VyY2VEdG8pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlRGlzdHJpYnV0aW9uR3JvdXBzKFRibEZhaWx1cmVJbmZvcm1hdGlvbiBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gc291cmNlRHRvKSB7CisgICAgICAgIGlmKCBzb3VyY2VEdG8uZ2V0RGlzdHJpYnV0aW9uR3JvdXBVdWlkcygpICE9IG51bGwgKSB7CisgICAgICAgICAgICByZXNvbHZlRGlzdHJpYnV0aW9uR3JvdXBVdWlkcyhkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBzb3VyY2VEdG8pOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRSZWZGYWlsdXJlQ2xhc3NpZmljYXRpb24obnVsbCk7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldERpc3RyaWJ1dGlvbkdyb3VwcyhudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlU3RhdGlvbklkcyhUYmxGYWlsdXJlSW5mb3JtYXRpb24gZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgRmFpbHVyZUluZm9ybWF0aW9uRHRvIHNvdXJjZUR0bykgeworICAgICAgICBpZiggc291cmNlRHRvLmdldFN0YXRpb25JZHMoKSAhPSBudWxsICkgeworICAgICAgICAgICAgTGlzdDxUYmxTdGF0aW9uPiBzdGF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICBmb3IgKFVVSUQgc3RhdGlvblV1aWQ6IHNvdXJjZUR0by5nZXRTdGF0aW9uSWRzKCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aW9uTGlzdC5hZGQoc3RhdGlvblJlcG9zaXRvcnkuZmluZEJ5VXVpZChzdGF0aW9uVXVpZCkub3JFbHNlVGhyb3coKCkgLT4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJzdGF0aW9uLnV1aWQubm90LmV4aXN0aW5nIikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRTdGF0aW9ucyhzdGF0aW9uTGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZURpc3RyaWJ1dGlvbkdyb3VwVXVpZHMoVGJsRmFpbHVyZUluZm9ybWF0aW9uIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBzb3VyY2VEdG8pIHsKKyAgICAgICAgTGlzdDxUYmxEaXN0cmlidXRpb25Hcm91cD4gZGlzdHJpYnV0aW9uR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChVVUlEIGRpc3RyaWJ1dGlvbkdyb3VwVXVpZCA6IHNvdXJjZUR0by5nZXREaXN0cmlidXRpb25Hcm91cFV1aWRzKCkpIHsKKyAgICAgICAgICAgIGRpc3RyaWJ1dGlvbkdyb3VwTGlzdC5hZGQoZGlzdHJpYnV0aW9uR3JvdXBSZXBvc2l0b3J5LmZpbmRCeVV1aWQoZGlzdHJpYnV0aW9uR3JvdXBVdWlkKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgTm90Rm91bmRFeGNlcHRpb24oImRpc3RyaWJ1dGlvbi5ncm91cC51dWlkLm5vdC5leGlzdGluZyIpKSk7CiAgICAgICAgIH0KIAorICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldERpc3RyaWJ1dGlvbkdyb3VwcyhkaXN0cmlidXRpb25Hcm91cExpc3QpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVGYWlsdXJlVHlwZShUYmxGYWlsdXJlSW5mb3JtYXRpb24gZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgRmFpbHVyZUluZm9ybWF0aW9uRHRvIHNvdXJjZUR0bykgewogICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkZhaWx1cmVUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUR0by5nZXRGYWlsdXJlVHlwZUlkKCkgIT0gbnVsbCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlVHlwZVJlcG9zaXRvcnkuZmluZEJ5VXVpZChzb3VyY2VEdG8uZ2V0RmFpbHVyZVR5cGVJZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiZmFpbHVyZS50eXBlLnV1aWQubm90LmV4aXN0aW5nIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsICk7CisgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVDb25kZW5zZWQoVGJsRmFpbHVyZUluZm9ybWF0aW9uIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBzb3VyY2VEdG8pIHsKKyAgICAgICAgaWYoIHNvdXJjZUR0by5nZXRGYWlsdXJlSW5mb3JtYXRpb25Db25kZW5zZWRJZCgpICE9IG51bGwgKSB7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFRibEZhaWx1cmVJbmZvcm1hdGlvbkNvbmRlbnNlZCggZmFpbHVyZUluZm9ybWF0aW9uUmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZmluZEJ5VXVpZChzb3VyY2VEdG8uZ2V0RmFpbHVyZUluZm9ybWF0aW9uQ29uZGVuc2VkSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihDb25zdGFudHMuRkFJTFVSRV9JTkZPX1VVSURfTk9UX0VYSVNUSU5HKSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRUYmxGYWlsdXJlSW5mb3JtYXRpb25Db25kZW5zZWQobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUV4cGVjdGVkUmVhc29uKFRibEZhaWx1cmVJbmZvcm1hdGlvbiBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gc291cmNlRHRvKSB7CisgICAgICAgIGlmKCBzb3VyY2VEdG8uZ2V0RXhwZWN0ZWRSZWFzb25JZCgpICE9IG51bGwgKSB7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkV4cGVjdGVkUmVhc29uKCBleHBlY3RlZFJlYXNvblJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRCeVV1aWQoc291cmNlRHRvLmdldEV4cGVjdGVkUmVhc29uSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiZXhwZWN0ZWQucmVhc29uLnV1aWQubm90LmV4aXN0aW5nIikpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmRXhwZWN0ZWRSZWFzb24obnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZVJhZGl1cyhUYmxGYWlsdXJlSW5mb3JtYXRpb24gZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgRmFpbHVyZUluZm9ybWF0aW9uRHRvIHNvdXJjZUR0bykgeworICAgICAgICBpZiggc291cmNlRHRvLmdldFJhZGl1c0lkKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmUmFkaXVzKCByYWRpdXNSZXBvc2l0b3J5CisgICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRSYWRpdXNJZCgpKQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJyYWRpdXMudXVpZC5ub3QuZXhpc3RpbmciKSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRSZWZSYWRpdXMobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZVN0YXRpaShUYmxGYWlsdXJlSW5mb3JtYXRpb24gZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbiwgRmFpbHVyZUluZm9ybWF0aW9uRHRvIHNvdXJjZUR0bykgewogICAgICAgICBpZiggc291cmNlRHRvLmdldFN0YXR1c0ludGVybklkKCkgIT0gbnVsbCApIHsKICAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmU3RhdHVzSW50ZXJuKCBzdGF0dXNSZXBvc2l0b3J5CiAgICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRTdGF0dXNJbnRlcm5JZCgpKQpAQCAtMjQzLDU5ICszMjgsNTggQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZlN0YXR1c0V4dGVybihudWxsKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiggc291cmNlRHRvLmdldFJhZGl1c0lkKCkgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmUmFkaXVzKCByYWRpdXNSZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRSYWRpdXNJZCgpKQotICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCJyYWRpdXMudXVpZC5ub3QuZXhpc3RpbmciKSkpOworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlRmFpbHVyZUNsYXNzaWZpY2F0aW9uKFRibEZhaWx1cmVJbmZvcm1hdGlvbiBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLCBGYWlsdXJlSW5mb3JtYXRpb25EdG8gc291cmNlRHRvKSB7CisgICAgICAgIGlmKCBzb3VyY2VEdG8uZ2V0RmFpbHVyZUNsYXNzaWZpY2F0aW9uSWQoKSAhPSBudWxsICkgeworICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRSZWZGYWlsdXJlQ2xhc3NpZmljYXRpb24oIGZhaWx1cmVDbGFzc2lmaWNhdGlvblJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRCeVV1aWQoc291cmNlRHRvLmdldEZhaWx1cmVDbGFzc2lmaWNhdGlvbklkKCkpCisgICAgICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgTm90Rm91bmRFeGNlcHRpb24oImZhaWx1cmUuY2xhc3NpZmljYXRpb24udXVpZC5ub3QuZXhpc3RpbmciKSkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRSZWZSYWRpdXMobnVsbCk7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkZhaWx1cmVDbGFzc2lmaWNhdGlvbihudWxsKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiggc291cmNlRHRvLmdldEV4cGVjdGVkUmVhc29uSWQoKSAhPSBudWxsICkgewotICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRSZWZFeHBlY3RlZFJlYXNvbiggZXhwZWN0ZWRSZWFzb25SZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRFeHBlY3RlZFJlYXNvbklkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgTm90Rm91bmRFeGNlcHRpb24oImV4cGVjdGVkLnJlYXNvbi51dWlkLm5vdC5leGlzdGluZyIpKSk7CisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVCcmFuY2goVGJsRmFpbHVyZUluZm9ybWF0aW9uIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24sIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBzb3VyY2VEdG8pIHsKKyAgICAgICAgaWYoIHNvdXJjZUR0by5nZXRCcmFuY2hJZCgpICE9IG51bGwgKSB7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkJyYW5jaCggYnJhbmNoUmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICAuZmluZEJ5VXVpZChzb3VyY2VEdG8uZ2V0QnJhbmNoSWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiYnJhbmNoLnV1aWQubm90LmV4aXN0aW5nIikpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UmVmRXhwZWN0ZWRSZWFzb24obnVsbCk7CisgICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFJlZkJyYW5jaChudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVB1YmxpY2F0aW9uQ2hhbm5lbHMoRmFpbHVyZUluZm9ybWF0aW9uRHRvIHNvdXJjZUR0bywgVGJsRmFpbHVyZUluZm9ybWF0aW9uIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24gKXsKKworICAgICAgICAvLyBMw7ZzY2hlbiB6dWdlb3JkbmV0ZXIgS2Fuw6RsZSBtaXQgcHVibGlzaGVkID0gZmFsc2UKKyAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uIGV4aXN0aW5nVGJsRmFpbHVyZUluZm9ybWF0aW9uID0gZmFpbHVyZUluZm9ybWF0aW9uUmVwb3NpdG9yeS5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRVdWlkKCkpCisgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihDb25zdGFudHMuRkFJTFVSRV9JTkZPX1VVSURfTk9UX0VYSVNUSU5HKSk7CisKKyAgICAgICAgTGlzdDxUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw+IGV4aXN0aW5nQ2hhbm5lbHNMaXN0ID0KKyAgICAgICAgICAgICAgICBleGlzdGluZ1RibEZhaWx1cmVJbmZvcm1hdGlvbi5nZXRQdWJsaWNhdGlvbkNoYW5uZWxMaXN0KCk7CisKKyAgICAgICAgTGlzdDxUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw+ZmlsdGVyZWRMaXN0ID0gZXhpc3RpbmdDaGFubmVsc0xpc3Quc3RyZWFtKCkuZmlsdGVyKHggLT4gIXguaXNQdWJsaXNoZWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBmb3IoVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsIGNoYW5uZWw6IGZpbHRlcmVkTGlzdCl7CisgICAgICAgICAgICBleGlzdGluZ0NoYW5uZWxzTGlzdC5yZW1vdmUoY2hhbm5lbCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiggc291cmNlRHRvLmdldEZhaWx1cmVJbmZvcm1hdGlvbkNvbmRlbnNlZElkKCkgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0VGJsRmFpbHVyZUluZm9ybWF0aW9uQ29uZGVuc2VkKCBmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5maW5kQnlVdWlkKHNvdXJjZUR0by5nZXRGYWlsdXJlSW5mb3JtYXRpb25Db25kZW5zZWRJZCgpKQotICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKENvbnN0YW50cy5GQUlMVVJFX0lORk9fVVVJRF9OT1RfRVhJU1RJTkcpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkZXN0VGJsRmFpbHVyZUluZm9ybWF0aW9uLnNldFRibEZhaWx1cmVJbmZvcm1hdGlvbkNvbmRlbnNlZChudWxsKTsKLSAgICAgICAgfQorICAgICAgICAvL0hpbnp1ZsO8Z2VuICB6dWdlb3JkbmV0ZXIgS2Fuw6RsZSBpbiBkZXIgWnVvcmRudW5nc3RhYmVsbGUgbWl0IHB1Ymxpc2hlZD0gZmFsc2UgKGNoZWNrLCBkYW1pdCBrZWluIEthbmFsIGRvcHBlbHQpCisgICAgICAgIExpc3Q8U3RyaW5nPiBuZXdDaGFubmVsTGlzdCA9IHNvdXJjZUR0by5nZXRQdWJsaWNhdGlvbkNoYW5uZWxzKCk7CisgICAgICAgIGZvcihTdHJpbmcgbmV3Q2hhbm5lbDogbmV3Q2hhbm5lbExpc3QpeworICAgICAgICAgICAgaWYoZXhpc3RpbmdDaGFubmVsc0xpc3Quc3RyZWFtKCkuZmlsdGVyKHgtPnguZ2V0UHVibGljYXRpb25DaGFubmVsKCkuZXF1YWxzKG5ld0NoYW5uZWwpKS5jb3VudCgpID09IDApeworICAgICAgICAgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCB0YmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwgPSBuZXcgVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsKCk7CisgICAgICAgICAgICAgICAgdGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsLnNldFRibEZhaWx1cmVJbmZvcm1hdGlvbihleGlzdGluZ1RibEZhaWx1cmVJbmZvcm1hdGlvbik7CisgICAgICAgICAgICAgICAgdGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsLnNldFB1YmxpY2F0aW9uQ2hhbm5lbChuZXdDaGFubmVsKTsKKyAgICAgICAgICAgICAgICB0YmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwuc2V0UHVibGlzaGVkKGZhbHNlKTsKIAotICAgICAgICBpZiggc291cmNlRHRvLmdldFN0YXRpb25JZHMoKSAhPSBudWxsICkgewotICAgICAgICAgICAgTGlzdDxUYmxTdGF0aW9uPiBzdGF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8VGJsU3RhdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChVVUlEIHN0YXRpb25VdWlkOiBzb3VyY2VEdG8uZ2V0U3RhdGlvbklkcygpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGlvbkxpc3QuYWRkKHN0YXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoc3RhdGlvblV1aWQpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigic3RhdGlvbi51dWlkLm5vdC5leGlzdGluZyIpKSk7CisgICAgICAgICAgICAgICAgZXhpc3RpbmdDaGFubmVsc0xpc3QuYWRkKHRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0U3RhdGlvbnMoc3RhdGlvbkxpc3QpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXRTdGF0aW9ucyhudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBzb3VyY2VEdG8uZ2V0RGlzdHJpYnV0aW9uR3JvdXBVdWlkcygpICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBMaXN0PFRibERpc3RyaWJ1dGlvbkdyb3VwPiBkaXN0cmlidXRpb25Hcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PFRibERpc3RyaWJ1dGlvbkdyb3VwPigpOwotCi0gICAgICAgICAgICBmb3IgKFVVSUQgZGlzdHJpYnV0aW9uR3JvdXBVdWlkOiBzb3VyY2VEdG8uZ2V0RGlzdHJpYnV0aW9uR3JvdXBVdWlkcygpKSB7Ci0gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uR3JvdXBMaXN0LmFkZChkaXN0cmlidXRpb25Hcm91cFJlcG9zaXRvcnkuZmluZEJ5VXVpZChkaXN0cmlidXRpb25Hcm91cFV1aWQpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiZGlzdHJpYnV0aW9uLmdyb3VwLnV1aWQubm90LmV4aXN0aW5nIikpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVzdFRibEZhaWx1cmVJbmZvcm1hdGlvbi5zZXREaXN0cmlidXRpb25Hcm91cHMoZGlzdHJpYnV0aW9uR3JvdXBMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0RGlzdHJpYnV0aW9uR3JvdXBzKG51bGwpOwotICAgICAgICB9CisgICAgICAgIGRlc3RUYmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0UHVibGljYXRpb25DaGFubmVsTGlzdChleGlzdGluZ0NoYW5uZWxzTGlzdCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldFZlcnNpb25OdW1iZXIoVGJsRmFpbHVyZUluZm9ybWF0aW9uIHRibEZhaWx1cmVJbmZvcm1hdGlvbil7CmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9TZXR0aW5nc1NlcnZpY2UuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL1NldHRpbmdzU2VydmljZS5qYXZhCmluZGV4IGQ0YzVlYjQuLjA2ZDhjZWYgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL1NldHRpbmdzU2VydmljZS5qYXZhCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL1NldHRpbmdzU2VydmljZS5qYXZhCkBAIC0xNiwxMSArMTYsMTUgQEAKIAogaW1wb3J0IGxvbWJvay5leHRlcm4ubG9nNGouTG9nNGoyOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLkZFU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tYXBwZXIuRkVTZXR0aW5nc01hcHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcS5SYWJiaXRNcUNoYW5uZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi52aWV3bW9kZWwuRkVTZXR0aW5nc0R0bzsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKIEBTZXJ2aWNlCiBATG9nNGoyCiBwdWJsaWMgY2xhc3MgU2V0dGluZ3NTZXJ2aWNlIHsKQEAgLTI4LDEyICszMiwyMSBAQAogICAgIEBBdXRvd2lyZWQKICAgICBwcml2YXRlIEZFU2V0dGluZ3MgZmVTZXR0aW5nczsKIAotICAgIEBBdXRvd2lyZWQKLSAgICBwcml2YXRlIEZFU2V0dGluZ3NNYXBwZXIgZmVTZXR0aW5nc01hcHBlcjsKLQogICAgIHB1YmxpYyBGRVNldHRpbmdzRHRvIGdldEZFU2V0dGluZ3MoKXsKIAotICAgICAgICByZXR1cm4gZmVTZXR0aW5nc01hcHBlci50b0ZFU2V0dGluZ3NEdG8oZmVTZXR0aW5ncyk7CisgICAgICAgIEZFU2V0dGluZ3NEdG8gZmVTZXR0aW5nc0R0byA9IG5ldyBGRVNldHRpbmdzRHRvKCk7CisgICAgICAgIExpc3Q8UmFiYml0TXFDaGFubmVsPiByYWJiaXRNcUNoYW5uZWxzID0gZmVTZXR0aW5ncy5nZXRDaGFubmVscygpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFubmVsTmFtZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IoUmFiYml0TXFDaGFubmVsIGNoYW5uZWw6IHJhYmJpdE1xQ2hhbm5lbHMpeworICAgICAgICAgICAgY2hhbm5lbE5hbWVzLmFkZChjaGFubmVsLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmZVNldHRpbmdzRHRvLnNldEV4cG9ydENoYW5uZWxzKGNoYW5uZWxOYW1lcyk7CisgICAgICAgIGZlU2V0dGluZ3NEdG8uc2V0RGV0YWlsTWFwSW5pdGlhbFpvb20oZmVTZXR0aW5ncy5nZXREZXRhaWxNYXBJbml0aWFsWm9vbSgpKTsKKyAgICAgICAgZmVTZXR0aW5nc0R0by5zZXRPdmVydmlld01hcEluaXRpYWxab29tKGZlU2V0dGluZ3MuZ2V0T3ZlcnZpZXdNYXBJbml0aWFsWm9vbSgpKTsKKworICAgICAgICByZXR1cm4gZmVTZXR0aW5nc0R0bzsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi92aWV3bW9kZWwvRkVTZXR0aW5nc0R0by5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9GRVNldHRpbmdzRHRvLmphdmEKaW5kZXggYTRmNmM2Ni4uY2FmYzcxNiAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9GRVNldHRpbmdzRHRvLmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9GRVNldHRpbmdzRHRvLmphdmEKQEAgLTE1LDExICsxNSwxNCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnZpZXdtb2RlbDsKIAogaW1wb3J0IGxvbWJvay5EYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLnJhYmJpdE1xLlJhYmJpdE1xQ2hhbm5lbDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBARGF0YQogcHVibGljIGNsYXNzIEZFU2V0dGluZ3NEdG8gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHB1YmxpYyBTdHJpbmdbXSBleHBvcnRDaGFubmVsczsKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGV4cG9ydENoYW5uZWxzOwogICAgIHB1YmxpYyBTdHJpbmcgb3ZlcnZpZXdNYXBJbml0aWFsWm9vbTsKICAgICBwdWJsaWMgU3RyaW5nIGRldGFpbE1hcEluaXRpYWxab29tOwogCmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vdmlld21vZGVsL0ZhaWx1cmVJbmZvcm1hdGlvbkR0by5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9GYWlsdXJlSW5mb3JtYXRpb25EdG8uamF2YQppbmRleCBiOGZlZWY2Li5jMmNiZWNjIDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vdmlld21vZGVsL0ZhaWx1cmVJbmZvcm1hdGlvbkR0by5qYXZhCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi92aWV3bW9kZWwvRmFpbHVyZUluZm9ybWF0aW9uRHRvLmphdmEKQEAgLTEwMiw0ICsxMDIsNiBAQAogCiAgICAgcHJpdmF0ZSBMaXN0PFVVSUQ+IHN0YXRpb25JZHM7CiAKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwdWJsaWNhdGlvbkNoYW5uZWxzOworCiB9CmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vdmlld21vZGVsL01haWxNZXNzYWdlRHRvLmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vdmlld21vZGVsL1JhYmJpdE1xTWVzc2FnZUR0by5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIGdmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi92aWV3bW9kZWwvTWFpbE1lc3NhZ2VEdG8uamF2YQpyZW5hbWUgdG8gZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9SYWJiaXRNcU1lc3NhZ2VEdG8uamF2YQppbmRleCBhNWVhOTNhLi44NmFmZjNkIDEwMDY0NAotLS0gYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vdmlld21vZGVsL01haWxNZXNzYWdlRHRvLmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3ZpZXdtb2RlbC9SYWJiaXRNcU1lc3NhZ2VEdG8uamF2YQpAQCAtMjQsMTUgKzI0LDE1IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIEBEYXRhCi1wdWJsaWMgY2xhc3MgTWFpbE1lc3NhZ2VEdG8gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworcHVibGljIGNsYXNzIFJhYmJpdE1xTWVzc2FnZUR0byBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICBwcml2YXRlIFN0cmluZyBtYWlsRGlzdHJpYnV0aW9uR3JvdXA7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzdHJpYnV0aW9uR3JvdXA7CiAKLSAgICBATm90TnVsbAogICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1haWxBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbW9iaWxlTnVtYmVyczsKIAogICAgIEBOb3ROdWxsCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFpbHRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgYm9keTsKIAogICAgIHByaXZhdGUgRmFpbHVyZUluZm9ybWF0aW9uRHRvIGZhaWx1cmVJbmZvcm1hdGlvbkR0bzsKIApkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbCBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwKaW5kZXggZjhkYmI3MC4uNjA0N2EzYSAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbAorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCkBAIC0yNywxNCArMjcsMjMgQEAKICAgICBmYWlsdXJlX2ltcG9ydF9xdWV1ZTogZmFpbHVyZUltcG9ydFF1ZXVlCiAgICAgZmFpbHVyZV9pbXBvcnRfcm91dGluZ2tleTogaW1wb3J0RXhjaGFuZ2UuZmFpbHVyZUltcG9ydEtleQogICAgIGV4cG9ydF9leGNoYW5nZTogZXhwb3J0RXhjaGFuZ2UKLSAgICBtYWlsX2V4cG9ydF9xdWV1ZTogbWFpbEV4cG9ydFF1ZXVlCi0gICAgbWFpbF9leHBvcnRfcm91dGluZ2tleTogbWFpbEV4cG9ydFF1ZXVlLm1haWxFeHBvcnRLZXkKKyAgICBjaGFubmVsczoKKyAgICAgIC0gbmFtZTogTUFJTAorICAgICAgICBleHBvcnRxdWV1ZTogbWFpbF9leHBvcnRfcXVldWVfdGVzdF9pbmEKKyAgICAgICAgZXhwb3J0a2V5OiBtYWlsX2V4cG9ydF9rZXlfdGVzdF9pbmEKKyAgICAgIC0gbmFtZTogU01TCisgICAgICAgIGV4cG9ydHF1ZXVlOiBzbXNfZXhwb3J0X3F1ZXVlX3Rlc3RfaW5hCisgICAgICAgIGV4cG9ydGtleTogc21zX2V4cG9ydF9rZXlfdGVzdF9pbmEKKyAgICAgIC0gbmFtZTogRkFYCisgICAgICAgIGV4cG9ydHF1ZXVlOiBmYXhfZXhwb3J0X3F1ZXVlX3Rlc3RfaW5hCisgICAgICAgIGV4cG9ydGtleTogZmF4X2V4cG9ydF9rZXlfdGVzdF9pbmEKKyAgICAgIC0gbmFtZTogWFkKKyAgICAgICAgZXhwb3J0cXVldWU6IHh5X2V4cG9ydF9xdWV1ZV90ZXN0X2luYQorICAgICAgICBleHBvcnRrZXk6IHh5X2V4cG9ydF9rZXlfdGVzdF9pbmEKICAgc2V0dGluZ3M6Ci0gICAgZXhwb3J0Q2hhbm5lbHM6IE1BSUwsIFNNUywgRkFYCiAgICAgb3ZlcnZpZXdNYXBJbml0aWFsWm9vbTogNgogICAgIGRldGFpbE1hcEluaXRpYWxab29tOiAxMwogCi0KIHNlcnZlcjoKICAgbWF4LWh0dHAtaGVhZGVyLXNpemU6IDI2MjE0NAogCkBAIC05NSw2ICsxMDQsOCBAQAogICAgIGxpc3RlbmVyOgogICAgICAgc2ltcGxlOgogICAgICAgICBhdXRvLXN0YXJ0dXA6IGZhbHNlCisKKwogICBqcGE6CiAgICAgaGliZXJuYXRlOgogICAgICAgZGRsLWF1dG86IGNyZWF0ZQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uX2xvY2FsZGV2LnltbCBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbl9sb2NhbGRldi55bWwKaW5kZXggMTU3MjQ5MC4uOTQwMGIwMCAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uX2xvY2FsZGV2LnltbAorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb25fbG9jYWxkZXYueW1sCkBAIC0yNywxMCArMjcsMjAgQEAKICAgICBmYWlsdXJlX2ltcG9ydF9xdWV1ZTogZmFpbHVyZUltcG9ydFF1ZXVlTG9jYWxEZXYKICAgICBmYWlsdXJlX2ltcG9ydF9yb3V0aW5na2V5OiBpbXBvcnRFeGNoYW5nZUxvY2FsRGV2LmZhaWx1cmVJbXBvcnRLZXlMb2NhbERldgogICAgIGV4cG9ydF9leGNoYW5nZTogZXhwb3J0RXhjaGFuZ2VMb2NhbERldgotICAgIG1haWxfZXhwb3J0X3F1ZXVlOiBtYWlsRXhwb3J0UXVldWVMb2NhbERldgotICAgIG1haWxfZXhwb3J0X3JvdXRpbmdrZXk6IG1haWxFeHBvcnRRdWV1ZUxvY2FsRGV2Lm1haWxFeHBvcnRLZXlMb2NhbERldgorICAgIGNoYW5uZWxzOgorICAgICAgLSBuYW1lOiBNQUlMCisgICAgICAgIGV4cG9ydHF1ZXVlOiBtYWlsX2V4cG9ydF9xdWV1ZV90ZXN0X2luYV9sb2NhbGRldgorICAgICAgICBleHBvcnRrZXk6IG1haWxfZXhwb3J0X2tleV90ZXN0X2luYV9sb2NhbGRldgorICAgICAgLSBuYW1lOiBTTVMKKyAgICAgICAgZXhwb3J0cXVldWU6IHNtc19leHBvcnRfcXVldWVfdGVzdF9pbmFfbG9jYWxkZXYKKyAgICAgICAgZXhwb3J0a2V5OiBzbXNfZXhwb3J0X2tleV90ZXN0X2luYV9sb2NhbGRldgorICAgICAgLSBuYW1lOiBGQVgKKyAgICAgICAgZXhwb3J0cXVldWU6IGZheF9leHBvcnRfcXVldWVfdGVzdF9pbmFfbG9jYWxkZXYKKyAgICAgICAgZXhwb3J0a2V5OiBmYXhfZXhwb3J0X2tleV90ZXN0X2luYV9sb2NhbGRldgorICAgICAgLSBuYW1lOiBYWQorICAgICAgICBleHBvcnRxdWV1ZTogeHlfZXhwb3J0X3F1ZXVlX3Rlc3RfaW5hX2xvY2FsZGV2CisgICAgICAgIGV4cG9ydGtleTogeHlfZXhwb3J0X2tleV90ZXN0X2luYV9sb2NhbGRldgogICBzZXR0aW5nczoKLSAgICBleHBvcnRDaGFubmVsczogTUFJTCwgU01TLCBGQVgKICAgICBvdmVydmlld01hcEluaXRpYWxab29tOiA2CiAgICAgZGV0YWlsTWFwSW5pdGlhbFpvb206IDEzCiAgIGpwYToKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9kYi9taWdyYXRpb24vVjBfWFhfX0NSRUFURV9HRklfREIuc3FsIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL21haW4vcmVzb3VyY2VzL2RiL21pZ3JhdGlvbi9WMF9YWF9fQ1JFQVRFX0dGSV9EQi5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhMTUzZQotLS0gL2Rldi9udWxsCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9kYi9taWdyYXRpb24vVjBfWFhfX0NSRUFURV9HRklfREIuc3FsCkBAIC0wLDAgKzEsODM5IEBACivvu78tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLS0gKiBDb3B5cmlnaHQgKGMpIDIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKy0tICoKKy0tICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorLS0gKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKy0tICoKKy0tICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCistLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKy0tICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorLS0gKgorLS0gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIENSRUFURSBST0xFIEdGSV9TRVJWSUNFIExPR0lOCistLSBOT1NVUEVSVVNFUiBJTkhFUklUIE5PQ1JFQVRFREIgTk9DUkVBVEVST0xFIE5PUkVQTElDQVRJT047CistLSBBTFRFUiBST0xFIEdGSV9TRVJWSUNFIHdpdGggcGFzc3dvcmQgJ2dmaV9zZXJ2aWNlJzsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlZFUlNJT04gQ0FTQ0FERTsKK0RST1AgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTiBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0lEX1NFUTsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlJFRl9TVEFUVVMgQ0FTQ0FERTsKK0RST1AgU0VRVUVOQ0UgSUYgRVhJU1RTIHB1YmxpYy5SRUZfU1RBVFVTX0lEX1NFUTsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlJFRl9CUkFOQ0ggQ0FTQ0FERTsKK0RST1AgU0VRVUVOQ0UgSUYgRVhJU1RTIHB1YmxpYy5SRUZfQlJBTkNIX0lEX1NFUTsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlJFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OIENBU0NBREU7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT05fSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuUkVGX0ZBSUxVUkVfVFlQRSBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlJFRl9GQUlMVVJFX1RZUEVfSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuUkVGX1JBRElVUyBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlJFRl9SQURJVVNfSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuUkVGX0VYUEVDVEVEX1JFQVNPTiBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlJFRl9FWFBFQ1RFRF9SRUFTT05fSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0lNUE9SVF9EQVRBIENBU0NBREU7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0lNUE9SVF9EQVRBX0lEX1NFUTsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlRCTF9ESVNUUklCVVRJT05fR1JPVVBfTUVNQkVSIENBU0NBREU7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUF9NRU1CRVJfSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUCBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlRCTF9ESVNUUklCVVRJT05fR1JPVVBfSURfU0VROworCitEUk9QIFRBQkxFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fRElTVFJJQlVUSU9OX0dST1VQIENBU0NBREU7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fRElTVFJJQlVUSU9OX0dST1VQX0lEX1NFUTsKKworRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX1BVQkxJQ0FUSU9OX0NIQU5ORUw7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fUFVCTElDQVRJT05fQ0hBTk5FTF9TRVEKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBWRVJTSU9OCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NSRUFURSBUQUJMRSBwdWJsaWMuVkVSU0lPTgorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMLAorICBWRVJTSU9OIGNoYXJhY3RlciB2YXJ5aW5nKDUwKSBOT1QgTlVMTCwKKyAgQ09OU1RSQUlOVCBSRUZfVkVSU0lPTl9QS0VZIFBSSU1BUlkgS0VZIChpZCkKKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy5WRVJTSU9OCisgIE9XTkVSIFRPIEdGSV9TRVJWSUNFOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy5WRVJTSU9OIFRPIEdGSV9TRVJWSUNFOworCitJTlNFUlQgSU5UTyBwdWJsaWMuVkVSU0lPTiAoSUQsIFZFUlNJT04pIFZBTFVFUyAoIDEsICcwMC1ERVYnICk7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEFCTEUgUkVGX1NUQVRVUworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLnJlZl9zdGF0dXNfaWRfc2VxCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CitBTFRFUiBUQUJMRSBwdWJsaWMucmVmX3N0YXR1c19pZF9zZXEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKK0NSRUFURSBUQUJMRSBwdWJsaWMuUkVGX1NUQVRVUworKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMICBERUZBVUxUIG5leHR2YWwoJ1JFRl9TVEFUVVNfSURfU0VRJzo6cmVnY2xhc3MpLAorICBVVUlEIHV1aWQgTk9UIE5VTEwsCisgIFNUQVRVUyBjaGFyYWN0ZXIgdmFyeWluZyg1MCkgTk9UIE5VTEwsCisgIElTX0lOVEVSTkFMIGJvb2xlYW4gTk9UIE5VTEwsCisgIElTX0VYVEVSTkFMIGJvb2xlYW4gTk9UIE5VTEwsCisgIENPTlNUUkFJTlQgUkVGX1NUQVRVU19QS0VZIFBSSU1BUlkgS0VZIChpZCkKKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy5SRUZfU1RBVFVTCisgIE9XTkVSIFRPIEdGSV9TRVJWSUNFOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy5SRUZfU1RBVFVTIFRPIEdGSV9TRVJWSUNFOworCitJTlNFUlQgSU5UTyBwdWJsaWMuUkVGX1NUQVRVUyAoSUQsIFVVSUQsIFNUQVRVUywgSVNfSU5URVJOQUwsIElTX0VYVEVSTkFMKSBWQUxVRVMgKDEsICdhY2FiYzhmNi0yY2YzLTQ4NWEtYTRmOC02OGQxNzhjN2RmNDUnLCAnbmV1JywgVFJVRSwgRkFMU0UgKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfU1RBVFVTIChJRCwgVVVJRCwgU1RBVFVTLCBJU19JTlRFUk5BTCwgSVNfRVhURVJOQUwpIFZBTFVFUyAoMiwgJ2YyZTQ0ZGM1LWQzMGMtNDEyOC04NmJiLWQzZDVmYzc2NmI2MScsICdnZXBsYW50JywgVFJVRSwgVFJVRSApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9TVEFUVVMgKElELCBVVUlELCBTVEFUVVMsIElTX0lOVEVSTkFMLCBJU19FWFRFUk5BTCkgVkFMVUVTICgzLCAnMjNmYzAyNTQtY2MzZC00MzcxLTk3YWQtNTRlZjczMzAwOGFlJywgJ2FuZ2VsZWd0JywgVFJVRSwgRkFMU0UgKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfU1RBVFVTIChJRCwgVVVJRCwgU1RBVFVTLCBJU19JTlRFUk5BTCwgSVNfRVhURVJOQUwpIFZBTFVFUyAoNCwgJzc0YTRjYTc4LTcyNjgtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsICdzdG9ybmllcnQnLCBUUlVFLCBGQUxTRSApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9TVEFUVVMgKElELCBVVUlELCBTVEFUVVMsIElTX0lOVEVSTkFMLCBJU19FWFRFUk5BTCkgVkFMVUVTICg1LCAnNzI2NGU1NzItZWFlOS00Y2NhLWJlMDUtYWY2YjBkMDgxMjQ3JywgJ3F1YWxpZml6aWVydCcsIFRSVUUsIEZBTFNFICk7CitJTlNFUlQgSU5UTyBwdWJsaWMuUkVGX1NUQVRVUyAoSUQsIFVVSUQsIFNUQVRVUywgSVNfSU5URVJOQUwsIElTX0VYVEVSTkFMKSBWQUxVRVMgKDYsICc5Mzc0MjE5YS03NDE5LTRiNzItODk5ZC1jZDA1NzZkODVjZGInLCAnYWt0dWFsaXNpZXJ0JywgVFJVRSwgVFJVRSApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9TVEFUVVMgKElELCBVVUlELCBTVEFUVVMsIElTX0lOVEVSTkFMLCBJU19FWFRFUk5BTCkgVkFMVUVTICg3LCAnOGMzMzMzNDUtNWMzYy00MWVkLTlkZTQtMzIzMDQ1ZjY0MjU5JywgJ2FiZ2VzY2hsb3NzZW4nLCBUUlVFLCBUUlVFICk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBSRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLnJlZl9mYWlsdXJlX2NsYXNzaWZpY2F0aW9uX2lkX3NlcQorICBJTkNSRU1FTlQgMQorICBNSU5WQUxVRSAxCisgIE1BWFZBTFVFIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyAgU1RBUlQgMQorICBDQUNIRSAxOworQUxURVIgVEFCTEUgcHVibGljLnJlZl9mYWlsdXJlX2NsYXNzaWZpY2F0aW9uX2lkX3NlcQorICBPV05FUiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5SRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTgorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMICBERUZBVUxUIG5leHR2YWwoJ1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBDTEFTU0lGSUNBVElPTiBjaGFyYWN0ZXIgdmFyeWluZyg1MCkgTk9UIE5VTEwsCisgIERFU0NSSVBUSU9OIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSkgTlVMTCwKKyAgQ09OU1RSQUlOVCBSRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTl9QS0VZIFBSSU1BUlkgS0VZIChpZCkKKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy5SRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTgorICBPV05FUiBUTyBHRklfU0VSVklDRTsKK0dSQU5UIEFMTCBPTiBUQUJMRSBwdWJsaWMuUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04gVE8gR0ZJX1NFUlZJQ0U7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTiAoVVVJRCwgQ0xBU1NJRklDQVRJT04sIERFU0NSSVBUSU9OKSBWQUxVRVMgKCAnOTI1NWZiNzktYzU3YS00NDQ4LWE2OWMtNWQ1Nzk5NGYwYzkxJywgJ1N0w7ZydW5nJywgTlVMTCApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OIChVVUlELCBDTEFTU0lGSUNBVElPTiwgREVTQ1JJUFRJT04pIFZBTFVFUyAoICc4ZWMxZTE0NC01MjMwLTRkNDMtYTNkZi1mNjJkZDY0YmI4NTUnLCAnZ2VwbGFudGUgTWHDn25haG1lJywgTlVMTCApOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEFCTEUgUkVGX0ZBSUxVUkVfVFlQRQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLnJlZl9mYWlsdXJlX3R5cGVfaWRfc2VxCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CitBTFRFUiBUQUJMRSBwdWJsaWMucmVmX2ZhaWx1cmVfdHlwZV9pZF9zZXEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKK0NSRUFURSBUQUJMRSBwdWJsaWMuUkVGX0ZBSUxVUkVfVFlQRQorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMIERFRkFVTFQgbmV4dHZhbCgnUkVGX0ZBSUxVUkVfVFlQRV9JRF9TRVEnOjpyZWdjbGFzcyksCisgIFVVSUQgdXVpZCBOT1QgTlVMTCwKKyAgVFlQRSBjaGFyYWN0ZXIgdmFyeWluZyg1MCkgTk9UIE5VTEwsCisgIERFU0NSSVBUSU9OIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSkgTlVMTCwKKyAgQ09OU1RSQUlOVCBSRUZfRkFJTFVSRV9UWVBFX1BLRVkgUFJJTUFSWSBLRVkgKGlkKQorKTsKKworQUxURVIgVEFCTEUgcHVibGljLlJFRl9GQUlMVVJFX1RZUEUKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CitHUkFOVCBBTEwgT04gVEFCTEUgcHVibGljLlJFRl9GQUlMVVJFX1RZUEUgVE8gR0ZJX1NFUlZJQ0U7CisKKworSU5TRVJUIElOVE8gcHVibGljLlJFRl9GQUlMVVJFX1RZUEUgKFVVSUQsIFRZUEUsIERFU0NSSVBUSU9OKSBWQUxVRVMgKCAnNDRhMmFhZWQtODkxMC00MTE2LWIwYzQtMDg1NWY4ZDNjMjhkJywgJ0luZm9ybWF0aW9uJywgTlVMTCApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9GQUlMVVJFX1RZUEUgKFVVSUQsIFRZUEUsIERFU0NSSVBUSU9OKSBWQUxVRVMgKCAnOTRlODgwYzQtMzEyNy00N2Q1LWFhZWUtNWY3Nzg0NjJhYjBjJywgJ3p1IHZlcsO2ZmZlbnRsaWNoZW5kZSBNZWxkdW5nJywgJ1N0YW5kYXJkd2VydCcgKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfRkFJTFVSRV9UWVBFIChVVUlELCBUWVBFLCBERVNDUklQVElPTikgVkFMVUVTICggJzY1ODI0NWJkLWJkYzQtNDdkZC1iYzkwLTAzMzZmOTQ3MTQxMCcsICd1bnRlcmxhZ2VydGUgU3TDtnJ1bmcnLCAnbmljaHQgenUgdmVyw7ZmZmVudGxpY2hlbicgKTsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBSRUZfQlJBTkNICistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NSRUFURSBTRVFVRU5DRSBwdWJsaWMucmVmX2JyYW5jaF9pZF9zZXEKKyAgSU5DUkVNRU5UIDEKKyAgTUlOVkFMVUUgMQorICBNQVhWQUxVRSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisgIFNUQVJUIDEKKyAgQ0FDSEUgMTsKK0FMVEVSIFRBQkxFIHB1YmxpYy5yZWZfYnJhbmNoX2lkX3NlcQorICBPV05FUiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5SRUZfQlJBTkNICisoCisgIElEIGludGVnZXIgTk9UIE5VTEwgREVGQVVMVCBuZXh0dmFsKCdSRUZfQlJBTkNIX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBOQU1FIGNoYXJhY3RlciB2YXJ5aW5nKDUwKSBOT1QgTlVMTCwKKyAgREVTQ1JJUFRJT04gY2hhcmFjdGVyIHZhcnlpbmcoMjU1KSwKKyAgQ09MT1JfQ09ERSBjaGFyYWN0ZXIgdmFyeWluZygyMCksCisgIENPTlNUUkFJTlQgUkVGX0JSQU5DSF9QS0VZIFBSSU1BUlkgS0VZIChpZCkKKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy5SRUZfQlJBTkNICisgIE9XTkVSIFRPIEdGSV9TRVJWSUNFOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy5SRUZfQlJBTkNIIFRPIEdGSV9TRVJWSUNFOworCitJTlNFUlQgSU5UTyBwdWJsaWMucmVmX2JyYW5jaCh1dWlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgY29sb3JfY29kZSkgVkFMVUVTICgnNTM1YjRiZWItOWIxNy00MjQ3LWJiOGItMjZiZDAxYjQ4ZjlhJywgJ1MnLCAnU3Ryb20nLCAnI2ZjNjA0MicpOworSU5TRVJUIElOVE8gcHVibGljLnJlZl9icmFuY2godXVpZCwgbmFtZSwgZGVzY3JpcHRpb24sIGNvbG9yX2NvZGUpIFZBTFVFUyAoJ2Q0MWY1NGU1LWM0ZGYtNDQwZS1iMzM0LTQwZThmM2E2ODU0YScsICdHJywgJ0dhcycsICcjZmRlYTY0Jyk7CitJTlNFUlQgSU5UTyBwdWJsaWMucmVmX2JyYW5jaCh1dWlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgY29sb3JfY29kZSkgVkFMVUVTICgnNjJjNmQzNjEtOTZhMC00MWNjLWJkYTEtNGU1OGFkMTZmMjFhJywgJ0YnLCAnRmVybnfDpHJtZScsICcjMmNjOTkwJyk7CitJTlNFUlQgSU5UTyBwdWJsaWMucmVmX2JyYW5jaCh1dWlkLCBuYW1lLCBkZXNjcmlwdGlvbiwgY29sb3JfY29kZSkgVkFMVUVTICgnZDhkOTNlMGUtNWM4Yy00YWI4LTk2MjUtZjgyMGRlNTVlZTdjJywgJ1cnLCAnV2Fzc2VyJywgJyMyYzgyYzknKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5yZWZfYnJhbmNoKHV1aWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBjb2xvcl9jb2RlKSBWQUxVRVMgKCc3ZDQ5MDdmYi1jYjNmLTRhNGYtOTNlOS04MzkwNTJlNzY4OTQnLCAnVEsnLCAnVGVsZWtvbW11bmlrYXRpb24nLCAnI2ZmMzNjYycpOworSU5TRVJUIElOVE8gcHVibGljLnJlZl9icmFuY2godXVpZCwgbmFtZSwgZGVzY3JpcHRpb24sIGNvbG9yX2NvZGUpIFZBTFVFUyAoJzAxNGM0YTJhLTNjZjEtNGQyOC1hZjcwLTQ1NzM3MjJiY2ViMCcsICdTVCcsICdTZWt1bmTDpHJ0ZWNobmlrJywgJyM5OTMzZmYnKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5yZWZfYnJhbmNoKHV1aWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBjb2xvcl9jb2RlKSBWQUxVRVMgKCc4ZmIzYzc2NC04ZmI1LTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAnT1MnLCAnb2huZSBTcGFydGUnLCAnI2ZmZmZmZicpOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEFCTEUgUkVGX0VYUEVDVEVEX1JFQVNPTgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLnJlZl9leHBlY3RlZF9yZWFzb25faWRfc2VxCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CitBTFRFUiBUQUJMRSBwdWJsaWMucmVmX2V4cGVjdGVkX3JlYXNvbl9pZF9zZXEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKK0NSRUFURSBUQUJMRSBwdWJsaWMuUkVGX0VYUEVDVEVEX1JFQVNPTgorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMIERFRkFVTFQgbmV4dHZhbCgnUkVGX0VYUEVDVEVEX1JFQVNPTl9JRF9TRVEnOjpyZWdjbGFzcyksCisgIFVVSUQgdXVpZCBOT1QgTlVMTCwKKyAgVEVYVCBjaGFyYWN0ZXIgdmFyeWluZygxMDApIE5PVCBOVUxMLAorICBERVNDUklQVElPTiBjaGFyYWN0ZXIgdmFyeWluZygyNTUpIE5VTEwsCisgIEJSQU5DSEVTIGNoYXJhY3RlciB2YXJ5aW5nKDEwMCkgTk9UIE5VTEwsCisgIENPTlNUUkFJTlQgUkVGX0VYUEVDVEVEX1JFQVNPTl9QS0VZIFBSSU1BUlkgS0VZIChpZCkKKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy5SRUZfRVhQRUNURURfUkVBU09OCisgIE9XTkVSIFRPIEdGSV9TRVJWSUNFOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy5SRUZfRVhQRUNURURfUkVBU09OIFRPIEdGSV9TRVJWSUNFOworCitJTlNFUlQgSU5UTyBwdWJsaWMucmVmX2V4cGVjdGVkX3JlYXNvbih1dWlkLCB0ZXh0LCBkZXNjcmlwdGlvbiwgYnJhbmNoZXMpIFZBTFVFUyAoJzI3YTA3OTE4LTZhYTAtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsICdEZWZla3QgdGVjaG5pc2NoZSBBbmxhZ2UnLCAnRGllcyBpc3QgZGllIEJlc2NocmVpYnVuZyBmw7xyOiBEZWZla3QgdGVjaG5pc2NoZSBBbmxhZ2UnLCAnUyxHLFcsRixPUycpOworSU5TRVJUIElOVE8gcHVibGljLnJlZl9leHBlY3RlZF9yZWFzb24odXVpZCwgdGV4dCwgZGVzY3JpcHRpb24sIGJyYW5jaGVzKSBWQUxVRVMgKCcyN2EwN2M0Mi02YWEwLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAnS2FiZWxmZWhsZXIgTWl0dGVsc3Bhbm51bmcnLCAnRGllcyBpc3QgZGllIEJlc2NocmVpYnVuZyBmw7xyOiBLYWJlbGZlaGxlciBNaXR0ZWxzcGFubnVuZycsICdTJyk7CitJTlNFUlQgSU5UTyBwdWJsaWMucmVmX2V4cGVjdGVkX3JlYXNvbih1dWlkLCB0ZXh0LCBkZXNjcmlwdGlvbiwgYnJhbmNoZXMpIFZBTFVFUyAoJzI3YTA3ZDUwLTZhYTAtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsICdLYWJlbGZlaGxlciBOaWVkZXJzcGFubnVuZycsICdEaWVzIGlzdCBkaWUgQmVzY2hyZWlidW5nIGbDvHI6IEthYmVsZmVobGVyIE5pZWRlcnNwYW5udW5nJywgJ1MnKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5yZWZfZXhwZWN0ZWRfcmVhc29uKHV1aWQsIHRleHQsIGRlc2NyaXB0aW9uLCBicmFuY2hlcykgVkFMVUVTICgnMjdhMDdlMjItNmFhMC0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgJ0xlaXR1bmcgYmVzY2jDpGRpZ3QnLCAnRGllcyBpc3QgZGllIEJlc2NocmVpYnVuZyBmw7xyOiBMZWl0dW5nIGJlc2Now6RkaWd0JywgJ1MsRyxXLEYnKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5yZWZfZXhwZWN0ZWRfcmVhc29uKHV1aWQsIHRleHQsIGRlc2NyaXB0aW9uLCBicmFuY2hlcykgVkFMVUVTICgnMjdhMDdlZWEtNmFhMC0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgJ25vY2ggbmljaHQgYmVrYW5udCcsICdEaWVzIGlzdCBkaWUgQmVzY2hyZWlidW5nIGbDvHI6IG5vY2ggbmljaHQgYmVrYW5udCcsICdHLFcsVEssU1QsRixPUycpOworSU5TRVJUIElOVE8gcHVibGljLnJlZl9leHBlY3RlZF9yZWFzb24odXVpZCwgdGV4dCwgZGVzY3JpcHRpb24sIGJyYW5jaGVzKSBWQUxVRVMgKCcyN2EwN2ZiYy02YWEwLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAnV2Fzc2Vycm9ocmJydWNoJywgJ0RpZXMgaXN0IGRpZSBCZXNjaHJlaWJ1bmcgZsO8cjogV2Fzc2Vycm9ocmJydWNoJywgJ1cnKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5yZWZfZXhwZWN0ZWRfcmVhc29uKHV1aWQsIHRleHQsIGRlc2NyaXB0aW9uLCBicmFuY2hlcykgVkFMVUVTICgnMjdhMDgxNjAtNmFhMC0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgJ8OcYmVycmVnaW9uYWxlIFN0w7ZydW5nJywgJ0RpZXMgaXN0IGRpZSBCZXNjaHJlaWJ1bmcgZsO8cjogw5xiZXJyZWdpb25hbGUgU3TDtnJ1bmcnLCAnUyxHLFcsVEssU1QnKTsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBSRUZfUkFESVVTCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NSRUFURSBTRVFVRU5DRSBwdWJsaWMucmVmX3JhZGl1c19pZF9zZXEKKyAgSU5DUkVNRU5UIDEKKyAgTUlOVkFMVUUgMQorICBNQVhWQUxVRSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisgIFNUQVJUIDEKKyAgQ0FDSEUgMTsKK0FMVEVSIFRBQkxFIHB1YmxpYy5yZWZfcmFkaXVzX2lkX3NlcQorICBPV05FUiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5SRUZfUkFESVVTCisoCisgIElEIGludGVnZXIgTk9UIE5VTEwgREVGQVVMVCBuZXh0dmFsKCdSRUZfUkFESVVTX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBSQURJVVMgaW50ZWdlciBOT1QgTlVMTCwKKyAgQ09OU1RSQUlOVCBSRUZfUkFESVVTX1BLRVkgUFJJTUFSWSBLRVkgKGlkKQorKTsKKworQUxURVIgVEFCTEUgcHVibGljLlJFRl9SQURJVVMKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CitHUkFOVCBBTEwgT04gVEFCTEUgcHVibGljLlJFRl9SQURJVVMgVE8gR0ZJX1NFUlZJQ0U7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfUkFESVVTKHV1aWQsIHJhZGl1cykgVkFMVUVTICgnZTY0MzliNDktY2U1YS00ODZlLWE0MzctYjM2MmVjNzNkYzQ0JywgMCk7CitJTlNFUlQgSU5UTyBwdWJsaWMuUkVGX1JBRElVUyh1dWlkLCByYWRpdXMpIFZBTFVFUyAoJzM2NjcxMDAwLTZhYTYtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsIDUwKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfUkFESVVTKHV1aWQsIHJhZGl1cykgVkFMVUVTICgnMzY2NzEyYTgtNmFhNi0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgMTAwKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfUkFESVVTKHV1aWQsIHJhZGl1cykgVkFMVUVTICgnMzY2NzEzYzAtNmFhNi0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgMjUwKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfUkFESVVTKHV1aWQsIHJhZGl1cykgVkFMVUVTICgnMzY2NzE1MGEtNmFhNi0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgNTAwKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy5SRUZfUkFESVVTKHV1aWQsIHJhZGl1cykgVkFMVUVTICgnMzY2NzE3ODAtNmFhNi0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgMTAwMCk7CitJTlNFUlQgSU5UTyBwdWJsaWMuUkVGX1JBRElVUyh1dWlkLCByYWRpdXMpIFZBTFVFUyAoJzM2NjcxODdhLTZhYTYtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsIDE1MDApOworSU5TRVJUIElOVE8gcHVibGljLlJFRl9SQURJVVModXVpZCwgcmFkaXVzKSBWQUxVRVMgKCczNjY3MWFkMi02YWE2LTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAyMDAwKTsKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uX2lkX3NlcQorICBJTkNSRU1FTlQgMQorICBNSU5WQUxVRSAxCisgIE1BWFZBTFVFIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyAgU1RBUlQgMQorICBDQUNIRSAxOworQUxURVIgVEFCTEUgcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uX2lkX3NlcQorICBPV05FUiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTgorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMIERFRkFVTFQgbmV4dHZhbCgnVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fSURfU0VRJzo6cmVnY2xhc3MpLAorICBVVUlEIHV1aWQgTk9UIE5VTEwsCisgIFZFUlNJT05fTlVNQkVSIGludGVnZXIgTk9UIE5VTEwsCisgIEZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OIGludGVnZXIsCisgIEZLX1JFRl9GQUlMVVJFX1RZUEUgaW50ZWdlciwKKyAgVElUTEUgY2hhcmFjdGVyIHZhcnlpbmcoMjU1KSBOVUxMLAorICBERVNDUklQVElPTiBjaGFyYWN0ZXIgdmFyeWluZygyNTUpIE5VTEwsCisgIFJFU1BPTlNJQklMSVRZIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksCisgIElOVEVSTl9FWFRFUk4gY2hhcmFjdGVyIHZhcnlpbmcoMSksCisgIEZLX1JFRl9TVEFUVVNfSU5URVJOIGludGVnZXIgTk9UIE5VTEwsCisgIEZLX1JFRl9TVEFUVVNfRVhURVJOIGludGVnZXIgTk9UIE5VTEwsCisgIEZLX1JFRl9CUkFOQ0ggaW50ZWdlciBOT1QgTlVMTCwKKyAgVk9MVEFHRV9MRVZFTCBjaGFyYWN0ZXIgdmFyeWluZygyKSwKKyAgUFJFU1NVUkVfTEVWRUwgY2hhcmFjdGVyIHZhcnlpbmcoMiksCisgIEZBSUxVUkVfQkVHSU4gdGltZXN0YW1wIE5PVCBOVUxMLAorICBGQUlMVVJFX0VORF9QTEFOTkVEIHRpbWVzdGFtcCwKKyAgRkFJTFVSRV9FTkRfUkVTVVBQTElFRCB0aW1lc3RhbXAsCisgIElOVEVSTkFMX1JFTUFSSyBjaGFyYWN0ZXIgdmFyeWluZygxMDI0KSwKKyAgUE9TVENPREUgY2hhcmFjdGVyIHZhcnlpbmcoMzApLAorICBDSVRZIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksCisgIERJU1RSSUNUIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksCisgIFNUUkVFVCBjaGFyYWN0ZXIgdmFyeWluZygyNTUpLAorICBIT1VTRU5VTUJFUiBjaGFyYWN0ZXIgdmFyeWluZygzMCksCisgIFNUQVRJT05fSUQgY2hhcmFjdGVyIHZhcnlpbmcgKDMwKSwKKyAgU1RBVElPTl9ERVNDUklQVElPTiBjaGFyYWN0ZXIgdmFyeWluZyAoMjU1KSwKKyAgU1RBVElPTl9DT09SRFMgY2hhcmFjdGVyIHZhcnlpbmcgKDI1NSksCisgIEZLX1JFRl9SQURJVVMgaW50ZWdlciwKKyAgTE9OR0lUVURFIG51bWVyaWMoOSw2KSwKKyAgTEFUSVRVREUgbnVtZXJpYyg5LDYpLAorICBGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQgaW50ZWdlciwKKyAgQ09OREVOU0VEIGJvb2xlYW4sCisgIENPTkRFTlNFRF9DT1VOVCBpbnRlZ2VyLAorICBPQkpFQ1RfUkVGRVJFTkNFX0VYVEVSTkFMX1NZU1RFTSBjaGFyYWN0ZXIgdmFyeWluZyAoMjU1KSwKKyAgUFVCTElDQVRJT05fU1RBVFVTIGNoYXJhY3RlciB2YXJ5aW5nICg0MCksCisgIFBVQkxJQ0FUSU9OX0ZSRUVURVhUIGNoYXJhY3RlciB2YXJ5aW5nICgxMDI0KSwKKyAgRktfUkVGX0VYUEVDVEVEX1JFQVNPTiBpbnRlZ2VyLAorICBDUkVBVEVfREFURSB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmUgTk9UIE5VTEwsCisgIENSRUFURV9VU0VSIGNoYXJhY3RlciB2YXJ5aW5nKDEwMCkgTk9UIE5VTEwsCisgIE1PRF9EQVRFIHRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZSBOT1QgTlVMTCwKKyAgTU9EX1VTRVIgY2hhcmFjdGVyIHZhcnlpbmcoMTAwKSwKKyAgQ09OU1RSQUlOVCBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9QS0VZIFBSSU1BUlkgS0VZIChpZCksCisgICAgQ09OU1RSQUlOVCBUQkxfRkFJTF9JTkZfX0ZDTEFTU19GS0VZIEZPUkVJR04gS0VZIChGS19SRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTikKKyAgICAgICAgICAgUkVGRVJFTkNFUyBwdWJsaWMuUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04gKElEKSBNQVRDSCBTSU1QTEUKKyAgICAgICAgICAgT04gVVBEQVRFIE5PIEFDVElPTiBPTiBERUxFVEUgTk8gQUNUSU9OLAorICAgIENPTlNUUkFJTlQgVEJMX0ZBSUxfSU5GX0ZUWVBFX0ZLRVkgRk9SRUlHTiBLRVkgKEZLX1JFRl9GQUlMVVJFX1RZUEUpCisgICAgICAgICAgIFJFRkVSRU5DRVMgcHVibGljLlJFRl9GQUlMVVJFX1RZUEUgKElEKSBNQVRDSCBTSU1QTEUKKyAgICAgICAgICAgT04gVVBEQVRFIE5PIEFDVElPTiBPTiBERUxFVEUgTk8gQUNUSU9OLAorICAgIENPTlNUUkFJTlQgVEJMX0ZBSUxfSU5GX1NUQVRVU0lOVF9GS0VZIEZPUkVJR04gS0VZIChGS19SRUZfU1RBVFVTX0lOVEVSTikKKyAgICAgICAgICAgUkVGRVJFTkNFUyBwdWJsaWMuUkVGX1NUQVRVUyAoSUQpIE1BVENIIFNJTVBMRQorICAgICAgICAgICBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBOTyBBQ1RJT04sCisgICAgQ09OU1RSQUlOVCBUQkxfRkFJTF9JTkZfX1NUQVRVU0VYVF9GS0VZIEZPUkVJR04gS0VZIChGS19SRUZfU1RBVFVTX0VYVEVSTikKKyAgICAgICAgICAgUkVGRVJFTkNFUyBwdWJsaWMuUkVGX1NUQVRVUyAoSUQpIE1BVENIIFNJTVBMRQorICAgICAgICAgICBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBOTyBBQ1RJT04sCisgICAgQ09OU1RSQUlOVCBUQkxfRkFJTF9JTkZfX0JSQU5DSF9JRF9GS0VZIEZPUkVJR04gS0VZIChGS19SRUZfQlJBTkNIKQorICAgICAgICAgICBSRUZFUkVOQ0VTIHB1YmxpYy5SRUZfQlJBTkNIIChJRCkgTUFUQ0ggU0lNUExFCisgICAgICAgICAgIE9OIFVQREFURSBOTyBBQ1RJT04gT04gREVMRVRFIE5PIEFDVElPTiwKKyAgICBDT05TVFJBSU5UIFRCTF9GQUlMX0lORl9fRVhQUkVBU09OX0ZLRVkgRk9SRUlHTiBLRVkgKEZLX1JFRl9FWFBFQ1RFRF9SRUFTT04pCisgICAgICAgICAgIFJFRkVSRU5DRVMgcHVibGljLlJFRl9FWFBFQ1RFRF9SRUFTT04gKElEKSBNQVRDSCBTSU1QTEUKKyAgICAgICAgICAgT04gVVBEQVRFIE5PIEFDVElPTiBPTiBERUxFVEUgTk8gQUNUSU9OCispOworCitBTFRFUiBUQUJMRSBwdWJsaWMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04KKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CitHUkFOVCBBTEwgT04gVEFCTEUgcHVibGljLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OIFRPIEdGSV9TRVJWSUNFOworCitJTlNFUlQgSU5UTyBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb24oVVVJRCwgVkVSU0lPTl9OVU1CRVIsIEZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLCBGS19SRUZfRkFJTFVSRV9UWVBFLCBUSVRMRSwgREVTQ1JJUFRJT04sICBSRVNQT05TSUJJTElUWSwgSU5URVJOX0VYVEVSTiwgRktfUkVGX1NUQVRVU19JTlRFUk4sIEZLX1JFRl9TVEFUVVNfRVhURVJOLCBGS19SRUZfQlJBTkNILCBWT0xUQUdFX0xFVkVMLCBQUkVTU1VSRV9MRVZFTCwgRkFJTFVSRV9CRUdJTiwgRkFJTFVSRV9FTkRfUExBTk5FRCwgRkFJTFVSRV9FTkRfUkVTVVBQTElFRCwgSU5URVJOQUxfUkVNQVJLLCBQT1NUQ09ERSwgQ0lUWSwgRElTVFJJQ1QsIFNUUkVFVCwgSE9VU0VOVU1CRVIsIFNUQVRJT05fSUQsIFNUQVRJT05fREVTQ1JJUFRJT04sIFNUQVRJT05fQ09PUkRTLCBGS19SRUZfUkFESVVTLCBMT05HSVRVREUsIExBVElUVURFLCBPQkpFQ1RfUkVGRVJFTkNFX0VYVEVSTkFMX1NZU1RFTSwgUFVCTElDQVRJT05fU1RBVFVTLCBQVUJMSUNBVElPTl9GUkVFVEVYVCwgRktfUkVGX0VYUEVDVEVEX1JFQVNPTiwgQ09OREVOU0VELCBDT05ERU5TRURfQ09VTlQsIEZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OX0NPTkRFTlNFRCwgQ1JFQVRFX0RBVEUsIENSRUFURV9VU0VSLCBNT0RfREFURSwgTU9EX1VTRVIpCitWQUxVRVMgKCc2NDMyYTljOS0wMzg0LTQ0YWYtOWJiOC0zNGYyODc4ZDdiNDknLDMsIDEsIDEsICdTdHJvbWF1c2ZhbGwgTXVycicsICdFcyBnaWJ0IGVpbmVuIFN0cm9tYXVzZmFsbCBpbSBCZXJlaWNoIE11cnIvV2VzdGJlemlyaycsICdSb2xmIFJ1ZGlzJywgJ0knLCAxLCAxLCAxLCAnTlMnLCBudWxsLCAnMjAyMS0wMS0xOSAwMDowMDowMCcsICcyMDIxLTAxLTIyIDAwOjAwOjAwJywgJzIwMjEtMDEtMjIgMTI6MDA6MDAnLCAgJ0RlciBCYWdnZXIgZ3J1YiB6dSB0aWVmJywgJzcxNzExJywgJ011cnInLCAnV2VzdGJlemlyaycsICdGZXJkaW5hbmQtUG9yc2NoZS1TdHJhw59lJywgJzInLCAnNTI4NjNhJywgJ1RyYWZvIDEnLCAnMTI0LDIzMjMnLCAyLCA5LjI0Nzk1MiwgNDguOTU1NzAwLCAnTGluayAtIGV4dGVuZXMgU3lzdGVtJywgJ3ZlcsO2ZmZlbnRsaWNodCcsICdGcmVpdGV4dCBmw7xyIGRpZSBWZXLDtmZmZW50bGljaHVuZzogRGVmZWt0IGFuIFRyYWZvc3RhdGlvbicsIDEsIGZhbHNlLCAwLCBudWxsLCAnMjAyMC0wMS0yMiAxNTozMjoxNScsICdTQ1JJUFQnLCAnMjAyMC0wMS0yNCAwODowMjo0NCcsICdTQ1JJUFQnKTsKKworSU5TRVJUIElOVE8gcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uKFVVSUQsIFZFUlNJT05fTlVNQkVSLCBGS19SRUZfRkFJTFVSRV9DTEFTU0lGSUNBVElPTiwgRktfUkVGX0ZBSUxVUkVfVFlQRSwgVElUTEUsIERFU0NSSVBUSU9OLCAgUkVTUE9OU0lCSUxJVFksIElOVEVSTl9FWFRFUk4sIEZLX1JFRl9TVEFUVVNfSU5URVJOLCBGS19SRUZfU1RBVFVTX0VYVEVSTiwgRktfUkVGX0JSQU5DSCwgVk9MVEFHRV9MRVZFTCwgUFJFU1NVUkVfTEVWRUwsIEZBSUxVUkVfQkVHSU4sIEZBSUxVUkVfRU5EX1BMQU5ORUQsIEZBSUxVUkVfRU5EX1JFU1VQUExJRUQsIElOVEVSTkFMX1JFTUFSSywgUE9TVENPREUsIENJVFksIERJU1RSSUNULCBTVFJFRVQsIEhPVVNFTlVNQkVSLCBTVEFUSU9OX0lELCBTVEFUSU9OX0RFU0NSSVBUSU9OLCBTVEFUSU9OX0NPT1JEUywgRktfUkVGX1JBRElVUywgTE9OR0lUVURFLCBMQVRJVFVERSwgT0JKRUNUX1JFRkVSRU5DRV9FWFRFUk5BTF9TWVNURU0sIFBVQkxJQ0FUSU9OX1NUQVRVUywgUFVCTElDQVRJT05fRlJFRVRFWFQsIEZLX1JFRl9FWFBFQ1RFRF9SRUFTT04sIENPTkRFTlNFRCwgQ09OREVOU0VEX0NPVU5ULCBGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQsIENSRUFURV9EQVRFLCBDUkVBVEVfVVNFUiwgTU9EX0RBVEUsIE1PRF9VU0VSKQorVkFMVUVTICgnMzdhZWY2MzUtZDBkNC00YzQ3LWFjMjUtYzBkMTZjMjllMzVjJywgMSwgMiwgMiwgJ0dhc2xlY2sgT2xkZW5idXJnJywgJ0VzIGdpYnQgZWluIEdhc2xlY2sgaW4gT2xkZW5idXJnJywgJ0Jlcm5kIEJyaXR6ZWwnLCAnRScsIDIsIDIsIDMsICdOUycsICdIRCcsICcyMDIxLTA1LTE5IDAwOjAwOjAwJywgJzIwMjEtMDUtMjIgMDA6MDA6MDAnLCAnMjAyMS0wNS0yMiAxMjowMDowMCcsICdIRCBiZXRyb2ZmZW4nLCAnMjYxMzMnLCAnT2xkZW5idXJnJywgbnVsbCwgJ0Nsb3BwZW5idXJnZXIgU3RyLicsICczMDInLCAnMTIzNDg2My1iMjM0JywgJ2VydGYnLCAnMTI0LDIzMjMnLCA0LCA4LjIxMDE1MCwgNTMuMTExODIwLCAnTGluayAtIGV4dGVuZXMgU3lzdGVtJywgJ25pY2h0IHZlcsO2ZmZlbnRsaWNodCcsICdGcmVpdGV4dDogRWluZSBHYXNsZWl0dW5nIHd1cmRlIGJlc2Now6RkaWd0JywgNCwgZmFsc2UsIDAsIG51bGwsICcyMDIwLTAyLTAzIDE1OjE1OjE1JywgJ1NDUklQVCcsICcyMDIwLTAyLTI0IDIwOjA4OjQxJywgJ1NDUklQVCcpOworCisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEFCTEUgVEJMX0RJU1RSSUJVVElPTl9HUk9VUAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLlRCTF9ESVNUUklCVVRJT05fR1JPVVBfSURfU0VRCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CitBTFRFUiBUQUJMRSBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUF9JRF9TRVEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5UQkxfRElTVFJJQlVUSU9OX0dST1VQCisoCisgIElEIGludGVnZXIgTk9UIE5VTEwgREVGQVVMVCBuZXh0dmFsKCdUQkxfRElTVFJJQlVUSU9OX0dST1VQX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBOQU1FIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksCisgIERJU1RSSUJVVElPTl9URVhUIGNoYXJhY3RlciB2YXJ5aW5nKDIwNDgpLAorICBDT05TVFJBSU5UIFRCTF9ESVNUUklCVVRJT05fR1JPVVBfUEtFWSBQUklNQVJZIEtFWSAoaWQpCispOworCitBTFRFUiBUQUJMRSBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUAorICBPV05FUiBUTyBHRklfU0VSVklDRTsKK0dSQU5UIEFMTCBPTiBUQUJMRSBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUCBUTyBHRklfU0VSVklDRTsKKworSU5TRVJUIElOVE8gcHVibGljLnRibF9kaXN0cmlidXRpb25fZ3JvdXAoVVVJRCwgTkFNRSwgRElTVFJJQlVUSU9OX1RFWFQpCitWQUxVRVMoJzVmNTAxN2ZlLTg4N2EtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsICdWZXJ0ZWlsZXIgdGVjaG5pc2NoIC0gaW50ZXJuJywgJ1N1YmplY3Q6IERpZSBNZWxkdW5nICRUaXRsZSQgbWl0IEJlZ2lubjogJEZhaWx1cmVCZWdpbiQgd3VyZGUgaW4gZGVuIFN0YXR1cyB2ZXLDtmZmZW50bGljaHQgZ2XDpG5kZXJ0LgorCitCb2R5OgorVmVydGVpbGVyIGZhY2hsaWNoIFRFU1QKKworU2VociBnZWVocnRlIERhbWVuIHVuZCBIZXJyZW4sCisKK2RpZSBpbSBCZXRyZWZmIGdlbmFubnRlIE1lbGR1bmcgaXN0IMO8YmVyIGZvbGdlbmRlbiBMaW5rIGVycmVpY2hiYXI6CisKKyRkaXJlY3RGYWlsdXJlTGluayQKKworTWl0IGZyZXVuZGxpY2hlbiBHcsO8w59lbgorSWhyZSBBZG1pbi1NZWlzdGVyLVRlYW0gZGVyIFBUQSBHbWJIJyk7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZGlzdHJpYnV0aW9uX2dyb3VwKFVVSUQsIE5BTUUsIERJU1RSSUJVVElPTl9URVhUKQorVkFMVUVTKCc1ZjUwMjA0Ni04ODdhLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAnVmVydGVpbGVyIGZhY2hsaWNoIC0gaW50ZXJuJywgJ1N1YmplY3Q6IERpZSBNZWxkdW5nICRUaXRsZSQgbWl0IEJlZ2lubjogJEZhaWx1cmVCZWdpbiQgd3VyZGUgaW4gZGVuIFN0YXR1cyB2ZXLDtmZmZW50bGljaHQgZ2XDpG5kZXJ0LgorCitCb2R5OgorVmVydGVpbGVyIGZhY2hsaWNoIFRFU1QKKworU2VociBnZWVocnRlIERhbWVuIHVuZCBIZXJyZW4sCisKK2RpZSBpbSBCZXRyZWZmIGdlbmFubnRlIE1lbGR1bmcgaXN0IMO8YmVyIGZvbGdlbmRlbiBMaW5rIGVycmVpY2hiYXI6CisKKyRkaXJlY3RGYWlsdXJlTGluayQKKworTWl0IGZyZXVuZGxpY2hlbiBHcsO8w59lbgorSWhyZSBBZG1pbi1NZWlzdGVyLVRlYW0gZGVyIFBUQSBHbWJIJyk7CisKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVEFCTEUgVEJMX0RJU1RSSUJVVElPTl9HUk9VUF9NRU1CRVIKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ1JFQVRFIFNFUVVFTkNFIHB1YmxpYy5UQkxfRElTVFJJQlVUSU9OX0dST1VQX01FTUJFUl9JRF9TRVEKKyAgSU5DUkVNRU5UIDEKKyAgTUlOVkFMVUUgMQorICBNQVhWQUxVRSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisgIFNUQVJUIDEKKyAgQ0FDSEUgMTsKK0FMVEVSIFRBQkxFIHB1YmxpYy5UQkxfRElTVFJJQlVUSU9OX0dST1VQX01FTUJFUl9JRF9TRVEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKK0NSRUFURSBUQUJMRSBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUF9NRU1CRVIKKygKKyAgSUQgaW50ZWdlciBOT1QgTlVMTCBERUZBVUxUIG5leHR2YWwoJ1RCTF9ESVNUUklCVVRJT05fR1JPVVBfTUVNQkVSX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBGS19UQkxfRElTVFJJQlVUSU9OX0dST1VQIGludGVnZXIgTk9UIE5VTEwsCisgIENPTlRBQ1RfSUQgdXVpZCBOT1QgTlVMTCwKKyAgQ09OU1RSQUlOVCBUQkxfRElTVFJJQlVUSU9OX0dST1VQX01FTUJFUl9QS0VZIFBSSU1BUlkgS0VZIChpZCksCisgIENPTlNUUkFJTlQgVEJMX0RJU19HUlBfTUVNX19ESVNfR1JQX0ZLRVkgRk9SRUlHTiBLRVkgKEZLX1RCTF9ESVNUUklCVVRJT05fR1JPVVApCisgICAgICAgICBSRUZFUkVOQ0VTIHB1YmxpYy5UQkxfRElTVFJJQlVUSU9OX0dST1VQIChJRCkgTUFUQ0ggU0lNUExFCisgICAgICAgICBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBOTyBBQ1RJT04KKyAgICApOworCitBTFRFUiBUQUJMRSBwdWJsaWMuVEJMX0RJU1RSSUJVVElPTl9HUk9VUF9NRU1CRVIKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CitHUkFOVCBBTEwgT04gVEFCTEUgcHVibGljLlRCTF9ESVNUUklCVVRJT05fR1JPVVBfTUVNQkVSIFRPIEdGSV9TRVJWSUNFOworCisKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZGlzdHJpYnV0aW9uX2dyb3VwX21lbWJlcihVVUlELCBGS19UQkxfRElTVFJJQlVUSU9OX0dST1VQLCBDT05UQUNUX0lEKQorVkFMVUVTKCc1ZjUwMjFhNC04ODdhLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAxLCAnYWUzZjJlYzEtY2NjNS00MjY5LWE0OGYtZGQ0MGUzN2ZhMTRlJyApOworCitJTlNFUlQgSU5UTyBwdWJsaWMudGJsX2Rpc3RyaWJ1dGlvbl9ncm91cF9tZW1iZXIoVVVJRCwgRktfVEJMX0RJU1RSSUJVVElPTl9HUk9VUCwgQ09OVEFDVF9JRCkKK1ZBTFVFUygnNWY1MDIyOGEtODg3YS0xMWVhLWJjNTUtMDI0MmFjMTMwMDAzJywgMSwgJzc3ODIxNzliLWZiNzktNDM3MC04ZjcxLWY0YzcxNDcwZDAwNicgKTsKKworSU5TRVJUIElOVE8gcHVibGljLnRibF9kaXN0cmlidXRpb25fZ3JvdXBfbWVtYmVyKFVVSUQsIEZLX1RCTF9ESVNUUklCVVRJT05fR1JPVVAsIENPTlRBQ1RfSUQpCitWQUxVRVMoJzE0ZGNhYzhjLTg4N2YtMTFlYS1iYzU1LTAyNDJhYzEzMDAwMycsIDEsICdmYTNkOTgxYi1hN2Q2LTQ5NjUtYTYyMy1jZGJjNjk0MDQxNTMnICk7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZGlzdHJpYnV0aW9uX2dyb3VwX21lbWJlcihVVUlELCBGS19UQkxfRElTVFJJQlVUSU9OX0dST1VQLCBDT05UQUNUX0lEKQorVkFMVUVTKCcxNGRjYWVmOC04ODdmLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAyLCAnYzg2MmQ2MDQtNTc2Ni00M2Q2LWE3ZTgtYTRiYWMyYmQwMWUxJyk7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZGlzdHJpYnV0aW9uX2dyb3VwX21lbWJlcihVVUlELCBGS19UQkxfRElTVFJJQlVUSU9OX0dST1VQLCBDT05UQUNUX0lEKQorVkFMVUVTKCcxNGRjYWZmYy04ODdmLTExZWEtYmM1NS0wMjQyYWMxMzAwMDMnLCAyLCAnOGZlNDFiOTAtZDEwYy00YTcwLThmZGUtMDk5MDI4NmFkM2M2Jyk7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9ESVNUUklCVVRJT05fR1JPVVAKKy0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ1JFQVRFIFNFUVVFTkNFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXBfaWRfc2VxCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CitBTFRFUiBUQUJMRSBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fZGlzdHJpYnV0aW9uX2dyb3VwX2lkX3NlcQorICBPV05FUiBUTyBnZmlfc2VydmljZTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXAKKygKKyAgaWQgaW50ZWdlciBOT1QgTlVMTCBERUZBVUxUIG5leHR2YWwoJ3RibF9mYWlsdXJlX2luZm9ybWF0aW9uX2Rpc3RyaWJ1dGlvbl9ncm91cF9pZF9zZXEnOjpyZWdjbGFzcyksCisgIGZrX3RibF9mYWlsdXJlX2luZm9ybWF0aW9uIGludGVnZXIgTk9UIE5VTEwsCisgIGZrX3RibF9kaXN0cmlidXRpb25fZ3JvdXAgaW50ZWdlciBOT1QgTlVMTCwKKyAgQ09OU1RSQUlOVCB0YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXBfcGtleSBQUklNQVJZIEtFWSAoaWQpLAorICBDT05TVFJBSU5UIHRibF9mYWlsX2luZl9kaXN0X2dycF9fZmFpbHVyZV9pbmZvcm1hdGlvbl9pZF9ma2V5IEZPUkVJR04gS0VZIChma190YmxfZmFpbHVyZV9pbmZvcm1hdGlvbikKKyAgICAgIFJFRkVSRU5DRVMgcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uIChpZCkgTUFUQ0ggU0lNUExFCisgICAgICBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBOTyBBQ1RJT04sCisgIENPTlNUUkFJTlQgdGJsX2ZhaWxfaW5mX2Rpc3RfZ3JwX19kaXN0cmlidXRpb25fZ3JvdXBfZmtleSBGT1JFSUdOIEtFWSAoZmtfdGJsX2Rpc3RyaWJ1dGlvbl9ncm91cCkKKyAgICAgIFJFRkVSRU5DRVMgcHVibGljLnRibF9kaXN0cmlidXRpb25fZ3JvdXAgKGlkKSBNQVRDSCBTSU1QTEUKKyAgICAgIE9OIFVQREFURSBOTyBBQ1RJT04gT04gREVMRVRFIE5PIEFDVElPTgorKQorV0lUSCAoCisgIE9JRFM9RkFMU0UKKyk7CitBTFRFUiBUQUJMRSBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fZGlzdHJpYnV0aW9uX2dyb3VwCisgIE9XTkVSIFRPIGdmaV9zZXJ2aWNlOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXAgVE8gZ2ZpX3NlcnZpY2U7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXAoRktfVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04sIEZLX1RCTF9ESVNUUklCVVRJT05fR1JPVVApCitWQUxVRVMoMSwgMSk7CitJTlNFUlQgSU5UTyBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fZGlzdHJpYnV0aW9uX2dyb3VwKEZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OLCBGS19UQkxfRElTVFJJQlVUSU9OX0dST1VQKQorVkFMVUVTKDEsIDIpOworSU5TRVJUIElOVE8gcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uX2Rpc3RyaWJ1dGlvbl9ncm91cChGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTiwgRktfVEJMX0RJU1RSSUJVVElPTl9HUk9VUCkKK1ZBTFVFUygyLCAxKTsKK0lOU0VSVCBJTlRPIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9kaXN0cmlidXRpb25fZ3JvdXAoRktfVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04sIEZLX1RCTF9ESVNUUklCVVRJT05fR1JPVVApCitWQUxVRVMoMiwgMik7CisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9QVUJMSUNBVElPTl9DSEFOTkVMCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ1JFQVRFIFNFUVVFTkNFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9wdWJsaWNhdGlvbl9jaGFubmVsX3NlcQorICBJTkNSRU1FTlQgMQorICBNSU5WQUxVRSAxCisgIE1BWFZBTFVFIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyAgU1RBUlQgMQorICBDQUNIRSAxOworQUxURVIgVEFCTEUgcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uX3B1YmxpY2F0aW9uX2NoYW5uZWxfc2VxCisgIE9XTkVSIFRPIGdmaV9zZXJ2aWNlOworCisKK0NSRUFURSBUQUJMRSBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fcHVibGljYXRpb25fY2hhbm5lbAorKAorICBpZCBpbnRlZ2VyIE5PVCBOVUxMIERFRkFVTFQgbmV4dHZhbCgndGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fcHVibGljYXRpb25fY2hhbm5lbF9zZXEnOjpyZWdjbGFzcyksCisgIGZrX3RibF9mYWlsdXJlX2luZm9ybWF0aW9uIGludGVnZXIgTk9UIE5VTEwsCisgIHB1YmxpY2F0aW9uX2NoYW5uZWwgY2hhcmFjdGVyIHZhcnlpbmcoNTApIE5PVCBOVUxMLAorICBwdWJsaXNoZWQgYm9vbGVhbiBOT1QgTlVMTCwKKyAgQ09OU1RSQUlOVCB0YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9wdWJsaWNhdGlvbl9jaGFubmVsX3BrZXkgUFJJTUFSWSBLRVkgKGlkKSwKKyAgQ09OU1RSQUlOVCB0YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9pZF9ma2V5IEZPUkVJR04gS0VZIChma190YmxfZmFpbHVyZV9pbmZvcm1hdGlvbikKKyAgICAgIFJFRkVSRU5DRVMgcHVibGljLnRibF9mYWlsdXJlX2luZm9ybWF0aW9uIChpZCkgTUFUQ0ggU0lNUExFCisgICAgICBPTiBVUERBVEUgTk8gQUNUSU9OIE9OIERFTEVURSBOTyBBQ1RJT04KKyk7CisKK0FMVEVSIFRBQkxFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9wdWJsaWNhdGlvbl9jaGFubmVsCisgIE9XTkVSIFRPIHBvc3RncmVzOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy50YmxfZmFpbHVyZV9pbmZvcm1hdGlvbl9wdWJsaWNhdGlvbl9jaGFubmVsIFRPIGdmaV9zZXJ2aWNlOworCitJTlNFUlQgSU5UTyBwdWJsaWMudGJsX2ZhaWx1cmVfaW5mb3JtYXRpb25fcHVibGljYXRpb25fY2hhbm5lbChGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTiwgUFVCTElDQVRJT05fQ0hBTk5FTCwgUFVCTElTSEVEKQorVkFMVUVTKDEsICdNQUlMJywgZmFsc2UpOworCisKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBISVNUT1JZLVRBQkxFUworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy0tIFBVQkxJQy5IVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04gQXV0b21hdGljIGdlbmVyYW50ZWQgSGlzdG9yeSBUYWJsZSBEREwgLS0KKy0tIDxHRU5FUkFURUQgQ09ERSE+CisKK0RST1AgVEFCTEUgSUYgRVhJU1RTIFBVQkxJQy5IVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT047CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBQVUJMSUMuSFRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0lEX1NFUTsKKworQ1JFQVRFIFNFUVVFTkNFIFBVQkxJQy5IVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fSURfU0VRCisgIElOQ1JFTUVOVCAxCisgIE1JTlZBTFVFIDEKKyAgTUFYVkFMVUUgOTIyMzM3MjAzNjg1NDc3NTgwNworICBTVEFSVCAxCisgIENBQ0hFIDE7CisKK0FMVEVSIFRBQkxFIFBVQkxJQy5IVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fSURfU0VRCisgIE9XTkVSIFRPIGdmaV9zZXJ2aWNlOworCitDUkVBVEUgVEFCTEUgUFVCTElDLkhUQkxfRkFJTFVSRV9JTkZPUk1BVElPTgorKAorICBISUQgaW50ZWdlciBOT1QgTlVMTCBERUZBVUxUIG5leHR2YWwoJ0hUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9JRF9TRVEnOjpyZWdjbGFzcyksCisgIEhBQ1RJT04gaW50ZWdlciBOT1QgTlVMTCwKKyAgSERBVEUgdGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lIE5PVCBOVUxMLAorICBIVVNFUiBjaGFyYWN0ZXIgdmFyeWluZygxMDApLAorCisgIElEIGludGVnZXIsCisgIFVVSUQgdXVpZCwKKyAgVkVSU0lPTl9OVU1CRVIgaW50ZWdlciwKKyAgRktfUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04gaW50ZWdlciwKKyAgRktfUkVGX0ZBSUxVUkVfVFlQRSBpbnRlZ2VyLAorICBUSVRMRSBjaGFyYWN0ZXIgdmFyeWluZygyNTUpIE5VTEwsCisgIERFU0NSSVBUSU9OIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSkgTlVMTCwKKyAgUkVTUE9OU0lCSUxJVFkgY2hhcmFjdGVyIHZhcnlpbmcgKDI1NSksCisgIElOVEVSTl9FWFRFUk4gY2hhcmFjdGVyIHZhcnlpbmcgKDEpLAorICBGS19SRUZfU1RBVFVTX0lOVEVSTiBpbnRlZ2VyLAorICBGS19SRUZfU1RBVFVTX0VYVEVSTiBpbnRlZ2VyLAorICBGS19SRUZfQlJBTkNIIGludGVnZXIsCisgIFZPTFRBR0VfTEVWRUwgY2hhcmFjdGVyIHZhcnlpbmcgKDIpLAorICBQUkVTU1VSRV9MRVZFTCBjaGFyYWN0ZXIgdmFyeWluZyAoMiksCisgIEZBSUxVUkVfQkVHSU4gdGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lLAorICBGQUlMVVJFX0VORF9QTEFOTkVEIHRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZSwKKyAgRkFJTFVSRV9FTkRfUkVTVVBQTElFRCB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmUsCisgIElOVEVSTkFMX1JFTUFSSyBjaGFyYWN0ZXIgdmFyeWluZyAoMTAyNCksCisgIFBPU1RDT0RFIGNoYXJhY3RlciB2YXJ5aW5nICgzMCksCisgIENJVFkgY2hhcmFjdGVyIHZhcnlpbmcgKDI1NSksCisgIERJU1RSSUNUIGNoYXJhY3RlciB2YXJ5aW5nICgyNTUpLAorICBTVFJFRVQgY2hhcmFjdGVyIHZhcnlpbmcgKDI1NSksCisgIEhPVVNFTlVNQkVSIGNoYXJhY3RlciB2YXJ5aW5nICgzMCksCisgIFNUQVRJT05fSUQgY2hhcmFjdGVyIHZhcnlpbmcgKDMwKSwKKyAgU1RBVElPTl9ERVNDUklQVElPTiBjaGFyYWN0ZXIgdmFyeWluZyAoMjU1KSwKKyAgU1RBVElPTl9DT09SRFMgY2hhcmFjdGVyIHZhcnlpbmcgKDI1NSksCisgIEZLX1JFRl9SQURJVVMgaW50ZWdlciwKKyAgTE9OR0lUVURFIG51bWVyaWMoOSw2KSwKKyAgTEFUSVRVREUgbnVtZXJpYyg5LDYpLAorICBGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQgaW50ZWdlciwKKyAgQ09OREVOU0VEIGJvb2xlYW4sCisgIENPTkRFTlNFRF9DT1VOVCBpbnRlZ2VyLAorICBPQkpFQ1RfUkVGRVJFTkNFX0VYVEVSTkFMX1NZU1RFTSBjaGFyYWN0ZXIgdmFyeWluZyAoMjU1KSwKKyAgUFVCTElDQVRJT05fU1RBVFVTIGNoYXJhY3RlciB2YXJ5aW5nICg0MCksCisgIFBVQkxJQ0FUSU9OX0ZSRUVURVhUIGNoYXJhY3RlciB2YXJ5aW5nICgxMDI0KSwKKyAgRktfUkVGX0VYUEVDVEVEX1JFQVNPTiBpbnRlZ2VyLAorICBDUkVBVEVfVVNFUiBjaGFyYWN0ZXIgdmFyeWluZygxMDApLAorICBDUkVBVEVfREFURSB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmUsCisgIE1PRF9VU0VSIGNoYXJhY3RlciB2YXJ5aW5nKDEwMCksCisgIE1PRF9EQVRFIHRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZSwKKyAgQ09OU1RSQUlOVCBIVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fUEtFWSBQUklNQVJZIEtFWSAoSElEKQorKQorV0lUSCAoCisgIE9JRFM9RkFMU0UKKyk7CisKK0FMVEVSIFRBQkxFIFBVQkxJQy5IVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04KKyAgT1dORVIgVE8gZ2ZpX3NlcnZpY2U7CitHUkFOVCBBTEwgT04gVEFCTEUgUFVCTElDLkhUQkxfRkFJTFVSRV9JTkZPUk1BVElPTiBUTyBnZmlfc2VydmljZTsKKworSU5TRVJUIElOVE8gcHVibGljLmh0YmxfZmFpbHVyZV9pbmZvcm1hdGlvbihIQUNUSU9OLCBIREFURSwgSFVTRVIsIElELCBVVUlELCBWRVJTSU9OX05VTUJFUiwgRktfUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04sIEZLX1JFRl9GQUlMVVJFX1RZUEUsIFRJVExFLCBERVNDUklQVElPTiwgUkVTUE9OU0lCSUxJVFksIElOVEVSTl9FWFRFUk4sIEZLX1JFRl9TVEFUVVNfSU5URVJOLCBGS19SRUZfU1RBVFVTX0VYVEVSTiwgRktfUkVGX0JSQU5DSCwgVk9MVEFHRV9MRVZFTCwgUFJFU1NVUkVfTEVWRUwsIEZBSUxVUkVfQkVHSU4sIEZBSUxVUkVfRU5EX1BMQU5ORUQsIEZBSUxVUkVfRU5EX1JFU1VQUExJRUQsIElOVEVSTkFMX1JFTUFSSywgUE9TVENPREUsIENJVFksIERJU1RSSUNULCBTVFJFRVQsIEhPVVNFTlVNQkVSLCBTVEFUSU9OX0lELCBTVEFUSU9OX0RFU0NSSVBUSU9OLCBTVEFUSU9OX0NPT1JEUywgRktfUkVGX1JBRElVUywgTE9OR0lUVURFLCBMQVRJVFVERSwgT0JKRUNUX1JFRkVSRU5DRV9FWFRFUk5BTF9TWVNURU0sIFBVQkxJQ0FUSU9OX1NUQVRVUywgUFVCTElDQVRJT05fRlJFRVRFWFQsIEZLX1JFRl9FWFBFQ1RFRF9SRUFTT04sIEZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OX0NPTkRFTlNFRCwgQ09OREVOU0VELCBDT05ERU5TRURfQ09VTlQsIENSRUFURV9EQVRFLCBDUkVBVEVfVVNFUiwgTU9EX0RBVEUsIE1PRF9VU0VSKQorVkFMVUVTICgxLCAnMjAyMC0wMy0xMyAwMDowMDowMCcsICdTQ1JJUFQnLCAxLCAnNjQzMmE5YzktMDM4NC00NGFmLTliYjgtMzRmMjg3OGQ3YjQ5JywgMSwgMSwgMSwgJ1N0cm9tYXVzZmFsbCBNdXJyJywgJ0VzIGdpYnQgZWluZW4gU3Ryb21hdXNmYWxsIGltIEJlcmVpY2ggTXVyci9XZXN0YmV6aXJrJywgJ1JvbGYgUnVkaXMnLCAnSScsIDEsIDEsIDEsICdOUycsIG51bGwsICcyMDIxLTAxLTE5IDAwOjAwOjAwJywgJzIwMjEtMDEtMjIgMDA6MDA6MDAnLCAnMjAyMS0wMS0yMiAxMjowMDowMCcsICdEZXIgQmFnZ2VyIGdydWIgenUgdGllZicsICc3MTcxMScsICdNdXJyJywgJ1dlc3RiZXppcmsnLCAnRmVyZGluYW5kLVBvcnNjaGUtU3RyYcOfZScsICcyJywgJzUyODYzYScsICdUcmFmbyAxJywgJzEyNCwyMzIzJywgMiwgOS4yNDc5NTIsIDQ4Ljk1NTcwMCwgJ0xpbmsgLSBleHRlbmVzIFN5c3RlbScsICd2ZXLDtmZmZW50bGljaHQnLCAnRnJlaXRleHQgZsO8ciBkaWUgVmVyw7ZmZmVudGxpY2h1bmc6IERlZmVrdCBhbiBUcmFmb3N0YXRpb24nLCAxLCBudWxsLCBmYWxzZSwgMCwgJzIwMjAtMDEtMjIgMTU6MzI6MTUnLCAnU0NSSVBUJywgJzIwMjAtMDEtMjQgMDg6MDI6NDQnLCAnU0NSSVBUJyk7CisKK0lOU0VSVCBJTlRPIHB1YmxpYy5odGJsX2ZhaWx1cmVfaW5mb3JtYXRpb24oSEFDVElPTiwgSERBVEUsIEhVU0VSLCBJRCwgVVVJRCwgVkVSU0lPTl9OVU1CRVIsIEZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLCBGS19SRUZfRkFJTFVSRV9UWVBFLCBUSVRMRSwgREVTQ1JJUFRJT04sIFJFU1BPTlNJQklMSVRZLCBJTlRFUk5fRVhURVJOLCBGS19SRUZfU1RBVFVTX0lOVEVSTiwgRktfUkVGX1NUQVRVU19FWFRFUk4sIEZLX1JFRl9CUkFOQ0gsIFZPTFRBR0VfTEVWRUwsIFBSRVNTVVJFX0xFVkVMLCBGQUlMVVJFX0JFR0lOLCBGQUlMVVJFX0VORF9QTEFOTkVELCBGQUlMVVJFX0VORF9SRVNVUFBMSUVELCBJTlRFUk5BTF9SRU1BUkssIFBPU1RDT0RFLCBDSVRZLCBESVNUUklDVCwgU1RSRUVULCBIT1VTRU5VTUJFUiwgU1RBVElPTl9JRCwgU1RBVElPTl9ERVNDUklQVElPTiwgU1RBVElPTl9DT09SRFMsIEZLX1JFRl9SQURJVVMsIExPTkdJVFVERSwgTEFUSVRVREUsIE9CSkVDVF9SRUZFUkVOQ0VfRVhURVJOQUxfU1lTVEVNLCBQVUJMSUNBVElPTl9TVEFUVVMsIFBVQkxJQ0FUSU9OX0ZSRUVURVhULCBGS19SRUZfRVhQRUNURURfUkVBU09OLCBGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQsIENPTkRFTlNFRCwgQ09OREVOU0VEX0NPVU5ULCBDUkVBVEVfREFURSwgQ1JFQVRFX1VTRVIsIE1PRF9EQVRFLCBNT0RfVVNFUikKK1ZBTFVFUyAoMiwgJzIwMjAtMDMtMTMgMDA6MDA6MDAnLCAnU0NSSVBUJywgMiwgJzM3YWVmNjM1LWQwZDQtNGM0Ny1hYzI1LWMwZDE2YzI5ZTM1YycsIDEsIDIsIDIsICdHYXNsZWNrIE9sZGVuYnVyZycsICdFcyBnaWJ0IGVpbiBHYXNsZWNrIGluIE9sZGVuYnVyZycsICdCZXJuZCBCcml0emVsJywgJ0UnLCAyLCAyLCAzLCAnTlMnLCAnSEQnLCAnMjAyMS0wNS0xOSAwMDowMDowMCcsICcyMDIxLTA1LTIyIDAwOjAwOjAwJywgJzIwMjEtMDUtMjIgMTI6MDA6MDAnLCAnSEQgYmV0cm9mZmVuJywgJzI2MTMzJywgJ09sZGVuYnVyZycsIG51bGwsICdDbG9wcGVuYnVyZ2VyIFN0ci4nLCAnMzAyJywgJzEyMzQ4NjMtYjIzNCcsICdlcnRmJywgJzEyNCwyMzIzJywgNCwgOC4yMTAxNTAsIDUzLjExMTgyMCwgJ0xpbmsgLSBleHRlbmVzIFN5c3RlbScsICduaWNodCB2ZXLDtmZmZW50bGljaHQnLCAnRnJlaXRleHQ6IEVpbmUgR2FzbGVpdHVuZyB3dXJkZSBiZXNjaMOkZGlndCcsIDQsIG51bGwsIGZhbHNlLCAwLCAnMjAyMC0wMi0wMyAxNToxNToxNScsICdTQ1JJUFQnLCAnMjAyMC0wMi0yNCAyMDowODo0MScsICdTQ1JJUFQnKTsKKworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUYWJsZXMgQUREUkVTU0lNUE9SVAorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKkRST1AgVEFCTEUgSUYgRVhJU1RTIHB1YmxpYy5UQkxfQUREUkVTUyBDQVNDQURFOworRFJPUCBTRVFVRU5DRSBJRiBFWElTVFMgcHVibGljLlRCTF9BRERSRVNTX0lEX1NFUTsqLworCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFRBQkxFIFRCTF9BRERSRVNTCistLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qQ1JFQVRFIFNFUVVFTkNFIHB1YmxpYy5UQkxfQUREUkVTU19JRF9TRVEKKyAgSU5DUkVNRU5UIDEKKyAgTUlOVkFMVUUgMQorICBNQVhWQUxVRSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisgIFNUQVJUIDEKKyAgQ0FDSEUgMTsKK0FMVEVSIFRBQkxFIHB1YmxpYy5UQkxfQUREUkVTU19JRF9TRVEKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CisKK0NSRUFURSBUQUJMRSBwdWJsaWMuVEJMX0FERFJFU1MKKygKKyAgSUQgaW50ZWdlciBOT1QgTlVMTCBERUZBVUxUIG5leHR2YWwoJ1RCTF9BRERSRVNTX0lEX1NFUSc6OnJlZ2NsYXNzKSwKKyAgVVVJRCB1dWlkIE5PVCBOVUxMLAorICBTRE9YMSBudW1lcmljKDksMikgTk9UIE5VTEwsCisgIFNET1kxIG51bWVyaWMoMTAsMikgTk9UIE5VTEwsCisgIEczRUZJRCBudW1lcmljLAorICBQT1NUQ09ERSBjaGFyYWN0ZXIgdmFyeWluZygzMCksCisgIENPTU1VTklUWSBjaGFyYWN0ZXIgdmFyeWluZygyNTUpLAorICBESVNUUklDVCBjaGFyYWN0ZXIgdmFyeWluZygyNTUpLAorICBTVFJFRVQgY2hhcmFjdGVyIHZhcnlpbmcoMjU1KSwKKyAgSE9VU0VOVU1CRVIgY2hhcmFjdGVyIHZhcnlpbmcoMzApLAorICBXQVRFUl9DT05ORUNUSU9OIGJvb2xlYW4sCisgIFdBVEVSX0dST1VQIGNoYXJhY3RlciB2YXJ5aW5nKDI1NSksCisgIEdBU19DT05ORUNUSU9OIGJvb2xlYW4sCisgIEdBU19HUk9VUCBjaGFyYWN0ZXIgdmFyeWluZygyNTUpLAorICBQT1dFUl9DT05ORUNUSU9OIGJvb2xlYW4sCisgIFNUQVRJT05fSUQgY2hhcmFjdGVyIHZhcnlpbmcoMzApLAorICBMT05HSVRVREUgbnVtZXJpYyg5LDYpLAorICBMQVRJVFVERSBudW1lcmljKDksNiksCisgIENPTlNUUkFJTlQgVEJMX0FERFJFU1NfUEtFWSBQUklNQVJZIEtFWSAoaWQpCispOworCitBTFRFUiBUQUJMRSBwdWJsaWMuVEJMX0FERFJFU1MKKyAgT1dORVIgVE8gR0ZJX1NFUlZJQ0U7CitHUkFOVCBBTEwgT04gVEFCTEUgcHVibGljLlRCTF9BRERSRVNTIFRPIEdGSV9TRVJWSUNFOworCitDUkVBVEUgSU5ERVggaWR4X3RibF9hZGRyZXNzX2czZWZpZCBPTiBwdWJsaWMuVEJMX0FERFJFU1MgKCBHM0VGSUQgKTsKK0NSRUFURSBJTkRFWCBpZHhfdGJsX2FkZHJlc3NfcG9zdGNvZGUgT04gcHVibGljLlRCTF9BRERSRVNTICggUE9TVENPREUgKTsKK0NSRUFURSBJTkRFWCBpZHhfdGJsX2FkZHJlc3NfY29tbXVuaXR5IE9OIHB1YmxpYy5UQkxfQUREUkVTUyAoIENPTU1VTklUWSApOworQ1JFQVRFIElOREVYIGlkeF90YmxfYWRkcmVzc19kaXN0cmljdCBPTiBwdWJsaWMuVEJMX0FERFJFU1MgKCBESVNUUklDVCApOworQ1JFQVRFIElOREVYIGlkeF90YmxfYWRkcmVzc19zdHJlZXQgT04gcHVibGljLlRCTF9BRERSRVNTICggU1RSRUVUICk7CitDUkVBVEUgSU5ERVggaWR4X3RibF9hZGRyZXNzX3N0YXRpb25faWQgT04gcHVibGljLlRCTF9BRERSRVNTICggU1RBVElPTl9JRCApOyovCisKKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUQUJMRSBUQkxfU1RBVElPTgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qRFJPUCBUQUJMRSBJRiBFWElTVFMgcHVibGljLlRCTF9TVEFUSU9OIENBU0NBREU7CitEUk9QIFNFUVVFTkNFIElGIEVYSVNUUyBwdWJsaWMuVEJMX1NUQVRJT05fSURfU0VROworCitDUkVBVEUgU0VRVUVOQ0UgcHVibGljLlRCTF9TVEFUSU9OX0lEX1NFUQorICBJTkNSRU1FTlQgMQorICBNSU5WQUxVRSAxCisgIE1BWFZBTFVFIDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyAgU1RBUlQgMQorICBDQUNIRSAxOworQUxURVIgVEFCTEUgcHVibGljLlRCTF9TVEFUSU9OX0lEX1NFUQorICBPV05FUiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIFRBQkxFIHB1YmxpYy5UQkxfU1RBVElPTgorKAorICBJRCBpbnRlZ2VyIE5PVCBOVUxMIERFRkFVTFQgbmV4dHZhbCgnVEJMX1NUQVRJT05fSURfU0VRJzo6cmVnY2xhc3MpLAorICBVVUlEIHV1aWQgTk9UIE5VTEwsCisgIFNET1gxIG51bWVyaWMoOSwyKSBOT1QgTlVMTCwKKyAgU0RPWTEgbnVtZXJpYygxMCwyKSBOT1QgTlVMTCwKKyAgRzNFRklEIG51bWVyaWMsCisgIFNUQVRJT05fSUQgY2hhcmFjdGVyIHZhcnlpbmcoMzApLAorICBTVEFUSU9OX05BTUUgY2hhcmFjdGVyIHZhcnlpbmcoMjU1KSwKKyAgTE9OR0lUVURFIG51bWVyaWMoOSw2KSwKKyAgTEFUSVRVREUgbnVtZXJpYyg5LDYpLAorICBDT05TVFJBSU5UIFRCTF9TVEFUSU9OX1BLRVkgUFJJTUFSWSBLRVkgKGlkKQorKTsKKworQUxURVIgVEFCTEUgcHVibGljLlRCTF9TVEFUSU9OCisgIE9XTkVSIFRPIEdGSV9TRVJWSUNFOworR1JBTlQgQUxMIE9OIFRBQkxFIHB1YmxpYy5UQkxfU1RBVElPTiBUTyBHRklfU0VSVklDRTsKKworQ1JFQVRFIElOREVYIGlkeF90Ymxfc3RhdGlvbl9nM2VmaWQgT04gcHVibGljLlRCTF9TVEFUSU9OICggRzNFRklEICk7CitDUkVBVEUgSU5ERVggaWR4X3RibF9zdGF0aW9uX3N0YXRpb25faWQgT04gcHVibGljLlRCTF9TVEFUSU9OICggU1RBVElPTl9JRCApOworKi8KKworLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVFJJR0dFUgorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy0tIFBVQkxJQy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTiBJTlNFUlQgVFJJR0dFUiAtLQorLS0gPEdFTkVSQVRFRCBDT0RFIT4KK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIFBVQkxJQy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9JTlNFUlRfVFJHKCkKKyAgUkVUVVJOUyB0cmlnZ2VyIEFTCiskQk9EWSQKKyAgICBCRUdJTgorCUlOU0VSVCBJTlRPIEhUQkxfRkFJTFVSRV9JTkZPUk1BVElPTiAoCisJCQkJCQkgIElELFVVSUQsVkVSU0lPTl9OVU1CRVIsRktfUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04sRktfUkVGX0ZBSUxVUkVfVFlQRSxUSVRMRSxERVNDUklQVElPTixSRVNQT05TSUJJTElUWSxJTlRFUk5fRVhURVJOLEZLX1JFRl9TVEFUVVNfSU5URVJOLEZLX1JFRl9TVEFUVVNfRVhURVJOLEZLX1JFRl9CUkFOQ0gsVk9MVEFHRV9MRVZFTCxQUkVTU1VSRV9MRVZFTCxGQUlMVVJFX0JFR0lOLEZBSUxVUkVfRU5EX1BMQU5ORUQsRkFJTFVSRV9FTkRfUkVTVVBQTElFRCxJTlRFUk5BTF9SRU1BUkssUE9TVENPREUsQ0lUWSxESVNUUklDVCxTVFJFRVQsSE9VU0VOVU1CRVIsU1RBVElPTl9JRCxTVEFUSU9OX0RFU0NSSVBUSU9OLFNUQVRJT05fQ09PUkRTLEZLX1JFRl9SQURJVVMsTE9OR0lUVURFLExBVElUVURFLEZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OX0NPTkRFTlNFRCxDT05ERU5TRUQsQ09OREVOU0VEX0NPVU5ULE9CSkVDVF9SRUZFUkVOQ0VfRVhURVJOQUxfU1lTVEVNLFBVQkxJQ0FUSU9OX1NUQVRVUyxQVUJMSUNBVElPTl9GUkVFVEVYVCxGS19SRUZfRVhQRUNURURfUkVBU09OLENSRUFURV9EQVRFLENSRUFURV9VU0VSLE1PRF9EQVRFLE1PRF9VU0VSLAorCisJCQkJCQkgIEhBQ1RJT04sCisJCQkJCQkgIEhEQVRFLAorCQkJCQkJICBIVVNFUgorCQkJCQkJICkKKwlWQUxVRVMgCQkJCSAoCisKKwkJCQkJCSAgTkVXLklELE5FVy5VVUlELE5FVy5WRVJTSU9OX05VTUJFUixORVcuRktfUkVGX0ZBSUxVUkVfQ0xBU1NJRklDQVRJT04sTkVXLkZLX1JFRl9GQUlMVVJFX1RZUEUsTkVXLlRJVExFLE5FVy5ERVNDUklQVElPTixORVcuUkVTUE9OU0lCSUxJVFksTkVXLklOVEVSTl9FWFRFUk4sTkVXLkZLX1JFRl9TVEFUVVNfSU5URVJOLE5FVy5GS19SRUZfU1RBVFVTX0VYVEVSTixORVcuRktfUkVGX0JSQU5DSCxORVcuVk9MVEFHRV9MRVZFTCxORVcuUFJFU1NVUkVfTEVWRUwsTkVXLkZBSUxVUkVfQkVHSU4sTkVXLkZBSUxVUkVfRU5EX1BMQU5ORUQsTkVXLkZBSUxVUkVfRU5EX1JFU1VQUExJRUQsTkVXLklOVEVSTkFMX1JFTUFSSyxORVcuUE9TVENPREUsTkVXLkNJVFksTkVXLkRJU1RSSUNULE5FVy5TVFJFRVQsTkVXLkhPVVNFTlVNQkVSLE5FVy5TVEFUSU9OX0lELE5FVy5TVEFUSU9OX0RFU0NSSVBUSU9OLE5FVy5TVEFUSU9OX0NPT1JEUyxORVcuRktfUkVGX1JBRElVUyxORVcuTE9OR0lUVURFLE5FVy5MQVRJVFVERSxORVcuRktfVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fQ09OREVOU0VELE5FVy5DT05ERU5TRUQsTkVXLkNPTkRFTlNFRF9DT1VOVCxORVcuT0JKRUNUX1JFRkVSRU5DRV9FWFRFUk5BTF9TWVNURU0sTkVXLlBVQkxJQ0FUSU9OX1NUQVRVUyxORVcuUFVCTElDQVRJT05fRlJFRVRFWFQsTkVXLkZLX1JFRl9FWFBFQ1RFRF9SRUFTT04sTkVXLkNSRUFURV9EQVRFLE5FVy5DUkVBVEVfVVNFUixORVcuTU9EX0RBVEUsTkVXLk1PRF9VU0VSLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisJCQkJCQkgIGN1cnJlbnRfdGltZXN0YW1wLAorCQkJCQkgICAgICBORVcuQ1JFQVRFX1VTRVIgKTsKKworICAgICAgICBSRVRVUk4gTkVXOworICAgIEVORDsKKyRCT0RZJAorICBMQU5HVUFHRSBwbHBnc3FsIFZPTEFUSUxFCisgIENPU1QgMTAwOworQUxURVIgRlVOQ1RJT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0lOU0VSVF9UUkcoKQorICBPV05FUiBUTyBnZmlfc2VydmljZTsKKworCitEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIFRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0lOU0VSVF9UUkcgT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OOworCitDUkVBVEUgVFJJR0dFUiBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9JTlNFUlRfVFJHCisgIEJFRk9SRSBJTlNFUlQKKyAgT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OCisgIEZPUiBFQUNIIFJPVworICBFWEVDVVRFIFBST0NFRFVSRSBQVUJMSUMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fSU5TRVJUX1RSRygpOworCisKKworLS0gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OIFVQREFURSBUUklHR0VSIC0tCistLSA8R0VORVJBVEVEIENPREUhPgorCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBQVUJMSUMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fVVBEQVRFX1RSRygpCisgIFJFVFVSTlMgdHJpZ2dlciBBUworJEJPRFkkCisgICAgQkVHSU4KKwlJTlNFUlQgSU5UTyBIVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT04gKAorCQkJCQkJICBJRCxVVUlELFZFUlNJT05fTlVNQkVSLEZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLEZLX1JFRl9GQUlMVVJFX1RZUEUsVElUTEUsREVTQ1JJUFRJT04sUkVTUE9OU0lCSUxJVFksSU5URVJOX0VYVEVSTixGS19SRUZfU1RBVFVTX0lOVEVSTixGS19SRUZfU1RBVFVTX0VYVEVSTixGS19SRUZfQlJBTkNILFZPTFRBR0VfTEVWRUwsUFJFU1NVUkVfTEVWRUwsRkFJTFVSRV9CRUdJTixGQUlMVVJFX0VORF9QTEFOTkVELEZBSUxVUkVfRU5EX1JFU1VQUExJRUQsSU5URVJOQUxfUkVNQVJLLFBPU1RDT0RFLENJVFksRElTVFJJQ1QsU1RSRUVULEhPVVNFTlVNQkVSLFNUQVRJT05fSUQsU1RBVElPTl9ERVNDUklQVElPTixTVEFUSU9OX0NPT1JEUyxGS19SRUZfUkFESVVTLExPTkdJVFVERSxMQVRJVFVERSxGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQsQ09OREVOU0VELENPTkRFTlNFRF9DT1VOVCxPQkpFQ1RfUkVGRVJFTkNFX0VYVEVSTkFMX1NZU1RFTSxQVUJMSUNBVElPTl9TVEFUVVMsUFVCTElDQVRJT05fRlJFRVRFWFQsRktfUkVGX0VYUEVDVEVEX1JFQVNPTixDUkVBVEVfREFURSxDUkVBVEVfVVNFUixNT0RfREFURSxNT0RfVVNFUiwKKworCQkJCQkJICBIQUNUSU9OLAorCQkJCQkJICBIREFURSwKKwkJCQkJCSAgSFVTRVIKKwkJCQkJCSApCisJVkFMVUVTIAkJCSAgICAoCisJICAgICAgICAgICAgICAgICAgICAgIE5FVy5JRCxORVcuVVVJRCxORVcuVkVSU0lPTl9OVU1CRVIsTkVXLkZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLE5FVy5GS19SRUZfRkFJTFVSRV9UWVBFLE5FVy5USVRMRSxORVcuREVTQ1JJUFRJT04sTkVXLlJFU1BPTlNJQklMSVRZLE5FVy5JTlRFUk5fRVhURVJOLE5FVy5GS19SRUZfU1RBVFVTX0lOVEVSTixORVcuRktfUkVGX1NUQVRVU19FWFRFUk4sTkVXLkZLX1JFRl9CUkFOQ0gsTkVXLlZPTFRBR0VfTEVWRUwsTkVXLlBSRVNTVVJFX0xFVkVMLE5FVy5GQUlMVVJFX0JFR0lOLE5FVy5GQUlMVVJFX0VORF9QTEFOTkVELE5FVy5GQUlMVVJFX0VORF9SRVNVUFBMSUVELE5FVy5JTlRFUk5BTF9SRU1BUkssTkVXLlBPU1RDT0RFLE5FVy5DSVRZLE5FVy5ESVNUUklDVCxORVcuU1RSRUVULE5FVy5IT1VTRU5VTUJFUixORVcuU1RBVElPTl9JRCxORVcuU1RBVElPTl9ERVNDUklQVElPTixORVcuU1RBVElPTl9DT09SRFMsTkVXLkZLX1JFRl9SQURJVVMsTkVXLkxPTkdJVFVERSxORVcuTEFUSVRVREUsTkVXLkZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OX0NPTkRFTlNFRCxORVcuQ09OREVOU0VELE5FVy5DT05ERU5TRURfQ09VTlQsTkVXLk9CSkVDVF9SRUZFUkVOQ0VfRVhURVJOQUxfU1lTVEVNLE5FVy5QVUJMSUNBVElPTl9TVEFUVVMsTkVXLlBVQkxJQ0FUSU9OX0ZSRUVURVhULE5FVy5GS19SRUZfRVhQRUNURURfUkVBU09OLE5FVy5DUkVBVEVfREFURSxORVcuQ1JFQVRFX1VTRVIsTkVXLk1PRF9EQVRFLE5FVy5NT0RfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKwkJCQkJCSAgY3VycmVudF90aW1lc3RhbXAsCisJCQkJCSAgICAgIE5FVy5NT0RfVVNFUgorCQkJCQkgICAgKTsKKworICAgICAgICBSRVRVUk4gTkVXOworICAgIEVORDsKKyRCT0RZJAorICBMQU5HVUFHRSBwbHBnc3FsIFZPTEFUSUxFCisgIENPU1QgMTAwOworQUxURVIgRlVOQ1RJT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX1VQREFURV9UUkcoKQorICBPV05FUiBUTyBnZmlfc2VydmljZTsKKworRFJPUCBUUklHR0VSIElGIEVYSVNUUyBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9VUERBVEVfVFJHIE9OIFBVQkxJQy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTjsKKworQ1JFQVRFIFRSSUdHRVIgVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fVVBEQVRFX1RSRworICBCRUZPUkUgVVBEQVRFCisgIE9OIFBVQkxJQy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTgorICBGT1IgRUFDSCBST1cKKyAgRVhFQ1VURSBQUk9DRURVUkUgUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX1VQREFURV9UUkcoKTsKKworCisKKy0tIFBVQkxJQy5UQkxfRkFJTFVSRV9JTkZPUk1BVElPTiBERUxFVEUgVFJJR0dFUiAtLQorLS0gPEdFTkVSQVRFRCBDT0RFIT4KKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0RFTEVURV9UUkcoKQorICBSRVRVUk5TIHRyaWdnZXIgQVMKKyRCT0RZJAorICAgIEJFR0lOCisgICAgSUYgVEdfT1AgPSAnREVMRVRFJyBUSEVOCisJSU5TRVJUIElOVE8gSFRCTF9GQUlMVVJFX0lORk9STUFUSU9OICgKKworCQkJCQkJICBJRCxVVUlELFZFUlNJT05fTlVNQkVSLEZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLEZLX1JFRl9GQUlMVVJFX1RZUEUsVElUTEUsREVTQ1JJUFRJT04sUkVTUE9OU0lCSUxJVFksSU5URVJOX0VYVEVSTixGS19SRUZfU1RBVFVTX0lOVEVSTixGS19SRUZfU1RBVFVTX0VYVEVSTixGS19SRUZfQlJBTkNILFZPTFRBR0VfTEVWRUwsUFJFU1NVUkVfTEVWRUwsRkFJTFVSRV9CRUdJTixGQUlMVVJFX0VORF9QTEFOTkVELEZBSUxVUkVfRU5EX1JFU1VQUExJRUQsSU5URVJOQUxfUkVNQVJLLFBPU1RDT0RFLENJVFksRElTVFJJQ1QsU1RSRUVULEhPVVNFTlVNQkVSLFNUQVRJT05fSUQsU1RBVElPTl9ERVNDUklQVElPTixTVEFUSU9OX0NPT1JEUyxGS19SRUZfUkFESVVTLExPTkdJVFVERSxMQVRJVFVERSxGS19UQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9DT05ERU5TRUQsQ09OREVOU0VELENPTkRFTlNFRF9DT1VOVCxPQkpFQ1RfUkVGRVJFTkNFX0VYVEVSTkFMX1NZU1RFTSxQVUJMSUNBVElPTl9TVEFUVVMsUFVCTElDQVRJT05fRlJFRVRFWFQsRktfUkVGX0VYUEVDVEVEX1JFQVNPTixDUkVBVEVfREFURSxDUkVBVEVfVVNFUixNT0RfREFURSxNT0RfVVNFUiwKKworCQkJCQkJICBIQUNUSU9OLAorCQkJCQkJICBIREFURSwKKwkJCQkJCSAgSFVTRVIKKwkJCQkJCSApCisJVkFMVUVTIAkJCQkoCisJCQkJCQkgIE9MRC5JRCxPTEQuVVVJRCxPTEQuVkVSU0lPTl9OVU1CRVIsT0xELkZLX1JFRl9GQUlMVVJFX0NMQVNTSUZJQ0FUSU9OLE9MRC5GS19SRUZfRkFJTFVSRV9UWVBFLE9MRC5USVRMRSxPTEQuREVTQ1JJUFRJT04sT0xELlJFU1BPTlNJQklMSVRZLE9MRC5JTlRFUk5fRVhURVJOLE9MRC5GS19SRUZfU1RBVFVTX0lOVEVSTixPTEQuRktfUkVGX1NUQVRVU19FWFRFUk4sT0xELkZLX1JFRl9CUkFOQ0gsT0xELlZPTFRBR0VfTEVWRUwsT0xELlBSRVNTVVJFX0xFVkVMLE9MRC5GQUlMVVJFX0JFR0lOLE9MRC5GQUlMVVJFX0VORF9QTEFOTkVELE9MRC5GQUlMVVJFX0VORF9SRVNVUFBMSUVELE9MRC5JTlRFUk5BTF9SRU1BUkssT0xELlBPU1RDT0RFLE9MRC5DSVRZLE9MRC5ESVNUUklDVCxPTEQuU1RSRUVULE9MRC5IT1VTRU5VTUJFUixPTEQuU1RBVElPTl9JRCxPTEQuU1RBVElPTl9ERVNDUklQVElPTixPTEQuU1RBVElPTl9DT09SRFMsT0xELkZLX1JFRl9SQURJVVMsT0xELkxPTkdJVFVERSxPTEQuTEFUSVRVREUsT0xELkZLX1RCTF9GQUlMVVJFX0lORk9STUFUSU9OX0NPTkRFTlNFRCxPTEQuQ09OREVOU0VELE9MRC5DT05ERU5TRURfQ09VTlQsT0xELk9CSkVDVF9SRUZFUkVOQ0VfRVhURVJOQUxfU1lTVEVNLE9MRC5QVUJMSUNBVElPTl9TVEFUVVMsT0xELlBVQkxJQ0FUSU9OX0ZSRUVURVhULE9MRC5GS19SRUZfRVhQRUNURURfUkVBU09OLE9MRC5DUkVBVEVfREFURSxPTEQuQ1JFQVRFX1VTRVIsT0xELk1PRF9EQVRFLE9MRC5NT0RfVVNFUiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorCQkJCQkJICBjdXJyZW50X3RpbWVzdGFtcCwKKwkJCQkJICAgICAgT0xELk1PRF9VU0VSICk7CisJRU5EIElGOworCisgICAgICAgIFJFVFVSTiBPTEQ7CisgICAgRU5EOworJEJPRFkkCisgIExBTkdVQUdFIHBscGdzcWwgVk9MQVRJTEUKKyAgQ09TVCAxMDA7CitBTFRFUiBGVU5DVElPTiBQVUJMSUMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fREVMRVRFX1RSRygpCisgIE9XTkVSIFRPIGdmaV9zZXJ2aWNlOworCitEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIFRCTF9GQUlMVVJFX0lORk9STUFUSU9OX0RFTEVURV9UUkcgT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OOworCitDUkVBVEUgVFJJR0dFUiBUQkxfRkFJTFVSRV9JTkZPUk1BVElPTl9ERUxFVEVfVFJHCisgIEJFRk9SRSBERUxFVEUKKyAgT04gUFVCTElDLlRCTF9GQUlMVVJFX0lORk9STUFUSU9OCisgIEZPUiBFQUNIIFJPVworICBFWEVDVVRFIFBST0NFRFVSRSBQVUJMSUMuVEJMX0ZBSUxVUkVfSU5GT1JNQVRJT05fREVMRVRFX1RSRygpOworCmRpZmYgLS1naXQgYS9nZnNCYWNrZW5kU2VydmljZS9zcmMvbWFpbi9yZXNvdXJjZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDkzNTRmNzguLjU2NTg4M2QgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy9tYWluL3Jlc291cmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0xMiw2ICsxMiw3IEBACiBzdGF0aW9uLmlkLm5vdC5leGlzdGluZz1EaWUgXHUwMGZjYmVyZ2ViZW5lIElkIGVpbmVyIFN0YXRpb24gZXhpc3RpZXJ0IG5pY2h0Lgogbm8uYWRkcmVzc2VzLmZvci5zdGF0aW9uLmlkID0gRvxyIGRpZSBpbiBkZXIgU3T2cnVuZ3NtZWxkdW5nIGFuZ2VnZWJlbmUgU3RhdGlvbiBleGlzdGllcmVuIGtlaW5lIEFkcmVzc2VuLgogbm8uc3RhdGlvbi5pZC5hdmFpbGFibGU9SW4gZGVyIFx1MDBmY2JlcmdlYmVuZW4gU3T2cnVuZ3NtZWxkdW5nIGlzdCBrZWluZSBTdGF0aW9uIGFuZ2VnZWJlbi4KLWNvdWxkLm5vdC5wdXNoLm1haWw9RGllIFx1MDBmY2JlcmdlYmVuZSBTdPZydW5nc21lbGR1bmcga29ubnRlIG5pY2h0IGFuIGRpZSBNYWlsLVF1ZXVlIPxiZXJnZWJlbiB3ZXJkZW4uCitjb3VsZC5ub3QucHVzaC5yYWJiaXRNcU1lc3NhZ2UgPURpZSBcdTAwZmNiZXJnZWJlbmUgU3T2cnVuZ3NtZWxkdW5nIGtvbm50ZSBuaWNodCBhbiBSYWJiaXRNcSD8YmVyZ2ViZW4gd2VyZGVuLgorY2hhbm5lbC5ub3QuZXhpc3Rpbmc9ZGVyIFx1MDBmY2JlcmdlYmVuZSBLYW5hbCBmXHUwMGZjciBkZW4gVmVyc2FuZCBlaW5lciBOYWNocmljaHQgZXhpc3RpZXJ0IG5pY2h0LgogCiAKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvU3RvcmVQdWJsaXNoU3RhdHVzVGFza1Rlc3QuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9icG1uL2ltcGwvU3RvcmVQdWJsaXNoU3RhdHVzVGFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJiODVhCi0tLSAvZGV2L251bGwKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2JwbW4vaW1wbC9TdG9yZVB1Ymxpc2hTdGF0dXNUYXNrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uYmFzZS5Qcm9jZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLnRhc2tzLlByb2Nlc3NIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwudGFza3MuU3RvcmVQdWJsaXNoU3RhdHVzVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5UZXN0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbnN0YW50cy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tb2RlbC5SZWZTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tb2RlbC5UYmxBZGRyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsRmFpbHVyZUluZm9ybWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuVGJsU3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnJlcG9zaXRvcnkuQWRkcmVzc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5yZXBvc2l0b3J5LkZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5yZXBvc2l0b3J5LlN0YXRpb25SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ucmVwb3NpdG9yeS5TdGF0dXNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uc2VydmljZS5GYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uc3VwcG9ydC5Nb2NrRGF0YUhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnZpZXdtb2RlbC5GYWlsdXJlSW5mb3JtYXRpb25EdG87CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5RdWFsaWZpZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LnRlc3QuYXV0b2NvbmZpZ3VyZS5vcm0uanBhLkRhdGFKcGFUZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC50ZXN0Lm1vY2subW9ja2l0by5Nb2NrQmVhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueVN0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitARGF0YUpwYVRlc3QKK0BDb250ZXh0Q29uZmlndXJhdGlvbihjbGFzc2VzID0ge1Rlc3RDb25maWd1cmF0aW9uLmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBTdG9yZVB1Ymxpc2hTdGF0dXNUYXNrVGVzdCB7CisKKworICAgIEBRdWFsaWZpZXIoIm15RmFpbHVyZUluZm9ybWF0aW9uU2VydmljZSIpCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgRmFpbHVyZUluZm9ybWF0aW9uU2VydmljZSBmYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlOworCisgICAgQE1vY2tCZWFuCisgICAgcHJpdmF0ZSBQcm9jZXNzSGVscGVyIHByb2Nlc3NIZWxwZXI7CisgICAgQE1vY2tCZWFuCisgICAgcHJpdmF0ZSBTdGF0dXNSZXBvc2l0b3J5IHN0YXR1c1JlcG9zaXRvcnk7CisgICAgQE1vY2tCZWFuCisgICAgcHJpdmF0ZSBGYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5IGZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnk7CisgICAgQE1vY2tCZWFuCisgICAgcHJpdmF0ZSBTdGF0aW9uUmVwb3NpdG9yeSBzdGF0aW9uUmVwb3NpdG9yeTsKKyAgICBATW9ja0JlYW4KKyAgICBwcml2YXRlIEFkZHJlc3NSZXBvc2l0b3J5IGFkZHJlc3NSZXBvc2l0b3J5OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRTZXRDb3JyZWN0U3RhdHVzT25MZWF2ZVN0ZXAoKSB0aHJvd3MgUHJvY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIFJlZlN0YXR1cyByZWZTdGF0dXMgPSBNb2NrRGF0YUhlbHBlci5tb2NrUmVmU3RhdHVzKCk7CisKKyAgICAgICAgRmFpbHVyZUluZm9ybWF0aW9uRHRvIGZpRHRvID0gTW9ja0RhdGFIZWxwZXIubW9ja0ZhaWx1cmVJbmZvcm1hdGlvbkR0bygpOworICAgICAgICBmaUR0by5zZXRTdGF0dXNJbnRlcm5JZChVVUlELnJhbmRvbVVVSUQoKSk7CisKKyAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uIGZpVGJsID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvbigpOworICAgICAgICBmaVRibC5zZXRJZCg3NzdMKTsKKyAgICAgICAgVGJsU3RhdGlvbiB0YmxTdGF0aW9uID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibFN0YXRpb24oKTsKKyAgICAgICAgTGlzdDxUYmxBZGRyZXNzPiBhZGRyZXNzTGlzdCA9IE1vY2tEYXRhSGVscGVyLm1vY2tUYmxBZGRyZXNzTGlzdCgpOworCisgICAgICAgIHdoZW4ocHJvY2Vzc0hlbHBlci5nZXRQcm9jZXNzU3RhdGVGcm9tU3RhdHVzVXVpZChhbnkoIFVVSUQuY2xhc3MgKSkpLnRoZW5SZXR1cm4oR2ZpUHJvY2Vzc1N0YXRlLkNBTkNFTEVEKTsKKyAgICAgICAgd2hlbihzdGF0dXNSZXBvc2l0b3J5LmZpbmRCeVV1aWQoYW55KCBVVUlELmNsYXNzICkpKS50aGVuUmV0dXJuKE9wdGlvbmFsLm9mKHJlZlN0YXR1cykpOworICAgICAgICB3aGVuKGZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnkuZmluZEJ5VXVpZChhbnkoVVVJRC5jbGFzcykpKS50aGVuUmV0dXJuKE9wdGlvbmFsLm9mKGZpVGJsKSk7CisgICAgICAgIHdoZW4oc3RhdGlvblJlcG9zaXRvcnkuZmluZEJ5U3RhdGlvbklkKGFueVN0cmluZygpKSkudGhlblJldHVybihPcHRpb25hbC5vZih0YmxTdGF0aW9uKSk7CisgICAgICAgIHdoZW4oYWRkcmVzc1JlcG9zaXRvcnkuZmluZEJ5U3RhdGlvbklkKGFueVN0cmluZygpKSkudGhlblJldHVybihhZGRyZXNzTGlzdCk7CisgICAgICAgIHdoZW4oIHByb2Nlc3NIZWxwZXIuc3RvcmVGYWlsdXJlRnJvbVZpZXdNb2RlbChhbnkoRmFpbHVyZUluZm9ybWF0aW9uRHRvLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgLnRoZW4oKEFuc3dlcjxGYWlsdXJlSW5mb3JtYXRpb25EdG8+KSBpbnZvY2F0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRmFpbHVyZUluZm9ybWF0aW9uRHRvKSBhcmdzWzBdOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGZpVGJsLnNldFB1YmxpY2F0aW9uU3RhdHVzKCJub3RoaW5nIik7CisgICAgICAgIFN0b3JlUHVibGlzaFN0YXR1c1Rhc2sgdGVzdFRhc2sgPSBuZXcgU3RvcmVQdWJsaXNoU3RhdHVzVGFzayhDb25zdGFudHMuUFVCX1NUQVRVU19WRVJPRUZGRU5UTElDSFQpOworICAgICAgICBHZmlQcm9jZXNzU3ViamVjdCBzdWJqZWN0ID0gR2ZpUHJvY2Vzc1N1YmplY3Qub2YoZmlEdG8sIHByb2Nlc3NIZWxwZXIpOworICAgICAgICB0ZXN0VGFzay5sZWF2ZVN0ZXAoc3ViamVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb25zdGFudHMuUFVCX1NUQVRVU19WRVJPRUZGRU5UTElDSFQsIHN1YmplY3QuZ2V0RmFpbHVyZUluZm9ybWF0aW9uRHRvKCkuZ2V0UHVibGljYXRpb25TdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9UZXN0Q29uZmlndXJhdGlvbi5qYXZhIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbmZpZy9UZXN0Q29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDY4MmU3NDguLjNkNjJjYWMgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb25maWcvVGVzdENvbmZpZ3VyYXRpb24uamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29uZmlnL1Rlc3RDb25maWd1cmF0aW9uLmphdmEKQEAgLTIxLDI4ICsyMSwzMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLkdmaUdyaWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwuR2ZpUHJvY2Vzc0Vudmlyb25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLnRhc2tzLlByb2Nlc3NIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcucmFiYml0TXEuUmFiYml0TXFDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcucmFiYml0TXEuUmFiYml0TXFQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubWFwcGVyLio7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5zZXJ2aWNlLio7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi51dGlsLkltcG9ydERhdGFWYWxpZGF0b3I7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAuY29yZS5EaXJlY3RFeGNoYW5nZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmFtcXAucmFiYml0LmNvbm5lY3Rpb24uQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5hbXFwLnJhYmJpdC5jb3JlLlJhYmJpdEFkbWluOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYW1xcC5yYWJiaXQuY29yZS5SYWJiaXRUZW1wbGF0ZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5RdWFsaWZpZXI7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmF1dG9jb25maWd1cmUuZG9tYWluLkVudGl0eVNjYW47CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LnRlc3QuY29udGV4dC5Db25maWdGaWxlQXBwbGljYXRpb25Db250ZXh0SW5pdGlhbGl6ZXI7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEuanBhLnJlcG9zaXRvcnkuY29uZmlnLkVuYWJsZUpwYVJlcG9zaXRvcmllczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmludGVncmF0aW9uLmNoYW5uZWwuRGlyZWN0Q2hhbm5lbDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5UZXN0UHJvcGVydHlTb3VyY2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCiBARW5hYmxlSnBhUmVwb3NpdG9yaWVzKGJhc2VQYWNrYWdlcyA9ICJvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uIikKIEBFbnRpdHlTY2FuKGJhc2VQYWNrYWdlQ2xhc3NlcyA9IEdyaWRGYWlsdXJlSW5mb3JtYXRpb25BcHBsaWNhdGlvbi5jbGFzcykKIEBDb250ZXh0Q29uZmlndXJhdGlvbiggaW5pdGlhbGl6ZXJzID0ge0NvbmZpZ0ZpbGVBcHBsaWNhdGlvbkNvbnRleHRJbml0aWFsaXplci5jbGFzc30pCiBAVGVzdFByb3BlcnR5U291cmNlKCJzcHJpbmcuY29uZmlnLmxvY2F0aW9uPWNsYXNzcGF0aDphcHBsaWNhdGlvbi55bWwiKQogcHVibGljIGNsYXNzIFRlc3RDb25maWd1cmF0aW9uIHsKLSAgICBAQmVhbgotICAgIEZFU2V0dGluZ3NNYXBwZXIgZmVTZXR0aW5nc01hcHBlcigpe3JldHVybiBuZXcgRkVTZXR0aW5nc01hcHBlckltcGwoKTt9CiAKICAgICBAQmVhbgogICAgIFNldHRpbmdzU2VydmljZSBzZXR0aW5nc1NlcnZpY2UoKXtyZXR1cm4gbmV3IFNldHRpbmdzU2VydmljZSgpO30KQEAgLTUxLDkgKzU0LDEzIEBACiAgICAgRkVTZXR0aW5ncyBmRVNldHRpbmdzKCl7cmV0dXJuIG5ldyBGRVNldHRpbmdzKCk7fQogCiAgICAgQEJlYW4KLSAgICBwdWJsaWMgUmFiYml0VGVtcGxhdGUgcmFiYml0VGVtcGxhdGUoKSB7Ci0gICAgICAgIHJldHVybiBNb2NraXRvLm1vY2soUmFiYml0VGVtcGxhdGUuY2xhc3MpOwotICAgIH0KKyAgICBAUXVhbGlmaWVyKCJleGNoYW5nZSIpCisgICAgcHVibGljIERpcmVjdEV4Y2hhbmdlIGV4Y2hhbmdlKCl7cmV0dXJuIE1vY2tpdG8ubW9jayhEaXJlY3RFeGNoYW5nZS5jbGFzcyk7fQorCisgICAgQEJlYW4KKyAgICBAUXVhbGlmaWVyKCJyYWJiaXRBZG1pbiIpCisgICAgcHVibGljIFJhYmJpdEFkbWluIHJhYmJpdEFkbWluKCl7cmV0dXJuIE1vY2tpdG8ubW9jayhSYWJiaXRBZG1pbi5jbGFzcyk7fQorCiAKICAgICBAQmVhbgogICAgIEBRdWFsaWZpZXIoInJhYmJpdE1xQ29uZmlnIikKQEAgLTYyLDggKzY5LDI2IEBACiAgICAgfQogCiAgICAgQEJlYW4KLSAgICBAUXVhbGlmaWVyKCJtYWlsRXhwb3J0Q2hhbm5lbCIpCi0gICAgTWVzc2FnZUNoYW5uZWwgbWFpbEV4cG9ydENoYW5uZWwoKSB7IHJldHVybiBNb2NraXRvLm1vY2soRGlyZWN0Q2hhbm5lbC5jbGFzcyk7IH0KKyAgICBAUXVhbGlmaWVyKCJyYWJiaXRUZW1wbGF0ZSIpCisgICAgcHVibGljIFJhYmJpdFRlbXBsYXRlIHJhYmJpdFRlbXBsYXRlKCl7CisKKyAgICAgICAgUmFiYml0VGVtcGxhdGUgcnQgPSAgTW9ja2l0by5tb2NrKFJhYmJpdFRlbXBsYXRlLmNsYXNzKTsKKyAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnkgY2YgPSBNb2NraXRvLm1vY2soQ29ubmVjdGlvbkZhY3RvcnkuY2xhc3MpOworICAgICAgICAvL3J0LnNldENvbm5lY3Rpb25GYWN0b3J5KGNmKTsKKworICAgICAgICB3aGVuKHJ0LmdldENvbm5lY3Rpb25GYWN0b3J5KCkpLnRoZW5SZXR1cm4oY2YpOworCisgICAgICAgIHJldHVybiBydDsKKworICAgIH0KKworICAgIEBCZWFuCisgICAgQFF1YWxpZmllcigicmFiYml0TXFQcm9wZXJ0aWVzIikKKyAgICBwdWJsaWMgUmFiYml0TXFQcm9wZXJ0aWVzIHJhYmJpdE1xUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIE1vY2tpdG8ubW9jayhSYWJiaXRNcVByb3BlcnRpZXMuY2xhc3MpOworICAgIH0KKworCiAKICAgICBAQmVhbgogICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKCl7cmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpO30KZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb250cm9sbGVyL0ZhaWx1cmVJbmZvcm1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vY29udHJvbGxlci9GYWlsdXJlSW5mb3JtYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDI5YzdiZmYuLmY4NWNjNzkgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9jb250cm9sbGVyL0ZhaWx1cmVJbmZvcm1hdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL2NvbnRyb2xsZXIvRmFpbHVyZUluZm9ybWF0aW9uQ29udHJvbGxlclRlc3QuamF2YQpAQCAtNDAsNyArNDAsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmVxOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uKjsKIGltcG9ydCBzdGF0aWMgb3JnLnNwcmluZ2ZyYW1ld29yay50ZXN0LndlYi5zZXJ2bGV0LnJlcXVlc3QuTW9ja012Y1JlcXVlc3RCdWlsZGVycy4qOwogaW1wb3J0IHN0YXRpYyBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3Qud2ViLnNlcnZsZXQucmVzdWx0Lk1vY2tNdmNSZXN1bHRNYXRjaGVycy4qOwogCkBAIC05Niw5ICs5NiwyMyBAQAogICAgICAgICAgICAgICAgIC5jb250ZW50VHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKICAgICAgICAgICAgICAgICAuY29udGVudChuZXcgT2JqZWN0TWFwcGVyKCkud3JpdGVWYWx1ZUFzU3RyaW5nKGZhaWx1cmVJbmZvRHRvKSkpCiAgICAgICAgICAgICAgICAgLmFuZEV4cGVjdChzdGF0dXMoKS5pczJ4eFN1Y2Nlc3NmdWwoKSk7CisKKyAgICAgICAgdmVyaWZ5KGZhaWx1cmVJbmZvcm1hdGlvblNlcnZpY2UsIHRpbWVzKDEpKS51cGRhdGVGYWlsdXJlSW5mbyhlcShmYWlsdXJlSW5mb0R0bykpOwogICAgIH0KIAogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRVcGRhdGVGYWlsdXJlSW5mb3JtYXRpb25Gb3JQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBmYWlsdXJlSW5mb0R0byA9IE1vY2tEYXRhSGVscGVyLm1vY2tGYWlsdXJlSW5mb3JtYXRpb25EdG8oKTsKKworICAgICAgICBtb2NrTXZjLnBlcmZvcm0ocHV0KCIvZ3JpZC1mYWlsdXJlLWluZm9ybWF0aW9ucy97ZmFpbHVyZUluZm9VdWlkfT9zYXZlRm9yUHVibGlzaD10cnVlIiwgZmFpbHVyZUluZm9EdG8uZ2V0VXVpZCgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgIC5jb250ZW50KG5ldyBPYmplY3RNYXBwZXIoKS53cml0ZVZhbHVlQXNTdHJpbmcoZmFpbHVyZUluZm9EdG8pKSkKKyAgICAgICAgICAgICAgICAuYW5kRXhwZWN0KHN0YXR1cygpLmlzMnh4U3VjY2Vzc2Z1bCgpKTsKKworICAgICAgICB2ZXJpZnkoZmFpbHVyZUluZm9ybWF0aW9uU2VydmljZSwgdGltZXMoMSkpLnVwZGF0ZUFuZFB1Ymxpc2goZXEoZmFpbHVyZUluZm9EdG8pKTsKKyAgICB9CisKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc2hvdWxkTm90VXBkYXRlRmFpbHVyZUluZm9ybWF0aW9uRHVlVG9FeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0V4cG9ydFNlcnZpY2VUZXN0LmphdmEgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9FeHBvcnRTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDRmMDMwYzMuLmMyOGNmYTYgMTAwNjQ0Ci0tLSBhL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0V4cG9ydFNlcnZpY2VUZXN0LmphdmEKKysrIGIvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3NlcnZpY2UvRXhwb3J0U2VydmljZVRlc3QuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5icG1uLmltcGwuR2ZpUHJvY2Vzc1N0YXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLlRlc3RDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uY29uZmlnLnJhYmJpdE1xLlJhYmJpdE1xQ2hhbm5lbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmV4Y2VwdGlvbnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLm1hcHBlci5GYWlsdXJlSW5mb3JtYXRpb25NYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5tb2RlbC5UYmxEaXN0cmlidXRpb25Hcm91cDsKQEAgLTc1LDI5ICs3NiwzMSBAQAogICAgIEBBdXRvd2lyZWQKICAgICBwcml2YXRlIEV4cG9ydFNlcnZpY2UgZXhwb3J0U2VydmljZTsKIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkRXhwb3J0RmFpbHVyZUluZm9Bc01haWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRXhwb3J0U2VydmljZSBleHBvcnRTZXJ2aWNlTG9jYWwgPSBzcHkoZXhwb3J0U2VydmljZSk7Ci0KLSAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uIHRibEZhaWx1cmVJbmZvcm1hdGlvbiA9IE1vY2tEYXRhSGVscGVyLm1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb24oKTsKLSAgICAgICAgTGlzdDxUYmxEaXN0cmlidXRpb25Hcm91cD4gbGlzdFRibERpc3RyaWJ1dGlvbkdyb3Vwcz0gTW9ja0RhdGFIZWxwZXIubW9ja0Rpc3RyaWJ1dGlvbkdyb3VwTGlzdCgpOwotICAgICAgICB0YmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0RGlzdHJpYnV0aW9uR3JvdXBzKGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cHMpOwotICAgICAgICBMaXN0PERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvPiBsaXN0VGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJEdG9zID0gIE1vY2tEYXRhSGVscGVyLm1vY2tEaXN0cmlidXRpb25Hcm91cE1lbWJlckR0b0xpc3QoKTsKLQotICAgICAgICB3aGVuIChmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoIGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YodGJsRmFpbHVyZUluZm9ybWF0aW9uKSk7Ci0gICAgICAgIHdoZW4oZGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJTZXJ2aWNlLmdldE1lbWJlcnNCeUdyb3VwSWQoYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihsaXN0VGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJEdG9zKTsKLSAgICAgICAgZG9Ob3RoaW5nKCkud2hlbihleHBvcnRTZXJ2aWNlTG9jYWwpLmNoZWNrRXhjaGFuZ2VBbmRRdWV1ZU9uUmFiYml0TXEoKTsKLSAgICAgICAgd2hlbihtYWlsRXhwb3J0Q2hhbm5lbC5zZW5kKGFueShNZXNzYWdlLmNsYXNzKSkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0KLSAgICAgICAgU3RyaW5nW10gY2hhbm5lbHMgPSB7Ik1BSUwifTsKLQotICAgICAgICBib29sZWFuIGlzTWFpbFB1c2hlZCA9IGV4cG9ydFNlcnZpY2VMb2NhbC5leHBvcnRGYWlsdXJlSW5mb3JtYXRpb24oVVVJRC5yYW5kb21VVUlEKCksIGNoYW5uZWxzKTsKLQotICAgICAgICBNb2NraXRvLnZlcmlmeShtYWlsRXhwb3J0Q2hhbm5lbCwgdGltZXMoMikpLnNlbmQoYW55KE1lc3NhZ2UuY2xhc3MpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc01haWxQdXNoZWQpOwotCi0gICAgfQorLy8gICAgQFRlc3QKKy8vICAgIHB1YmxpYyB2b2lkIHNob3VsZEV4cG9ydEZhaWx1cmVJbmZvQXNNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLworLy8gICAgICAgIEV4cG9ydFNlcnZpY2UgZXhwb3J0U2VydmljZUxvY2FsID0gc3B5KGV4cG9ydFNlcnZpY2UpOworLy8KKy8vICAgICAgICBUYmxGYWlsdXJlSW5mb3JtYXRpb24gdGJsRmFpbHVyZUluZm9ybWF0aW9uID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvbigpOworLy8gICAgICAgIExpc3Q8VGJsRGlzdHJpYnV0aW9uR3JvdXA+IGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cHM9IE1vY2tEYXRhSGVscGVyLm1vY2tEaXN0cmlidXRpb25Hcm91cExpc3QoKTsKKy8vICAgICAgICBSYWJiaXRNcUNoYW5uZWwgcmFiYml0TXFDaGFubmVsID0gIE1vY2tEYXRhSGVscGVyLm1vY2tSYWJiaXRNcUNoYW5uZWwoKTsKKy8vICAgICAgICB0YmxGYWlsdXJlSW5mb3JtYXRpb24uc2V0RGlzdHJpYnV0aW9uR3JvdXBzKGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cHMpOworLy8gICAgICAgIExpc3Q8RGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJEdG8+IGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cE1lbWJlckR0b3MgPSAgTW9ja0RhdGFIZWxwZXIubW9ja0Rpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvTGlzdCgpOworLy8KKy8vICAgICAgICB3aGVuIChmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoIGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YodGJsRmFpbHVyZUluZm9ybWF0aW9uKSk7CisvLyAgICAgICAgd2hlbihkaXN0cmlidXRpb25Hcm91cE1lbWJlclNlcnZpY2UuZ2V0TWVtYmVyc0J5R3JvdXBJZChhbnkoVVVJRC5jbGFzcykpKS50aGVuUmV0dXJuKGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cE1lbWJlckR0b3MpOworLy8gICAgICAgIGRvTm90aGluZygpLndoZW4oZXhwb3J0U2VydmljZUxvY2FsKS5jaGVja0V4Y2hhbmdlQW5kUXVldWVPblJhYmJpdE1xKGFueVN0cmluZygpLCBhbnlTdHJpbmcoKSk7CisvLyAgICAgICAgZG9SZXR1cm4ocmFiYml0TXFDaGFubmVsKS53aGVuKGV4cG9ydFNlcnZpY2VMb2NhbC5nZXRBdmFpbGFibGVSYWJiaXRNcUNoYW5uZWwoYW55U3RyaW5nKCkpKTsKKy8vICAgICAgICB3aGVuKG1haWxFeHBvcnRDaGFubmVsLnNlbmQoYW55KE1lc3NhZ2UuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsKKy8vCisvLyAgICAgICAgU3RyaW5nW10gY2hhbm5lbHMgPSB7Ik1BSUwifTsKKy8vCisvLyAgICAgICAgYm9vbGVhbiBpc01haWxQdXNoZWQgPSBleHBvcnRTZXJ2aWNlTG9jYWwuZXhwb3J0RmFpbHVyZUluZm9ybWF0aW9uKFVVSUQucmFuZG9tVVVJRCgpLCBjaGFubmVscyk7CisvLworLy8gICAgICAgIE1vY2tpdG8udmVyaWZ5KG1haWxFeHBvcnRDaGFubmVsLCB0aW1lcygyKSkuc2VuZChhbnkoTWVzc2FnZS5jbGFzcykpOworLy8gICAgICAgIGFzc2VydFRydWUoaXNNYWlsUHVzaGVkKTsKKy8vCisvLyAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEV4cG9ydEZhaWx1cmVJbmZvQXNNYWlsc19ub0Rpc3RyaWJ1dGlvbkdyb3VwcygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTExLDcgKzExNCw3IEBACiAKICAgICAgICAgd2hlbiAoZmFpbHVyZUluZm9ybWF0aW9uUmVwb3NpdG9yeS5maW5kQnlVdWlkKCBhbnkoVVVJRC5jbGFzcykpKS50aGVuUmV0dXJuKE9wdGlvbmFsLm9mKHRibEZhaWx1cmVJbmZvcm1hdGlvbikpOwogICAgICAgICB3aGVuKGRpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyU2VydmljZS5nZXRNZW1iZXJzQnlHcm91cElkKGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4obGlzdFRibERpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvcyk7Ci0gICAgICAgIGRvTm90aGluZygpLndoZW4oZXhwb3J0U2VydmljZUxvY2FsKS5jaGVja0V4Y2hhbmdlQW5kUXVldWVPblJhYmJpdE1xKCk7CisgICAgICAgIGRvTm90aGluZygpLndoZW4oZXhwb3J0U2VydmljZUxvY2FsKS5jaGVja0V4Y2hhbmdlQW5kUXVldWVPblJhYmJpdE1xKGFueVN0cmluZygpLCBhbnlTdHJpbmcoKSk7CiAgICAgICAgIHdoZW4obWFpbEV4cG9ydENoYW5uZWwuc2VuZChhbnkoTWVzc2FnZS5jbGFzcykpKS50aGVuUmV0dXJuKHRydWUpOwogCiAgICAgICAgIFN0cmluZ1tdIGNoYW5uZWxzID0geyJNQUlMIn07CkBAIC0xMzcsNyArMTQwLDcgQEAKIAogICAgICAgICB3aGVuIChmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoIGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YodGJsRmFpbHVyZUluZm9ybWF0aW9uKSk7CiAgICAgICAgIHdoZW4oZGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJTZXJ2aWNlLmdldE1lbWJlcnNCeUdyb3VwSWQoYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihsaXN0VGJsRGlzdHJpYnV0aW9uR3JvdXBNZW1iZXJEdG9zKTsKLSAgICAgICAgZG9Ob3RoaW5nKCkud2hlbihleHBvcnRTZXJ2aWNlTG9jYWwpLmNoZWNrRXhjaGFuZ2VBbmRRdWV1ZU9uUmFiYml0TXEoKTsKKyAgICAgICAgZG9Ob3RoaW5nKCkud2hlbihleHBvcnRTZXJ2aWNlTG9jYWwpLmNoZWNrRXhjaGFuZ2VBbmRRdWV1ZU9uUmFiYml0TXEoYW55U3RyaW5nKCksIGFueVN0cmluZygpKTsKICAgICAgICAgd2hlbihtYWlsRXhwb3J0Q2hhbm5lbC5zZW5kKGFueShNZXNzYWdlLmNsYXNzKSkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAKICAgICAgICAgU3RyaW5nW10gY2hhbm5lbHMgPSB7Ik1BSUwifTsKQEAgLTE2Myw3ICsxNjYsNyBAQAogCiAgICAgICAgIHdoZW4gKGZhaWx1cmVJbmZvcm1hdGlvblJlcG9zaXRvcnkuZmluZEJ5VXVpZCggYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihPcHRpb25hbC5vZih0YmxGYWlsdXJlSW5mb3JtYXRpb24pKTsKICAgICAgICAgd2hlbihkaXN0cmlidXRpb25Hcm91cE1lbWJlclNlcnZpY2UuZ2V0TWVtYmVyc0J5R3JvdXBJZChhbnkoVVVJRC5jbGFzcykpKS50aGVuUmV0dXJuKGxpc3RUYmxEaXN0cmlidXRpb25Hcm91cE1lbWJlckR0b3MpOwotICAgICAgICBkb05vdGhpbmcoKS53aGVuKGV4cG9ydFNlcnZpY2VMb2NhbCkuY2hlY2tFeGNoYW5nZUFuZFF1ZXVlT25SYWJiaXRNcSgpOworICAgICAgICBkb05vdGhpbmcoKS53aGVuKGV4cG9ydFNlcnZpY2VMb2NhbCkuY2hlY2tFeGNoYW5nZUFuZFF1ZXVlT25SYWJiaXRNcShhbnlTdHJpbmcoKSwgYW55U3RyaW5nKCkpOwogICAgICAgICB3aGVuKG1haWxFeHBvcnRDaGFubmVsLnNlbmQoYW55KE1lc3NhZ2UuY2xhc3MpKSkudGhlblJldHVybih0cnVlKTsKIAogICAgICAgICBTdHJpbmdbXSBjaGFubmVscyA9IHsiVEVTVCIsICJURVNUMiJ9OwpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3NlcnZpY2UvRmFpbHVyZUluZm9ybWF0aW9uU2VydmljZVRlc3QuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zZXJ2aWNlL0ZhaWx1cmVJbmZvcm1hdGlvblNlcnZpY2VUZXN0LmphdmEKaW5kZXggMTJmZWI0My4uMmYxMzM1ZiAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3NlcnZpY2UvRmFpbHVyZUluZm9ybWF0aW9uU2VydmljZVRlc3QuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc2VydmljZS9GYWlsdXJlSW5mb3JtYXRpb25TZXJ2aWNlVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmJwbW4uaW1wbC5HZmlQcm9jZXNzU3RhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcuVGVzdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25maWcucmFiYml0TXEuUmFiYml0TXFDaGFubmVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uZXhjZXB0aW9ucy5CYWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uZXhjZXB0aW9ucy5Ob3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmV4Y2VwdGlvbnMuT3BlcmF0aW9uRGVuaWVkRXhjZXB0aW9uOwpAQCAtMzQsMTAgKzM1LDcgQEAKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnRlc3QuY29udGV4dC5Db250ZXh0Q29uZmlndXJhdGlvbjsKIAogaW1wb3J0IGphdmEuc3FsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLio7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuKjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy4qOwpAQCAtMjQ1LDcgKzI0Myw2MyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoZmlUYmwuZ2V0U3RhdGlvbkNvb3JkcygpLCBzYXZlZER0by5nZXRTdGF0aW9uQ29vcmRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZmlUYmwuZ2V0TG9uZ2l0dWRlKCksIHNhdmVkRHRvLmdldExvbmdpdHVkZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpVGJsLmdldExhdGl0dWRlKCksIHNhdmVkRHRvLmdldExhdGl0dWRlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc2F2ZWREdG8uZ2V0QWRkcmVzc1BvbHlnb25Qb2ludHMoKS5zaXplKCkpOworLy8gICAgICAgIGFzc2VydEVxdWFscyg1LCBzYXZlZER0by5nZXRBZGRyZXNzUG9seWdvblBvaW50cygpLnNpemUoKSk7IF9mZCByZXZlcnNlTWFwcGluZyBvZiBzdGF0aW9ucworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkVXBkYXRlRmFpbHVyZUluZm9ybWF0aW9uX3VwZGF0ZUNoYW5uZWxzMSgpIHsKKworICAgICAgICBGYWlsdXJlSW5mb3JtYXRpb25EdG8gZmlEdG8gPSAgTW9ja0RhdGFIZWxwZXIubW9ja0ZhaWx1cmVJbmZvcm1hdGlvbkR0bygpOworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gY2hhbm5lbExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGNoYW5uZWxMaXN0LmFkZCgiTU9DS1hYIik7IC8vbmV1ZXIgQ2hhbm5lbCBlbnRzcHJpY2h0IGtlaW5lbSBiZXJlaXRzIGV4aXN0aWVyZW5kZW0gQ2hhbm5lbAorICAgICAgICBjaGFubmVsTGlzdC5hZGQoIk1PQ0tZWSIpOyAvL25ldWVyIENoYW5uZWwgZW50c3ByaWNodCBrZWluZW0gYmVyZWl0cyBleGlzdGllcmVuZGVtIENoYW5uZWwKKyAgICAgICAgZmlEdG8uc2V0UHVibGljYXRpb25DaGFubmVscyhjaGFubmVsTGlzdCk7CisKKyAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uIHRibEZpID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvbigpOworICAgICAgICBUYmxGYWlsdXJlSW5mb3JtYXRpb24gZXhpc3RpbmdUYmxGaSA9IE1vY2tEYXRhSGVscGVyLm1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb24oKTsKKworICAgICAgICBUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwgdGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsMSA9IE1vY2tEYXRhSGVscGVyLm1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwoKTsKKyAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsIHRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbDIgPSBNb2NrRGF0YUhlbHBlci5tb2NrVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsMigpOworCisgICAgICAgIExpc3Q8VGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsPiBybXFDaGFubmVscyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgcm1xQ2hhbm5lbHMuYWRkKHRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbDEpOworICAgICAgICBybXFDaGFubmVscy5hZGQodGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsMik7CisgICAgICAgIGV4aXN0aW5nVGJsRmkuc2V0UHVibGljYXRpb25DaGFubmVsTGlzdChybXFDaGFubmVscyk7CisKKyAgICAgICAgd2hlbiggZmFpbHVyZUluZm9ybWF0aW9uUmVwb3NpdG9yeS5maW5kQnlVdWlkKGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YoZXhpc3RpbmdUYmxGaSkpOworCisgICAgICAgIGZhaWx1cmVJbmZvcm1hdGlvblNlcnZpY2UudXBkYXRlUHVibGljYXRpb25DaGFubmVscyhmaUR0bywgdGJsRmkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0LCB0YmxGaS5nZXRQdWJsaWNhdGlvbkNoYW5uZWxMaXN0KCkuc2l6ZSgpKTsgLy96dSBkZW4gendlaSBiZXJlaXRzIGV4aXN0aWVyZW5kZW4gQ2hhbm5lbHMga29tbWVuIHp3ZWkgd2VpdGVyZSBoaW56dQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRVcGRhdGVGYWlsdXJlSW5mb3JtYXRpb25fdXBkYXRlQ2hhbm5lbHMyKCkgeworCisgICAgICAgIEZhaWx1cmVJbmZvcm1hdGlvbkR0byBmaUR0byA9ICBNb2NrRGF0YUhlbHBlci5tb2NrRmFpbHVyZUluZm9ybWF0aW9uRHRvKCk7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBjaGFubmVsTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgY2hhbm5lbExpc3QuYWRkKCJNT0NLTUFJTCIpOyAvLyBuZXVlciBDaGFubmVsIGVudHNwcmljaHQgZWluZW0gYmVyZWl0cyBleGlzdGllcmVuZGVtIENoYW5uZWwKKyAgICAgICAgY2hhbm5lbExpc3QuYWRkKCJNT0NLU01TIik7IC8vIG5ldWVyIENoYW5uZWwgZW50c3ByaWNodCBlaW5lbSBiZXJlaXRzIGV4aXN0aWVyZW5kZW0gQ2hhbm5lbAorICAgICAgICBmaUR0by5zZXRQdWJsaWNhdGlvbkNoYW5uZWxzKGNoYW5uZWxMaXN0KTsKKworICAgICAgICBUYmxGYWlsdXJlSW5mb3JtYXRpb24gdGJsRmkgPSBNb2NrRGF0YUhlbHBlci5tb2NrVGJsRmFpbHVyZUluZm9ybWF0aW9uKCk7CisgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvbiBleGlzdGluZ1RibEZpID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvbigpOworCisgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCB0YmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwxID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCgpOworICAgICAgICBUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwgdGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsMiA9IE1vY2tEYXRhSGVscGVyLm1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwyKCk7CisKKyAgICAgICAgTGlzdDxUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWw+IHJtcUNoYW5uZWxzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBybXFDaGFubmVscy5hZGQodGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsMSk7CisgICAgICAgIHJtcUNoYW5uZWxzLmFkZCh0YmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwyKTsKKyAgICAgICAgZXhpc3RpbmdUYmxGaS5zZXRQdWJsaWNhdGlvbkNoYW5uZWxMaXN0KHJtcUNoYW5uZWxzKTsKKworICAgICAgICB3aGVuKCBmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihPcHRpb25hbC5vZihleGlzdGluZ1RibEZpKSk7CisKKyAgICAgICAgZmFpbHVyZUluZm9ybWF0aW9uU2VydmljZS51cGRhdGVQdWJsaWNhdGlvbkNoYW5uZWxzKGZpRHRvLCB0YmxGaSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHRibEZpLmdldFB1YmxpY2F0aW9uQ2hhbm5lbExpc3QoKS5zaXplKCkpOyAvL2VzIGJsZWlidCBiZWkgZGVuIGJlcmVpdHMgZXhpc3RpZXJlbmRlbiAyIENoYW5uZWxzCisKICAgICB9CiAKICAgICBAVGVzdApAQCAtNDYyLDcgKzUxNiw3IEBACiAgICAgICAgIFRibERpc3RyaWJ1dGlvbkdyb3VwIHRibERpc3RyaWJ1dGlvbkdyb3VwID0gTW9ja0RhdGFIZWxwZXIubW9ja1RibERpc3RyaWJ1dGlvbkdyb3VwKCk7CiAKICAgICAgICAgd2hlbihzdGF0dXNSZXBvc2l0b3J5LmZpbmRCeUlkKGFueUxvbmcoKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YocmVmU3RhdHVzKSk7Ci0gICAgICAgIHdoZW4oZmFpbHVyZUluZm9ybWF0aW9uUmVwb3NpdG9yeS5maW5kQnlVdWlkKGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YoZmlUYmwpKTsKKyAgICAgICAgd2hlbihmYWlsdXJlSW5mb3JtYXRpb25SZXBvc2l0b3J5LmZpbmRCeVV1aWQoYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihPcHRpb25hbC5vZihmaVRibCksIE9wdGlvbmFsLm9mKGZpVGJsKSk7CiAgICAgICAgIHdoZW4oYnJhbmNoUmVwb3NpdG9yeS5maW5kQnlVdWlkKGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YocmVmQnJhbmNoKSk7CiAgICAgICAgIHdoZW4oZmFpbHVyZUNsYXNzaWZpY2F0aW9uUmVwb3NpdG9yeS5maW5kQnlVdWlkKGFueShVVUlELmNsYXNzKSkpLnRoZW5SZXR1cm4oT3B0aW9uYWwub2YocmVmRmFpbHVyZUNsYXNzaWZpY2F0aW9uKSk7CiAgICAgICAgIHdoZW4oZmFpbHVyZVR5cGVSZXBvc2l0b3J5LmZpbmRCeVV1aWQoYW55KFVVSUQuY2xhc3MpKSkudGhlblJldHVybihPcHRpb25hbC5vZihyZWZGYWlsdXJlVHlwZSkpOwpkaWZmIC0tZ2l0IGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3N1cHBvcnQvTW9ja0RhdGFIZWxwZXIuamF2YSBiL2dmc0JhY2tlbmRTZXJ2aWNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2Uvb3BlbmsvZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi9zdXBwb3J0L01vY2tEYXRhSGVscGVyLmphdmEKaW5kZXggNTcwM2E1Ny4uZGEwM2Q5OSAxMDA2NDQKLS0tIGEvZ2ZzQmFja2VuZFNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9vcGVuay9ncmlkZmFpbHVyZWluZm9ybWF0aW9uL3N1cHBvcnQvTW9ja0RhdGFIZWxwZXIuamF2YQorKysgYi9nZnNCYWNrZW5kU2VydmljZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL29wZW5rL2dyaWRmYWlsdXJlaW5mb3JtYXRpb24vc3VwcG9ydC9Nb2NrRGF0YUhlbHBlci5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uc3VwcG9ydDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24uYnBtbi5pbXBsLkdmaVByb2Nlc3NTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLmNvbmZpZy5yYWJiaXRNcS5SYWJiaXRNcUNoYW5uZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmsuZ3JpZGZhaWx1cmVpbmZvcm1hdGlvbi5jb25zdGFudHMuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5rLmdyaWRmYWlsdXJlaW5mb3JtYXRpb24ubW9kZWwuKjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vcGVuay5ncmlkZmFpbHVyZWluZm9ybWF0aW9uLnZpZXdtb2RlbC4qOwpAQCAtMTA0LDYgKzEwNSw3IEBACiAKICAgICAgICAgZHRvLnNldERpc3RyaWJ1dGlvbkdyb3VwVXVpZHMobW9ja1V1aWRMaXN0KCkpOwogICAgICAgICBkdG8uc2V0U3RhdGlvbklkcyhtb2NrVXVpZExpc3QoKSk7CisgICAgICAgIC8vZHRvLnNldFB1YmxpY2F0aW9uQ2hhbm5lbHMobW9ja1B1YmxpY2F0aW9uQ2hhbm5lbExpc3QoKSk7CiAgICAgICAgIHJldHVybiBkdG87CiAgICAgfQogCkBAIC0xMjU1LDYgKzEyNTcsMjIgQEAKICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbkdyb3VwTWVtYmVyRHRvTGlzdDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFJhYmJpdE1xQ2hhbm5lbCBtb2NrUmFiYml0TXFDaGFubmVsKCl7CisgICAgICAgIFJhYmJpdE1xQ2hhbm5lbCByQ2hhbm5lbCA9IG5ldyBSYWJiaXRNcUNoYW5uZWwoKTsKKyAgICAgICAgckNoYW5uZWwuc2V0TmFtZSgiTU9DS01BSUwiKTsKKyAgICAgICAgckNoYW5uZWwuc2V0RXhwb3J0a2V5KCJtb2NrbWFpbF9leHBvcnRfa2V5Iik7CisgICAgICAgIHJDaGFubmVsLnNldEV4cG9ydHF1ZXVlKCJtb2NrbWFpbF9leHBvcnRfcXVldWUiKTsKKyAgICAgICAgcmV0dXJuIHJDaGFubmVsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmFiYml0TXFDaGFubmVsIG1vY2tSYWJiaXRNcUNoYW5uZWwyKCl7CisgICAgICAgIFJhYmJpdE1xQ2hhbm5lbCByQ2hhbm5lbCA9IG5ldyBSYWJiaXRNcUNoYW5uZWwoKTsKKyAgICAgICAgckNoYW5uZWwuc2V0TmFtZSgiTU9DS1NNUyIpOworICAgICAgICByQ2hhbm5lbC5zZXRFeHBvcnRrZXkoIm1vY2tzbXNfZXhwb3J0X2tleSIpOworICAgICAgICByQ2hhbm5lbC5zZXRFeHBvcnRxdWV1ZSgibW9ja3Ntc19leHBvcnRfcXVldWUiKTsKKyAgICAgICAgcmV0dXJuIHJDaGFubmVsOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgIFRibEZhaWx1cmVJbmZvcm1hdGlvblN0YXRpb24gbW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvblN0YXRpb24oKSB7CiAgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvblN0YXRpb24gdGJsRmFpbHVyZUluZm9ybWF0aW9uU3RhdGlvbiA9IG5ldyBUYmxGYWlsdXJlSW5mb3JtYXRpb25TdGF0aW9uKCk7CiAgICAgICAgIHRibEZhaWx1cmVJbmZvcm1hdGlvblN0YXRpb24uc2V0U3RhdGlvblN0YXRpb25JZCgiMjM0NTYiKTsKQEAgLTEyODYsNCArMTMwNCwzMSBAQAogICAgICAgICByZXR1cm4gZmFpbHVyZUluZm9Hcm91cER0bzsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBtb2NrUHVibGljYXRpb25DaGFubmVsTGlzdCgpeworICAgICAgICBMaXN0PFN0cmluZz4gcHVibGljYXRpb25DaGFubmVscz0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBwdWJsaWNhdGlvbkNoYW5uZWxzLmFkZCgiTU9DS01BSUwiKTsKKyAgICAgICAgcHVibGljYXRpb25DaGFubmVscy5hZGQoIk1PQ0tTTVMiKTsKKyAgICAgICAgcHVibGljYXRpb25DaGFubmVscy5hZGQoIk1PQ0tYWSIpOworCisgICAgICAgIHJldHVybiBwdWJsaWNhdGlvbkNoYW5uZWxzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsIG1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwoKXsKKyAgICAgICAgVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsIHRmaXBDaGFubmVsID0gbmV3IFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCgpOworICAgICAgICB0ZmlwQ2hhbm5lbC5zZXRJZCgxTCk7CisgICAgICAgIHRmaXBDaGFubmVsLnNldFRibEZhaWx1cmVJbmZvcm1hdGlvbihtb2NrVGJsRmFpbHVyZUluZm9ybWF0aW9uKCkpOworICAgICAgICB0ZmlwQ2hhbm5lbC5zZXRQdWJsaWNhdGlvbkNoYW5uZWwoIk1PQ0tNQUlMIik7CisgICAgICAgIHRmaXBDaGFubmVsLnNldFB1Ymxpc2hlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRmaXBDaGFubmVsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGJsRmFpbHVyZUluZm9ybWF0aW9uUHVibGljYXRpb25DaGFubmVsIG1vY2tUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwyKCl7CisgICAgICAgIFRibEZhaWx1cmVJbmZvcm1hdGlvblB1YmxpY2F0aW9uQ2hhbm5lbCB0ZmlwQ2hhbm5lbCA9IG5ldyBUYmxGYWlsdXJlSW5mb3JtYXRpb25QdWJsaWNhdGlvbkNoYW5uZWwoKTsKKyAgICAgICAgdGZpcENoYW5uZWwuc2V0SWQoMUwpOworICAgICAgICB0ZmlwQ2hhbm5lbC5zZXRUYmxGYWlsdXJlSW5mb3JtYXRpb24obW9ja1RibEZhaWx1cmVJbmZvcm1hdGlvbigpKTsKKyAgICAgICAgdGZpcENoYW5uZWwuc2V0UHVibGljYXRpb25DaGFubmVsKCJNT0NLU01TIik7CisgICAgICAgIHRmaXBDaGFubmVsLnNldFB1Ymxpc2hlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRmaXBDaGFubmVsOworICAgIH0KKwogfQo=