UEsDBBQACAAIALkC0j4AAAAAAAAAAAAAAAAUAAQATUVUQS1JTkYvTUFOSUZFU1QuTUb+ygAAjVNNT8JAEL036X9oSLzRDdSvpISDml6MGiLG+7gdYLHdrbtTQv31TllSAYF42WQz7735evMMWs3QUfyO1imj02goBmFwX+u8wPgVv2plMc/WKGvicKZXyhpdoqY0ekymWTwU1x182pQfplDyBUpMI2PnAmWhKodC6VzNjSDO5EZO6XmBxMnGZGsMg8yj4if4bqYElrV9YKt7J0mtgIw9LSre+O1wYbCtPPYK+zxpLApba1Iljj58ipVvf9y7FDdi0Ot7fBhEntKqabMWVSKWYCtrJDpn7B82D08kg47vyaBZhzZpj6RLfglQgVy0eDoifCuGPdbZU94p66h6wuUcFLOhsI5nlUiQA8G/mZ5msTJOkWEd25zjLmut/jZzxU0Pet16d6zXUr9qKNRMIW8xW1fGUjwB+QnzM5bqn7QFb8sdTm0PsGnldJhdX7iu0ocCnJsALdKIFyU/n6AxNbVJ+mKnHZ23Vr3Y+x+amRuetLfSpFHBtu/C/nYudn5d6Hl7q928kjAIgx9QSwcIZKRFdYgBAADCAwAAUEsDBAoAAAAAAPYC0j5CyP2JXA0AAFwNAAARAAAAZ2V0UmVsZW5nVGVzdHMuc2gjIS91c3IvYmluL2VudiBiYXNoCgojIGl0IGlzIGFzc3VtZWQgd2UgYXJlIGV4ZWN1dGluZyB0aGlzIGluIFJFTEVOR19URVNUUyBvciB0aGUgcGFyZW50IG9mIFJFTEVOR19URVNUUwoKIyBOb3RlOiBmb3IgZGVwbG95bWVudCBvbiBwcm9kdWN0aW9uIG1hY2hpbmUsIG5vICJjdXN0b20iIHByb3BlcnRpZXMgbmVlZCB0byBiZSBzZXQgaW4gYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlLCAKIyBhc3N1bWluZyB0aGUgImh1ZHNvbiBidWlsZCBzY3JpcHQiIGhhcyBiZWVuIHNldCB1cCBhcHByb3ByaWF0ZWx5LiAKIyAxLiBuZWVkIHRvIHNldCAidXNlIGN1c3RvbSB3b3Jrc3BhY2UiIHNvIHNvbWUgb2YgdGhlIHJlbGF0aXZlIGRpcmVjdG9yeSBhc3N1bXB0aW9ucyBhcmUgdHJ1ZSAuLi4gc3VjaCBhcyBmb3IgaW5kaWdvLCBzZXQgCiMgICAgL3NoYXJlZC9pbmRpZ28vb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzCiMgMi4gY29weSAiYnkgaGFuZCIgKG9yIHNjcCkgdGhpcyBnZXRSZWxlbmdUZXN0cy5zaCBmaWxlIHRvIC9zaGFyZWQvaW5kaWdvIGFuZCBydW4gZnJvbSBodWRzb24gZnJvbSB0aGVyZSwgdGhlIHBhcmVudCBvZiAKIyAgICBvLmUuaS50ZXN0cywgbmFtZWx5ICJydW4gc2hlbGwgc2NyaXB0IiAvc2hhcmVkL2luZGlnby9nZXRSZWxlbmdUZXN0cy5zaAojIDMuIFdlIGN1cnJlbnRseSBhc3N1bWUgInRlc3RJbnN0YW5jZSIgYWxyZWFkeSBleGlzdHMsIGFzIGEgY2hpbGQgb2YgL3NoYXJlZC9pbmRpZ28sIGFuZCBjb250YWlucyBhbiBpbnN0YW5jZSBvZiBlY2xpcHNlIFNESyAoMy43KS4gCgoKIyBmaW5kcyBmaWxlIG9uIHVzZXJzIHBhdGgsIGJlZm9yZSBjdXJyZW50IGRpcmVjdG9yeQojIGhlbmNlLCBub24tcHJvZHVjdGlvbiB1c2VycyBjYW4gc2V0IHRoZWlyIG93biB2YWx1ZXMgZm9yIHRlc3QgbWFjaGluZXMKc291cmNlIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZQoKaWYgWyAteiAke1JFTEVOR19URVNUU30gXSA7IHRoZW4KCiAgICBSRUxFTkdfVEVTVFM9b3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzCiAgICBlY2hvICJSRUxFTkdfVEVTVFMgc2V0IGZyb20gc2NyaXB0OiAiICRSRUxFTkdfVEVTVFMKZWxzZQogICAgZWNobyAiUkVMRU5HX1RFU1RTIHNldCBmcm9tIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZTogIiAkUkVMRU5HX1RFU1RTCgpmaQoKIyBUaGlzIHNjcmlwdCBmaWxlIGlzIHRvIGhlbHAgZ2V0IGJ1aWxkcyBzdGFydGVkICJmcmVzaCIsIHdoZW4KIyB0aGUgJHtSRUxFTkdfVEVTVFN9IGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBvbiBsb2NhbCBmaWxlIHN5c3RlbS4KIyBXaGlsZSBpdCBpcyBpbiB0aGUgY3ZzIHJlcG9zaXRvcnkgaW4gJHtSRUxFTkdfVEVTVFN9LCBpdCBpcwojIG1lYW50IHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnkKIyBvZiAke1JFTEVOR19URVNUU30gb24gdGhlIGZpbGUgc3lzdGVtLgoKIyBleHBvcnQgaXMgdXNlZCwgaW5zdGVhZCBvZiBjaGVja291dCwganVzdCB0byBhdm9pZCB0aGUgQ1ZTIGRpcmVjdG9yaWVzIGFuZCBzaW5jZSB0aGlzIGNvZGUKIyBmb3IgYSBsb2NhbCBidWlsZCwgdGhlcmUgc2hvdWxkIG5ldmVyIGJlIGEgbmVlZCB0byBjaGVjayBpdCBiYWNrIGluIHRvIENWUy4KCiMgSWYgdGhlcmUgaXMgbm8gc3ViZGlyZWN0b3J5LCB0cnkgZ29pbmcgdXAgb25lIGRpcmVjdG9yeSBhbmQgbG9va2luZyBhZ2FpbiAoaW4gY2FzZSB3ZSBhcmUgaW4gaXQpLgppZiBbICEgLWUgJHtSRUxFTkdfVEVTVFN9IF0KdGhlbgogICAgY2QgLi4KICAgIGlmIFsgISAtZSAke1JFTEVOR19URVNUU30gXQogICAgdGhlbiAgICAgICAgCiAgICAgICAgZWNobyAiJHtSRUxFTkdfVEVTVFN9IGRvZXMgbm90IGV4aXN0IGFzIHN1YiBkaXJlY3RvcnkiOwogICAgICAgIGV4aXQgMTsKICAgIGZpCmZpCgoKIyBtYWtlIHN1cmUgUkVMRU5HX1RFU1RTIGhhcyBiZWVuIGRlZmluZWQgYW5kIGlzIG5vIHplcm8gbGVuZ3RoLCBvciAKIyBlbHNlIGZvbGxvd2luZyB3aWxsIGV2YWwgdG8gInJtIC1mciAvKiIgLi4uIHBvdGVudGlhbGx5IGNhdGFzdHJvcGhpYwppZiBbIC16ICIke1JFTEVOR19URVNUU30iIF0KdGhlbgogICAgZWNobyAiVGhlIHZhcmlhYmxlIFJFTEVOR19URVNUUyBtdXN0IGJlIGRlZmluZWQgdG8gcnVuIHRoaXMgc2NyaXB0IgogICAgZXhpdCAxOwpmaQplY2hvICIgICAgcmVtb3ZpbmcgYWxsIG9mICR7UkVMRU5HX1RFU1RTfSAuLi4iCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8qCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8ucHJvamVjdApybSAtZnIgIiR7UkVMRU5HX1RFU1RTfSIvLnNldHRpbmdzCnJtIC1mciAiJHtSRUxFTkdfVEVTVFN9Ii8uY2xhc3NwYXRoCm1rZGlyIC1wICIke1JFTEVOR19URVNUU30iCgojY29udHJvbHRhZz1kYXZpZF93aWxsaWFtc190ZW1wQnJhbmNoMwpjb250cm9sdGFnPUhFQUQKZWNobyAiICAgIGNoZWNraW5nIG91dCAkY29udHJvbHRhZyBvZiAke1JFTEVOR19URVNUU30gZnJvbSBjdnMgLi4uIgoKZXhwb3J0IENWU19SU0g9c3NoCmlmIFsgLXogJHtDVlNfSU5GT30gXSA7IHRoZW4KICAgIENWU19JTkZPPTpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6CmZpCgplY2hvICJDVlNfSU5GTzogIiAkQ1ZTX0lORk8KCmN2cyAtUSAtZiAtZCAke0NWU19JTkZPfS9jdnNyb290L2NhbGxpc3RvICBleHBvcnQgLWQgJHtSRUxFTkdfVEVTVFN9IC1yICRjb250cm9sdGFnICR7UkVMRU5HX1RFU1RTfQpyZXR1cm5jb2RlPSQ/CmlmIFsgJHJldHVybmNvZGUgLW5lIDAgXSAKdGhlbgogICAgZWNobyAibm9uIHplcm8gZnJvbSBjdnMgY2hlY2tvdXQ6ICIkcmV0dXJuY29kZQogICAgZXhpdCAkcmV0dXJuY29kZQpmaSAKZWNobyAiICAgIG1ha2luZyBzdXJlIHJlbGVuZyBjb250cm9sIGZpbGVzIGFyZSBleGVjdXRhYmxlIGFuZCBoYXZlIHByb3BlciBFT0wgLi4uIgpkb3MydW5peCAke1JFTEVOR19URVNUU30vKi5zaCogJHtSRUxFTkdfVEVTVFN9LyoucHJvcGVydGllcyAke1JFTEVOR19URVNUU30vKi54bWwgPi9kZXYvbnVsbCAyPj4vZGV2L251bGwKY2htb2QgK3ggJHtSRUxFTkdfVEVTVFN9Lyouc2ggPiAvZGV2L251bGwKZWNobwoKaWYgWyAteiAke0JVSUxEX0hPTUV9IF0gOyB0aGVuCiAgICBCVUlMRF9IT01FPSR7UFdEfQpmaQoKIyBUT0RPIEluc3RhbGwgdGVzdCBpbnN0YW5jZSAoYW5kIHRlc3RzKSB2aWEgYnVpbGQueG1sIGFzIHdlIGRvICJhZ2dyZWdhdG9yIGFuZCB0b29scyIKIyBUT0RPIEJldHRlciB0byB1c2UgcDIgdG8gaW5zdGFsbCBpbnRvIHRlc3QgaW5zdGFuY2UKcm0gLWZyICR7QlVJTERfSE9NRX0vdGVzdEluc3RhbmNlL2VjbGlwc2UvZHJvcGlucy8ke1JFTEVOR19URVNUU30KY3AgLXIgJHtSRUxFTkdfVEVTVFN9ICAke0JVSUxEX0hPTUV9L3Rlc3RJbnN0YW5jZS9lY2xpcHNlL2Ryb3BpbnMvCgpQSwMECgAAAAAARHi5PsCjoJl6AAAAegAAAB8AAABPU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzCkJ1bmRsZS1OYW1lID0gUmVsZW5nIFRlc3RzIGZvciBJbmRpZ28gUmVsZWFzZQpCdW5kbGUtVmVuZG9yID0gRWNsaXBzZSBTaW1SZWxQSwMECgAAAAAAXLa9PnRMFZpzDwAAcw8AAAkAAAB2ZXJpZnkuc2gjIS91c3IvYmluL2VudiBiYXNoCgppZiBbWyAkIyAhPSAxIF1dIAp0aGVuCiAgICBwcmludGYgIlx0RVJST1I6IHRoaXMgc2NyaXB0LCAiJHswIyMqL30iLCByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudDsgdGhlIG5hbWUgb3IgcGF0aCBvZiBqYXIgb3IgamFyLnBhY2suZ3ogZmlsZS5cbiIgPiYyCiAgICBleGl0IDEKZmkKCmlmIFtbIC16ICRWRVJJRllPVVRESVIgXV0gCnRoZW4KICAgIHByaW50ZiAiXHRFUlJPUjogdGhpcyBzY3JpcHQsICIkezAjIyovfSIsIHJlcXVpcmVzIFZFUklGWU9VVERJUiB0byBiZSBkZWZpbmVkLlxuIiA+JjIKICAgIGV4aXQgMQpmaQoKCgpmaWxlbmFtZT0iJHsxfSIKCmlmIFsgISAtZSAiJHtmaWxlbmFtZX0iIF0KdGhlbgogICAgcHJpbnRmICJcdEVSUk9SOiBmaWxlIGRvZXMgbm90IGV4aXN0OiIgIiR7ZmlsZW5hbWV9XG4iID4mMgogICAgZXhpdCAxCmZpCgpqYXJuYW1lPSQoYmFzZW5hbWUgIiR7ZmlsZW5hbWV9IikKCiMgbW9zdCB1c2VycyBuZWVkIG9ubHkgb25lLCBKYXZhIDUgb3IgSmF2YSA2LCBidXQgc29tZXRpbWVzIG1heSB3YW50IHRvIAojIGNoYW5nZSBKQVZBX0hPTUUsIGJlbG93LCB0byBzd2l0Y2ggYmFjayBhbmQgZm9ydGguCiMgVXNlIEpBVkEgNSB0byBlbnN1cmUgcGFjay5neiBmaWxlcyBjYW4gYmUgdW5wYWNrZWQgKGluc3RhbGxlZCkgd2l0aCBKQVZBIDUuIAojIFNvbWUgcGFjay5neiBmaWxlcyBjYW4gbm90IGJlIHVucGFja2VkIHdpdGggSmF2YSA2IChpbiBJbmRpZ28gcmVwb3NpdG9yaWVzKSwgCiMgc28gdXNlIEpBVkEgNiBpZiB5b3UgZG8gbm90IGNhcmUgKGkuZS4geW91ciB1c2UgY2FzZXMgYWxsIHVzZSBKQVZBIDYpCiMgdG8gYXZvaWQgdGhlIGVycm9yIG1lc3NhZ2VzLgojSkFWQV81X0hPTUU9L2hvbWUvc2hhcmVkL3dlYnRvb2xzL2FwcHMvaWJtLWphdmEyLWkzODYtNTAxMQojSkFWQV81X0hPTUU9L3NoYXJlZC9jb21tb24vamRrLTEuNS4wLTIyLng4Nl82NC8KI0pBVkFfNl9IT01FPS9ob21lL3NoYXJlZC93ZWJ0b29scy9hcHBzL2libS1qYXZhLWkzODYtNjA4CiNKQVZBXzZfSE9NRT0vc2hhcmVkL2NvbW1vbi9qZGstMS42Lng4Nl82NC8KCiMgV2UgYWx3YXlzIHNldCBKQVZBX0hPTUUgZXhwbGljaXRseSB0byB3aGF0IHdlIHdhbnQsIHNpbmNlIG9uIG1hbnkgc3lzdGVtcywgCiMgaXMgaXQgc2V0IHRvIHNvbWUgSlJFIHRoYXQgd291bGQgbm90IHN1ZmZpY2UuIAojSkFWQV9IT01FPSR7SkFWQV82X0hPTUV9CgppZiBbICEgLWUgIiR7SkFWQV9IT01FfSIgXQp0aGVuCiAgICBwcmludGYgIlx0RVJST1I6IHRoaXMgc2NyaXB0LCAiJHswIyMqL30iLCByZXF1aXJlcyBKQVZBX0hPTUUgdG8gYmUgZGVmaW5lZCBhbmQgZXhpc3QuXG4iID4mMgogICAgZXhpdCAxCmZpCgpVTlBBQ0syMDBfRVhFPSRKQVZBX0hPTUUvanJlL2Jpbi91bnBhY2syMDAKVkVSSUZZX0VYRT0kSkFWQV9IT01FL2Jpbi9qYXJzaWduZXIKCiAgICBWRVJJRklFRF9PVVRGSUxFPSIke1ZFUklGWU9VVERJUn0iL3ZlcmlmaWVkLnR4dAogICAgS05PV05fRVhDRVBUSU9OPSIke1ZFUklGWU9VVERJUn0iL2tub3dudW5zaWduZWQudHh0CiAgICBVTlNJR05FRF9PVVRGSUxFPSIke1ZFUklGWU9VVERJUn0iL3Vuc2lnbmVkLnR4dAogICAgTk9NQU5JRkVTVD0iJHtWRVJJRllPVVRESVJ9Ii9ub21hbmlmZXN0LnR4dAogICAgRVJST1JfRVhJVF9GSUxFPSIke1ZFUklGWU9VVERJUn0iL2Vycm9yLnR4dAoKUFBBVF9QQUNLR1o9IiguKikucGFjay5neiQiCmlmIFtbICIkamFybmFtZSIgPX4gICRQUEFUX1BBQ0tHWiBdXQp0aGVuIAogICAgYmFzZWphcm5hbWU9JHtCQVNIX1JFTUFUQ0hbMV19CiAgICAjZWNobyAtZSAiXG4gYmFzZWphcm5hbWU6ICIgJGJhc2VqYXJuYW1lICJcbiIKICAgICIke1VOUEFDSzIwMF9FWEV9IiAkZmlsZW5hbWUgL3RtcC8kYmFzZWphcm5hbWUKICAgIHZyZXN1bHQ9YCIke1ZFUklGWV9FWEV9IiAtdmVyaWZ5IC90bXAvJGJhc2VqYXJuYW1lYAogICAgZXhpdGNvZGU9JD8KICAgIHJtIC90bXAvJGJhc2VqYXJuYW1lCmVsc2UKICAgIHZyZXN1bHQ9YCIke1ZFUklGWV9FWEV9IiAtdmVyaWZ5ICRmaWxlbmFtZWAKICAgIGV4aXRjb2RlPSQ/CmZpCgojIGphcnNpZ25lciBzb21ldGltZXMgcmV0dXJucyBvbmUgbGluZSwgc29tZXRpbWVzIHR3byAuLi4gd2UgdGFrZSAKIyBvdXQgRU9McyB0byBwcmludCBjb21wYWN0bHkKdnJlc3VsdD1gZWNobyAiJHt2cmVzdWx0fSIgfCB0ciAnXG4nICcgJ2AKCiMga25vd24gcmVzcG9uc2UgcGF0dGVybnMgZnJvbSBqYXJzaWduZXIKUFBBVF9WRVJJRklFRD0iXmphclwgdmVyaWZpZWQuKiIKIyBubyBtYW5pZmVzdCBpcyBub3Qgc2lnbmVkIGZvciBvdXIgcHVycG9zZXMgLi4uIG9jY3VycyBhIGxvdCBmb3IgdW5zaWduZWQgZmVhdHVyZSBqYXJzClBQQVRfVU5TSUdORURfT1JfTk9NQU5JRkVTVD0iXihqYXIgaXMgdW5zaWduZWQpfChubyBtYW5pZmVzdCkuKiIKIyBkbyBub3QgY3VycmVudGx5IHVzZSB1bnNpZ25lZCBvciBubyBtYW5pZmVzdCAoYnkgdGhlbXNlbHZlcykgCiMgbm9yICJjb3B5IG1vZGUiIC4uLiBjb3B5IG1vZGUgcHJpbnRlZCB0byBzdGRvdXQgYnkgdW5wYWNrMjAwCiNQUEFUX1VOU0lHTkVEPSJeamFyIGlzIHVuc2lnbmVkLioiCiNQUEFUX05PTUFOSUZFU1Q9Il5ubyBtYW5pZmVzdC4qIgojUFBBVF9DT1BZTU9ERT0iXkNvcHktbW9kZVwuLioiCgppZiBbWyAiJHt2cmVzdWx0fSIgPX4gJFBQQVRfVkVSSUZJRUQgXV0KdGhlbgogICAgcHJpbnRmICclLTgwcyBcdFx0JyAiICAgJHtqYXJuYW1lfTogIiA+PiAiJHtWRVJJRklFRF9PVVRGSUxFfSIgCiAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiID4+ICIke1ZFUklGSUVEX09VVEZJTEV9IgplbGlmIFtbICIke3ZyZXN1bHR9IiA9fiAkUFBBVF9VTlNJR05FRF9PUl9OT01BTklGRVNUIF1dCnRoZW4KCiAgICAjIGxpc3QgImtub3duIGNhc2VzIiwgdGhhdCBjYW4gbm90IGJlIHNpZ25lZCwgCiAgICAjIGluIHRoZWlyIG93biAia25vd24gZXhjZXB0aW9uIGZpbGUiLCBlbHNlIGxpc3QgaW4gInVuc2lnbmVkIiBmaWxlLgoKICAgIFBQQVRfS05PV05fVU5TSUdORUQ9Jyhjb21tb25qXC5zZG8uKil8KGFydGlmYWN0c1wuamFyKXwoY29udGVudFwuamFyKXwoY29tcG9zaXRlQXJ0aWZhY3RzLmphcil8KGNvbXBvc2l0ZUNvbnRlbnQuamFyKScKICAgIGlmICBbWyAke2phcm5hbWV9ID1+ICRQUEFUX0tOT1dOX1VOU0lHTkVEIF1dICAgICAgIAogICAgdGhlbgogICAgICAgIHByaW50ZiAnJS0xMDBzIFx0XHQnICIgICAke2phcm5hbWV9OiAiICA+PiAiJHtLTk9XTl9FWENFUFRJT059IgogICAgICAgIHByaW50ZiAnJXNcbicgIiAke3ZyZXN1bHR9ICIgID4+ICIke0tOT1dOX0VYQ0VQVElPTn0iCgogICAgZWxzZQogICAgICAgICMgcHVycG9zZWx5IG5vIGxpbmUgZGVsaW1pdGVyLCBzbyBvdXRwdXQgb2YgamFyc2lnbmVyIGlzIG9uIHNhbWUgbGluZQogICAgICAgIHByaW50ZiAnJS0xMDBzIFx0XHQnICIgICAke2phcm5hbWV9OiAiICA+PiAiJHtVTlNJR05FRF9PVVRGSUxFfSIgCiAgICAgICAgcHJpbnRmICclc1xuJyAiICR7dnJlc3VsdH0gIiAgPj4gIiR7VU5TSUdORURfT1VURklMRX0iCiAgICBmaSAKCmVsc2UgCiAjIGZhbGwgdGhyb3VnaCBpZiB1bmV4cGVjdGVkIHJlc3VsdC4gV2lsbCBoYXBwZW4gaWYgY2FuIG5vdCB1bnBhY2syMDAgYSBmaWxlCiAgICBwcmludGYgJyUtMTAwcyBcdFx0JyAiICAgJHtqYXJuYW1lfTogIiAgPj4gIiR7RVJST1JfRVhJVF9GSUxFfSIgCiAgICBwcmludGYgJyVzXG4nICIgJHt2cmVzdWx0fSAiICA+PiAiJHtFUlJPUl9FWElUX0ZJTEV9IiAKZmkKCmlmIFtbICRleGl0Y29kZSAtZ3QgMCBdXQp0aGVuCgogICAgZWNobyAtZSAiXG4gZXhpdGNvZGU6ICIgJGV4aXRjb2RlOiAkKGJhc2VuYW1lICRmaWxlbmFtZSkiIFxuIiAgPj4gIiR7RVJST1JfRVhJVF9GSUxFfSIgIApmaQoKUEsDBAoAAAAAADdyvD50D6eYVwUAAFcFAAAWAAAAY2xlYW51cEJ1aWxkUmVzdWx0cy5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgc21hbGwgdXRpbGl0eSB0byByZW1vdmUgb2xkICh0ZW1wb3JhcnkpIGJ1aWxkcyBmcm9tIHdvcmsgYXJlYQoKIyBmaW5kcyBmaWxlIG9uIHVzZXJzIHBhdGgsIGJlZm9yZSBjdXJyZW50IGRpcmVjdG9yeQojIGhlbmNlLCBub24tcHJvZHVjdGlvbiB1c2VycyBjYW4gc2V0IHRoZWlyIG93biB2YWx1ZXMgZm9yIHRlc3QgbWFjaGluZXMKc291cmNlIGFnZ3JfcHJvcGVydGllcy5zaHNvdXJjZQoKIyByZW1vdmUgYXJ0aWZhY3RzIG92ZXIgbiBkYXlzIG9sZAojICh3aGVyZSBob3VycyA9IDI0ICsgKG4gKiAyNCksIGJhc2ljYWxseSwgc28gdGhhdAojIGV2ZW4gbj0wIG1lYW5zICIxIGRheSIpCgojIHNldCBhdCAxMCBkYXlzLCB1bmRlciBhc3N1bXB0aW9uIHRoYXQgYmVmb3JlIHRoYXQgdGltZSwKIyBhcnRpZmFjdHMgd2lsbCBiZSAic2F2ZWQiIGVsc2V3aGVyZSwgaWYgbmVlZGVkLgojIGlmIG1vcmUgY2xlYW51cCBpcyBuZWVkZWQsIHdlIHNob3VsZCB0YWtlIHRpbWUsIGFuZAojIGV4aXN0ZW5jZSBvZiBtb3JlIHJlY2VudCBidWlsZHMgaW50byBhY2NvdW50LCBzbyB3ZSBuZXZlcgojIGRlbGV0ZSB0aGUgbGFzdCBleGlzdGluZyBidWlsZCAoZXZlbiBpZiAib2xkIikuCgpuZGF5cz0xOwphcnRpZmFjdHNEaXI9JHtCVUlMRF9SRVNVTFRTfTsKCmVjaG87CmVjaG8gIiAgICBSZW1vdmluZyBhcnRpZmFjdCBkaXJlY3RvcmllcyBvbGRlciB0aGFuICR7bmRheXN9IGRheXMiOwplY2hvICIgICAgICAgIChmcm9tICR7YXJ0aWZhY3RzRGlyfSkiOwpiZWZvcmU9YGZpbmQgJHthcnRpZmFjdHNEaXJ9IC1taW5kZXB0aCAxIC1tYXhkZXB0aCAxIHwgd2MgLWxgOwplY2hvICIgICAgICAgICAgICBudW1iZXIgb2YgZGlyZWN0b3JpZXMgYmVmb3JlIGNsZWFuaW5nOiAke2JlZm9yZX0iOwoKIyBlbXB0eSBkaXJlY3RvcmllcyBvZnRlbiByZXN1bHQgZnJvbSAiYmFkIGJ1aWxkcyIuIFdlIHJlbW92ZSB0aG9zZSBubyBtYXR0ZXIgaG93IG9sZApmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMiAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybSAtZnIgJ3t9JyBcOwojIG5vdyByZW1vdmUgb2xkIG9uZXMKZmluZCAke2FydGlmYWN0c0Rpcn0gLW1pbmRlcHRoIDEgLW1heGRlcHRoIDEgLXR5cGUgZCAtY3RpbWUgKyRuZGF5cyAtZXhlY2RpciAke0JVSUxEX0hPTUV9JHtSRUxFTkdfVE9PTFN9L3JlbW92ZUlmLnNoICd7fScgXDsKCmFmdGVyPWBmaW5kICR7YXJ0aWZhY3RzRGlyfSAtbWluZGVwdGggMSAtbWF4ZGVwdGggMSB8IHdjIC1sYDsKZWNobyAiICAgICAgICAgICAgbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGFmdGVyIGNsZWFuaW5nOiAke2FmdGVyfSI7CmVjaG8KUEsDBAoAAAAAAEUJyz5bQ4F8YgYAAGIGAAAMAAAAdmVyaWZ5ZGlyLnNoIyEvdXNyL2Jpbi9lbnYgYmFzaAoKIyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgJ3ZlcmlmeS5zaCcgaXMgaW4gc2FtZSBkaXJlY3RvcnkgYXMgJ3ZlcmlmeWRpci5zaCcgCiMgc28gdGhlIGNvcnJlY3QgJ3ZlcmlmeS5zaCcgZmlsZSBjb21tYW5kIGNhbiBiZSB1c2VkOyB0aGUgb25lIHRoYXQgImdvZXMgd2l0aCIgdGhlIHZlcmlmeWRpci5zaCBzY3JpcHQgCiMgd2UgYXJlIGN1cnJlbnRseSBleGVjdXRpbmcuIFNvLCB3ZSBzdG9yZSB0aGUgcGF0aCB0byB2ZXJpZnlkaXIuc2ggaW4gRVhFQ0RJUi4gIApFWEVDRElSPSR7MCUvKn0KCmVjaG8gIjE6ICIgJDEKZWNobyAiMjogIiAkMgplY2hvICIzOiAiICQzCgppZiBbIC16ICQxIF0KdGhlbgogICAgbG9jPS4vCmVsc2UKICAgIGxvYz0kezF9CmZpCgppZiBbIC16ICQyIF0KdGhlbgogICAgZXhwb3J0IFZFUklGWU9VVERJUj0iJHtIT01FfSIvdmVyaWZ5ZGlyb3V0cHV0CmVsc2UKICAgIGV4cG9ydCBWRVJJRllPVVRESVI9IiR7Mn0iL3ZlcmlmeWRpcm91dHB1dApmaQoKaWYgWyAteiAkMyBdCnRoZW4KICAgIHBhdD0iLipcKFwuamFyJFx8XC5qYXJcLnBhY2tcLmd6JFwpIgplbHNlCiAgICBwYXQ9IiR7M30iCmZpCgojIFZFUklGWU9VVERJUiBpcyB1c2VkIGluICd2ZXJpZnkuc2gnIGFuZCBtdXN0IGJlIGNsZWFuIGJlZm9yZQojIGJlZ2lubmluZyB0aGUgb3ZlcmFsbCBjaGVjawoKIyBtYWtlLCBpbiBjYXNlIGRvZXNuJ3QgZXhpc3QKbWtkaXIgLXAgIiR7VkVSSUZZT1VURElSfSIKCiMgZXZlbiB0aG91Z2ggd2UganVzdCBzZXQgaXQgYWJvdmUsIGluY2x1ZGUgdGhlIGlmIGNoZWNrIAojIGhlcmUgdG8gZ2F1cmQgYWdhaW5zdCBmdXR1cmUgZXJyb3JzLCBzaW5jZSBpZiAndmVyZml5b3V0ZGlyJyBpcyAKIyBub3QgZGVmaW5lZCwgdGhlIHJlbW92ZSB3b3VsZCBiZSBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5ISEgCmlmIFtbIC1uICIke1ZFUklGWU9VVERJUn0iIF1dCnRoZW4gCiAgICAgICBybSAtZnIgIiR7VkVSSUZZT1VURElSfSIvKgpmaQoKZWNobyAiICAgdmVyaWZ5IGRpcmVjdG9yeTogJHtsb2N9IgplY2hvICIgICBmb3IgZmlsZSBwYXR0ZXJuOiAke3BhdH0iCmVjaG8gIiAgIHJlc3VsdCBsaXN0IGZpbGVzIHdpbGwgYmUgaW4gIiAiJHtWRVJJRllPVVRESVJ9IiAiKGFuZCBhbnkgZXhpc3RpbmcgZmlsZXMgdGhlcmUgcmVtb3ZlZCkuIgoKZmluZCAiJHtsb2N9IiAtcmVnZXggIiR7cGF0fSIgLWV4ZWMgJHtFWEVDRElSfS92ZXJpZnkuc2ggJ3t9JyBcOwoKIyBpZiBjZXJ0YWluIGZpbGVzIHdlcmUgbm90IGNyZWF0ZWQgZHVyaW5nIHNpZ25pbmcgY2hlY2tzLCBjcmVhdGUgYSAicGxhaW4iIG9uZSBhdCBleHBlY3RlZCBsb2NhdGlvbiwgCiMgdG8gYXZvaWQgNDA0IGVycm9ycyBmcm9tIHN0YW5kYXJkIGluZGV4Lmh0bWwuIEZvciBleGFtcGxlLCBhbGwgamFycyBhcmUgc2lnbmVkLCB0aGVyZSB3aWxsIGJlIG5vIHVuc2lnbmVkLnR4dCBmaWxlcy4KaWYgWyAhIC1lICIke1ZFUklGWU9VVERJUn0iL3Vuc2lnbmVkLnR4dCBdCnRoZW4KICAgIGVjaG8gICJUaGVyZSB3ZXJlIG5vIHVuc2lnbmVkIGphcnMgaW4gdGhlIGRpcmVjdG9yaWVzIGNoZWNrZWQuICIgPiAiJHtWRVJJRllPVVRESVJ9Ii91bnNpZ25lZC50eHQKZmkgCgpQSwMECgAAAAAAlwnLPvpdOBi2DAAAtgwAAAwAAABydW5UZXN0cy54bWw8cHJvamVjdAogICAgbmFtZT0iU2ltUmVsIFRlc3RzIgogICAgYmFzZWRpcj0iLiIKICAgIGRlZmF1bHQ9InJ1blRlc3RzIj4KCiAgICA8cHJvcGVydHkKICAgICAgICBlbnZpcm9ubWVudD0iZW52Ii8+Cgk8IS0tCgkgICAgICAgIFRoaXMgcHJvcGVydHkgZmlsZSBuYW1lIGlzIGl0c2VsZiBhIHByb3BlcnR5LCBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbgoJICAgICAgICBvbiBvbmUgbWFjaGluZSB2ZXJzdXMgYW5vdGhlci4gV2UgZG8gaXQgdGhpcyB3YXksIGluc3RlYWQgb2YganVzdCBzcGVjaWZ5aW5nCgkgICAgICAgIC1wcm9wZXJ0eUZpbGUgb24gY29tbWFuZCBsaW5lLCBzbyB0aGF0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgY2FuIGJlICJuZXN0ZWQiCgkgICAgICAgIGluIG90aGVyIHByb3BlcnR5IHZhbHVlcyBhbmQgZXZhbHVhdGVkIGxhemlseS4KCSAgICAtLT4KCiAgICA8cHJvcGVydHkKICAgICAgICBuYW1lPSJhZ2dyUHJvcGVydHlGaWxlIgogICAgICAgIHZhbHVlPSJhZ2dyLnByb3BlcnRpZXMiLz4KCiAgICA8cHJvcGVydHkKICAgICAgICBmaWxlPSIke2FnZ3JQcm9wZXJ0eUZpbGV9Ii8+CgoJPCEtLSBCeSBkZWZhdWx0LCB3ZSdsbCBwdXQgdGVzdCBvdXRwdXQgZmlsZXMgaW4gInN0YWdpbmciIHNvIHRoZSBpbmRleC5odG1sIGZpbGUgICAtLT4KICAgIDxwcm9wZXJ0eQogICAgICAgIG5hbWU9Im91dHB1dERpcmVjdG9yeSIKICAgICAgICB2YWx1ZT0iJHtURVNUX1JFU1VMVFN9Ii8+CgogICAgPHRhcmdldAogICAgICAgIG5hbWU9InJ1blRlc3RzIj4KICAgICAgICA8ZWNobwogICAgICAgICAgICBtZXNzYWdlPSJDcmVhdGluZyBSZXBvcnRzIi8+CgogICAgICAgIDxlY2hvcHJvcGVydGllcy8+CgogICAgICAgIDxta2RpcgogICAgICAgICAgICBkaXI9IiR7b3V0cHV0RGlyZWN0b3J5fSIvPgoKICAgIAk8IS0tIE5PVEU6IHdlIHN0cm9uZ2x5IGFzc3VtZSAnb3V0cHV0RGlyZWN0b3J5JyBpcyBkZWRpY2F0ZWQgY29tcGxldGVseSBmb3Igb3VyIHVzZSEgLS0+CiAgICAgICAgPGRlbGV0ZT4KICAgICAgICAgICAgPGZpbGVzZXQKICAgICAgICAgICAgICAgIGRpcj0iJHtvdXRwdXREaXJlY3Rvcnl9Ij4KICAgICAgICAgICAgPC9maWxlc2V0PgogICAgICAgIDwvZGVsZXRlPgogICAgICAgPG1rZGlyCiAgICAgICAgICAgZGlyPSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIvPgoKICAgICAgICA8Y29weQogICAgICAgICAgICB0b2ZpbGU9IiR7b3V0cHV0RGlyZWN0b3J5fS9pbmRleC5odG1sIgogICAgICAgICAgICBmaWxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdGVtcGxhdGVGaWxlcy9pbmRleFBlbmRpbmcuaHRtbCIKICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIi8+CgogICAgICAgIDxnZW5lcmF0ZVJlcG9zaXRvcnlSZXBvcnRzCiAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iCiAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s9IiR7dGVzdFJlcG9EaXJlY3Rvcnl9IgogICAgICAgICAgICBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5PSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIKICAgICAgICAgICAgZmFpbHVyZXNvY2N1cnJlZD0iZmFpbHVyZXNvY2N1cnJlZCIvPgoKICAgICAgICA8Y29weQogICAgICAgICAgICB0b2ZpbGU9IiR7b3V0cHV0RGlyZWN0b3J5fS9pbmRleC5odG1sIgogICAgICAgICAgICBmaWxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdGVtcGxhdGVGaWxlcy9pbmRleG1haW5wcmVzaWduLmh0bWwiCiAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgoKICAgICAgICA8ZXhlYwogICAgICAgICAgICBleGVjdXRhYmxlPSIke0JVSUxEX1RFU1RTX0RJUn0vdmVyaWZ5ZGlyLnNoIj4KICAgICAgICAgICAgPGFyZwogICAgICAgICAgICAgICAgdmFsdWU9IiR7dGVzdFJlcG9EaXJlY3Rvcnl9Ii8+CiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgIHZhbHVlPSIke291dHB1dERpcmVjdG9yeX0vcmVwb3J0cyIvPgoJCiAgICAgICAgCTwhLS0gd2UnbGwgY2hlY2sgamFycyBvbmx5LCB0byBzYXZlIHRpbWUgLi4uIGFzc3VtZSBwYWNrLmd6IGZpbGVzIHdvdWxkIGJlIGNvcnJlY3QgdG9vICAKICAgICAgICAgICA8YXJnCiAgICAgICAgICAgICAgICB2YWx1ZT0iLipcKFwuamFyJFx8XC5qYXJcLnBhY2tcLmd6JFwpIi8+IC0tPgogICAgICAgIAkKICAgICAgICAJPCEtLSByZXN0cmljdGluZyB0byAnY29tbW9uJyBqdXN0IGZvciB0ZXN0aW5nIC4uLiBzbyBmaW5pc2hlcyByZWxhdGl2ZWx5IHF1aWNrbHkgCiAgICAgICAgICAgIDxhcmcKICAgICAgICAgICAgICAgIHZhbHVlPSIuKmNvbW1vbi4qXC5qYXIkIi8+CiAgICAgICAgICAgICAgICAtLT4KICAgICAgICAgICAgPGFyZwogICAgICAgICAgICAgICAgIHZhbHVlPSIuKlwuamFyJCIvPgogICAgICAgIDwvZXhlYz4KCiAgICAgICAgPGNvcHkKICAgICAgICAgICAgdG9maWxlPSIke291dHB1dERpcmVjdG9yeX0vaW5kZXguaHRtbCIKICAgICAgICAgICAgZmlsZT0iJHtCVUlMRF9URVNUU19ESVJ9L3RlbXBsYXRlRmlsZXMvaW5kZXhtYWluLmh0bWwiCiAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgoKCQk8IS0tCiAgICAgICAgPG1rZGlyCiAgICAgICAgICAgIGRpcj0iJHtvdXRwdXREaXJlY3Rvcnl9L291dHB1dC1lY2xpcHNlIi8+CiAgICAgICAgPHRlc3RMYXlvdXR0YXNrCiAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyPSIvdG1wL3RlbXBXb3JraW5nTG9jYXRpb24iCiAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s9Ii9ob21lL2RhdGEvaHR0cGQvZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS91cGRhdGVzLzMuN21pbGVzdG9uZXMvUy0zLjdSQzMtSTIwMTEwNTI2MTcwOC8iCiAgICAgICAgICAgIG91dHB1dFJlc3VsdHNEaXJlY3Rvcnk9IiR7b3V0cHV0RGlyZWN0b3J5fS9vdXRwdXQtZWNsaXBzZSIKICAgICAgICAgICAgZmFpbHVyZXNvY2N1cnJlZD0iZmFpbHVyZXNvY2N1cnJlZCIvPgotLT4KCgkJPCEtLSBUT0RPOiB1c2UgdG1wIG9uIHN0YWdpbmcgZGlyZWN0b3J5IHRvIGF2b2lkIGZpbGxpbmcgdXAgL3RtcD8gLS0+CiAgICAgICAgPGRlbGV0ZQogICAgICAgICAgICBkaXI9Ii90bXAvdGVtcFdvcmtpbmdMb2NhdGlvbiIvPgoKCQk8IS0tIGN1cnJlbnRseSwgd2UgbmV2ZXIgImZhaWwiIC4uLiBidXQsIHdpbGwgaW4gZnV0dXJlIC0tPgogICAgICAgIDxmYWlsCiAgICAgICAgICAgIGlmPSJmYWlsdXJlc29jY3VycmVkIi8+CiAgICA8L3RhcmdldD4KPC9wcm9qZWN0PlBLAwQKAAAAAAA7AtI+fexsuDYLAAA2CwAALAAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9UZXN0QWN0aXZhdG9yLmNsYXNzyv66vgAAADEAfwcAAgEAJm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9UZXN0QWN0aXZhdG9yBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVBY3RpdmF0b3IBAA1QSV9QUk9WX1RFU1RTAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACwEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdAEAB2NvbnRleHQBACJMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7AQAMcGFja2FnZUFkbWluAQAsTG9yZy9vc2dpL3NlcnZpY2UvcGFja2FnZWFkbWluL1BhY2thZ2VBZG1pbjsBAA9wYWNrYWdlQWRtaW5SZWYBACVMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAOVEVTVF9EQVRBX1BBVEgBAAg8Y2xpbml0PgEAAygpVgEABENvZGUJAAEAFwwADgAPCQABABkMABAAEQgAGwEACHRlc3REYXRhCQABAB0MABIACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAiDAAgABQBAAR0aGlzAQAoTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9UZXN0QWN0aXZhdG9yOwEACmdldENvbnRleHQBACQoKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsJAAEAKAwADAANAQAKZ2V0TG9nRmlsZQEAECgpTGphdmEvaW8vRmlsZTsHACwBACtvcmcvZWNsaXBzZS9vc2dpL2ZyYW1ld29yay9sb2cvRnJhbWV3b3JrTG9nCgAuADAHAC8BAA9qYXZhL2xhbmcvQ2xhc3MMADEAMgEAB2dldE5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwoANAA2BwA1AQA6b3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlcgwANwA4AQAKZ2V0U2VydmljZQEASChMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwsAKwA6DAA7ACoBAAdnZXRGaWxlAQADbG9nAQAtTG9yZy9lY2xpcHNlL29zZ2kvZnJhbWV3b3JrL2xvZy9GcmFtZXdvcmtMb2c7AQAFc3RhcnQBACUoTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0OylWAQAKRXhjZXB0aW9ucwcAQgEAE2phdmEvbGFuZy9FeGNlcHRpb24HAEQBACpvcmcvb3NnaS9zZXJ2aWNlL3BhY2thZ2VhZG1pbi9QYWNrYWdlQWRtaW4LAEYASAcARwEAIG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0DABJAEoBABNnZXRTZXJ2aWNlUmVmZXJlbmNlAQA5KExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7CwBGAEwMADcATQEAOShMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7KUxqYXZhL2xhbmcvT2JqZWN0OwEABHN0b3ABABFnZXRUZXN0RGF0YUZvbGRlcgsARgBRDABSAFMBAAlnZXRCdW5kbGUBAB0oKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlOwsAVQBXBwBWAQAZb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZQwAWABZAQAIZ2V0RW50cnkBACIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25ldC9VUkw7BwBbAQAMamF2YS9pby9GaWxlCgBdAF8HAF4BACRvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvRmlsZUxvY2F0b3IMAGAAYQEAB3Jlc29sdmUBAB4oTGphdmEvbmV0L1VSTDspTGphdmEvbmV0L1VSTDsKAGMAZQcAZAEADGphdmEvbmV0L1VSTAwAOwAyCgBaAGcMACAAaAEAFShMamF2YS9sYW5nL1N0cmluZzspVgcAagEAE2phdmEvaW8vSU9FeGNlcHRpb24BAAN1cmwBAA5MamF2YS9uZXQvVVJMOwEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAC8oTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlOwsAQwBxDAByAHMBAApnZXRCdW5kbGVzAQBCKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylbTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7CwBVAHUMAHYAdwEACGdldFN0YXRlAQADKClJAQAMc3ltYm9saWNOYW1lAQAHYnVuZGxlcwEAHFtMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZTsBAAFpAQABSQEAClNvdXJjZUZpbGUBABJUZXN0QWN0aXZhdG9yLmphdmEAIQABAAMAAQAFAAUAGQAHAAgAAQAJAAAAAgAKAAkADAANAAAACgAOAA8AAAAKABAAEQAAAAkAEgAIAAAACAAIABMAFAABABUAAAA6AAEAAAAAAA4BswAWAbMAGBIaswAcsQAAAAIAHgAAABIABAAAAB0ABAAeAAgAHwANABoAHwAAAAIAAAABACAAFAABABUAAAAvAAEAAQAAAAUqtwAhsQAAAAIAHgAAAAYAAQAAABoAHwAAAAwAAQAAAAUAIwAkAAAACQAlACYAAQAVAAAAJAABAAAAAAAEsgAnsAAAAAIAHgAAAAYAAQAAACIAHwAAAAIAAAAJACkAKgABABUAAABMAAIAAQAAAB6yACcSK7YALbgAM8AAK0sqxwAHAacACSq5ADkBALAAAAACAB4AAAAKAAIAAAApAA8AKgAfAAAADAABAA8ADwA8AD0AAAABAD4APwACAEAAAAAEAAEAQQAVAAAAYgACAAIAAAAiK7MAJysSQ7YALbkARQIAswAYK7IAGLkASwIAwABDswAWsQAAAAIAHgAAABIABAAAAC4ABAAvABIAMAAhADEAHwAAABYAAgAAACIAIwAkAAAAAAAiAAwADQABAAEATgA/AAIAQAAAAAQAAQBBABUAAAA9AAEAAgAAAAUBswAnsQAAAAIAHgAAAAoAAgAAADQABAA1AB8AAAAWAAIAAAAFACMAJAAAAAAABQAMAA0AAQAJAE8AKgABABUAAABrAAMAAQAAACOyACe5AFABALIAHLkAVAIAS7sAWlkquABctgBitwBmsEsBsAABAAAAHwAgAGkAAgAeAAAAEgAEAAAAOQARADoAIAA8ACEAPQAfAAAAFgACABEADwBrAGwAAAAhAAIAbQBuAAAACQBSAG8AAQAVAAAAnAADAAMAAAA6sgAWxwAFAbCyABYqAbkAcAMATCvHAAUBsAM9pwAXKxwyuQB0AQAGfpoAByscMrCEAgEcK76h/+kBsAAAAAIAHgAAACoACgAAAEIABgBDAAgARQATAEYAFwBHABkASgAeAEsAKwBMAC8ASgA4AE8AHwAAACAAAwAAADoAeAAIAAAAEwAnAHkAegABABsAHQB7AHwAAgABAH0AAAACAH5QSwMECgAAAAAAinG9Pku6eRjyCwAA8gsAACsAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvVGVzdEFjdGl2YXRvci5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqIAogKiAgQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0czsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJMOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nOwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwppbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwoKcHVibGljIGNsYXNzIFRlc3RBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgICAgICBQSV9QUk9WX1RFU1RTICAgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0IjsKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCAgICAgY29udGV4dDsKICAgIHByaXZhdGUgc3RhdGljIFBhY2thZ2VBZG1pbiAgICAgcGFja2FnZUFkbWluICAgID0gbnVsbDsKICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluUmVmID0gbnVsbDsKICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICAgICAgICAgICAgVEVTVF9EQVRBX1BBVEggID0gInRlc3REYXRhIjsgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAoKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewogICAgICAgIHJldHVybiBjb250ZXh0OwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gYSBmaWxlIGhhbmRsZSB0byB0aGUgZnJhbWV3b3JrIGxvZyBmaWxlLCBvciBudWxsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMb2dGaWxlKCkgewogICAgICAgIEZyYW1ld29ya0xvZyBsb2cgPSAoRnJhbWV3b3JrTG9nKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoY29udGV4dCwgRnJhbWV3b3JrTG9nLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgcmV0dXJuIGxvZyA9PSBudWxsID8gbnVsbCA6IGxvZy5nZXRGaWxlKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBUZXN0QWN0aXZhdG9yLmNvbnRleHQgPSBjb250ZXh0OwogICAgICAgIHBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICBwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgVGVzdEFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdERhdGFGb2xkZXIoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgVVJMIHVybCA9IGNvbnRleHQuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVGVzdEFjdGl2YXRvci5URVNUX0RBVEFfUEFUSCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0RmlsZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7CiAgICAgICAgaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBCdW5kbGVbXSBidW5kbGVzID0gcGFja2FnZUFkbWluLmdldEJ1bmRsZXMoc3ltYm9saWNOYW1lLCBudWxsKTsKICAgICAgICBpZiAoYnVuZGxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvL1JldHVybiB0aGUgZmlyc3QgYnVuZGxlIHRoYXQgaXMgbm90IGluc3RhbGxlZCBvciB1bmluc3RhbGxlZAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cgp9ClBLAwQKAAAAAAA7AtI+r14lKKwTAACsEwAAMwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9SdW5BbGxSZXBvcnRzQW50VGFzay5jbGFzc8r+ur4AAAAxANAHAAIBAC1vcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2sHAAQBABlvcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrAQAQZGlyZWN0b3J5VG9DaGVjawEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADnRlbXBXb3JraW5nRGlyAQAWb3V0cHV0UmVzdWx0c0RpcmVjdG9yeQEAEGZhaWx1cmVzT2NjdXJyZWQBAAFaAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAPDAALAAwJAAEAEQwACQAKAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAL0xvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2s7AQAHZXhlY3V0ZQEACkV4Y2VwdGlvbnMHABkBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbgcAGwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCAAdAQAHZmlsZTovLwoAGgAfDAALACABABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAIgwAIwAkAQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CgAaACYMACcAKAEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAGgAqDAArACQBAAh0b1N0cmluZwcALQEALm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcKACwADwoALAAwDAAxACABABBzZXRSZXBvVVJMVG9UZXN0CgABADMMADQAJAEAGWdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkKACwANgwANwAgAQASc2V0T3V0cHV0RGlyZWN0b3J5CgAsADkMADoAOwEAE3Rlc3RWZXJzaW9uVW5pcW5lc3MBAAMoKVoKAAEAPQwAPgA/AQATc2V0RmFpbHVyZXNPY2N1cnJlZAEABChaKVYHAEEBACxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlcgoAQAAPCgBAADAKAEAANgoAQABGDABHADsBABB0ZXN0RmVhdHVyZU5hbWVzCgBAAEkMAEoAOwEAD3Rlc3RCdW5kbGVOYW1lcwcATAEAMm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyCgBLAA8KAEsAMAoASwA2CgBLAFEMAFIAOwEAEXRlc3RQcm92aWRlck5hbWVzBwBUAQA8b3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyCgBTAA8KAFMAMAoAUwA2CgBTAFkMAFoAOwEAE3Rlc3REaXNwbGF5YWJsZURhdGEHAFwBADFvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzCgBbAA8KAFsAMAoAWwA2CgBbAGEMAGIAYwEAGnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoAQADKClJCgAYAGUMAAsAZgEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgcAaAEAJG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0VTVGVzdAoAZwAPCgBnAGsMAGwAIAEAE3NldERpcmVjdG9yeVRvQ2hlY2sKAAEAbgwAbwAkAQARZ2V0VGVtcFdvcmtpbmdEaXIKAGcAcQwAcgAgAQARc2V0VGVtcFdvcmtpbmdEaXIKAGcANgoAZwB1DAB2ADsBABF0ZXN0RVNTZXR0aW5nUnVsZQcAeAEAJm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0JSRUVUZXN0CgB3AA8KAHcAawoAdwBxCgB3ADYKAHcAfgwAfwA7AQATdGVzdEJSRUVTZXR0aW5nUnVsZQcAgQEAKW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0CgCAAA8KAIAAawoAgAA2CgCAAIYMAIcAOwEADnRlc3RCdW5kbGVQYWNrBwCJAQApb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVmVyc2lvblRlc3QKAIgADwoAiABrCgCIADYKAIgAjgwAjwA7AQAUdGVzdFZlcnNpb25zUGF0dGVybnMHAJEBACxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9UZXN0TGF5b3V0VGVzdAoAkAAPCgCQAGsKAJAAcQoAkAA2CgCQAJcMAJgAOwEACnRlc3RMYXlvdXQHAJoBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uBwCcAQAzb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uBwCeAQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwCgAQATamF2YS9pby9JT0V4Y2VwdGlvbgEACnJlcG9Ub1Rlc3QBAA91bmlxdWVuZXNzQ2hlY2sBABNmZWF0dXJlTmFtZUZhaWx1cmVzAQASYnVuZGxlTmFtZUZhaWx1cmVzAQAUcHJvdmlkZXJOYW1lc0ZhaWx1cmUBABlsaWNlbnNlQ29uc2lzdGVuY3lGYWlsdXJlAQARdW5pcXVlbmVzc0NoZWNrZXIBADBMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZzsBAAdpdU5hbWVzAQAuTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyOwEAE3Byb3ZpZGVyTmFtZUNoZWNrZXIBADRMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXI7AQAObGljZW5zZUNoZWNrZXIBAD5Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyOwEAEmZlYXR1cmVOYW1lTGVuZ3RocwEAM0xvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzOwEAAWUBADBMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbjsBADVMb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwEAHUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247AQAGZXNUZXN0AQAmTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0VTVGVzdDsBAAplc0ZhaWx1cmVz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UkVFVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5qYXJzLkVTVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5qYXJzLlBhY2syMDBUZXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLmphcnMuVGVzdExheW91dFRlc3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMuamFycy5WZXJzaW9uVGVzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvcy5GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvcy5GZWF0dXJlTmFtZUxlbmd0aHM7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMucmVwb3MuSVVOYW1lQ2hlY2tlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvcy5Qcm92aWRlck5hbWVDaGVja2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnJlcG9zLlZlcnNpb25DaGVja2luZzsKCnB1YmxpYyBjbGFzcyBSdW5BbGxSZXBvcnRzQW50VGFzayBleHRlbmRzIFRhc2sgewoKICAgIHByaXZhdGUgU3RyaW5nICBkaXJlY3RvcnlUb0NoZWNrOwogICAgcHJpdmF0ZSBTdHJpbmcgIHRlbXBXb3JraW5nRGlyOwogICAgcHJpdmF0ZSBTdHJpbmcgIG91dHB1dFJlc3VsdHNEaXJlY3Rvcnk7CiAgICBwcml2YXRlIGJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCA9IGZhbHNlOwoKICAgIEBPdmVycmlkZQogICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CgogICAgICAgIHRyeSB7CgoKICAgICAgICAgICAgU3RyaW5nIHJlcG9Ub1Rlc3QgPSAiZmlsZTovLyIgKyBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CgogICAgICAgICAgICBib29sZWFuIHVuaXF1ZW5lc3NDaGVjayA9IGZhbHNlOwogICAgICAgICAgICBib29sZWFuIGZlYXR1cmVOYW1lRmFpbHVyZXMgPSBmYWxzZTsKICAgICAgICAgICAgYm9vbGVhbiBidW5kbGVOYW1lRmFpbHVyZXMgPSBmYWxzZTsKICAgICAgICAgICAgYm9vbGVhbiBwcm92aWRlck5hbWVzRmFpbHVyZSA9IGZhbHNlOwogICAgICAgICAgICBib29sZWFuIGxpY2Vuc2VDb25zaXN0ZW5jeUZhaWx1cmUgPSBmYWxzZTsKICAgICAgICAgICAgdHJ5IHsKCiAgICAgICAgICAgICAgICBWZXJzaW9uQ2hlY2tpbmcgdW5pcXVlbmVzc0NoZWNrZXIgPSBuZXcgVmVyc2lvbkNoZWNraW5nKCk7CiAgICAgICAgICAgICAgICB1bmlxdWVuZXNzQ2hlY2tlci5zZXRSZXBvVVJMVG9UZXN0KHJlcG9Ub1Rlc3QpOwogICAgICAgICAgICAgICAgdW5pcXVlbmVzc0NoZWNrZXIuc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgICAgICB1bmlxdWVuZXNzQ2hlY2sgPSB1bmlxdWVuZXNzQ2hlY2tlci50ZXN0VmVyc2lvblVuaXFuZXNzKCk7CiAgICAgICAgICAgICAgICBpZiAodW5pcXVlbmVzc0NoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RmFpbHVyZXNPY2N1cnJlZCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBJVU5hbWVDaGVja2VyIGl1TmFtZXMgPSBuZXcgSVVOYW1lQ2hlY2tlcigpOwogICAgICAgICAgICAgICAgaXVOYW1lcy5zZXRSZXBvVVJMVG9UZXN0KHJlcG9Ub1Rlc3QpOwogICAgICAgICAgICAgICAgaXVOYW1lcy5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lRmFpbHVyZXMgPSBpdU5hbWVzLnRlc3RGZWF0dXJlTmFtZXMoKTsKICAgICAgICAgICAgICAgIGJ1bmRsZU5hbWVGYWlsdXJlcyA9IGl1TmFtZXMudGVzdEJ1bmRsZU5hbWVzKCk7CgogICAgICAgICAgICAgICAgUHJvdmlkZXJOYW1lQ2hlY2tlciBwcm92aWRlck5hbWVDaGVja2VyID0gbmV3IFByb3ZpZGVyTmFtZUNoZWNrZXIoKTsKICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZUNoZWNrZXIuc2V0UmVwb1VSTFRvVGVzdChyZXBvVG9UZXN0KTsKICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZUNoZWNrZXIuc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgICAgICBwcm92aWRlck5hbWVzRmFpbHVyZSA9IHByb3ZpZGVyTmFtZUNoZWNrZXIudGVzdFByb3ZpZGVyTmFtZXMoKTsKCiAgICAgICAgICAgICAgICBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlciBsaWNlbnNlQ2hlY2tlciA9IG5ldyBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlcigpOwogICAgICAgICAgICAgICAgbGljZW5zZUNoZWNrZXIuc2V0UmVwb1VSTFRvVGVzdChyZXBvVG9UZXN0KTsKICAgICAgICAgICAgICAgIGxpY2Vuc2VDaGVja2VyLnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwogICAgICAgICAgICAgICAgbGljZW5zZUNvbnNpc3RlbmN5RmFpbHVyZSA9IGxpY2Vuc2VDaGVja2VyLnRlc3REaXNwbGF5YWJsZURhdGEoKTsKCiAgICAgICAgICAgICAgICBGZWF0dXJlTmFtZUxlbmd0aHMgZmVhdHVyZU5hbWVMZW5ndGhzID0gbmV3IEZlYXR1cmVOYW1lTGVuZ3RocygpOwogICAgICAgICAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnNldFJlcG9VUkxUb1Rlc3QocmVwb1RvVGVzdCk7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0T3V0cHV0RGlyZWN0b3J5KGdldE91dHB1dFJlc3VsdHNEaXJlY3RvcnkoKSk7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMudGVzdEZlYXR1cmVEaXJlY3RvcnlMZW5ndGgoKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZlYXR1cmVOYW1lRmFpbHVyZXMgfHwgYnVuZGxlTmFtZUZhaWx1cmVzIHx8IHByb3ZpZGVyTmFtZXNGYWlsdXJlIHx8IGxpY2Vuc2VDb25zaXN0ZW5jeUZhaWx1cmUpIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBFU1Rlc3QgZXNUZXN0ID0gbmV3IEVTVGVzdCgpOwogICAgICAgICAgICBlc1Rlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICBlc1Rlc3Quc2V0VGVtcFdvcmtpbmdEaXIoZ2V0VGVtcFdvcmtpbmdEaXIoKSk7CiAgICAgICAgICAgIGVzVGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKCiAgICAgICAgICAgIGJvb2xlYW4gZXNGYWlsdXJlcyA9IGVzVGVzdC50ZXN0RVNTZXR0aW5nUnVsZSgpOwoKICAgICAgICAgICAgaWYgKGVzRmFpbHVyZXMpIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJSRUVUZXN0IGJyZWVUZXN0ID0gbmV3IEJSRUVUZXN0KCk7CiAgICAgICAgICAgIGJyZWVUZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsKICAgICAgICAgICAgYnJlZVRlc3Quc2V0VGVtcFdvcmtpbmdEaXIoZ2V0VGVtcFdvcmtpbmdEaXIoKSk7CiAgICAgICAgICAgIGJyZWVUZXN0LnNldE91dHB1dERpcmVjdG9yeShnZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KCkpOwoKICAgICAgICAgICAgYm9vbGVhbiBicmVlRmFpbHVyZXMgPSBicmVlVGVzdC50ZXN0QlJFRVNldHRpbmdSdWxlKCk7CgogICAgICAgICAgICBpZiAoYnJlZUZhaWx1cmVzKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgUGFjazIwMFRlc3QgcGFja1Rlc3QgPSBuZXcgUGFjazIwMFRlc3QoKTsKICAgICAgICAgICAgcGFja1Rlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICBwYWNrVGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgYm9vbGVhbiBwYWNrRmFpbHVyZXMgPSBwYWNrVGVzdC50ZXN0QnVuZGxlUGFjaygpOwogICAgICAgICAgICBpZiAocGFja0ZhaWx1cmVzKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgVmVyc2lvblRlc3QgdmVyc2lvblRlc3QgPSBuZXcgVmVyc2lvblRlc3QoKTsKICAgICAgICAgICAgdmVyc2lvblRlc3Quc2V0RGlyZWN0b3J5VG9DaGVjayhnZXREaXJlY3RvcnlUb0NoZWNrKCkpOwogICAgICAgICAgICB2ZXJzaW9uVGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgYm9vbGVhbiB2ZXJzaW9uQ2hlY2sgPSB2ZXJzaW9uVGVzdC50ZXN0VmVyc2lvbnNQYXR0ZXJucygpOwogICAgICAgICAgICBpZiAodmVyc2lvbkNoZWNrKSB7CiAgICAgICAgICAgICAgICBzZXRGYWlsdXJlc09jY3VycmVkKHRydWUpOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgVGVzdExheW91dFRlc3QgdGVzdCA9IG5ldyBUZXN0TGF5b3V0VGVzdCgpOwogICAgICAgICAgICB0ZXN0LnNldERpcmVjdG9yeVRvQ2hlY2soZ2V0RGlyZWN0b3J5VG9DaGVjaygpKTsKICAgICAgICAgICAgdGVzdC5zZXRUZW1wV29ya2luZ0RpcihnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgdGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpKTsKICAgICAgICAgICAgYm9vbGVhbiBsYXlvdXRGYWlsdXJlcyA9IHRlc3QudGVzdExheW91dCgpOwogICAgICAgICAgICBpZiAobGF5b3V0RmFpbHVyZXMpIHsKICAgICAgICAgICAgICAgIHNldEZhaWx1cmVzT2NjdXJyZWQodHJ1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgewogICAgICAgIHJldHVybiBkaXJlY3RvcnlUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVRvQ2hlY2soU3RyaW5nIGJ1bmRsZURpclRvQ2hlY2spIHsKICAgICAgICB0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcFdvcmtpbmdEaXIoKSB7CiAgICAgICAgcmV0dXJuIHRlbXBXb3JraW5nRGlyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFRlbXBXb3JraW5nRGlyKFN0cmluZyB0ZW1wV29ya2luZ0RpcikgewogICAgICAgIHRoaXMudGVtcFdvcmtpbmdEaXIgPSB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWx1cmVzT2NjdXJyZWQoKSB7CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJyZWQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RmFpbHVyZXNPY2N1cnJlZChib29sZWFuIGZhaWx1cmVzT2NjdXJyZWQpIHsKICAgICAgICB0aGlzLmZhaWx1cmVzT2NjdXJyZWQgPSBmYWlsdXJlc09jY3VycmVkOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0UmVzdWx0c0RpcmVjdG9yeSgpIHsKICAgICAgICByZXR1cm4gb3V0cHV0UmVzdWx0c0RpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRSZXN1bHRzRGlyZWN0b3J5KFN0cmluZyBvdXRwdXRSZXN1bHRzRGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXRSZXN1bHRzRGlyZWN0b3J5ID0gb3V0cHV0UmVzdWx0c0RpcmVjdG9yeTsKICAgIH0KCn0KUEsDBAoAAAAAADsC0j56LKuaFEkAABRJAAAyAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QuY2xhc3PK/rq+AAAAMQKyBwACAQAsb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAQuamFyAQAURVhURU5TSU9OX1BBQ0VLRF9KQVIIAAwBAAgucGFjay5negEADUVYVEVOU0lPTl9aSVAIAA8BAAQuemlwAQASUFJPUEVSVFlfQlVORExFX0lECAASAQATQnVuZGxlLVN5bWJvbGljTmFtZQEADmNvbmZpZ0ZpbGVuYW1lAQAPS0VZX0RGVF9CSU5fSkFSCAAWAQASZGVmYXVsdC5iaW5hcnkuamFyAQAPS0VZX0RGVF9TUkNfSkFSCAAZAQASZGVmYXVsdC5zb3VyY2UuamFyAQAPS0VZX0RGVF9GRUFUVVJFCAAcAQAPZGVmYXVsdC5mZWF0dXJlAQAGY29uZmlnAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBABBkaXJlY3RvcnlUb0NoZWNrAQAOdGVtcFdvcmtpbmdEaXIBAA9vdXRwdXREaXJlY3RvcnkBAAxyZXBvcnRXcml0ZXIBAC1Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADACoMACYAJwgALAEAEWNvbmZpZy5wcm9wZXJ0aWVzCQABAC4MABMABgcAMAEAE2phdmEvdXRpbC9BcnJheUxpc3QKAC8AKgkAAQAzDAAfACABAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAuTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1Rlc3RMYXlvdXRUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABACoIADwBAAtEOlx0ZW1wdGVzdAoAAQA+DAA/AEABABNzZXREaXJlY3RvcnlUb0NoZWNrAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCABCAQAHRDovdGVtcAoAAQBEDABFAEABABFzZXRUZW1wV29ya2luZ0RpcgoAAQBHDABIAEkBAAp0ZXN0TGF5b3V0AQADKClaCgBLAE0HAEwBABNqYXZhL2lvL0lPRXhjZXB0aW9uDABOACcBAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAIYWRkRXJyb3ILAFYAWAcAVwEADmphdmEvdXRpbC9MaXN0DABZAFoBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAdtZXNzYWdlAQAKRXhjZXB0aW9ucwoAAQBeDABfAGABAA9nZXRSZXBvcnRXcml0ZXIBAC8oKUxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwgAYgEAL0NoZWNrIGZpbGVzIGFuZCBsYXlvdXQgaW4gYnVuZGxlcyBhbmQgZmVhdHVyZXMuCgBkAGYHAGUBACtvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyDABnAEABAAd3cml0ZWxuCgABAGkMAGoASQEAEXRlc3RGZWF0dXJlTGF5b3V0CgABAGwMAG0ASQEAEHRlc3RCdW5kbGVMYXlvdXQKAGQAbwwAcAAnAQAFY2xvc2UBAAZyZXN1bHQBAAFaAQAPZmVhdHVyZUZhaWx1cmVzAQAOYnVuZGxlRmFpbHVyZXMKAAEAdgwAdwB4AQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7BwB6AQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24IAHwBAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAHkAfgwAJgBACACAAQABLwoAggCEBwCDAQAQamF2YS9sYW5nL1N0cmluZwwAhQCGAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoHAIgBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoAggCKDACLAIwBAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAIcAfggAjwEAEWFnZ3JlZ2F0ZS9wbHVnaW5zCgCHAJEMAJIAkwEABmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAhwCVDACWAHgBAAh0b1N0cmluZwgAmAEAEi9hZ2dyZWdhdGUvcGx1Z2lucwcAmgEADGphdmEvaW8vRmlsZQoAmQB+CgCZAJ0MAJ4ASQEABmV4aXN0cwoAmQCgDAChAEkBAAtpc0RpcmVjdG9yeQgAowEAEmJ1bmRsZSBkaXJlY290cnkgKAgApQEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuBwCnAQAwb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyCgCmACoKAJkAqgwAqwCsAQAJbGlzdEZpbGVzAQApKExqYXZhL2lvL0ZpbGVuYW1lRmlsdGVyOylbTGphdmEvaW8vRmlsZTsKAAEArgwArwCwAQALZ2V0QnVuZGxlSWQBACIoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7CACyAQAHLnNvdXJjZQgAtAEACC5pbmZvcG9wCAC2AQAJLmRvYy51c2VyCAC4AQAELmRvYwgAugEACC5kb2MuaXN2CAC8AQAILmRvYy5kZXYIAL4BAAguZG9jLmFwaQgAwAEAEHN0YW5kYXJkLnNjaGVtYXMIAMIBAAkuYnJhbmRpbmcKAAEAxAwAxQDGAQALZ2V0RXhwZWN0ZWQBACQoTGphdmEvbGFuZy9TdHJpbmc7WilMamF2YS91dGlsL1NldDsKAAEAyAwAyQDKAQANcHJvY2Vzc0J1bmRsZQEAIChMamF2YS9pby9GaWxlO0xqYXZhL3V0aWwvU2V0OylWCgBkAMwMAGcAJwgAzgEADSAgIENoZWNraW5nOiAIANABAAsgICBDaGVja2VkIAoAhwDSDACSANMBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADVAQAEIG9mIAgA1wEAAS4IANkBABEgICBFcnJvcnMgZm91bmQ6IAsAVgDbDADcAN0BAARzaXplAQADKClJCgDfAOEHAOABABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAOIA4wEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCwBWAOUMAOYA5wEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsA6QDrBwDqAQASamF2YS91dGlsL0l0ZXJhdG9yDADsAO0BAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsKAGQA7wwAZwDwAQAVKExqYXZhL2xhbmcvT2JqZWN0OylWCwDpAPIMAPMASQEAB2hhc05leHQBAA9mYWlsdXJlc09jY3VyZWQBAAhwcm9wZXJ0eQEAD2J1bmRsZURpcmVjdG9yeQEACGlucHV0ZGlyAQAOTGphdmEvaW8vRmlsZTsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQACaWQBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsJAAEBBAwAHQAeCgABAQYMAQcAJwEACWdldENvbmZpZwoBCQELBwEKAQAUamF2YS91dGlsL1Byb3BlcnRpZXMMAQwBDQEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsIAQ8BAB1VbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6IAcBEQEAEWphdmEvdXRpbC9IYXNoU2V0CgEQACoHARQBABlqYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyCAEWAQABLAoBEwEYDAAmARkBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKARMBGwwBHAB4AQAJbmV4dFRva2VuCgCCAR4MAR8AeAEABHRyaW0LASEAWAcBIgEADWphdmEvdXRpbC9TZXQKARMBJAwBJQBJAQANaGFzTW9yZVRva2VucwEABnNvdXJjZQEABGxpbmUBAA9MamF2YS91dGlsL1NldDsBAAl0b2tlbml6ZXIBABtMamF2YS91dGlsL1N0cmluZ1Rva2VuaXplcjsBABJnZXRGZWF0dXJlRXhwZWN0ZWQBACUoTGphdmEvbGFuZy9TdHJpbmc7WlopTGphdmEvdXRpbC9TZXQ7AQADemlwCgEJACoKAAEBMAwBMQB4AQARZ2V0Q29uZmlnRmlsZW5hbWUHATMBABdqYXZhL2lvL0ZpbGVJbnB1dFN0cmVhbQoBMgE1DAAmATYBABEoTGphdmEvaW8vRmlsZTspVgoAAwE4DAE5AToBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsKATwBPgcBPQEAD2phdmEvbGFuZy9DbGFzcwwBPwFAAQATZ2V0UmVzb3VyY2VBc1N0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07CAFCAQAiVW5hYmxlIHRvIGxvYWQgY29uZmlndXJhdGlvbiBmaWxlLgoBCQFEDAFFAUYBAARsb2FkAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgFIAG8HAUkBABNqYXZhL2lvL0lucHV0U3RyZWFtAQAFaW5wdXQBABVMamF2YS9pby9JbnB1dFN0cmVhbTsBAApjb25maWdGaWxlCwEhANsLASEBTwwBUAFRAQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAFAIAVQBAAAKAAEBVgwBVwFYAQAKcHJvY2Vzc0RpcgEANihMamF2YS9sYW5nL1N0cmluZztMamF2YS9pby9GaWxlO1tMamF2YS9sYW5nL1N0cmluZzspVggBWgEACE1pc3NpbmcgCAFcAQAJIGluIGRpcjogCgCZAV4MAV8AeAEAD2dldEFic29sdXRlUGF0aAoAAQFhDABUAEAKAAEBYwwBZAFlAQAOcHJvY2Vzc0FyY2hpdmUBACQoTGphdmEvaW8vRmlsZTtbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARmaWxlAQAIZXhwZWN0ZWQBAAVhcnJheQEADnByb2Nlc3NGZWF0dXJlBwFrAQAVamF2YS91dGlsL3ppcC9aaXBGaWxlCgFqAW0MACYBbgEAEihMamF2YS9pby9GaWxlO0kpVgoBagFwDAFxAXIBAAdlbnRyaWVzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwsBdAF2BwF1AQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAF3AO0BAAtuZXh0RWxlbWVudAcBeQEAFmphdmEvdXRpbC96aXAvWmlwRW50cnkKAXgBewwBfAB4AQAHZ2V0TmFtZQoAggF+DAF/AIYBAAdtYXRjaGVzCgGBAE0HAYIBACZqYXZhL3V0aWwvcmVnZXgvUGF0dGVyblN5bnRheEV4Y2VwdGlvbgsBdAGEDAGFAEkBAA9oYXNNb3JlRWxlbWVudHMIAYcBAAogaW4gZmlsZTogCgCZAXsKAWoAbwEAF0xqYXZhL3V0aWwvemlwL1ppcEZpbGU7AQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVlbnRyeQEAGExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwEABG5hbWUBAAdwYXR0ZXJuAQACZXgBAChMamF2YS91dGlsL3JlZ2V4L1BhdHRlcm5TeW50YXhFeGNlcHRpb247CgCZAZMMAKsBlAEAESgpW0xqYXZhL2lvL0ZpbGU7CgCCAZYMAZcA3QEABmxlbmd0aAoAhwGZDACSAZoBABwoQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGBAZwMAZ0AeAEACmdldE1lc3NhZ2UBAARyb290AQADZGlyAQAFaW5kZXgBABdnZXRCdW5kbGVJZEZyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgGkAaYHAaUBACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAGnAagBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsLAaoBrAcBqwEADWphdmEvdXRpbC9NYXAMAa0BrgEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CAGwAQA6QnVuZGxlU3ltYm9saWNOYW1lIGhlYWRlciBub3Qgc2V0IGluIG1hbmlmZXN0IGZvciBidW5kbGU6IAoAggGyDAGzAbQBAAdpbmRleE9mAQAEKEkpSQoAggG2DAG3AbgBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7CgG6AZwHAbsBACJvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlRXhjZXB0aW9uCgBLAZwBAARwYXRoAQAKYXR0cmlidXRlcwEAD0xqYXZhL3V0aWwvTWFwOwEAA3BvcwEAJExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlRXhjZXB0aW9uOwoAAQHDDAHEALABABJnZXRCdW5kbGVJZEZyb21EaXIKAIIBxgwBxwB4AQALdG9Mb3dlckNhc2UKAAEByQwBygCwAQASZ2V0QnVuZGxlSWRGcm9tWklQCgABAcwMAc0AsAEAEmdldEJ1bmRsZUlkRnJvbUpBUgoBagE1CAHQAQAYXi4qL01FVEEtSU5GL01BTklGRVNULk1GCgFqAdIMAdMB1AEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEB1gwBoQGiCAHYAQAzQnVuZGxlIG1hbmlmZXN0IChNQU5JRkVTVC5NRikgbm90IGZvdW5kIGluIGJ1bmRsZTogCAHaAQAUTUVUQS1JTkYvTUFOSUZFU1QuTUYKAJkB3AwAJgHdAQAjKExqYXZhL2lvL0ZpbGU7TGphdmEvbGFuZy9TdHJpbmc7KVYKAJkB3wwB4ABJAQAGaXNGaWxlCAHiAQAsQnVuZGxlIG1hbmlmZXN0IChNQU5JRkVTVC5NRikgbm90IGZvdW5kIGF0OiAKAeQBnAcB5QEAHWphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uAQAMbWFuaWZlc3RGaWxlAQAfTGphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwEAFGdldEZpbGVGcm9tUEFDS0VESkFSAQAeKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2lvL0ZpbGU7CgHrAe0HAewBAEVvcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IMAe4B7wEAEmdldFVucGFja1Byb2Nlc3NvcgEAXyhMamF2YS91dGlsL1Byb3BlcnRpZXM7KUxvcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3I7CgABAfEMAfIAeAEAEWdldFRlbXBXb3JraW5nRGlyCgHrAfQMAfUAQAEAE3NldFdvcmtpbmdEaXJlY3RvcnkKAesB9wwB+AHpAQAKcHJvY2Vzc0phcgEABnRtcGphcgEADGphcnByb2Nlc3NvcgEAR0xvcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3I7CQABAf0MACEABgEAEGJ1bmRsZURpclRvQ2hlY2sBABFzZXRDb25maWdGaWxlbmFtZQcCAQEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoCAAIDDAAmAgQBABMoTGphdmEvaW8vRmlsZTtaSSlWCgIAAgYMAgcCCAEAC2dldEphckVudHJ5AQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL2phci9KYXJFbnRyeTsIAgoBACxCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6IAoCAABvCgIAAdIBAANqYXIBABdMamF2YS91dGlsL2phci9KYXJGaWxlOwEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwkAAQIRDAAiAAYIAhMBABJhZ2dyZWdhdGUvZmVhdHVyZXMIAhUBABMvYWdncmVnYXRlL2ZlYXR1cmVzCAIXAQATZmVhdHVyZSBkaXJlY290cnkgKAoAAQIZDAHoAekKAAECGwwCHACwAQAMZ2V0RmVhdHVyZUlkCgABAh4MASsBLAoAAQIgDAFpAMoBABBmYWlsdXJlc09jY3VycmVkAQAQZmVhdHVyZURpcmVjdG9yeQoAAQIkDAIlALABABNnZXRGZWF0dXJlSWRGcm9tRGlyCgABAicMAigAsAEAE2dldEZlYXR1cmVJZEZyb21KQVIIAioBAAtmZWF0dXJlLnhtbAgCLAEAMUZlYXR1cmUgamFyIGRvZXMgbm90IGNvbnRhaW4gYSBmZWF0dXJlLnhtbCBmaWxlOiAKAAECLgwCLwIwAQAYZ2V0RmVhdHVyZUZyb21GZWF0dXJlWE1MAQApKExqYXZhL2lvL0lucHV0U3RyZWFtOylMamF2YS9sYW5nL1N0cmluZzsKAjIBnAcCMwEALmphdmF4L3htbC9wYXJzZXJzL1BhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KAjUBnAcCNgEAGG9yZy94bWwvc2F4L1NBWEV4Y2VwdGlvbgEAMExqYXZheC94bWwvcGFyc2Vycy9QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwEAGkxvcmcveG1sL3NheC9TQVhFeGNlcHRpb247CAI6AQAaRmVhdHVyZS54bWwgbm90IGZvdW5kIGF0OiAKAAECPAwCLwCwAQALZmVhdHVyZUZpbGUKAAECPwwCQAJBAQAGZ2V0RE9NAQAmKExqYXZhL2lvL0ZpbGU7KUxvcmcvdzNjL2RvbS9Eb2N1bWVudDsKAAECQwwCRAJFAQATZ2V0RmVhdHVyZUlkRnJvbURPTQEAKihMb3JnL3czYy9kb20vRG9jdW1lbnQ7KUxqYXZhL2xhbmcvU3RyaW5nOwEACGRvY3VtZW50AQAWTG9yZy93M2MvZG9tL0RvY3VtZW50OwgCSQEAB2ZlYXR1cmULAksCTQcCTAEAFG9yZy93M2MvZG9tL0RvY3VtZW50DAJOAk8BABRnZXRFbGVtZW50c0J5VGFnTmFtZQEAKihMamF2YS9sYW5nL1N0cmluZzspTG9yZy93M2MvZG9tL05vZGVMaXN0OwsCUQJTBwJSAQAUb3JnL3czYy9kb20vTm9kZUxpc3QMAlQA3QEACWdldExlbmd0aAsCUQJWDAJXAlgBAARpdGVtAQAVKEkpTG9yZy93M2MvZG9tL05vZGU7BwJaAQATb3JnL3czYy9kb20vRWxlbWVudAsCWQJcDAJdAl4BAA1nZXRBdHRyaWJ1dGVzAQAcKClMb3JnL3czYy9kb20vTmFtZWROb2RlTWFwOwgBAAsCYQJjBwJiAQAYb3JnL3czYy9kb20vTmFtZWROb2RlTWFwDAJkAmUBAAxnZXROYW1lZEl0ZW0BACYoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvdzNjL2RvbS9Ob2RlOwsCZwJpBwJoAQAQb3JnL3czYy9kb20vTm9kZQwCagB4AQAMZ2V0Tm9kZVZhbHVlAQAPZmVhdHVyZUVsZW1lbnRzAQAWTG9yZy93M2MvZG9tL05vZGVMaXN0OwEADmZlYXR1cmVFbGVtZW50AQAVTG9yZy93M2MvZG9tL0VsZW1lbnQ7AQALZmVhdHVyZU5vZGUBABJMb3JnL3czYy9kb20vTm9kZTsBAA1hTmFtZWROb2RlTWFwAQAaTG9yZy93M2MvZG9tL05hbWVkTm9kZU1hcDsBAAtpZEF0dHJpYnV0ZQoAAQJ1DAJAAnYBAC0oTGphdmEvaW8vSW5wdXRTdHJlYW07KUxvcmcvdzNjL2RvbS9Eb2N1bWVudDsBAAZzdHJlYW0HAnkBABZqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyBwJ7AQASamF2YS9pby9GaWxlUmVhZGVyCgJ6ATUKAngCfgwAJgJ/AQATKExqYXZhL2lvL1JlYWRlcjspVgcCgQEAF29yZy94bWwvc2F4L0lucHV0U291cmNlCgKAAn4KAoQChgcChQEAKGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3RvcnkMAocCiAEAC25ld0luc3RhbmNlAQAsKClMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKAoQCigwCiwKMAQASbmV3RG9jdW1lbnRCdWlsZGVyAQAlKClMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyOwoCjgKQBwKPAQAhamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyDAKRApIBAAVwYXJzZQEAMShMb3JnL3htbC9zYXgvSW5wdXRTb3VyY2U7KUxvcmcvdzNjL2RvbS9Eb2N1bWVudDsKAjUATQoCeABvCgIyAE0IApcBAC5FcnJvcjogY291bGQgbm90IHBhcnNlIHhtbCBpbiBjbGFzc3BhdGggZmlsZTogAQAJYURvY3VtZW50AQAGcmVhZGVyAQAYTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQALaW5wdXRTb3VyY2UBABlMb3JnL3htbC9zYXgvSW5wdXRTb3VyY2U7AQAHZmFjdG9yeQEAKkxqYXZheC94bWwvcGFyc2Vycy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwEAB2J1aWxkZXIBACNMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyOwEAA21zZwoCgAKjDAAmAUYBABJnZXRPdXRwdXREaXJlY3RvcnkJAAECpgwAIwAGAQASc2V0T3V0cHV0RGlyZWN0b3J5CQABAqkMACQAJQgCqwEAD2xheW91dENoZWNrLnR4dAoAAQKtDAKkAHgKAGQBGAEADm91dHB1dEZpbGVuYW1lAQAKU291cmNlRmlsZQEAE1Rlc3RMYXlvdXRUZXN0LmphdmEAIQABAAMAAAAOABoABQAGAAEABwAAAAIACAAa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ciB0aGUgdGVybXMgb2YKICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgCiAqIGluIFdUUCBhbmQgaW1wcm92ZWQgdG8gdXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIAogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMuamFyczsKCmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwppbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CmltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CmltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwppbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CmltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKCi8qKgogKiBAc2luY2UgMy4zCiAqLwpwdWJsaWMgY2xhc3MgVGVzdExheW91dFRlc3QgewoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSkFSICAgICAgICA9ICIuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUEFDRUtEX0pBUiA9ICIucGFjay5neiI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1pJUCAgICAgICAgPSAiLnppcCI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQlVORExFX0lEICAgPSAiQnVuZGxlLVN5bWJvbGljTmFtZSI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgY29uZmlnRmlsZW5hbWUgICAgICAgPSAiY29uZmlnLnByb3BlcnRpZXMiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERlRfQklOX0pBUiAgICAgID0gImRlZmF1bHQuYmluYXJ5LmphciI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RGVF9TUkNfSkFSICAgICAgPSAiZGVmYXVsdC5zb3VyY2UuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREZUX0ZFQVRVUkUgICAgICA9ICJkZWZhdWx0LmZlYXR1cmUiOwogICAgcHJpdmF0ZSBQcm9wZXJ0aWVzICAgICAgICAgIGNvbmZpZzsKICAgIHByaXZhdGUgTGlzdCAgICAgICAgICAgICAgICBlcnJvcnMgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3QoKTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBkaXJlY3RvcnlUb0NoZWNrOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIHRlbXBXb3JraW5nRGlyOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKICAgIHByaXZhdGUgUmVwb3J0V3JpdGVyICAgICAgICByZXBvcnRXcml0ZXI7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewoKICAgICAgICBUZXN0TGF5b3V0VGVzdCB0ZXN0bGF5b3V0ID0gbmV3IFRlc3RMYXlvdXRUZXN0KCk7CiAgICAgICAgdGVzdGxheW91dC5zZXREaXJlY3RvcnlUb0NoZWNrKCJEOlxcdGVtcHRlc3QiKTsKICAgICAgICB0ZXN0bGF5b3V0LnNldFRlbXBXb3JraW5nRGlyKCJEOi90ZW1wIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGVzdGxheW91dC50ZXN0TGF5b3V0KCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICBlcnJvcnMuYWRkKG1lc3NhZ2UpOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RMYXlvdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiQ2hlY2sgZmlsZXMgYW5kIGxheW91dCBpbiBidW5kbGVzIGFuZCBmZWF0dXJlcy4iKTsKICAgICAgICAgICAgYm9vbGVhbiBmZWF0dXJlRmFpbHVyZXMgPSB0ZXN0RmVhdHVyZUxheW91dCgpOwogICAgICAgICAgICBib29sZWFuIGJ1bmRsZUZhaWx1cmVzID0gdGVzdEJ1bmRsZUxheW91dCgpOwogICAgICAgICAgICByZXN1bHQgPSBmZWF0dXJlRmFpbHVyZXMgfHwgYnVuZGxlRmFpbHVyZXM7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS5jbG9zZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0QnVuZGxlTGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwogICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuIik7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBidW5kbGVEaXJlY3RvcnkgPSBudWxsOwogICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9hZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShidW5kbGVEaXJlY3RvcnkpOwogICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGJ1bmRsZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRCdW5kbGVJZChjaGlsZCk7CiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoaWQuZW5kc1dpdGgoIi5zb3VyY2UiKSB8fCBpZC5lbmRzV2l0aCgiLmluZm9wb3AiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy51c2VyIikgfHwgaWQuZW5kc1dpdGgoIi5kb2MiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5pc3YiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5kZXYiKSB8fCBpZC5lbmRzV2l0aCgiLmRvYy5hcGkiKSB8fCBpZC5lbmRzV2l0aCgic3RhbmRhcmQuc2NoZW1hcyIpIHx8IGlkLmVuZHNXaXRoKCIuYnJhbmRpbmciKSkgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NCdW5kbGUoY2hpbGQsIGdldEV4cGVjdGVkKGlkLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0J1bmRsZShjaGlsZCwgZ2V0RXhwZWN0ZWQoaWQsIGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCk7CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiICAgQ2hlY2tpbmc6ICIgKyBidW5kbGVEaXJlY3RvcnkpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCByZXR1cm4gYSBzZXQgb2YgcmVndWxhciBleHByZXNzaW9ucwogICAgICogd2hpY2ggbWF0Y2ggdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGJ1bmRsZS4KICAgICAqLwogICAgcHJpdmF0ZSBTZXQgZ2V0RXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSkgewogICAgICAgIC8vIGlzIHRoZSBjb25maWcgY2FjaGVkPwogICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgewogICAgICAgICAgICBnZXRDb25maWcoKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoaWQpOwogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX1NSQ19KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGluZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShLRVlfREZUX0JJTl9KQVIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBzZXR0aW5ncyBmb3I6ICIgKyBpZCk7CiAgICAgICAgfQogICAgICAgIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwogICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIHsKICAgICAgICAgICAgcmVzdWx0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIFNldCBnZXRGZWF0dXJlRXhwZWN0ZWQoU3RyaW5nIGlkLCBib29sZWFuIHNvdXJjZSwgYm9vbGVhbiB6aXApIHsKICAgICAgICAvLyBpcyB0aGUgY29uZmlnIGNhY2hlZD8KICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKICAgICAgICAgICAgZ2V0Q29uZmlnKCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBsaW5lID0gY29uZmlnLmdldFByb3BlcnR5KGlkKTsKICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgIGxpbmUgPSBjb25maWcuZ2V0UHJvcGVydHkoS0VZX0RGVF9GRUFUVVJFKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHNldHRpbmdzIGZvcjogIiArIGlkKTsKICAgICAgICB9CiAgICAgICAgU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7CiAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewogICAgICAgICAgICByZXN1bHQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBnZXRDb25maWcoKSB7CiAgICAgICAgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJlYWQgdGhpcyBmaWxlLCBpdCdzIGJlZW4gc2V0IGJ5IGNhbGxlcgogICAgICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdGaWxlbmFtZSgpKTsKICAgICAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGVsc2UsIHVzZSB0aGUgZGVmYXVsdCB3ZSAic2hpcCIKICAgICAgICAgICAgICAgIGlucHV0ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0Q29uZmlnRmlsZW5hbWUoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubG9hZChpbnB1dCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogUHJvY2VzcyB0aGUgYnVuZGxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggdGhlIGdpdmVuIHNldCBvZgogICAgICogZXhwZWN0ZWQgcmVzdWx0cy4KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCdW5kbGUoRmlsZSBmaWxlLCBTZXQgZXhwZWN0ZWQpIHsKICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBleHBlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZXhwZWN0ZWQuc2l6ZSgpXSk7CiAgICAgICAgICAgIHByb2Nlc3NEaXIoIiIsIGZpbGUsIGFycmF5KTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgYXJyYXlbaV0gKyAiIGluIGRpcjogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcm9jZXNzQXJjaGl2ZShmaWxlLCAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShGaWxlIGZpbGUsIFNldCBleHBlY3RlZCkgewogICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1tleHBlY3RlZC5zaXplKCldKTsKICAgICAgICAgICAgcHJvY2Vzc0RpcigiIiwgZmlsZSwgYXJyYXkpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGFkZEVycm9yKCJNaXNzaW5nICIgKyBhcnJheVtpXSArICIgaW4gZGlyOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByb2Nlc3NBcmNoaXZlKGZpbGUsIChTdHJpbmdbXSkgZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nW2V4cGVjdGVkLnNpemUoKV0pKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBidW5kbGUgaXMgYW4gYXJjaGl2ZS4gTWFrZSBzdXJlIGl0IGhhcyB0aGUgcmlnaHQgY29udGVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXJjaGl2ZShGaWxlIGZpbGUsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgWmlwRmlsZSB6aXAgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHppcCA9IG5ldyBaaXBGaWxlKGZpbGUsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gemlwLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGV4cGVjdGVkW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLm1hdGNoZXMocGF0dGVybikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcigiTWlzc2luZyAiICsgZXhwZWN0ZWRbaV0gKyAiIGluIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB6aXAuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBUaGUgYnVuZGxlIGlzIGluIGEgZGlyZWN0b3J5LgogICAgICovCiAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcihTdHJpbmcgcm9vdCwgRmlsZSBkaXIsIFN0cmluZ1tdIGV4cGVjdGVkKSB7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZGlyLmxpc3RGaWxlcygpOwogICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByb290Lmxlbmd0aCgpID09IDAgPyBjaGlsZC5nZXROYW1lKCkgOiByb290ICsgJy8nICsgY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICBpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgcHJvY2Vzc0RpcihuYW1lLCBjaGlsZCwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBleHBlY3RlZFtpXTsKICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubWF0Y2hlcyhwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21NYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0JVTkRMRV9JRCk7CiAgICAgICAgICAgIGlmICgoaWQgPT0gbnVsbCkgfHwgKGlkLmxlbmd0aCgpID09IDApKSB7CiAgICAgICAgICAgICAgICBhZGRFcnJvcigiQnVuZGxlU3ltYm9saWNOYW1lIGhlYWRlciBub3Qgc2V0IGluIG1hbmlmZXN0IGZvciBidW5kbGU6ICIgKyBwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2FuIGJlIGZvbGxvd2VkIGJ5IGF0dHJpYnV0ZXMgc3VjaCBhcwogICAgICAgICAgICAgICAgLy8gJ3NpbmdsZXRvbicKICAgICAgICAgICAgICAgIGludCBwb3MgPSBpZC5pbmRleE9mKCc7Jyk7CiAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDAsIHBvcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkZW50aWZpZXIgZm9yIHRoZSBidW5kbGUgY29udGFpbmVkIGluIHRoZSBnaXZlbgogICAgICogYXJjaGl2ZS9kaXJlY3RvcnkuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkKEZpbGUgZmlsZSkgewogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbURpcihmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fWklQKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbVpJUChmaWxlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgewogICAgICAgICAgICBpZCA9IGdldEJ1bmRsZUlkRnJvbUpBUihmaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZUlkRnJvbVpJUChGaWxlIGZpbGUpIHsKICAgICAgICBaaXBGaWxlIHppcCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7CiAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHppcC5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CiAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5tYXRjaGVzKCJeLiovIiArIEphckZpbGUuTUFOSUZFU1RfTkFNRSkpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ1bmRsZUlkRnJvbU1hbmlmZXN0KGlucHV0LCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgIC8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihleC5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICh6aXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHppcC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBtYW5pZmVzdCAoTUFOSUZFU1QuTUYpIG5vdCBmb3VuZCBpbiBidW5kbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGFuIGV4cGFuZGVkIGJ1bmRsZSBvbiBkaXNjLiBMb29rIGludG8gdGhlCiAgICAgKiBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlSWRGcm9tRGlyKEZpbGUgZGlyKSB7CiAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGRpciwgSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSB8fCAhbWFuaWZlc3RGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgIGFkZEVycm9yKCJCdW5kbGUgbWFuaWZlc3QgKE1BTklGRVNULk1GKSBub3QgZm91bmQgYXQ6ICIgKyBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlkID0gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QobmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpLCBtYW5pZmVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoKICAgICAqIFRoZSBnaXZlbiBmaWxlIHBvaW50cyB0byBhIGJ1bmRsZSBjb250YWluZWQgaW4gYW4gYXJjaGl2ZS4gTG9vayBpbnRvCiAgICAgKiB0aGUgYnVuZGxlIG1hbmlmZXN0IGZpbGUgdG8gZmluZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVBBQ0tFREpBUihGaWxlIGZpbGUpIHsKCiAgICAgICAgRmlsZSB0bXBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphclByb2Nlc3NvciBqYXJwcm9jZXNzb3IgPSBKYXJQcm9jZXNzb3IuZ2V0VW5wYWNrUHJvY2Vzc29yKG51bGwpOwogICAgICAgICAgICBqYXJwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShnZXRUZW1wV29ya2luZ0RpcigpKTsKICAgICAgICAgICAgdG1wamFyID0gamFycHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRtcGphcjsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlbmFtZSgpIHsKICAgICAgICByZXR1cm4gY29uZmlnRmlsZW5hbWU7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZW5hbWUoU3RyaW5nIGNvbmZpZ0ZpbGVuYW1lKSB7CiAgICAgICAgdGhpcy5jb25maWdGaWxlbmFtZSA9IGNvbmZpZ0ZpbGVuYW1lOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGUgZ2l2ZW4gZmlsZSBwb2ludHMgdG8gYSBidW5kbGUgY29udGFpbmVkIGluIGFuIGFyY2hpdmUuIExvb2sgaW50bwogICAgICogdGhlIGJ1bmRsZSBtYW5pZmVzdCBmaWxlIHRvIGZpbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVJZEZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5wdXQgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogICAgICAgICAgICByZXR1cm4gZ2V0QnVuZGxlSWRGcm9tTWFuaWZlc3QoaW5wdXQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBXb3JraW5nRGlyKCkgewogICAgICAgIHJldHVybiB0ZW1wV29ya2luZ0RpcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRUZW1wV29ya2luZ0RpcihTdHJpbmcgdGVtcFdvcmtpbmdEaXIpIHsKICAgICAgICB0aGlzLnRlbXBXb3JraW5nRGlyID0gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHRlc3RGZWF0dXJlTGF5b3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cnJlZCA9IGZhbHNlOwogICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgZmVhdHVyZURpcmVjdG9yeSA9IG51bGw7CiAgICAgICAgaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICAgZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmZWF0dXJlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL2FnZ3JlZ2F0ZS9mZWF0dXJlcyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyZWN0b3J5KTsKICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZlYXR1cmUgZGlyZWNvdHJ5ICgiICsgZmVhdHVyZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX1BBQ0VLRF9KQVIpKSB7CiAgICAgICAgICAgICAgICBjaGlsZCA9IGdldEZpbGVGcm9tUEFDS0VESkFSKGNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0RmVhdHVyZUlkKGNoaWxkKTsKICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZlYXR1cmUoY2hpbGQsIGdldEZlYXR1cmVFeHBlY3RlZChpZCwgdHJ1ZSwgY2hpbGQuZ2V0TmFtZSgpLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oKTsKICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgICBDaGVja2luZzogIiArIGZlYXR1cmVEaXJlY3RvcnkpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwogICAgICAgIGlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7CiAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGVycm9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKICAgICAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oaXRlci5uZXh0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZhaWx1cmVzT2NjdXJyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cnJlZDsKCiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkKEZpbGUgZmlsZSkgewogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICBpZCA9IGdldEZlYXR1cmVJZEZyb21EaXIoZmlsZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoRVhURU5TSU9OX0pBUikpIHsKICAgICAgICAgICAgaWQgPSBnZXRGZWF0dXJlSWRGcm9tSkFSKGZpbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUlkRnJvbUpBUihGaWxlIGZpbGUpIHsKICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIFN0cmluZyBpZCA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImZlYXR1cmUueG1sIik7CiAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhZGRFcnJvcigiRmVhdHVyZSBqYXIgZG9lcyBub3QgY29udGFpbiBhIGZlYXR1cmUueG1sIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgIGlkID0gZ2V0RmVhdHVyZUZyb21GZWF0dXJlWE1MKGlucHV0KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgYWRkRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChqYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21EaXIoRmlsZSBkaXIpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIEZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShkaXIsICJmZWF0dXJlLnhtbCIpOwogICAgICAgIGlmICghZmVhdHVyZUZpbGUuZXhpc3RzKCkgfHwgIWZlYXR1cmVGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgIGFkZEVycm9yKCJGZWF0dXJlLnhtbCBub3QgZm91bmQgYXQ6ICIgKyBmZWF0dXJlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZCA9IGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChmZWF0dXJlRmlsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZDsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRnJvbUZlYXR1cmVYTUwoRmlsZSBmaWxlKSB7CiAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRET00oZmlsZSk7CiAgICAgICAgcmV0dXJuIGdldEZlYXR1cmVJZEZyb21ET00oZG9jdW1lbnQpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVJZEZyb21ET00oRG9jdW1lbnQgZG9jdW1lbnQpIHsKICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwogICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIE5vZGVMaXN0IGZlYXR1cmVFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmZWF0dXJlIik7CiAgICAgICAgICAgIEVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICBpZiAoZmVhdHVyZUVsZW1lbnRzLmdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgTm9kZSBmZWF0dXJlTm9kZSA9IGZlYXR1cmVFbGVtZW50cy5pdGVtKDApOwogICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVFbGVtZW50ID0gKEVsZW1lbnQpIGZlYXR1cmVOb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmZWF0dXJlRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgYU5hbWVkTm9kZU1hcCA9IGZlYXR1cmVFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgICAgIE5vZGUgaWRBdHRyaWJ1dGUgPSBhTmFtZWROb2RlTWFwLmdldE5hbWVkSXRlbSgiaWQiKTsKICAgICAgICAgICAgICAgIGlkID0gaWRBdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVGcm9tRmVhdHVyZVhNTChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldERPTShzdHJlYW0pOwogICAgICAgIHJldHVybiBnZXRGZWF0dXJlSWRGcm9tRE9NKGRvY3VtZW50KTsKICAgIH0KCiAgICBwcml2YXRlIERvY3VtZW50IGdldERPTShGaWxlIGZpbGUpIHsKCiAgICAgICAgRG9jdW1lbnQgYURvY3VtZW50ID0gbnVsbDsKICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CiAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7CiAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwogICAgICAgICAgICBhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgb25lCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChhRG9jdW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yOiBjb3VsZCBub3QgcGFyc2UgeG1sIGluIGNsYXNzcGF0aCBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhRG9jdW1lbnQ7CgogICAgfQoKICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RE9NKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewoKICAgICAgICBEb2N1bWVudCBhRG9jdW1lbnQgPSBudWxsOwogICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7CiAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKICAgICAgICBhRG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKCiAgICAgICAgcmV0dXJuIGFEb2N1bWVudDsKCiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyBSZXBvcnRXcml0ZXIgZ2V0UmVwb3J0V3JpdGVyKCkgewogICAgICAgIGlmIChyZXBvcnRXcml0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZW5hbWUgPSAibGF5b3V0Q2hlY2sudHh0IjsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0V3JpdGVyOwogICAgfQp9ClBLAwQKAAAAAAA7AtI+GDa7S5geAACYHgAALwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0LmNsYXNzyv66vgAAADEBWwcAAgEAKW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0BwAEAQAQamF2YS9sYW5nL09iamVjdAEADUVYVEVOU0lPTl9KQVIBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQAELmphcgEAFEVYVEVOU0lPTl9QQUNFS0RfSkFSCAAMAQAMLmphci5wYWNrLmd6AQAKbmFtZVBhcnNlcgEAMkxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAOb3V0cHV0RmlsZW5hbWUBAA9vdXRwdXREaXJlY3RvcnkBABBkaXJlY3RvcnlUb0NoZWNrAQAPYnVuZGxlRGlyZWN0b3J5AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlBwAXAQAwb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyCgAWABkMABoAFAEABjxpbml0PgkAAQAcDAANAA4IAB4BAA9wYWNrMjAwZGF0YS50eHQJAAEAIAwADwAGAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlCgADABkBAAR0aGlzAQArTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1BhY2syMDBUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABABkIACoBABlEOlx0ZW1wXHN0YWdpbmdcYWdncmVnYXRlCgABACwMAC0ALgEAE3NldERpcmVjdG9yeVRvQ2hlY2sBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAMAwAMQAyAQAOdGVzdEJ1bmRsZVBhY2sBAAMoKVoKADQANgcANQEAE2phdmEvaW8vSU9FeGNlcHRpb24MADcAFAEAD3ByaW50U3RhY2tUcmFjZQEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsJAAEAQAwAEQAGAQAQYnVuZGxlRGlyVG9DaGVjawEACkV4Y2VwdGlvbnMKAAEARAwAPQA+BwBGAQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24IAEgBAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAEUASgwAGgAuBwBMAQAMamF2YS9pby9GaWxlCgABAE4MAE8APgEAEmdldEJ1bmRsZURpcmVjdG9yeQoASwBKCgBLAFIMAFMAMgEABmV4aXN0cwoASwBVDABWADIBAAtpc0RpcmVjdG9yeQcAWAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCABaAQASYnVuZGxlIGRpcmVjb3RyeSAoCgBXAEoKAFcAXQwAXgBfAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CABhAQAgKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4KAFcAYwwAZAA+AQAIdG9TdHJpbmcKAAEAZgwAZwBoAQAQY2hlY2tGaWxlc1BhY2tlZAEAEShMamF2YS9pby9GaWxlOylaAQAIcHJvcGVydHkBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgcAbwEAE2phdmEvdXRpbC9BcnJheUxpc3QKAG4AGQcAcgEAMG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgoAcQAZCgBLAHUMAHYAdwEACWxpc3RGaWxlcwEAKShMamF2YS9pby9GaWxlbmFtZUZpbHRlcjspW0xqYXZhL2lvL0ZpbGU7BwB5AQAzb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyCgB4ABkKAAEAfAwAfQB+AQAMbm9wYWNrZWRGaWxlAQAvKFtMamF2YS9pby9GaWxlO1tMamF2YS9pby9GaWxlOylbTGphdmEvaW8vRmlsZTsKAEsAgAwAgQA+AQAHZ2V0TmFtZQoASwCDDACEADIBAAZpc0ZpbGUKAAEAhgwAhwCIAQAMZ2V0QmFzaWNOYW1lAQA4KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKABYAigwAiwCMAQAFcGFyc2UBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoKAI4AkAcAjwEAEGphdmEvbGFuZy9TdHJpbmcMAJEAkgEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwgAlAEAMSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkLAJYAmAcAlwEADmphdmEvdXRpbC9MaXN0DACZAJoBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAAEAnAwAnQBoAQAMY29udGFpbnNKYXZhCACfAQAgIGNvbnRhaW5zIGphdmEgYnV0IGlzIG5vdCBwYWNrZWQKAAEAoQwAogCjAQAMcHJpbnRTdW1tYXJ5AQAzKExqYXZhL3V0aWwvTGlzdDtbTGphdmEvaW8vRmlsZTtbTGphdmEvaW8vRmlsZTtJSSlWCwCWAKUMAKYApwEABHNpemUBAAMoKUkBAAZlcnJvcnMBABBMamF2YS91dGlsL0xpc3Q7AQALamFyY2hpbGRyZW4BAA9bTGphdmEvaW8vRmlsZTsBAA5wYWNrZWRjaGlsZHJlbgEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEACWJhc2ljTmFtZQEABXZhbGlkBwC2AQArb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgoAAQC4DAC5AD4BABJnZXRPdXRwdXREaXJlY3RvcnkKALUAuwwAGgC8AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWCgC1AL4MAL8AFAEAB3dyaXRlbG4IAMEBABYgICBEaXJlY3RvcnkgY2hlY2tlZDogCgC1AMMMAL8ALggAxQEAKCBDaGVjayBvZiBwYWNrZWQgYW5kIG5vdCBwYWNrZWQgYnVuZGxlcy4IAMcBABcgICBOdW1iZXIgb2YgamFyIGZpbGVzIAoAVwDJDABeAMoBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADMAQAbICAgTnVtYmVyIG9mIHBhY2suZ3ogZmlsZXMgCADOAQAtICAgRGlmZmVyZW5jZSwgbnVtYmVyIG9mIGphciBmaWxlcyB0byBjaGVjazogCADQAQALICAgQ2hlY2tlZCAIANIBAAQgb2YgCADUAQABLggA1gEAESAgIEVycm9ycyBmb3VuZDogCgDYANoHANkBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMANsA3AEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWCwCWAN4MAN8A4AEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsA4gDkBwDjAQASamF2YS91dGlsL0l0ZXJhdG9yDADlAOYBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsKALUA6AwAvwDpAQAVKExqYXZhL2xhbmcvT2JqZWN0OylWCwDiAOsMAOwAMgEAB2hhc05leHQKALUA7gwA7wAUAQAFY2xvc2UBAAxyZXBvcnRXcml0ZXIBAC1Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsKAAEA9QwA9gD3AQAIY29udGFpbnMBACAoW0xqYXZhL2lvL0ZpbGU7TGphdmEvaW8vRmlsZTspWgoAbgCYCgBuAKUKAG4A3gEAB3Jlc3VsdHMBABVMamF2YS91dGlsL0FycmF5TGlzdDsBAARmaWxlAQAJZmlsZUFycmF5CgCOAQAMAQEAmgEABmVxdWFscwEABnJlc3VsdAcBBAEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoBAwEGDAAaAQcBABMoTGphdmEvaW8vRmlsZTtaSSlWCgEDAQkMAQoBCwEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwENAQ8HAQ4BABVqYXZhL3V0aWwvRW51bWVyYXRpb24MARAA5gEAC25leHRFbGVtZW50BwESAQAWamF2YS91dGlsL2phci9KYXJFbnRyeQoBEQCACAEVAQAGLmNsYXNzCgCOARcMARgAjAEACGVuZHNXaXRoCgEDARoMARsBHAEADmdldElucHV0U3RyZWFtAQAvKExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OylMamF2YS9pby9JbnB1dFN0cmVhbTsKAAEBHgwAnQEfAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylaCwENASEMASIAMgEAD2hhc01vcmVFbGVtZW50cwoBAwDuAQAHamFyZmlsZQEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVlbnRyeQEAGExqYXZhL3V0aWwvamFyL0phckVudHJ5OwEABWlucHV0AQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAMUxqYXZhL3V0aWwvRW51bWVyYXRpb248TGphdmEvdXRpbC9qYXIvSmFyRW50cnk7PjsHAS8BABxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtCgEuATEMABoBMgEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgoBLgE0DAE1ATYBAAxnZXROZXh0RW50cnkBABooKUxqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoBOACABwE5AQAWamF2YS91dGlsL3ppcC9aaXBFbnRyeQoBLgE7DAE8AKcBAAlhdmFpbGFibGUKAT4A7gcBPwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BAA5qYXJJbnB1dFN0cmVhbQEAHkxqYXZhL3V0aWwvamFyL0phcklucHV0U3RyZWFtOwEAGExqYXZhL3V0aWwvemlwL1ppcEVudHJ5OwoAjgFEDAFFAUYBAAtsYXN0SW5kZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQoAjgFIDAFJAUoBAAlzdWJzdHJpbmcBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7AQAIZnVsbG5hbWUBAAlleHRlbnNpb24BAANwb3MJAAEBTwwAEAAGAQASc2V0T3V0cHV0RGlyZWN0b3J5CQABAVIMABIABggBVAEAAS8IAVYBABFhZ2dyZWdhdGUvcGx1Z2lucwgBWAEAEy9hZ2dyZWdhdGUvL3BsdWdpbnMBAApTb3VyY2VGaWxlAQAQUGFjazIwMFRlc3QuamF2YQAhAAEAAwAAAAcA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mwAeAJwAJQCZAC8AnwA4AKAAOwChAEQAogBWAKEAYACkACIAAABcAAkAAABjACQAJQAAAAAAYwCqAKsAAQAAAGMArACrAAIACABbAPsA/AADAAsAJACwAK4ABAAUABEA/QBrAAUAOAArAP4AqwAEADsAKACwAK4ABQBBAB8A3wDzAAYAAgD2APcAAQAVAAAAoAAEAAUAAAA2Az4DNgSnACgqKxUEMrYAfxILtwCFKiy2AH8SCLcAhbYA/5kACAQ+pwANhAQBFQQrvqH/1x2sAAAAAgAhAAAAHgAHAAAAqAACAKkACACqACUAqwAnAKwAKgCpADQArwAiAAAANAAFAAAANgAkACUAAAAAADYArACrAAEAAAA2AP0AawACAAIANAECAG0AAwAFAC8AsACuAAQAAgCdAGgAAQAVAAABuQAFAAkAAACfAz0BTrsBA1krAwS3AQVOLbYBCDoEpwBFGQS5AQwBAMABEToFGQW2ARMTARS2ARaZAAgEPacAXBkFtgETEgi2ARaZABktGQW2ARk6BioZBrcBHZkACAQ9pwA5GQS5ASABAJr/t6cALDoEGQS2ADMtxgAuLbYBI6cAJzoIpwAiOgctxgAMLbYBI6cABToIGQe/LcYADC22ASOnAAU6CBysAAUABABkAGcANAByAHYAeQA0AAQAbgB+AAAAhACIAIsANACUAJgAmwA0AAMAIQAAAHYAHQAAALQAAgC1AAQAtwAPALgAFQC5ABgAugAkALsAMgC8ADQAvQA3AL8ARADAAEwAwQBVAMIAVwDDAFoAuQBnAMkAaQDKAG4AzQByAM8AeQDRAH4AzACAAM0AhADPAIsA0QCNANUAkADNAJQAzwCbANEAnQDWACIAAABSAAgAAACfACQAJQAAAAAAnwEkAGsAAQACAJ0AnQBtAAIABACbASUBJgADABUAUgEKAScABAAkADYBKAEpAAUATAAOASoBKwAGAGkABQA7ADwABAEsAAAADAABABUAUgEKAS0ABAACAJ0BHwABABUAAAFIAAMABwAAAGwDPbsBLlkrtwEwTqcAIS22ATM6BBkExgAWGQS2ATcTARS2ARaZAAgEPacANC22ATqd/96nACpOLbYAMyvGAC4rtgE9pwAnOganACI6BSvGAAwrtgE9pwAFOgYZBb8rxgAMK7YBPacABToGHKwABQACADMANgA0AD8AQwBGADQAAgA7AEsAAABRAFUAWAA0AGEAZQBoADQAAgAhAAAAXgAXAAAA2wACAN4ACwDfAA4A4AAUAOEAGQDiACcA4wApAOQALADfADYA6gA3AOsAOwDuAD8A8ABGAPIASwDtAE0A7gBRAPAAWADyAFoA9gBdAO4AYQDwAGgA8gBqAPcAIgAAAD4ABgAAAGwAJAAlAAAAAABsASoBKwABAAIAagCdAG0AAgALACsBQAFBAAMAFAAYASgBQgAEADcABAA7ADwAAwACAIcAiAABABUAAAB6AAMABQAAABgrTisstgFDNgQVBJsACysDFQS2AUdOLbAAAAACACEAAAAWAAUAAAD7AAIA/AAJAP0ADgD+ABYBAAAiAAAANAAFAAAAGAAkACUAAAAAABgBSwAGAAEAAAAYAUwABgACAAIAFgECAAYAAwAJAA8BTQCuAAQAAQC5AD4AAQAVAAAALwABAAEAAAAFKrQBTrAAAAACACEAAAAGAAEAAAEEACIAAAAMAAEAAAAFACQAJQAAAAEBUAAuAAEAFQAAAD4AAgACAAAABiortQFOsQAAAAIAIQAAAAoAAgAAAQgABQEJACIAAAAWAAIAAAAGACQAJQAAAAAABgAQAAYAAQACAE8APgABABUAAACsAAQAAgAAAFwqtAFRxwBTKrYAQ0wrxwANuwBFWRJHtwBJvysTAVO2ARaZAB4quwBXWSu4AI23AFsTAVW2AFy2AGK1AVGnABsquwBXWSu4AI23AFsTAVe2AFy2AGK1AVEqtAFRsAAAAAIAIQAAACIACAAAAQwABwENAAwBDgAQAQ8AGgERACQBEgA/ARUAVwEYACIAAAAWAAIAAABcACQAJQAAAAwASwBpAAYAAQABAVkAAAACAVpQSwMECgAAAAAAvAHEPofvs6GqJgAAqiYAAC4AAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9QYWNrMjAwVGVzdC5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCiAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCiAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgY2FtZSBmcm9tICdFY2xpcHNlIE9yYml0JyBwcm9qZWN0IHRoZW4gYWRhcHRlZCB0byB1c2UgCiAqIGluIFdUUCBhbmQgaW1wcm92ZWQgdG8gdXNlICdNYW5pZmVzdCcgdG8gcmVhZCBtYW5pZmVzdC5tZiwgaW5zdGVhZCBvZiByZWFkaW5nIAogKiBpdCBhcyBhIHByb3BlcnRpZXMgZmlsZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMuamFyczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKCmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5GdWxsSmFyTmFtZVBhcnNlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5KQVJGaWxlTmFtZUZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5QYWNrR3pGaWxlTmFtZUZpbHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5SZXBvcnRXcml0ZXI7CgovKioKICogQHNpbmNlIDMuMwogKi8KcHVibGljIGNsYXNzIFBhY2syMDBUZXN0IHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgICAgICBFWFRFTlNJT05fSkFSICAgICAgICA9ICIuamFyIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgIEVYVEVOU0lPTl9QQUNFS0RfSkFSID0gIi5qYXIucGFjay5neiI7CiAgICBwcml2YXRlIHN0YXRpYyBGdWxsSmFyTmFtZVBhcnNlciBuYW1lUGFyc2VyICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgICAgICAgPSAicGFjazIwMGRhdGEudHh0IjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3Rvcnk7CgoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgUGFjazIwMFRlc3QgdGVzdGxheW91dCA9IG5ldyBQYWNrMjAwVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiRDpcXHRlbXBcXHN0YWdpbmdcXGFnZ3JlZ2F0ZSIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEJ1bmRsZVBhY2soKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKCiAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVRvQ2hlY2soKSB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5VG9DaGVjayhTdHJpbmcgYnVuZGxlRGlyVG9DaGVjaykgewogICAgICAgIHRoaXMuZGlyZWN0b3J5VG9DaGVjayA9IGJ1bmRsZURpclRvQ2hlY2s7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJ1bmRsZVBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICB9CgogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShnZXRCdW5kbGVEaXJlY3RvcnkoKSk7CiAgICAgICAgaWYgKCEoaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJidW5kbGUgZGlyZWNvdHJ5ICgiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iKTsKICAgICAgICB9CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0ZpbGVzUGFja2VkKGlucHV0ZGlyKTsKICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZpbGVzUGFja2VkKEZpbGUgaW5wdXRkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gcmVzZXQvaW5pdGlhbGl6ZSBlcnJvcnMKICAgICAgICBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwogICAgICAgIEZpbGVbXSBqYXJjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgRmlsZVtdIHBhY2tlZGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBQYWNrR3pGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBGaWxlW10gbm9wYWNrZWRGaWxlID0gbm9wYWNrZWRGaWxlKGphcmNoaWxkcmVuLCBwYWNrZWRjaGlsZHJlbik7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IG5vcGFja2VkRmlsZS5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxzaXplOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IG5vcGFja2VkRmlsZVtpXTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CiAgICAgICAgICAgIC8vIGFzc3VtZSBkaXJlY3RvcnkgaWYgbm90IGZpbGUKICAgICAgICAgICAgaWYgKGNoaWxkLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICBjaGVja2VkKys7CgogICAgICAgICAgICAgICAgU3RyaW5nIGJhc2ljTmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fSkFSKTsKICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBuYW1lUGFyc2VyLnBhcnNlKGJhc2ljTmFtZSk7Ci8vIFN0cmluZyBidW5kbGVuYW1lID0gYmFzaWNOYW1lOwogICAgICAgICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb24gKGl0IGlzIHVucGFyc2FibGUpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNKYXZhKGNoaWxkKSkgewovLyBidW5kbGVuYW1lID0gbmFtZVBhcnNlci5nZXRQcm9qZWN0U3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmFtZSArICIgY29udGFpbnMgamF2YSBidXQgaXMgbm90IHBhY2tlZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHByaW50U3VtbWFyeShlcnJvcnMsIGphcmNoaWxkcmVuLCBwYWNrZWRjaGlsZHJlbiwgdG90YWxzaXplLCBjaGVja2VkKTsKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRTdW1tYXJ5KExpc3QgZXJyb3JzLCBGaWxlW10gamFyY2hpbGRyZW4sIEZpbGVbXSBwYWNrZWRjaGlsZHJlbiwgaW50IHRvdGFsc2l6ZSwgaW50IGNoZWNrZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoKICAgICAgICBSZXBvcnRXcml0ZXIgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXJlY3RvcnkgY2hlY2tlZDogIiArIGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiBDaGVjayBvZiBwYWNrZWQgYW5kIG5vdCBwYWNrZWQgYnVuZGxlcy4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE51bWJlciBvZiBqYXIgZmlsZXMgIiArIGphcmNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBOdW1iZXIgb2YgcGFjay5neiBmaWxlcyAiICsgcGFja2VkY2hpbGRyZW4ubGVuZ3RoKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIERpZmZlcmVuY2UsIG51bWJlciBvZiBqYXIgZmlsZXMgdG8gY2hlY2s6ICIgKyAoamFyY2hpbGRyZW4ubGVuZ3RoIC0gcGFja2VkY2hpbGRyZW4ubGVuZ3RoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIi4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICAgICAgaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVycm9ycyk7CiAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oaXRlci5uZXh0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICByZXBvcnRXcml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBGaWxlW10gbm9wYWNrZWRGaWxlKEZpbGVbXSBqYXJjaGlsZHJlbiwgRmlsZVtdIHBhY2tlZGNoaWxkcmVuKSB7CiAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBGaWxlIGZpbGUgPSBqYXJjaGlsZHJlbltpXTsKICAgICAgICAgICAgaWYgKCFjb250YWlucyhwYWNrZWRjaGlsZHJlbiwgZmlsZSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGVbXSBmaWxlQXJyYXkgPSBuZXcgRmlsZVtyZXN1bHRzLnNpemUoKV07CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgZmlsZUFycmF5W2krK10gPSAoRmlsZSkgaXRlcmF0b3IubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmlsZUFycmF5OwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyhGaWxlW10gcGFja2VkY2hpbGRyZW4sIEZpbGUgZmlsZSkgewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrZWRjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZ2V0QmFzaWNOYW1lKHBhY2tlZGNoaWxkcmVuW2ldLmdldE5hbWUoKSwgRVhURU5TSU9OX1BBQ0VLRF9KQVIpLmVxdWFscyhnZXRCYXNpY05hbWUoZmlsZS5nZXROYW1lKCksIEVYVEVOU0lPTl9KQVIpKSkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShGaWxlIGphcmZpbGUpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7CiAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zSmF2YShpbnB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbnNKYXZhOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGphcklucHV0U3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGlucHV0KTsKICAgICAgICAgICAgd2hpbGUgKGphcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewogICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zSmF2YTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY05hbWUoU3RyaW5nIGZ1bGxuYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7CiAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZ1bGxuYW1lOwogICAgICAgIGludCBwb3MgPSBmdWxsbmFtZS5sYXN0SW5kZXhPZihleHRlbnNpb24pOwogICAgICAgIGlmIChwb3MgPj0gMCkgewogICAgICAgICAgICByZXN1bHQgPSBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlRGlyZWN0b3J5KCkgewogICAgICAgIGlmIChidW5kbGVEaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJhZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBidW5kbGVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICIvYWdncmVnYXRlLy9wbHVnaW5zIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVuZGxlRGlyZWN0b3J5OwogICAgfQp9ClBLAwQKAAAAAAA7AtI+KG5niWYYAABmGAAALwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1ZlcnNpb25UZXN0LmNsYXNzyv66vgAAADEBLQcAAgEAKW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1ZlcnNpb25UZXN0BwAEAQAQamF2YS9sYW5nL09iamVjdAEADUVYVEVOU0lPTl9KQVIBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQAELmphcgEAFEVYVEVOU0lPTl9QQUNFS0RfSkFSCAAMAQAMLmphci5wYWNrLmd6AQANRVhURU5TSU9OX1pJUAgADwEABC56aXABAApuYW1lUGFyc2VyAQAyTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlcjsBAAlCQUNLU0xBU0gBAA5MSVRFUkFMX1BFUklPRAEAA0FOWQEACXRocmVlZG90cwEAGUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVybjsBAA9vdXRwdXREaXJlY3RvcnkBAAxyZXBvcnRXcml0ZXIBAC1Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBABBkaXJlY3RvcnlUb0NoZWNrAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAfDAAbABwHACEBADBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIKACAAHwkAAQAkDAAQABEIACYBAAFcCQABACgMABIABgcAKgEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCgAsAC4HAC0BABBqYXZhL2xhbmcvU3RyaW5nDAAvADABAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKACkAMgwAGwAzAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCAA1AQABLgoAKQA3DAA4ADkBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKACkAOwwAPAA9AQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQA/DAATAAYIAEEBAAIuKgkAAQBDDAAUAAYKAEUARwcARgEAF2phdmEvdXRpbC9yZWdleC9QYXR0ZXJuDABIAEkBAAdjb21waWxlAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL3JlZ2V4L1BhdHRlcm47CQABAEsMABUAFgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACtMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVmVyc2lvblRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAHwgAVAEAGUQ6XHRlbXBcc3RhZ2luZ1xhZ2dyZWdhdGUKAAEAVgwAVwAzAQATc2V0RGlyZWN0b3J5VG9DaGVjawoAAQBZDABaAFsBABN0ZXN0RmVhdHVyZVZlcnNpb25zAQADKClaCgABAF0MAF4AWwEAEnRlc3RCdW5kbGVWZXJzaW9ucwoAYABiBwBhAQATamF2YS9pby9JT0V4Y2VwdGlvbgwAYwAcAQAPcHJpbnRTdGFja1RyYWNlAQAEYXJncwEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAp0ZXN0bGF5b3V0AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAE2dldERpcmVjdG9yeVRvQ2hlY2sJAAEAawwAGgAGAQAQYnVuZGxlRGlyVG9DaGVjawEACkV4Y2VwdGlvbnMKAAEAbwwAaQA9BwBxAQAjb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24IAHMBAC1OZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4KAHAAMggAdgEAAS8KACwAeAwAeQB6AQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoIAHwBABFhZ2dyZWdhdGUvcGx1Z2lucwgAfgEAEi9hZ2dyZWdhdGUvcGx1Z2lucwcAgAEADGphdmEvaW8vRmlsZQoAfwAyCgB/AIMMAIQAWwEABmV4aXN0cwoAfwCGDACHAFsBAAtpc0RpcmVjdG9yeQgAiQEAEmJ1bmRsZSBkaXJlY290cnkgKAgAiwEAICkgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuCgABAI0MAI4AjwEAD2dldFJlcG9ydFdyaXRlcgEALygpTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7CACRAQAlIENoZWNrIGZvciA0LXBhcnQgdmVyc2lvbnMgaW4gQnVuZGxlcwoAkwCVBwCUAQArb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcgwAlgAzAQAHd3JpdGVsbgoAAQCYDACZAJoBABJjaGVja0ZpbGVzVmVyc2lvbnMBABEoTGphdmEvaW8vRmlsZTspWgEACHByb3BlcnR5AQAPYnVuZGxlRGlyZWN0b3J5AQAIaW5wdXRkaXIBAA5MamF2YS9pby9GaWxlOwEAD2ZhaWx1cmVzT2NjdXJlZAEAAVoHAKIBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgChAB8HAKUBADBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAKQAHwoAfwCoDACpAKoBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAfwCsDACtAD0BAAdnZXROYW1lCgB/AK8MALAAWwEABmlzRmlsZQoAAQCyDACzALQBAAxnZXRCYXNpY05hbWUBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAIAC2DAC3AHoBAAVwYXJzZQgAuQEAMSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbiAoaXQgaXMgdW5wYXJzYWJsZSkLALsAvQcAvAEADmphdmEvdXRpbC9MaXN0DAC+AL8BAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKACAAwQwAwgA9AQAQZ2V0VmVyc2lvblN0cmluZwoARQDEDADFAMYBAAdtYXRjaGVyAQAzKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS91dGlsL3JlZ2V4L01hdGNoZXI7CgDIAMoHAMkBABdqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcgwAywBbAQAHbWF0Y2hlcwgAzQEAGSBkb2VzIG5vdCBjb250YWluIDQgcGFydHMIAM8BAAsgICBDaGVja2VkIAoAKQDRDAA4ANIBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADUAQAEIG9mIAgA1gEAESAgIEVycm9ycyBmb3VuZDogCwC7ANgMANkA2gEABHNpemUBAAMoKUkKANwA3gcA3QEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwA3wDgAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLALsA4gwA4wDkAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwDmAOgHAOcBABJqYXZhL3V0aWwvSXRlcmF0b3IMAOkA6gEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoAkwDsDACWAO0BABUoTGphdmEvbGFuZy9PYmplY3Q7KVYLAOYA7wwA8ABbAQAHaGFzTmV4dAEABmVycm9ycwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQABaQEABWNoaWxkAQAEbmFtZQEABXZhbGlkAQAHdmVyc2lvbgEAGUxqYXZhL3V0aWwvcmVnZXgvTWF0Y2hlcjsBAARpdGVyAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsKACwBAQwBAgEDAQALbGFzdEluZGV4T2YBABUoTGphdmEvbGFuZy9TdHJpbmc7KUkKACwBBQwBBgEHAQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwEACGZ1bGxuYW1lAQAJZXh0ZW5zaW9uAQAGcmVzdWx0AQADcG9zAQAUdGVzdFZlcnNpb25zUGF0dGVybnMIAQ4BAB1DaGVjayA0LXBhcnQgdmVyc2lvbiBwYXR0ZXJucwoAkwEQDAERABwBAAVjbG9zZQEAD2ZlYXR1cmVGYWlsdXJlcwEADmJ1bmRsZUZhaWx1cmVzCAEVAQASYWdncmVnYXRlL2ZlYXR1cmVzCAEXAQATL2FnZ3JlZ2F0ZS9mZWF0dXJlcwgBGQEAE2ZlYXR1cmUgZGlyZWNvdHJ5ICgIARsBACYgQ2hlY2sgZm9yIDQtcGFydCB2ZXJzaW9ucyBpbiBGZWF0dXJlcwEAEGZlYXR1cmVEaXJlY3RvcnkBABJnZXRPdXRwdXREaXJlY3RvcnkJAAEBHwwAFwAGAQASc2V0T3V0cHV0RGlyZWN0b3J5CQABASIMABgAGQgBJAEAF3ZlcnNpb25QYXR0ZXJuQ2hlY2sudHh0CgABASYMAR0APQoAkwEoDAAbASkB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KioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwogKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSAnRWNsaXBzZSBPcmJpdCcgcHJvamVjdCB0aGVuIGFkYXB0ZWQgdG8gdXNlIAogKiBpbiBXVFAgYW5kIGltcHJvdmVkIHRvIHVzZSAnTWFuaWZlc3QnIHRvIHJlYWQgbWFuaWZlc3QubWYsIGluc3RlYWQgb2YgcmVhZGluZyAKICogaXQgYXMgYSBwcm9wZXJ0aWVzIGZpbGUuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLmphcnM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuRnVsbEphck5hbWVQYXJzZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwoKLyoqCiAqIEBzaW5jZSAzLjMKICovCnB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdCB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9KQVIgICAgICAgID0gIi5qYXIiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QQUNFS0RfSkFSID0gIi5qYXIucGFjay5neiI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1pJUCAgICAgICAgPSAiLnppcCI7CiAgICBwcml2YXRlIEZ1bGxKYXJOYW1lUGFyc2VyICAgbmFtZVBhcnNlciAgICAgICAgICAgPSBuZXcgRnVsbEphck5hbWVQYXJzZXIoKTsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBCQUNLU0xBU0ggICAgICAgICAgICA9ICJcXCI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgTElURVJBTF9QRVJJT0QgICAgICAgPSBCQUNLU0xBU0ggKyAiLiI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgQU5ZICAgICAgICAgICAgICAgICAgPSAiLioiOwogICAgcHJpdmF0ZSBQYXR0ZXJuICAgICAgICAgICAgIHRocmVlZG90cyAgICAgICAgICAgID0gUGF0dGVybi5jb21waWxlKEFOWSArIExJVEVSQUxfUEVSSU9EICsgQU5ZICsgTElURVJBTF9QRVJJT0QgKyBBTlkgKyBMSVRFUkFMX1BFUklPRCArIEFOWSk7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5OwogICAgcHJpdmF0ZSBSZXBvcnRXcml0ZXIgICAgICAgIHJlcG9ydFdyaXRlcjsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIFZlcnNpb25UZXN0IHRlc3RsYXlvdXQgPSBuZXcgVmVyc2lvblRlc3QoKTsKICAgICAgICB0ZXN0bGF5b3V0LnNldERpcmVjdG9yeVRvQ2hlY2soIkQ6XFx0ZW1wXFxzdGFnaW5nXFxhZ2dyZWdhdGUiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICB0ZXN0bGF5b3V0LnRlc3RGZWF0dXJlVmVyc2lvbnMoKTsKICAgICAgICAgICAgdGVzdGxheW91dC50ZXN0QnVuZGxlVmVyc2lvbnMoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeVRvQ2hlY2s7CgoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VG9DaGVjaygpIHsKICAgICAgICByZXR1cm4gZGlyZWN0b3J5VG9DaGVjazsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlUb0NoZWNrKFN0cmluZyBidW5kbGVEaXJUb0NoZWNrKSB7CiAgICAgICAgdGhpcy5kaXJlY3RvcnlUb0NoZWNrID0gYnVuZGxlRGlyVG9DaGVjazsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gdGVzdEJ1bmRsZVZlcnNpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwogICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuIik7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBidW5kbGVEaXJlY3RvcnkgPSBudWxsOwogICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9hZ2dyZWdhdGUvcGx1Z2lucyI7CiAgICAgICAgfQogICAgICAgIEZpbGUgaW5wdXRkaXIgPSBuZXcgRmlsZShidW5kbGVEaXJlY3RvcnkpOwogICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGJ1bmRsZURpcmVjdG9yeSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKCIgQ2hlY2sgZm9yIDQtcGFydCB2ZXJzaW9ucyBpbiBCdW5kbGVzIik7CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBjaGVja0ZpbGVzVmVyc2lvbnMoaW5wdXRkaXIpOwogICAgICAgIC8vIGFzc2VydEZhbHNlKCJTb21lIGJ1bmRsZXMgZGlkIG5vdCBoYXZlIDQgcGFydCB2ZXJzaW9uIG51bWJlcnMiLCBmYWlsdXJlc09jY3VyZWQpOwogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZXNWZXJzaW9ucyhGaWxlIGlucHV0ZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzCiAgICAgICAgTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQgPSBmYWxzZTsKICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBpbnB1dGRpci5saXN0RmlsZXMobmV3IEpBUkZpbGVOYW1lRmlsdGVyKCkpOwogICAgICAgIGludCB0b3RhbHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgaW50IGNoZWNrZWQgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKICAgICAgICAgICAgLy8gYXNzdW1lIGRpcmVjdG9yeSBpZiBub3QgZmlsZQogICAgICAgICAgICBpZiAoY2hpbGQuaXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9QQUNFS0RfSkFSKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRCYXNpY05hbWUobmFtZSwgRVhURU5TSU9OX1BBQ0VLRF9KQVIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lbmRzV2l0aChFWFRFTlNJT05fSkFSKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRCYXNpY05hbWUobmFtZSwgRVhURU5TSU9OX0pBUik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKEVYVEVOU0lPTl9aSVApKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGdldEJhc2ljTmFtZShuYW1lLCBFWFRFTlNJT05fWklQKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjaGVja2VkKys7CiAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBuYW1lUGFyc2VyLnBhcnNlKG5hbWUpOwogICAgICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5hbWUgKyAiIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB2ZXJzaW9uIChpdCBpcyB1bnBhcnNhYmxlKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBuYW1lUGFyc2VyLmdldFZlcnNpb25TdHJpbmcoKTsKICAgICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHRocmVlZG90cy5tYXRjaGVyKHZlcnNpb24pOwoKICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlci5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5hbWUgKyAiIGRvZXMgbm90IGNvbnRhaW4gNCBwYXJ0cyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIENoZWNrZWQgIiArIGNoZWNrZWQgKyAiIG9mICIgKyB0b3RhbHNpemUgKyAiLiIpOwogICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIiAgIEVycm9ycyBmb3VuZDogIiArIGVycm9ycy5zaXplKCkpOwoKICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlcnJvcnMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBnZXRSZXBvcnRXcml0ZXIoKS53cml0ZWxuKGl0ZXIubmV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFpbHVyZXNPY2N1cmVkOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJhc2ljTmFtZShTdHJpbmcgZnVsbG5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZnVsbG5hbWU7CiAgICAgICAgaW50IHBvcyA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKGV4dGVuc2lvbik7CiAgICAgICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bGxuYW1lLnN1YnN0cmluZygwLCBwb3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RWZXJzaW9uc1BhdHRlcm5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLndyaXRlbG4oIkNoZWNrIDQtcGFydCB2ZXJzaW9uIHBhdHRlcm5zIik7CiAgICAgICAgICAgIGJvb2xlYW4gZmVhdHVyZUZhaWx1cmVzID0gdGVzdEZlYXR1cmVWZXJzaW9ucygpOwogICAgICAgICAgICBib29sZWFuIGJ1bmRsZUZhaWx1cmVzID0gdGVzdEJ1bmRsZVZlcnNpb25zKCk7CiAgICAgICAgICAgIHJlc3VsdCA9IGZlYXR1cmVGYWlsdXJlcyB8fCBidW5kbGVGYWlsdXJlczsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGdldFJlcG9ydFdyaXRlcigpLmNsb3NlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIHRlc3RGZWF0dXJlVmVyc2lvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXREaXJlY3RvcnlUb0NoZWNrKCk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICB9CiAgICAgICAgU3RyaW5nIGZlYXR1cmVEaXJlY3RvcnkgPSBudWxsOwogICAgICAgIGlmIChwcm9wZXJ0eS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICAgICAgIGZlYXR1cmVEaXJlY3RvcnkgPSBwcm9wZXJ0eSArICJhZ2dyZWdhdGUvZmVhdHVyZXMiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmVhdHVyZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9hZ2dyZWdhdGUvZmVhdHVyZXMiOwogICAgICAgIH0KICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZmVhdHVyZURpcmVjdG9yeSk7CiAgICAgICAgaWYgKCEoaW5wdXRkaXIuZXhpc3RzKCkgJiYgaW5wdXRkaXIuaXNEaXJlY3RvcnkoKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmZWF0dXJlIGRpcmVjb3RyeSAoIiArIGZlYXR1cmVEaXJlY3RvcnkgKyAiKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4iKTsKICAgICAgICB9CiAgICAgICAgZ2V0UmVwb3J0V3JpdGVyKCkud3JpdGVsbigiIENoZWNrIGZvciA0LXBhcnQgdmVyc2lvbnMgaW4gRmVhdHVyZXMiKTsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrRmlsZXNWZXJzaW9ucyhpbnB1dGRpcik7CiAgICAgICAgLy8gYXNzZXJ0RmFsc2UoIlNvbWUgZmVhdHVyZXMgZGlkIG5vdCBoYXZlIDQgcGFydCB2ZXJzaW9uIG51bWJlcnMiLCBmYWlsdXJlc09jY3VyZWQpOwogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CgogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgUmVwb3J0V3JpdGVyIGdldFJlcG9ydFdyaXRlcigpIHsKICAgICAgICBpZiAocmVwb3J0V3JpdGVyID09IG51bGwpIHsKICAgICAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVuYW1lID0gInZlcnNpb25QYXR0ZXJuQ2hlY2sudHh0IjsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVwb3J0V3JpdGVyOwogICAgfQp9ClBLAwQKAAAAAAA7AtI+LXGOu78EAAC/BAAALAAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1Rlc3RKYXJzLmNsYXNzyv66vgAAADEALgcAAgEAJm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1Rlc3RKYXJzBwAEAQAQamF2YS9sYW5nL09iamVjdAEAD2J1bmRsZURpcmVjdG9yeQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAEGRpcmVjdG9yeVRvQ2hlY2sBAA50ZW1wV29ya2luZ0RpcgEAD291dHB1dERpcmVjdG9yeQEABjxpbml0PgEAAygpVgEABENvZGUKAAMADgwACgALCQABABAMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAChMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdEphcnM7AQATZ2V0RGlyZWN0b3J5VG9DaGVjawEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CQABABgMAAcABgEAE3NldERpcmVjdG9yeVRvQ2hlY2sBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABBidW5kbGVEaXJUb0NoZWNrAQASZ2V0T3V0cHV0RGlyZWN0b3J5CQABAB4MAAkABggAIAEACHVzZXIuZGlyCgAiACQHACMBABBqYXZhL2xhbmcvU3lzdGVtDAAlACYBAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQARZ2V0VGVtcFdvcmtpbmdEaXIJAAEAKQwACAAGAQARc2V0VGVtcFdvcmtpbmdEaXIBABJzZXRPdXRwdXREaXJlY3RvcnkBAApTb3VyY2VGaWxlAQANVGVzdEphcnMuamF2YQQhAAEAAwAAAAQABAAFAAYAAAACAAcABgAAAAIACAAGAAAAAgAJAAYAAAAHAAEACgALAAEADAAAADwAAgABAAAACiq3AA0qAbUAD7EAAAACABEAAAAOAAMAAAADAAQABgAJAAMAEgAAAAwAAQAAAAoAEwAUAAAAAQAVABYAAQAMAAAALwABAAEAAAAFKrQAF7AAAAACABEAAAAGAAEAAAAMABIAAAAMAAEAAAAFABMAFAAAAAEAGQAaAAEADAAAAD4AAgACAAAABiortQAXsQAAAAIAEQAAAAoAAgAAABAABQARABIAAAAWAAIAAAAGABMAFAAAAAAABgAbAAYAAQABABwAFgABAAwAAABHAAIAAQAAABUqtAAdxwAMKhIfuAAhtQAdKrQAHbAAAAACABEAAAAOAAMAAAAUAAcAFQAQABcAEgAAAAwAAQAAABUAEwAUAAAAAQAnABYAAQAMAAAALwABAAEAAAAFKrQAKLAAAAACABEAAAAGAAEAAAAbABIAAAAMAAEAAAAFABMAFAAAAAEAKgAaAAEADAAAAD4AAgACAAAABiortQAosQAAAAIAEQAAAAoAAgAAAB8ABQAgABIAAAAWAAIAAAAGABMAFAAAAAAABgAIAAYAAQABACsAGgABAAwAAAA+AAIAAgAAAAYqK7UAHbEAAAACABEAAAAKAAIAAAAjAAUAJAASAAAAFgACAAAABgATABQAAAAAAAYACQAGAAEAAQAsAAAAAgAtUEsDBAoAAAAAAEUDxD5LLki4qAMAAKgDAAArAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdEphcnMuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLmphcnM7CgpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdEphcnMgewoKCiAgICBwcm90ZWN0ZWQgU3RyaW5nIGJ1bmRsZURpcmVjdG9yeSA9IG51bGw7CiAgICBwcml2YXRlIFN0cmluZyAgIGRpcmVjdG9yeVRvQ2hlY2s7CiAgICBwcml2YXRlIFN0cmluZyAgIHRlbXBXb3JraW5nRGlyOwogICAgcHJpdmF0ZSBTdHJpbmcgICBvdXRwdXREaXJlY3Rvcnk7CgogICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnlUb0NoZWNrKCkgewogICAgICAgIHJldHVybiBkaXJlY3RvcnlUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeVRvQ2hlY2soU3RyaW5nIGJ1bmRsZURpclRvQ2hlY2spIHsKICAgICAgICB0aGlzLmRpcmVjdG9yeVRvQ2hlY2sgPSBidW5kbGVEaXJUb0NoZWNrOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewogICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewogICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRUZW1wV29ya2luZ0RpcigpIHsKICAgICAgICByZXR1cm4gdGVtcFdvcmtpbmdEaXI7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0VGVtcFdvcmtpbmdEaXIoU3RyaW5nIHRlbXBXb3JraW5nRGlyKSB7CiAgICAgICAgdGhpcy50ZW1wV29ya2luZ0RpciA9IHRlbXBXb3JraW5nRGlyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CiAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICB9Cgp9ClBLAwQKAAAAAAC2AtI+6yisHmcDAABnAwAAOQAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YS5jbGFzc8r+ur4AAAAxACkHAAIBADNvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS9sYW5nL0NvbXBhcmFibGUBAAhmaWxlbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACWJyZWVWYWx1ZQEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUKAAMADgwACgAPAQADKClWCQABABEMAAcACAkAAQATDAAJAAgBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA1TG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YTsBAAljb21wYXJlVG8BABUoTGphdmEvbGFuZy9PYmplY3Q7KUkKABsAHQcAHAEAEGphdmEvbGFuZy9TdHJpbmcMABgAHgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAAW8BABJMamF2YS9sYW5nL09iamVjdDsBAAZyZXN1bHQBAAFJAQAKU291cmNlRmlsZQEADUJSRUVUZXN0LmphdmEBAAxJbm5lckNsYXNzZXMHACcBACZvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdAEADEJSRUVGaWxlRGF0YQAgAAEAAwABAAUAAgAAAAcACAAAAAAACQAIAAAAAgABAAoACwABAAwAAABZAAIAAwAAAA8qtwANKiu1ABAqLLUAErEAAAACABQAAAASAAQAAAAxAAQAMgAJADMADgA0ABUAAAAgAAMAAAAPABYAFwAAAAAADwAHAAgAAQAAAA8ACQAIAAIAAQAYABkAAQAMAAAAbgACAAMAAAAkKrQAEivAAAG0ABK2ABo9HJoAEiq0ABArwAABtAAQtgAaPRysAAAAAgAUAAAAEgAEAAAAOAAPADkAEwA6ACIAPAAVAAAAIAADAAAAJAAWABcAAAAAACQAHwAgAAEADwAVACEAIgACAAIAIwAAAAIAJAAlAAAACgABAAEAJgAoAAhQSwMECgAAAAAAtgLSPlYFKOHELAAAxCwAACwAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdC5jbGFzc8r+ur4AAAAxAecHAAIBACZvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdAcABAEAJm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1Rlc3RKYXJzAQAOb3V0cHV0RmlsZW5hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAJAQAMYnJlZWRhdGEudHh0AQAuUFJPUEVSVFlfQlVORExFX1JFUVVJUkVEX0VYRUNVVElPTl9FTlZJUk9OTUVOVAgADAEAI0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50AQAKbmFtZVBhcnNlcgEAMkxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlBwATAQAwb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyCgASABUMABYAEAEABjxpbml0PgkAAQAYDAANAA4BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAFQEABHRoaXMBAChMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvQlJFRVRlc3Q7AQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEAFQgAIgEAKy9ob21lL2ZpbGVzL2J1aWxkemlwcy9pbmRpZ29SQzIvZWNsaXBzZUpFRS8KAAEAJAwAJQAmAQATc2V0RGlyZWN0b3J5VG9DaGVjawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAoDAApACoBABN0ZXN0QlJFRVNldHRpbmdSdWxlAQADKClaCgAsAC4HAC0BABNqYXZhL2lvL0lPRXhjZXB0aW9uDAAvABABAA9wcmludFN0YWNrVHJhY2UBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEACnRlc3RsYXlvdXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAKRXhjZXB0aW9ucwoAAQA3DAA4ADkBABNnZXREaXJlY3RvcnlUb0NoZWNrAQAUKClMamF2YS9sYW5nL1N0cmluZzsHADsBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbggAPQEALU5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LgoAOgA/DAAWACYHAEEBAAxqYXZhL2lvL0ZpbGUKAAEAQwwARAA5AQASZ2V0QnVuZGxlRGlyZWN0b3J5CgBAAD8KAEAARwwASAAqAQAGZXhpc3RzCgBAAEoMAEsAKgEAC2lzRGlyZWN0b3J5BwBNAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIIAE8BABJidW5kbGUgZGlyZWN0b3J5ICgKAEwAPwoATABSDABTAFQBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsIAFYBACApIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LgoATABYDABZADkBAAh0b1N0cmluZwoAAQBbDABcAF0BAA9jaGVja0J1bmRsZUJSRUUBABEoTGphdmEvaW8vRmlsZTspWgEACHByb3BlcnR5AQAIaW5wdXRkaXIBAA5MamF2YS9pby9GaWxlOwEAD2ZhaWx1cmVzT2NjdXJlZAEAAVoKAGQAZgcAZQEAEGphdmEvbGFuZy9PYmplY3QMAGcAaAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwgAagEAFWV4Y2VwdGlvbnMucHJvcGVydGllcwoAbABuBwBtAQAPamF2YS9sYW5nL0NsYXNzDABvAHABABNnZXRSZXNvdXJjZUFzU3RyZWFtAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9pby9JbnB1dFN0cmVhbTsHAHIBABRqYXZhL3V0aWwvUHJvcGVydGllcwoAcQAVCAB1AQAACgBxAHcMAHgAeQEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYIAHsBAA5icmVlRXhjZXB0aW9ucwoAcQB9DAB+AH8BAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgCBAIMHAIIBABNqYXZhL2lvL0lucHV0U3RyZWFtDACEABABAAVjbG9zZQcAhgEAEWphdmEvdXRpbC9IYXNoTWFwCgCFABUHAIkBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgCIABUHAIwBADBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAIsAFQoAQACPDACQAJEBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAQACTDACUADkBAAdnZXROYW1lCgABAJYMAJcAfwEADWdldEJ1bmRsZU5hbWUKAJkAmwcAmgEAEGphdmEvbGFuZy9TdHJpbmcMAJwAnQEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABAJ8MAKAAoQEADmdldEJSRUVGcm9tSkFSAQAiKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOwoAmQCjDACkAKUBAAZsZW5ndGgBAAMoKUkKAAEApwwAqABdAQAMY29udGFpbnNKYXZhCgABAKoMAKsArAEAD2luY3JlbWVudENvdW50cwEAJChMamF2YS91dGlsL01hcDtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCuDACvALABABR0cmFja0ZhbHNlSW5jbHVzaW9ucwEAMyhMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspVgoAAQCyDACzALQBAA50cmFja09taXNzaW9ucwEAIShMamF2YS91dGlsL0xpc3Q7TGphdmEvaW8vRmlsZTspVgoAAQC2DAC3ALgBAAtwcmludHJlcG9ydAEANShMamF2YS91dGlsL01hcDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0lJSSlWAQAOcHJvcGVydHlTdHJlYW0BABVMamF2YS9pby9JbnB1dFN0cmVhbTsBABdicmVlRXhjZXB0aW9uUHJvcGVydGllcwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAxqYXZhV2l0aEJyZWUBAA9MamF2YS91dGlsL01hcDsBAA9ub25qYXZhV2l0aEJyZWUBABBMamF2YS91dGlsL0xpc3Q7AQAPamF2YVdpdGhvdXRCcmVlAQANbm9uSmF2YU5vQlJFRQEAAUkBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAB2NoZWNrZWQBAAFpAQAFY2hpbGQBAARuYW1lAQAKYnVuZGxlTmFtZQEABGJyZWUHAM4BACtvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyCgABANAMANEAOQEAEmdldE91dHB1dERpcmVjdG9yeQoAzQDTDAAWANQBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKAM0A1gwA1wAQAQAHd3JpdGVsbggA2QEAFiAgIERpcmVjdG9yeSBjaGVja2VkOiAKAM0A2wwA1wAmCADdAQALICAgQ2hlY2tlZCAKAEwA3wwAUwDgAQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgA4gEABCBvZiAIAOQBAAYgamFycy4IAOYBAE0gIEJ1bmRsZXMgd2l0aCBhcHByb3ByaWF0ZSB1c2Ugb2YgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgKEJSRUUpOggA6AEAEyAgIEphdmEgd2l0aCBCUkVFOiAKAAEA6gwA6wDsAQAKdG90YWxDb3VudAEAEihMamF2YS91dGlsL01hcDspSQgA7gEAGSAgIE5vbiBKYXZhIHdpdGhvdXQgQlJFRToIAPABACkgICBEaXN0cmlidXRpb24gb2YgQlJFRXMgaW4gSmF2YSBCdW5kbGVzIAsA8gD0BwDzAQANamF2YS91dGlsL01hcAwA9QD2AQAGa2V5U2V0AQARKClMamF2YS91dGlsL1NldDsKAIgA+AwAFgD5AQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspVgoA+wD9BwD8AQAVamF2YS91dGlsL0NvbGxlY3Rpb25zDAD+AP8BAARzb3J0AQATKExqYXZhL3V0aWwvTGlzdDspVgsBAQEDBwECAQAOamF2YS91dGlsL0xpc3QMAQQBBQEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsBBwEJBwEIAQASamF2YS91dGlsL0l0ZXJhdG9yDAEKAQsBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsLAPIBDQwBDgEPAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAREBABFqYXZhL2xhbmcvSW50ZWdlcggBEwEACQkJJTVkCSVzCgoBEAEVDAEWAKUBAAhpbnRWYWx1ZQoBEAEYDAEZARoBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwoAzQEcDAEdAR4BAAZwcmludGYBACgoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvT2JqZWN0OylWCwEHASAMASEAKgEAB2hhc05leHQIASMBADcgIEJ1bmRsZXMgd2l0aCBxdWVzdGlvbmFibGUgYWJzZW5jZSBvciBwcmVzZW5jZSBvZiBCUkVFCAElAQAhICAgIEphdmEgQnVuZGxlcyB3aXRob3V0IGEgQlJFRTogCwEBAScMASgApQEABHNpemUIASoBAAcgICAgICAgCgBMASwMAFMBLQEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgBLwEAIiAgICBOb24gSmF2YSBCdW5kbGVzIHdpdGggYSBCUkVFOiAHATEBADNvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEIATMBAAglMjRzCSVzCgkBMAE1DAE2AAYBAAlicmVlVmFsdWUJATABOAwBOQAGAQAIZmlsZW5hbWUHATsBAA9qYXZhL2xhbmcvRXJyb3IIAT0BABJQcm9ncmFtbWluZyBlcnJvci4KAToAPwoAzQCDAQAMcmVwb3J0V3JpdGVyAQAtTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXI7AQAIYWxsQlJFRXMBAA9MamF2YS91dGlsL1NldDsBAAthbGxCUkVFTGlzdAEABm9iamVjdAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABWNvdW50AQATTGphdmEvbGFuZy9JbnRlZ2VyOwEAFExqYXZhL3V0aWwvSXRlcmF0b3I7AQAMYnJlZWZpbGVkYXRhAQA1TG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0JSRUVUZXN0JEJSRUVGaWxlRGF0YTsLAPIBTQwBTgFPAQAGdmFsdWVzAQAYKClMamF2YS91dGlsL0NvbGxlY3Rpb247CwFRAQMHAVIBABRqYXZhL3V0aWwvQ29sbGVjdGlvbgEACWFsbENvdW50cwEAFkxqYXZhL3V0aWwvQ29sbGVjdGlvbjsBAAV0b3RhbAsBAQFXDAFYAVkBAANhZGQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKATAA0wEABGxpc3QKARABXQwAFgFeAQAEKEkpVgsA8gFgDAFhAWIBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFkDAFlAWYBAAlpbmNyZW1lbnQBACgoTGphdmEvbGFuZy9JbnRlZ2VyOylMamF2YS9sYW5nL0ludGVnZXI7AQAHYnJlZU1hcAcBaQEAFWphdmEvdXRpbC9qYXIvSmFyRmlsZQoBaAFrDAAWAWwBABMoTGphdmEvaW8vRmlsZTtaSSlWCgFoAW4MAW8BcAEAB2VudHJpZXMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247CwFyAXQHAXMBABVqYXZhL3V0aWwvRW51bWVyYXRpb24MAXUBCwEAC25leHRFbGVtZW50BwF3AQAWamF2YS91dGlsL2phci9KYXJFbnRyeQoBdgCTCAF6AQAGLmNsYXNzCgCZAXwMAX0BfgEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCAGAAQAELmphcgoBaAGCDAGDAYQBAA5nZXRJbnB1dFN0cmVhbQEALyhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTspTGphdmEvaW8vSW5wdXRTdHJlYW07CgABAYYMAKgBhwEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspWgsBcgGJDAGKACoBAA9oYXNNb3JlRWxlbWVudHMJAYwBjgcBjQEAEGphdmEvbGFuZy9TeXN0ZW0MAY8BkAEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwoALAGSDAGTADkBAApnZXRNZXNzYWdlCgGVAZcHAZYBABNqYXZhL2lvL1ByaW50U3RyZWFtDAGYACYBAAdwcmludGxuCgFoAIMBAAdqYXJmaWxlAQADamFyAQAXTGphdmEvdXRpbC9qYXIvSmFyRmlsZTsBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEABWVudHJ5AQAYTGphdmEvdXRpbC9qYXIvSmFyRW50cnk7AQAFaW5wdXQBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAxTGphdmEvdXRpbC9FbnVtZXJhdGlvbjxMamF2YS91dGlsL2phci9KYXJFbnRyeTs+OwcBpAEAHGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW0KAaMBpgwAFgB5CgGjAagMAakBqgEADGdldE5leHRFbnRyeQEAGigpTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgGsAJMHAa0BABZqYXZhL3V0aWwvemlwL1ppcEVudHJ5CgGjAa8MAbAApQEACWF2YWlsYWJsZQEADmphcklucHV0U3RyZWFtAQAeTGphdmEvdXRpbC9qYXIvSmFySW5wdXRTdHJlYW07AQAYTGphdmEvdXRpbC96aXAvWmlwRW50cnk7CgASAbUMAbYBfgEABXBhcnNlCgASAbgMAbkAOQEAEGdldFByb2plY3RTdHJpbmcBAAhmdWxsbmFtZQEABnJlc3VsdAEACHBhcnNhYmxlAQATZ2V0QlJFRUZyb21NYW5pZmVzdAEAOyhMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgHAAcIHAcEBACVvcmcvZWNsaXBzZS9vc2dpL3V0aWwvTWFuaWZlc3RFbGVtZW50DAHDAcQBABNwYXJzZUJ1bmRsZU1hbmlmZXN0AQA1KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL3V0aWwvTWFwOylMamF2YS91dGlsL01hcDsKAcYALgcBxwEAIm9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVFeGNlcHRpb24BAARwYXRoAQAKYXR0cmlidXRlcwEAJExvcmcv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KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgogKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiBUaGlzIGZpbGUgb3JpZ2luYWxseSBjYW1lIGZyb20gJ0VjbGlwc2UgT3JiaXQnIHByb2plY3QgdGhlbiBhZGFwdGVkIHRvIHVzZSAKICogaW4gV1RQIGFuZCBpbXByb3ZlZCB0byB1c2UgJ01hbmlmZXN0JyB0byByZWFkIG1hbmlmZXN0Lm1mLCBpbnN0ZWFkIG9mIHJlYWRpbmcgCiAqIGl0IGFzIGEgcHJvcGVydGllcyBmaWxlLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5qYXJzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwppbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwppbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuRnVsbEphck5hbWVQYXJzZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CgovKioKICogQHNpbmNlIDMuMwogKi8KcHVibGljIGNsYXNzIEJSRUVUZXN0IGV4dGVuZHMgVGVzdEphcnMgewoKICAgIHN0YXRpYyBjbGFzcyBCUkVFRmlsZURhdGEgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKICAgICAgICBTdHJpbmcgZmlsZW5hbWU7CiAgICAgICAgU3RyaW5nIGJyZWVWYWx1ZTsKCiAgICAgICAgcHVibGljIEJSRUVGaWxlRGF0YShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBicmVlVmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwogICAgICAgICAgICB0aGlzLmJyZWVWYWx1ZSA9IGJyZWVWYWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CiAgICAgICAgICAgIC8vIGZpcnN0IHNvcnQgb24gYnJlZSBuYW1lLCB0aGVuIG9uIGZpbGUvYnVuZGxlIG5hbWUKICAgICAgICAgICAgaW50IHJlc3VsdCA9IGJyZWVWYWx1ZS5jb21wYXJlVG8oKChCUkVFRmlsZURhdGEpIG8pLmJyZWVWYWx1ZSk7CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWUuY29tcGFyZVRvKCgoQlJFRUZpbGVEYXRhKSBvKS5maWxlbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAiYnJlZWRhdGEudHh0IjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICAgICAgICAgIFBST1BFUlRZX0JVTkRMRV9SRVFVSVJFRF9FWEVDVVRJT05fRU5WSVJPTk1FTlQgPSAiQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVsbEphck5hbWVQYXJzZXIgbmFtZVBhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCiAgICAgICAgQlJFRVRlc3QgdGVzdGxheW91dCA9IG5ldyBCUkVFVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2luZGlnb1JDMi9lY2xpcHNlSkVFLyIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEJSRUVTZXR0aW5nUnVsZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KCiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJSRUVTZXR0aW5nUnVsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgogICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LiIpOwogICAgICAgIH0KCiAgICAgICAgRmlsZSBpbnB1dGRpciA9IG5ldyBGaWxlKGdldEJ1bmRsZURpcmVjdG9yeSgpKTsKICAgICAgICBpZiAoIShpbnB1dGRpci5leGlzdHMoKSAmJiBpbnB1dGRpci5pc0RpcmVjdG9yeSgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJ1bmRsZSBkaXJlY3RvcnkgKCIgKyBnZXRCdW5kbGVEaXJlY3RvcnkoKSArICIpIG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIpOwogICAgICAgIH0KCiAgICAgICAgYm9vbGVhbiBmYWlsdXJlc09jY3VyZWQ7CgogICAgICAgIGZhaWx1cmVzT2NjdXJlZCA9IGNoZWNrQnVuZGxlQlJFRShpbnB1dGRpcik7CgogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlQlJFRShGaWxlIGlucHV0ZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIC8vIHJlc2V0L2luaXRpYWxpemUgZXJyb3JzCiAgICAgICAgSW5wdXRTdHJlYW0gcHJvcGVydHlTdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZXhjZXB0aW9ucy5wcm9wZXJ0aWVzIik7CiAgICAgICAgUHJvcGVydGllcyBicmVlRXhjZXB0aW9uUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgU3RyaW5nIGJyZWVFeGNlcHRpb25zID0gIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYnJlZUV4Y2VwdGlvblByb3BlcnRpZXMubG9hZChwcm9wZXJ0eVN0cmVhbSk7CiAgICAgICAgICAgIGJyZWVFeGNlcHRpb25zID0gYnJlZUV4Y2VwdGlvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImJyZWVFeGNlcHRpb25zIik7CiAgICAgICAgICAgIGlmIChicmVlRXhjZXB0aW9ucyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBicmVlRXhjZXB0aW9ucyA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB1bnVzdWFsIHRvIGdldCBoZXJlPwogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9Ci8vIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIE1hcCBqYXZhV2l0aEJyZWUgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgIExpc3Qgbm9uamF2YVdpdGhCcmVlID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIExpc3QgamF2YVdpdGhvdXRCcmVlID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGludCBub25KYXZhTm9CUkVFID0gMDsKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZCA9IGZhbHNlOwogICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGlucHV0ZGlyLmxpc3RGaWxlcyhuZXcgSkFSRmlsZU5hbWVGaWx0ZXIoKSk7CiAgICAgICAgaW50IHRvdGFsc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICBpbnQgY2hlY2tlZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbHNpemU7IGkrKykgewogICAgICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwogICAgICAgICAgICAvLyB3aXRoIEluZGlnbywgc2luY2Ugd2UgaGF2ZSBhbGwgamFycyBvbiBmaWxlIHN5c3RlbSwgaW4gYWRkaXRpb24gdG8gcGFjay5neiBmaWxlcywKICAgICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgdGhlIHBhY2suZ3ogb25lcy4gV2UgY2FuIGFzc3VtZSB0aGV5IGFyZSBpZGVudGlhbCB0byB0aGVpciAuamFyIHZlcnNpb24uCi8vIGlmIChjaGlsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUikpIHsKLy8gY2hpbGQgPSBnZXRGaWxlRnJvbVBBQ0tFREpBUihjaGlsZCk7Ci8vIH0KLy8gaWYgKGNoaWxkICE9IG51bGwpIHsKCiAgICAgICAgICAgIFN0cmluZyBidW5kbGVOYW1lID0gZ2V0QnVuZGxlTmFtZShuYW1lKTsKICAgICAgICAgICAgaWYgKChidW5kbGVOYW1lICE9IG51bGwpICYmICFicmVlRXhjZXB0aW9ucy5jb250YWlucyhidW5kbGVOYW1lKSkgewogICAgICAgICAgICAgICAgY2hlY2tlZCsrOwogICAgICAgICAgICAgICAgU3RyaW5nIGJyZWUgPSBnZXRCUkVFRnJvbUpBUihjaGlsZCk7CiAgICAgICAgICAgICAgICBpZiAoKGJyZWUgIT0gbnVsbCkgJiYgKGJyZWUubGVuZ3RoKCkgPiAwKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGhhcyBCUkVFLCBjb25maXJtIGlzIGphdmEgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoY2hpbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudENvdW50cyhqYXZhV2l0aEJyZWUsIGJyZWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGYWxzZUluY2x1c2lvbnMobm9uamF2YVdpdGhCcmVlLCBjaGlsZCwgYnJlZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzT2NjdXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gQlJFRSwgY29uZmlybSBpcyBub24tamF2YQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluc0phdmEoY2hpbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrT21pc3Npb25zKGphdmFXaXRob3V0QnJlZSwgY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlc09jY3VyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9uSmF2YU5vQlJFRSsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgcHJpbnRyZXBvcnQoamF2YVdpdGhCcmVlLCBub25qYXZhV2l0aEJyZWUsIGphdmFXaXRob3V0QnJlZSwgbm9uSmF2YU5vQlJFRSwgdG90YWxzaXplLCBjaGVja2VkKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRyZXBvcnQoTWFwIGphdmFXaXRoQnJlZSwgTGlzdCBub25qYXZhV2l0aEJyZWUsIExpc3QgamF2YVdpdGhvdXRCcmVlLCBpbnQgbm9uSmF2YU5vQlJFRSwgaW50IHRvdGFsc2l6ZSwgaW50IGNoZWNrZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoKICAgICAgICBSZXBvcnRXcml0ZXIgcmVwb3J0V3JpdGVyID0gbmV3IFJlcG9ydFdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoKSwgb3V0cHV0RmlsZW5hbWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXJlY3RvcnkgY2hlY2tlZDogIiArIGdldERpcmVjdG9yeVRvQ2hlY2soKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBDaGVja2VkICIgKyBjaGVja2VkICsgIiBvZiAiICsgdG90YWxzaXplICsgIiBqYXJzLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICBCdW5kbGVzIHdpdGggYXBwcm9wcmlhdGUgdXNlIG9mIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IChCUkVFKToiKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIEphdmEgd2l0aCBCUkVFOiAiICsgdG90YWxDb3VudChqYXZhV2l0aEJyZWUpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE5vbiBKYXZhIHdpdGhvdXQgQlJFRToiICsgbm9uSmF2YU5vQlJFRSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICBEaXN0cmlidXRpb24gb2YgQlJFRXMgaW4gSmF2YSBCdW5kbGVzICIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICBTZXQgYWxsQlJFRXMgPSBqYXZhV2l0aEJyZWUua2V5U2V0KCk7CiAgICAgICAgICAgIExpc3QgYWxsQlJFRUxpc3QgPSBuZXcgQXJyYXlMaXN0KGFsbEJSRUVzKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhbGxCUkVFTGlzdCk7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGFsbEJSRUVMaXN0KSB7CiAgICAgICAgICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIGphdmFXaXRoQnJlZS5nZXQob2JqZWN0KTsKICAgICAgICAgICAgICAgIHJlcG9ydFdyaXRlci5wcmludGYoIlx0XHQlNWRcdCVzXG4iLCBjb3VudC5pbnRWYWx1ZSgpLCBvYmplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgIEJ1bmRsZXMgd2l0aCBxdWVzdGlvbmFibGUgYWJzZW5jZSBvciBwcmVzZW5jZSBvZiBCUkVFIik7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgICAgSmF2YSBCdW5kbGVzIHdpdGhvdXQgYSBCUkVFOiAiICsgamF2YVdpdGhvdXRCcmVlLnNpemUoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoamF2YVdpdGhvdXRCcmVlKTsKICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGphdmFXaXRob3V0QnJlZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIE5vbiBKYXZhIEJ1bmRsZXMgd2l0aCBhIEJSRUU6ICIgKyBub25qYXZhV2l0aEJyZWUuc2l6ZSgpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub25qYXZhV2l0aEJyZWUpOwogICAgICAgICAgICBCUkVFRmlsZURhdGEgYnJlZWZpbGVkYXRhID0gbnVsbDsKICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vbmphdmFXaXRoQnJlZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJSRUVGaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgIGJyZWVmaWxlZGF0YSA9IChCUkVFRmlsZURhdGEpIG9iamVjdDsKICAgICAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIucHJpbnRmKCIlMjRzXHQlc1xuIiwgYnJlZWZpbGVkYXRhLmJyZWVWYWx1ZSwgYnJlZWZpbGVkYXRhLmZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUHJvZ3JhbW1pbmcgZXJyb3IuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGludCB0b3RhbENvdW50KE1hcCBqYXZhV2l0aEJyZWUpIHsKCiAgICAgICAgQ29sbGVjdGlvbiBhbGxDb3VudHMgPSBqYXZhV2l0aEJyZWUudmFsdWVzKCk7CiAgICAgICAgaW50IHRvdGFsID0gMDsKICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQ291bnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKICAgICAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBjb3VudC5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWw7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRyYWNrT21pc3Npb25zKExpc3QgamF2YVdpdGhvdXRCcmVlLCBGaWxlIGNoaWxkKSB7CiAgICAgICAgamF2YVdpdGhvdXRCcmVlLmFkZChjaGlsZC5nZXROYW1lKCkpOwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgdHJhY2tGYWxzZUluY2x1c2lvbnMoTGlzdCBsaXN0LCBGaWxlIGNoaWxkLCBTdHJpbmcgYnJlZSkgewogICAgICAgIGxpc3QuYWRkKG5ldyBCUkVFRmlsZURhdGEoY2hpbGQuZ2V0TmFtZSgpLCBicmVlKSk7CgogICAgfQoKICAgIHByaXZhdGUgdm9pZCBpbmNyZW1lbnRDb3VudHMoTWFwIGJyZWVNYXAsIFN0cmluZyBicmVlKSB7CiAgICAgICAgSW50ZWdlciBjb3VudCA9IChJbnRlZ2VyKSBicmVlTWFwLmdldChicmVlKTsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICBicmVlTWFwLnB1dChicmVlLCBuZXcgSW50ZWdlcigxKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBicmVlTWFwLnB1dChicmVlLCBpbmNyZW1lbnQoY291bnQpKTsKICAgICAgICB9CgogICAgfQoKICAgIHByaXZhdGUgSW50ZWdlciBpbmNyZW1lbnQoSW50ZWdlciBjb3VudCkgewogICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpICsgMSk7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSmF2YShGaWxlIGphcmZpbGUpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CiAgICAgICAgSmFyRmlsZSBqYXIgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGphcmZpbGUsIGZhbHNlLCBaaXBGaWxlLk9QRU5fUkVBRCk7CiAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgIEphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluc0phdmEgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zSmF2YShpbnB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGFpbnNKYXZhOwogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0phdmEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKICAgICAgICAvLyBXZSBhc3N1bWUgdGhlIGZpbGUgaXMgYSAnamFyJyBmaWxlLgogICAgICAgIGJvb2xlYW4gY29udGFpbnNKYXZhID0gZmFsc2U7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGphcklucHV0U3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGlucHV0KTsKICAgICAgICAgICAgd2hpbGUgKGphcklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewogICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNKYXZhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zSmF2YTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVOYW1lKFN0cmluZyBmdWxsbmFtZSkgewogICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwogICAgICAgIGJvb2xlYW4gcGFyc2FibGUgPSBuYW1lUGFyc2VyLnBhcnNlKGZ1bGxuYW1lKTsKICAgICAgICBpZiAocGFyc2FibGUpIHsKICAgICAgICAgICAgcmVzdWx0ID0gbmFtZVBhcnNlci5nZXRQcm9qZWN0U3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGlkIGZyb20gdGhlIG1hbmlmZXN0IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIGlucHV0CiAgICAgKiBzdHJlYW0uCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIGdldEJSRUVGcm9tTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBwYXRoKSB7CiAgICAgICAgU3RyaW5nIGJyZWUgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBicmVlID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoUFJPUEVSVFlfQlVORExFX1JFUVVJUkVEX0VYRUNVVElPTl9FTlZJUk9OTUVOVCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBicmVlOwogICAgfQoKCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGEgYnVuZGxlIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlLiBMb29rIGludG8KICAgICAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QlJFRUZyb21KQVIoRmlsZSBmaWxlKSB7CiAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwogICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICBqYXIgPSBuZXcgSmFyRmlsZShmaWxlLCBmYWxzZSwgWmlwRmlsZS5PUEVOX1JFQUQpOwogICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IGphci5nZXRKYXJFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gYWRkRXJyb3IoIkJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZTogIiArCiAgICAgICAgICAgICAgICAvLyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlucHV0ID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKICAgICAgICAgICAgcmV0dXJuIGdldEJSRUVGcm9tTWFuaWZlc3QoaW5wdXQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAvLyBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGphciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRCdW5kbGVEaXJlY3RvcnkoKSB7CiAgICAgICAgaWYgKGJ1bmRsZURpcmVjdG9yeSA9PSBudWxsKSB7CiAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldERpcmVjdG9yeVRvQ2hlY2soKTsKICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVlZCB0byBzZXQgaW5wdXQgZGlyZWN0b3J5IHRvIGNoZWNrIGFnYWluc3QuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgImFnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJ1bmRsZURpcmVjdG9yeSA9IHByb3BlcnR5ICsgIi9hZ2dyZWdhdGUvL3BsdWdpbnMiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBidW5kbGVEaXJlY3Rvcnk7CiAgICB9Cn0KUEsDBAoAAAAAADsC0j4DufawnCMAAJwjAAAqAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvRVNUZXN0LmNsYXNzyv66vgAAADEBngcAAgEAJG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL0VTVGVzdAcABAEAJm9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1Rlc3RKYXJzAQAhUFJPUEVSVFlfRUNMSVBTRV9TT1VSQ0VSRUZFUkVOQ0VTAQASTGphdmEvbGFuZy9PYmplY3Q7AQAKbmFtZVBhcnNlcgEAMkxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXI7AQAOb3V0cHV0RmlsZW5hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAANAQAKZXNkYXRhLnR4dAEAD2J1bmRsZURpcmVjdG9yeQEACDxjbGluaXQ+AQADKClWAQAEQ29kZQgAEwEAGEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcwkAAQAVDAAFAAYHABcBADBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIKABYAGQwAGgAQAQAGPGluaXQ+CQABABwMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQoAAwAZCQABACEMAA4ACgEABHRoaXMBACZMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvRVNUZXN0OwEABG1haW4BABYoW0xqYXZhL2xhbmcvU3RyaW5nOylWCgABABkIACgBACsvaG9tZS9maWxlcy9idWlsZHppcHMvaW5kaWdvUkMyL2VjbGlwc2VKRUUvCgABACoMACsALAEAE3NldERpcmVjdG9yeVRvQ2hlY2sBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEALgwALwAwAQARdGVzdEVTU2V0dGluZ1J1bGUBAAMoKVoKADIANAcAMwEAE2phdmEvaW8vSU9FeGNlcHRpb24MADUAEAEAD3ByaW50U3RhY2tUcmFjZQEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAKdGVzdGxheW91dAEAAWUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAApFeGNlcHRpb25zBwA9AQAMamF2YS9pby9GaWxlCgABAD8MAEAAQQEAEmdldEJ1bmRsZURpcmVjdG9yeQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CgA8AEMMABoALAoAPABFDABGADABAAZleGlzdHMKADwASAwASQAwAQALaXNEaXJlY3RvcnkHAEsBACNvcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbgcATQEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCABPAQASYnVuZGxlIGRpcmVjb3RyeSAoCgBMAEMKAEwAUgwAUwBUAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CABWAQAgKSBtdXN0IGJlIGFuIGV4aXN0aW5nIGRpcmVjdG9yeS4KAEwAWAwAWQBBAQAIdG9TdHJpbmcKAEoAQwoAAQBcDABdAF4BAA1jaGVja0J1bmRsZUVTAQARKExqYXZhL2lvL0ZpbGU7KVoBAAhpbnB1dGRpcgEADkxqYXZhL2lvL0ZpbGU7AQAPZmFpbHVyZXNPY2N1cmVkAQABWgoAZABmBwBlAQAQamF2YS9sYW5nL09iamVjdAwAZwBoAQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7CABqAQAVZXhjZXB0aW9ucy5wcm9wZXJ0aWVzCgBsAG4HAG0BAA9qYXZhL2xhbmcvQ2xhc3MMAG8AcAEAE2dldFJlc291cmNlQXNTdHJlYW0BACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL0lucHV0U3RyZWFtOwcAcgEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgBxABkIAHUBAAAKAHEAdwwAeAB5AQAEbG9hZAEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVggAewEADGVzRXhjZXB0aW9ucwoAcQB9DAB+AH8BAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgCBAIMHAIIBABNqYXZhL2lvL0lucHV0U3RyZWFtDACEABABAAVjbG9zZQcAhgEAEWphdmEvdXRpbC9IYXNoTWFwCgCFABkHAIkBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgCIABkHAIwBADBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIKAIsAGQoAPACPDACQAJEBAAlsaXN0RmlsZXMBACkoTGphdmEvaW8vRmlsZW5hbWVGaWx0ZXI7KVtMamF2YS9pby9GaWxlOwoAPACTDACUAEEBAAdnZXROYW1lCgABAJYMAJcAfwEADWdldEJ1bmRsZU5hbWUKAJkAmwcAmgEAEGphdmEvbGFuZy9TdHJpbmcMAJwAnQEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCgABAJ8MAKAAoQEADGdldEVTRnJvbUpBUgEAIihMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsIAKMBAAhwcm9qZWN0PQoAmQClDACmAKcBAAZsZW5ndGgBAAMoKUkKAAEAqQwAqgCrAQAPaW5jcmVtZW50Q291bnRzAQAkKExqYXZhL3V0aWwvTWFwO0xqYXZhL2xhbmcvU3RyaW5nOylWCgABAK0MAK4ArwEADnRyYWNrT21pc3Npb25zAQAhKExqYXZhL3V0aWwvTGlzdDtMamF2YS9pby9GaWxlOylWCgABALEMALIAswEAC3ByaW50cmVwb3J0AQAlKExqYXZhL3V0aWwvTWFwO0xqYXZhL3V0aWwvTGlzdDtJSUkpVgEADnByb3BlcnR5U3RyZWFtAQAVTGphdmEvaW8vSW5wdXRTdHJlYW07AQAVZXNFeGNlcHRpb25Qcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwEABndpdGhFcwEAD0xqYXZhL3V0aWwvTWFwOwEACXdpdGhvdXRFcwEAEExqYXZhL3V0aWwvTGlzdDsBAAhjaGlsZHJlbgEAD1tMamF2YS9pby9GaWxlOwEACXRvdGFsc2l6ZQEAAUkBAAdjaGVja2VkAQAMblByb2plY3RUYWdzAQABaQEABWNoaWxkAQAEbmFtZQEACmJ1bmRsZU5hbWUBAAJlcwcAyAEAK29yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIKAAEAygwAywBBAQASZ2V0T3V0cHV0RGlyZWN0b3J5CgDHAM0MABoAzgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoAxwDQDADRABABAAd3cml0ZWxuCADTAQAWICAgRGlyZWN0b3J5IGNoZWNrZWQ6IAoAxwDVDADRACwIANcBAAsgICBDaGVja2VkIAoATADZDABTANoBABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CADcAQAEIG9mIAgA3gEABiBqYXJzLggA4AEANyAgIE51bWJlciBvZiBidW5kbGVzIHdpdGggYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzOiAKAAEA4gwA4wDkAQAKdG90YWxDb3VudAEAEihMamF2YS91dGlsL01hcDspSQgA5gEAKSAgICAgICAgTnVtYmVyIG9mIHRob3NlIHdpdGggJ3Byb2plY3Q9JzogCADoAQALIGF0dHJpYnV0ZS4IAOoBADogICBOdW1iZXIgb2YgYnVuZGxlcyB3aXRob3V0IGFuIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlczogCwDsAO4HAO0BAA5qYXZhL3V0aWwvTGlzdAwA7wCnAQAEc2l6ZQgA8QEAMCAgQnVuZGxlcyB3aXRoIEVjbGlwc2UtU291cmNlUmVmZXJlbmNlcyAodG90YWw6IAgA8wEAASkLAPUA9wcA9gEADWphdmEvdXRpbC9NYXAMAPgA+QEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CgCIAPsMABoA/AEAGShMamF2YS91dGlsL0NvbGxlY3Rpb247KVYKAP4BAAcA/wEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwBAQECAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYLAOwBBAwBBQEGAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwEIAQoHAQkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAQsBDAEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwgBDgEAAyAgIAoATAEQDABTAREBAC0oTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsLAQgBEwwBFAAwAQAHaGFzTmV4dAgBFgEAOCAgICBCdW5kbGVzIHdpdGhvdXQgYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzICh0b3RhbDogCAEYAQAHICAgICAgIAoAxwCDAQAKd2l0aG91dEVTcwEADHJlcG9ydFdyaXRlcgEALUxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyOwEABmFsbEVTcwEAFkxqYXZhL3V0aWwvQ29sbGVjdGlvbjsBAAlhbGxFU0xpc3QBAAZvYmplY3QLAPUBIgwBIwEkAQAGdmFsdWVzAQAYKClMamF2YS91dGlsL0NvbGxlY3Rpb247CwEmAQQHAScBABRqYXZhL3V0aWwvQ29sbGVjdGlvbgcBKQEAEWphdmEvbGFuZy9JbnRlZ2VyCgEoASsMASwApwEACGludFZhbHVlAQANYnVuZGxlc1dpdGhFcwEACWFsbENvdW50cwEABXRvdGFsAQAUTGphdmEvdXRpbC9JdGVyYXRvcjsBAAVjb3VudAEAE0xqYXZhL2xhbmcvSW50ZWdlcjsLAOwBNAwBNQE2AQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQAQYnVuZGxlc1dpdGhvdXRFcwsA9QE5DAE6ATsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoBKAE9DAAaAT4BAAQoSSlWCwD1AUAMAUEBQgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgABAUQMAUUBRgEACWluY3JlbWVudAEAKChMamF2YS9sYW5nL0ludGVnZXI7KUxqYXZhL2xhbmcvSW50ZWdlcjsBAAVlc01hcAoAFgFJDAFKAUsBAAVwYXJzZQEAFShMamF2YS9sYW5nL1N0cmluZzspWgoAFgFNDAFOAEEBABBnZXRQcm9qZWN0U3RyaW5nAQAIZnVsbG5hbWUBAAZyZXN1bHQBAAhwYXJzYWJsZQEAEWdldEVTRnJvbU1hbmlmZXN0AQA7KExqYXZhL2lvL0lucHV0U3RyZWFtO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAVUBVwcBVgEAJW9yZy9lY2xpcHNlL29zZ2kvdXRpbC9NYW5pZmVzdEVsZW1lbnQMAVgBWQEAE3BhcnNlQnVuZGxlTWFuaWZlc3QBADUoTGphdmEvaW8vSW5wdXRTdHJlYW07TGphdmEvdXRpbC9NYXA7KUxqYXZhL3V0aWwvTWFwOwoBWwA0BwFcAQAib3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUV4Y2VwdGlvbgEABWlucHV0AQAEcGF0aAEACmF0dHJpYnV0ZXMBACRMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUV4Y2VwdGlvbjsHAWIBABVqYXZhL3V0aWwvamFyL0phckZpbGUKAWEBZAwAGgFlAQATKExqYXZhL2lvL0ZpbGU7WkkpVggBZwEAFE1FVEEtSU5GL01BTklGRVNULk1GCgFhAWkMAWoBawEAC2dldEphckVudHJ5AQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL2phci9KYXJFbnRyeTsKAWEAgwoBYQFuDAFvAXABAA5nZXRJbnB1dFN0cmVhbQEALyhMamF2YS91dGlsL3ppcC9aaXBFbnRyeTspTGphdmEvaW8vSW5wdXRTdHJlYW07CgA8AXIMAXMAQQEAD2dldEFic29sdXRlUGF0aAoAAQF1DAFSAVMJAXcBeQcBeAEAEGphdmEvbGFuZy9TeXN0ZW0MAXoBewEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwoAMgF9DAF+AEEBAApnZXRNZXNzYWdlCgGAAYIHAYEBABNqYXZhL2lvL1ByaW50U3RyZWFtDAGDACwBAAdwcmludGxuAQAEZmlsZQEAA2phcgEAF0xqYXZhL3V0aWwvamFyL0phckZpbGU7AQAFZW50cnkBABhMamF2YS91dGlsL2phci9KYXJFbnRyeTsKAAEBigwBiwBBAQATZ2V0RGlyZWN0b3J5VG9DaGVjawgBjQEALU5lZWQgdG8gc2V0IGlucHV0IGRpcmVjdG9yeSB0byBjaGVjayBhZ2FpbnN0LggBjwEAAS8KAJkBkQwBkgFLAQAIZW5kc1dpdGgKAJkBlAwBlQGWAQAHdmFsdWVP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AQACAK4BXQC1AAIABACsAYUBhgADABgACQGHAYgABAA5ABYBhwGIAAQAagAPADkAOgAEAAIAQABBAAEAEQAAAK0ABAACAAAAXSq0ACDHAFQqtgGJTCvHAA67AEpZEwGMtwBavysTAY62AZCZAB4quwBMWSu4AZO3AFATAZe2AFG2AFe1ACCnABsquwBMWSu4AZO3AFATAZm2AFG2AFe1ACAqtAAgsAAAAAIAHQAAACIACAAAASQABwElAAwBJgAQAScAGwEpACUBKgBAAS0AWAEwAB4AAAAWAAIAAABdACIAIwAAAAwATAGbAAoAAQABAZwAAAACAZ1QSwMECgAAAAAAawPEPmRvDK2cKAAAnCgAACkAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9FU1Rlc3QuamF2YS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwogKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwogKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5qYXJzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CmltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CmltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CgppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuRnVsbEphck5hbWVQYXJzZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuSkFSRmlsZU5hbWVGaWx0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHMuUmVwb3J0V3JpdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CgovKioKICogVGVzdCB0byBjaGVjayBNQU5JRkVTVC5NRiBmaWxlcyBpbiBqYXJzIGluIGEgcmVwb3NpdG9yeSBmb3IgcHJlc2VuY2Ugb2YKICogRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzLgogKiAKICogQHNpbmNlIDMuNwogKi8KcHVibGljIGNsYXNzIEVTVGVzdCBleHRlbmRzIFRlc3RKYXJzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgICAgICAgICAgICBQUk9QRVJUWV9FQ0xJUFNFX1NPVVJDRVJFRkVSRU5DRVMgPSAiRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bGxKYXJOYW1lUGFyc2VyIG5hbWVQYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGdWxsSmFyTmFtZVBhcnNlcigpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgICAgICAgICAgICAgICAgICAgID0gImVzZGF0YS50eHQiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgID0gbnVsbDsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIEVTVGVzdCB0ZXN0bGF5b3V0ID0gbmV3IEVTVGVzdCgpOwogICAgICAgIHRlc3RsYXlvdXQuc2V0RGlyZWN0b3J5VG9DaGVjaygiL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2luZGlnb1JDMi9lY2xpcHNlSkVFLyIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRlc3RsYXlvdXQudGVzdEVTU2V0dGluZ1J1bGUoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CgogICAgfQoKCgogICAgcHVibGljIGJvb2xlYW4gdGVzdEVTU2V0dGluZ1J1bGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKICAgICAgICBGaWxlIGlucHV0ZGlyID0gbmV3IEZpbGUoZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwogICAgICAgIGlmICghKGlucHV0ZGlyLmV4aXN0cygpICYmIGlucHV0ZGlyLmlzRGlyZWN0b3J5KCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYnVuZGxlIGRpcmVjb3RyeSAoIiArIGdldEJ1bmRsZURpcmVjdG9yeSgpICsgIikgbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnkuIik7CiAgICAgICAgfQoKICAgICAgICBib29sZWFuIGZhaWx1cmVzT2NjdXJlZDsKCiAgICAgICAgZmFpbHVyZXNPY2N1cmVkID0gY2hlY2tCdW5kbGVFUyhpbnB1dGRpcik7CgogICAgICAgIHJldHVybiBmYWlsdXJlc09jY3VyZWQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVuZGxlRVMoRmlsZSBpbnB1dGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyByZXNldC9pbml0aWFsaXplIGVycm9ycwogICAgICAgIElucHV0U3RyZWFtIHByb3BlcnR5U3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImV4Y2VwdGlvbnMucHJvcGVydGllcyIpOwogICAgICAgIFByb3BlcnRpZXMgZXNFeGNlcHRpb25Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBTdHJpbmcgZXNFeGNlcHRpb25zID0gIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZXNFeGNlcHRpb25Qcm9wZXJ0aWVzLmxvYWQocHJvcGVydHlTdHJlYW0pOwogICAgICAgICAgICBlc0V4Y2VwdGlvbnMgPSBlc0V4Y2VwdGlvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImVzRXhjZXB0aW9ucyIpOwogICAgICAgICAgICBpZiAoZXNFeGNlcHRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGVzRXhjZXB0aW9ucyA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB1bnVzdWFsIHRvIGdldCBoZXJlPwogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIE1hcCB3aXRoRXMgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgIExpc3Qgd2l0aG91dEVzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgIGJvb2xlYW4gZmFpbHVyZXNPY2N1cmVkID0gZmFsc2U7CiAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gaW5wdXRkaXIubGlzdEZpbGVzKG5ldyBKQVJGaWxlTmFtZUZpbHRlcigpKTsKICAgICAgICBpbnQgdG90YWxzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgIGludCBjaGVja2VkID0gMDsKICAgICAgICBpbnQgblByb2plY3RUYWdzID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CgogICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGdldEJ1bmRsZU5hbWUobmFtZSk7CiAgICAgICAgICAgIGlmICgoYnVuZGxlTmFtZSAhPSBudWxsKSAmJiAhZXNFeGNlcHRpb25zLmNvbnRhaW5zKGJ1bmRsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICBjaGVja2VkKys7CiAgICAgICAgICAgICAgICBTdHJpbmcgZXMgPSBnZXRFU0Zyb21KQVIoY2hpbGQpOwogICAgICAgICAgICAgICAgaWYgKChlcyAhPSBudWxsKSAmJiBlcy5jb250YWlucygicHJvamVjdD0iKSkgewogICAgICAgICAgICAgICAgICAgIG5Qcm9qZWN0VGFncysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChlcyAhPSBudWxsKSAmJiAoZXMubGVuZ3RoKCkgPiAwKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGhhcyBFUwogICAgICAgICAgICAgICAgICAgIGluY3JlbWVudENvdW50cyh3aXRoRXMsIGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIG5vIEVTCiAgICAgICAgICAgICAgICAgICAgdHJhY2tPbWlzc2lvbnMod2l0aG91dEVzLCBjaGlsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRyZXBvcnQod2l0aEVzLCB3aXRob3V0RXMsIHRvdGFsc2l6ZSwgY2hlY2tlZCwgblByb2plY3RUYWdzKTsKCiAgICAgICAgcmV0dXJuIGZhaWx1cmVzT2NjdXJlZDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRyZXBvcnQoTWFwIHdpdGhFcywgTGlzdCB3aXRob3V0RVNzLCBpbnQgdG90YWxzaXplLCBpbnQgY2hlY2tlZCwgaW50IG5Qcm9qZWN0VGFncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgogICAgICAgIFJlcG9ydFdyaXRlciByZXBvcnRXcml0ZXIgPSBuZXcgUmVwb3J0V3JpdGVyKGdldE91dHB1dERpcmVjdG9yeSgpLCBvdXRwdXRGaWxlbmFtZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIERpcmVjdG9yeSBjaGVja2VkOiAiICsgZ2V0QnVuZGxlRGlyZWN0b3J5KCkpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgQ2hlY2tlZCAiICsgY2hlY2tlZCArICIgb2YgIiArIHRvdGFsc2l6ZSArICIgamFycy4iKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgIE51bWJlciBvZiBidW5kbGVzIHdpdGggYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzOiAiICsgdG90YWxDb3VudCh3aXRoRXMpKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAgTnVtYmVyIG9mIHRob3NlIHdpdGggJ3Byb2plY3Q9JzogIiArIG5Qcm9qZWN0VGFncyArICIgYXR0cmlidXRlLiIpOwogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgTnVtYmVyIG9mIGJ1bmRsZXMgd2l0aG91dCBhbiBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXM6ICIgKyB3aXRob3V0RVNzLnNpemUoKSk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCk7CiAgICAgICAgICAgIHJlcG9ydFdyaXRlci53cml0ZWxuKCIgIEJ1bmRsZXMgd2l0aCBFY2xpcHNlLVNvdXJjZVJlZmVyZW5jZXMgKHRvdGFsOiAiICsgdG90YWxDb3VudCh3aXRoRXMpICsgIikiKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgQ29sbGVjdGlvbiBhbGxFU3MgPSB3aXRoRXMua2V5U2V0KCk7CiAgICAgICAgICAgIExpc3QgYWxsRVNMaXN0ID0gbmV3IEFycmF5TGlzdChhbGxFU3MpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGFsbEVTTGlzdCk7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGFsbEVTTGlzdCkgewogICAgICAgICAgICAgICAgLy9JbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIHdpdGhFcy5nZXQob2JqZWN0KTsKICAgICAgICAgICAgICAgIC8vcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICIgKyBjb3VudC5pbnRWYWx1ZSgpICsgIiAgIiArIG9iamVjdCk7CiAgICAgICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigiICAgIiArIG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oKTsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICBCdW5kbGVzIHdpdGhvdXQgYW4gRWNsaXBzZS1Tb3VyY2VSZWZlcmVuY2VzICh0b3RhbDogIiArIHdpdGhvdXRFU3Muc2l6ZSgpICsgIikiKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh3aXRob3V0RVNzKTsKICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogd2l0aG91dEVTcykgewogICAgICAgICAgICAgICAgcmVwb3J0V3JpdGVyLndyaXRlbG4oIiAgICAgICAiICsgb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXBvcnRXcml0ZXIud3JpdGVsbigpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgcmVwb3J0V3JpdGVyLmNsb3NlKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgaW50IHRvdGFsQ291bnQoTWFwIGJ1bmRsZXNXaXRoRXMpIHsKCiAgICAgICAgQ29sbGVjdGlvbiBhbGxDb3VudHMgPSBidW5kbGVzV2l0aEVzLnZhbHVlcygpOwogICAgICAgIGludCB0b3RhbCA9IDA7CiAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbENvdW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgY291bnQuaW50VmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCB0cmFja09taXNzaW9ucyhMaXN0IGJ1bmRsZXNXaXRob3V0RXMsIEZpbGUgY2hpbGQpIHsKICAgICAgICBidW5kbGVzV2l0aG91dEVzLmFkZChjaGlsZC5nZXROYW1lKCkpOwoKICAgIH0KCgogICAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudENvdW50cyhNYXAgZXNNYXAsIFN0cmluZyBlcykgewogICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgZXNNYXAuZ2V0KGVzKTsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICBlc01hcC5wdXQoZXMsIG5ldyBJbnRlZ2VyKDEpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVzTWFwLnB1dChlcywgaW5jcmVtZW50KGNvdW50KSk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcml2YXRlIEludGVnZXIgaW5jcmVtZW50KEludGVnZXIgY291bnQpIHsKICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpOwogICAgfQoKCgogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlTmFtZShTdHJpbmcgZnVsbG5hbWUpIHsKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKICAgICAgICBib29sZWFuIHBhcnNhYmxlID0gbmFtZVBhcnNlci5wYXJzZShmdWxsbmFtZSk7CiAgICAgICAgaWYgKHBhcnNhYmxlKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5hbWVQYXJzZXIuZ2V0UHJvamVjdFN0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm4gdGhlIGJ1bmRsZSBpZCBmcm9tIHRoZSBtYW5pZmVzdCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpbnB1dAogICAgICogc3RyZWFtLgogICAgICovCiAgICBwcml2YXRlIFN0cmluZyBnZXRFU0Zyb21NYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICBTdHJpbmcgZXMgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW5wdXQsIG51bGwpOwogICAgICAgICAgICBlcyA9IChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KFBST1BFUlRZX0VDTElQU0VfU09VUkNFUkVGRVJFTkNFUyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBlczsKICAgIH0KCiAgICAvKgogICAgICogVGhlIGdpdmVuIGZpbGUgcG9pbnRzIHRvIGEgYnVuZGxlIGNvbnRhaW5lZCBpbiBhbiBhcmNoaXZlLiBMb29rIGludG8KICAgICAqIHRoZSBidW5kbGUgbWFuaWZlc3QgZmlsZSB0byBmaW5kIHRoZSBidW5kbGUgaWRlbnRpZmllci4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RVNGcm9tSkFSKEZpbGUgZmlsZSkgewogICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKICAgICAgICBKYXJGaWxlIGphciA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgamFyID0gbmV3IEphckZpbGUoZmlsZSwgZmFsc2UsIFppcEZpbGUuT1BFTl9SRUFEKTsKICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoSmFyRmlsZS5NQU5JRkVTVF9OQU1FKTsKICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIGFkZEVycm9yKCJCdW5kbGUgZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGU6ICIgKwogICAgICAgICAgICAgICAgLy8gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnB1dCA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CiAgICAgICAgICAgIHJldHVybiBnZXRFU0Zyb21NYW5pZmVzdChpbnB1dCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIC8vIGFkZEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgamFyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZURpcmVjdG9yeSgpIHsKICAgICAgICBpZiAoYnVuZGxlRGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0RGlyZWN0b3J5VG9DaGVjaygpOwogICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZWVkIHRvIHNldCBpbnB1dCBkaXJlY3RvcnkgdG8gY2hlY2sgYWdhaW5zdC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydHkuZW5kc1dpdGgoIi8iKSkgewogICAgICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiYWdncmVnYXRlL3BsdWdpbnMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYnVuZGxlRGlyZWN0b3J5ID0gcHJvcGVydHkgKyAiL2FnZ3JlZ2F0ZS9wbHVnaW5zIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVuZGxlRGlyZWN0b3J5OwogICAgfQoKfQpQSwMECgAAAAAAACHJPscv7m7/AwAA/wMAAC8AAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9jb25maWcucHJvcGVydGllcyMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwKIyBhYm91dCBmaWxlLCBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmb3IgdHJhbnNsYXRpb24sCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4KZGVmYXVsdC5zb3VyY2UuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUgpkZWZhdWx0LmJpbmFyeS5qYXIgPSBNRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQlhYm91dFwuaHRtbAoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBzb3VyY2UgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LAojIGFib3V0IGZpbGUsIHBsdWdpbi54bWwgYW5kIHBsdWdpbi5wcm9wZXJ0aWVzIGZvciB0cmFuc2xhdGlvbiwKIyBhcyB3ZWxsIGFzIGEgemlwIGZpbGUgd2l0aCBzb3VyY2UgYW5kIGFuIGFib3V0LiBOb3RlIHRoZQojIGV4dHJhIGRpcmVjdG9yeSBlbnRyeSBhdCB0aGUgYmVnaW5uaW5nCmRlZmF1bHQuc291cmNlLnppcCA9IF4uKi9NRVRBLUlORi9NQU5JRkVTVFwuTUYsIFwKCQleLiovYWJvdXRcLmh0bWwKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUi4gTm90ZSB0aGUKIyBleHRyYSBkaXJlY3RvcnkgZW50cnkgYXQgdGhlIGJlZ2lubmluZwpkZWZhdWx0LmJpbmFyeS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJXi4qL2Fib3V0XC5odG1sCgoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBmZWF0dXJlCmRlZmF1bHQuZmVhdHVyZSA9IGxpY2Vuc2VcLmh0bWwsIFwKCQkoZWRsLXYxMFwuaHRtbHxlcGwtdjEwXC5odG1sKVBLAwQKAAAAAADKago7ToF6UXQHAAB0BwAAMwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL2NvbmZpZ0hPTEQucHJvcGVydGllcyMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgc291cmNlIGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwKIyBhYm91dCBmaWxlLCBwbHVnaW4ueG1sIGFuZCBwbHVnaW4ucHJvcGVydGllcyBmb3IgdHJhbnNsYXRpb24sCiMgYXMgd2VsbCBhcyBhIHppcCBmaWxlIHdpdGggc291cmNlIGFuZCBhbiBhYm91dC4KZGVmYXVsdC5zb3VyY2UuamFyID0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcwoKIyBkZWZhdWx0IGxheW91dCBmb3IgYSBiaW5hcnkgYnVuZGxlLiBjb250YWlucyBhIG1hbmlmZXN0LCAKIyBhYm91dCBmaWxlLCBhbmQgYXQgbGVhc3Qgb25lIGNsYXNzIGZpbGUgb3IgSkFSCmRlZmF1bHQuYmluYXJ5LmphciA9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMsIFwKCQkuKlwuKGNsYXNzfGphcikkCgojIGRlZmF1bHQgbGF5b3V0IGZvciBhIHNvdXJjZSBidW5kbGUuIGNvbnRhaW5zIGEgbWFuaWZlc3QsCiMgYWJvdXQgZmlsZSwgcGx1Z2luLnhtbCBhbmQgcGx1Z2luLnByb3BlcnRpZXMgZm9yIHRyYW5zbGF0aW9uLAojIGFzIHdlbGwgYXMgYSB6aXAgZmlsZSB3aXRoIHNvdXJjZSBhbmQgYW4gYWJvdXQuIE5vdGUgdGhlCiMgZXh0cmEgZGlyZWN0b3J5IGVudHJ5IGF0IHRoZSBiZWdpbm5pbmcKZGVmYXVsdC5zb3VyY2UuemlwID0gXi4qL01FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCV4uKi9hYm91dFwuaHRtbCwgXAoJCV4uKi8ocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMKCiMgZGVmYXVsdCBsYXlvdXQgZm9yIGEgYmluYXJ5IGJ1bmRsZS4gY29udGFpbnMgYSBtYW5pZmVzdCwgCiMgYWJvdXQgZmlsZSwgYW5kIGF0IGxlYXN0IG9uZSBjbGFzcyBmaWxlIG9yIEpBUi4gTm90ZSB0aGUKIyBleHRyYSBkaXJlY3RvcnkgZW50cnkgYXQgdGhlIGJlZ2lubmluZwpkZWZhdWx0LmJpbmFyeS56aXAgPSBeLiovTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJXi4qL2Fib3V0XC5odG1sLCBcCgkJXi4qLyhwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcywgXAoJCS4qXC4oY2xhc3N8amFyKSQKCiMgc3BlY2lhbCBjYXNlIG9mIGEgY29kZSBidW5kbGUgbm90IGNvbnRhaW5pbmcgY29kZSA/Cm9yZy5lY2xpcHNlLndzdC54c2wuc2F4b249IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCgkJCiMgc3BlY2lhbCBjYXNlIHdpdGggbm8gY29kZTogYnJhbmRpbmcgYnVuZGxlCm9yZy5lY2xpcHNlLndzdC54c2w9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCgkJCiMgc3BlY2lhbCBjYXNlIHdpdGggbm8gY29kZTogYnJhbmRpbmcgYnVuZGxlCQpvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZwcm9qLnNkaz0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcyAJCgojIHNwZWNpYWwgY2FzZSB3aXRoIG5vIGNvZGU6IGJyYW5kaW5nIGJ1bmRsZQkJCQpvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZwcm9qLmVuYWJsZW1lbnQuamR0LnNkaz0gTUVUQS1JTkYvTUFOSUZFU1RcLk1GLCBcCgkJYWJvdXRcLmh0bWwsIFwKCQkuKihwbHVnaW58YnVuZGxlKVwucHJvcGVydGllcyAJCgkJCiMgc3BlY2lhbCBjYXNlIG9mIGEgYnVuZGxlIHdpdGggbm8gY29kZQkJCm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWk9IE1FVEEtSU5GL01BTklGRVNUXC5NRiwgXAoJCWFib3V0XC5odG1sLCBcCgkJLioocGx1Z2lufGJ1bmRsZSlcLnByb3BlcnRpZXMgCQoJCQkJCVBLAwQKAAAAAADKago77bed9NgDAADYAwAAMwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL2V4Y2VwdGlvbnMucHJvcGVydGllc2JyZWVFeGNlcHRpb25zPW9yZy5lY2xpcHNlLnN3dCwgXAogb3JnLmVjbGlwc2UuY29tcGFyZS5leGFtcGxlcy54bWwsIFwKIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnNkay5leGFtcGxlcywgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludCwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS50ZWFtLmV4YW1wbGVzLmZpbGVzeXN0ZW0sIFwKIG9yZy5lY2xpcHNlLnVpLmV4YW1wbGVzLmphdmFlZGl0b3IsIFwKIG9yZy5lY2xpcHNlLmNvbXBhcmUuZXhhbXBsZXMueG1sLCBcCiBvcmcuZWNsaXBzZS5jb21wYXJlLmV4YW1wbGVzLCBcCiBvcmcuZWNsaXBzZS5zZGsuZXhhbXBsZXMsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciwgXAogb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLCBcCiBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQsIFwKIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcywgXAogb3JnLmVjbGlwc2UudGVhbS5leGFtcGxlcy5maWxlc3lzdGVtLCBcCiBvcmcuZWNsaXBzZS51aS5leGFtcGxlcy5qYXZhZWRpdG9yLCBcClBLAwQKAAAAAAA7AtI+XCPWhZs2AACbNgAAQgAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9GZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlci5jbGFzc8r+ur4AAAAxAaIHAAIBADxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIHAAQBACdvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvVGVzdFJlcG8BACFTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUBABJMamF2YS9sYW5nL1N0cmluZzsBAAg8Y2xpbml0PgEAAygpVgEABENvZGUIAAsBABtzdGFuZGFyZExpY2Vuc2VzLnByb3BlcnRpZXMJAAEADQwABQAGAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAGPGluaXQ+CgADABIMABAACAEABHRoaXMBAD5Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyOwEAF2NoZWNrTGljZW5zZUNvbnNpc3RlbmN5AQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspWgEACkV4Y2VwdGlvbnMHABkBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVoHAB0BABRqYXZhL3V0aWwvUHJvcGVydGllcwoAHAASCgAgACIHACEBABBqYXZhL2xhbmcvT2JqZWN0DAAjACQBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsKACYAKAcAJwEAD2phdmEvbGFuZy9DbGFzcwwAKQAqAQATZ2V0UmVzb3VyY2VBc1N0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07CgAcACwMAC0ALgEABGxvYWQBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYIADABAAtsaWNlbnNlMjAxMQoAHAAyDAAzADQBAAtnZXRQcm9wZXJ0eQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CAA2AQALbGljZW5zZTIwMTAHADgBADBvcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0xpY2Vuc2UKADcAOgwAEAA7AQA1KExqYXZhL25ldC9VUkk7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYHAD0BABNqYXZhL3V0aWwvQXJyYXlMaXN0CgA8ABIKAAEAQAwAQQBCAQANY2hlY2tMaWNlbnNlcwEA0ihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JTGljZW5zZTtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JTGljZW5zZTtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDspVgoAAQBEDABFAEYBABJwcmludFJlcG9ydExpY2Vuc2UBAFMoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvTGlzdDspVgsASABKBwBJAQAOamF2YS91dGlsL0xpc3QMAEsATAEABHNpemUBAAMoKUkBAAthbGxGZWF0dXJlcwEAK0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsBAAZyZXN1bHQBAAFaAQAKcHJvcGVydGllcwEAFkxqYXZhL3V0aWwvUHJvcGVydGllczsBAAhpblN0cmVhbQEAFUxqYXZhL2lvL0lucHV0U3RyZWFtOwEACGJvZHkyMDExAQAIYm9keTIwMTABABNzdGFuZGFyZExpY2Vuc2UyMDExAQAqTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7AQATc3RhbmRhcmRMaWNlbnNlMjAxMAEACW5vTGljZW5zZQEAEExqYXZhL3V0aWwvTGlzdDsBAAxleHRyYUxpY2Vuc2UBAAtnb29kTGljZW5zZQEACm9sZExpY2Vuc2UBAApiYWRMaWNlbnNlAQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQBETGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsBAgooTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYJAGUAZwcAZgEAEGphdmEvbGFuZy9TeXN0ZW0MAGgAaQEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwcAawEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCABtAQAkTnVtYmVyIG9mIElVcyBkdXJpbmcgbGljZW5zZSBjaGVjazogCgBqAG8MABAAcAEAFShMamF2YS9sYW5nL1N0cmluZzspVgsAcgB0BwBzAQApb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQMAHUAdgEAEXRvVW5tb2RpZmlhYmxlU2V0AQARKClMamF2YS91dGlsL1NldDsLAHgASgcAeQEADWphdmEvdXRpbC9TZXQKAGoAewwAfAB9AQAGYXBwZW5kAQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoAagB/DACAAIEBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7CgCDAIUHAIQBABNqYXZhL2lvL1ByaW50U3RyZWFtDACGAHABAAdwcmludGxuCwB4AIgMAIkAigEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwsAjACOBwCNAQASamF2YS91dGlsL0l0ZXJhdG9yDACPAJABAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsHAJIBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQLAJEAlAwAlQCBAQAFZ2V0SWQIAJcBAA4uZmVhdHVyZS5ncm91cAoAmQCbBwCaAQAQamF2YS9sYW5nL1N0cmluZwwAnACdAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoLAJEAnwwAoAChAQALZ2V0TGljZW5zZXMBACooTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL3V0aWwvQ29sbGVjdGlvbjsLAKMApQcApAEAFGphdmEvdXRpbC9Db2xsZWN0aW9uDACmAKcBAAdpc0VtcHR5AQADKClaCwBIAKkMAKoAqwEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgsAowBKCwCjAIgHAK8BAChvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lMaWNlbnNlCwCuALEMALIAgQEAB2dldFVVSUQKAJkAtAwAtQCrAQAGZXF1YWxzCwCMALcMALgApwEAB2hhc05leHQIALoBACZOdW1iZXIgZmVhdHVyZXMgZHVyaW5nIGxpY2Vuc2UgY2hlY2s6IAgAvAEAKU51bWJlciBub24tZmVhdHVlcyBkdXJpbmcgbGljZW5zZSBjaGVjazogAQATcGxhdGZvcm1MaWNlbnNlMjAxMQEAE3BsYXRmb3JtTGljZW5zZTIwMTABAAluRmVhdHVyZXMBAAFJAQAMbk5vbkZlYXR1cmVzAQAHZmVhdHVyZQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQAIbGljZW5zZXMBABZMamF2YS91dGlsL0NvbGxlY3Rpb247AQAOZmVhdHVyZUxpY2Vuc2UBAEJMamF2YS91dGlsL0NvbGxlY3Rpb248TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUxpY2Vuc2U7PjsBAVcoTGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylWCADKAQAdPGJyIC8+PT09PT09PT09PT09PT09PT09PT09PT0KAAEAzAwAzQCBAQASZ2V0T3V0cHV0RGlyZWN0b3J5BwDPAQAMamF2YS9pby9GaWxlCADRAQAXbGljZW5zZUNvbnNpc3RlbmN5Lmh0bWwKAM4A0wwAEADUAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwDWAQASamF2YS9pby9GaWxlV3JpdGVyCgDVANgMABAA2QEAEShMamF2YS9pby9GaWxlOylWCADbAQAIb3V0cHV0OiAKAM4A3QwA3gCBAQAPZ2V0QWJzb2x1dGVQYXRoCgBqAOAMAHwA4QEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgA4wEAITxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6IAoAAQDlDADmAIEBABBnZXRSZXBvVVJMVG9UZXN0CADoAQAEPC9wPgkAAQDqDADrAAYBAANFT0wKAAEA7QwAhgDuAQApKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvbGFuZy9TdHJpbmc7KVYIAPABACg8YnIgLz48YnIgLz5MaWNlbnNlIENvbnNpc3RlbmN5IFN1bW1hcnk6CADyAQApRmVhdHVyZXMgd2l0aCBjb25mb3JtaW5nICgyMDExKSBsaWNlbnNlOiAIAPQBACJGZWF0dXJlcyB3aXRoIG9sZCAoMjAxMCkgbGljZW5zZTogCAD2AQAhRmVhdHVyZXMgd2l0aCBkaWZmZXJlbnQgbGljZW5zZTogCAD4AQAaRmVhdHVyZXMgd2l0aCBubyBsaWNlbnNlOiAIAPoBAB5GZWF0dXJlcyB3aXRoIGV4dHJhIGxpY2Vuc2VzOiAIAPwBABc9PT09PT09PT09PT09PT09PT09PT09PQgA/gEAFDxiciAvPjxiciAvPkRldGFpbHM6CAEAAQAZRmVhdHVyZXMgd2l0aCBubyBsaWNlbnNlOgcBAgEALW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvcgoBAQASCgEFAQcHAQYBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAQgBCQEABHNvcnQBACkoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjspVgsASACICAEMAQAsPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkaWZmZXJlbnQgbGljZW5zZToIAQ4BAC08YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIG9sZCAoMjAxMCkgbGljZW5zZToIARABADI8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIG1hdGNoaW5nICgyMDExKSBsaWNlbnNlOgoAGAESDAETAAgBAA9wcmludFN0YWNrVHJhY2UKANUBFQwBFgAIAQAFY2xvc2UBAAZTUEFDRVIBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBAAt0ZXN0RGlyTmFtZQEABHVuaXQBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQATdGVzdERpc3BsYXlhYmxlRGF0YQcBIgEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcBJAEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24HASYBADNvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KAAEBKAwBKQEqAQAOZ2V0QWxsR3JvdXBJVXMBAC0oKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsKAAEBLAwAFQAWCgABAS4MAS8AFgEAD2NoZWNrQ29weXJpZ2h0cwoAAQExDAEyABYBABFjaGVja0Rlc2NyaXB0aW9ucwEABmFsbElVcwsAkQE1DAE2ATcBAAxnZXRDb3B5cmlnaHQBAEAoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lDb3B5cmlnaHQ7CwE5ATsHAToBACpvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lDb3B5cmlnaHQMATwAgQEAB2dldEJvZHkKAJkBPgwBPwBMAQAGbGVuZ3RoCAFBAQABJQoAmQFDDAFEAJ0BAApzdGFydHNXaXRoCAFGAQABWwgBSAEACUNvcHlyaWdodAgBSgEADShjKSBDb3B5cmlnaHQKAJkBTAwBTQFOAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoIAVABAAljb3B5cmlnaHQKAAEBUgwBUwFUAQAVcHJpbnRSZXBvcnRDb3B5cmlnaHRzAQAzKExqYXZhL3V0aWwvTGlzdDtMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0OylWAQAQbm9PckJhZENvcHlyaWdodAEAC29rQ29weXJpZ2h0AQAWaW5kZXRlcm1pbmF0ZUNvcHlyaWdodAEALExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lDb3B5cmlnaHQ7AQAEYm9keQgBWwEAIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGVzY3JpcHRpb24LAJEBXQwAMwFeAQA4KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsKAAEBYAwBYQFiAQAWcHJpbnRSZXBvcnREZXNjcmlwdGlvbgEAIyhMamF2YS91dGlsL0xpc3Q7TGphdmEvdXRpbC9MaXN0OylWAQAJbm9uZU9yQmFkAQACb2sBAAtkZXNjcmlwdGlvbgEAiyhMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYIAWgBABFkZXNjcmlwdGlvbnMuaHRtbAgBagEAHzxiciAvPjxiciAvPkRlc2NyaXB0aW9uIFJlcG9ydDoIAWwBAC5GZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGRlc2NyaXB0aW9uczogCAFuAQAbRmVhdHVyZXMgcHJvYmFibHkgY29ycmVjdDogCAFwAQAoRmVhdHVyZXMgd2l0aCBubyBvciBkdWJpb3VzIGRlc2NyaXBpdG9uOgoAAQFyDAFzAXQBABRwcmludExpbmVEZXNjcmlwdGlvbgEASShMamF2YS9pby9GaWxlV3JpdGVyO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVYIAXYBACc8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIGRlc2NyaXBpdG9uczoBAM8oTGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+O0xqYXZhL3V0aWwvTGlzdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYIAXkBAA9jb3B5cmlnaHRzLmh0bWwIAXsBAB08YnIgLz48YnIgLz5Db3B5cmlnaHQgUmVwb3J0OggBfQEALEZlYXR1cmVzIHdyb25nIG9yIHVuZXhwbGFpbmFibGUgY29weXJpZ2h0czogCAF/AQAwRmVhdHVyZXMgbWF5YmUgd3JvbmcsIG1heWJlIGNvcnJlY3QgY29weXJpZ2h0czogCAGBAQA7RmVhdHVyZXMgd2l0aCBubyBvciBwcm9iYWJseSBpbmNvcnJlY3QgY29weXJpZ2h0IHN0YXRlbWVudDoKAAEBgwwBhAF0AQAScHJpbnRMaW5lQ29weXJpZ2h0CAGGAQBnPGJyIC8+PGJyIC8+SW5kZXRlcm1pbmFudDogZmVhdHVyZSdzIGNvcHlyaWdo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EwGXtgDfGQW2AN+yAZm2AN8TAZe2AN8ttgDftgB+tgDssQAAAAIADgAAABYABQAAAVkACwFaABMBWwAeAVwATQFdAA8AAAA+AAYAAABOABMAFAAAAAAATgEYARkAAQAAAE4BnADDAAIACwBDAWUABgADABMAOwGeAAYABAAeADABnwAGAAUAAQGgAAAAAgGhUEsDBAoAAAAAAEGXxD6R3LNkoj4AAKI+AABBAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5MaWNlbnNlOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUNvcHlyaWdodDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUxpY2Vuc2U7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5JVUlkQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBGZWF0dXJlRGlzcGxheWFibGVEYXRhQ2hlY2tlciBleHRlbmRzIFRlc3RSZXBvIHsKICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUgPSAic3RhbmRhcmRMaWNlbnNlcy5wcm9wZXJ0aWVzIjsKCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tMaWNlbnNlQ29uc2lzdGVuY3koSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKCiAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShTVEFOREFSRF9MSUNFTlNFU19QUk9QRVJUSUVTX0ZJTEUpOwogICAgICAgIHByb3BlcnRpZXMubG9hZChpblN0cmVhbSk7CiAgICAgICAgU3RyaW5nIGJvZHkyMDExID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibGljZW5zZTIwMTEiKTsKICAgICAgICBTdHJpbmcgYm9keTIwMTAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJsaWNlbnNlMjAxMCIpOwogICAgICAgIElMaWNlbnNlIHN0YW5kYXJkTGljZW5zZTIwMTEgPSBuZXcgTGljZW5zZShudWxsLCBib2R5MjAxMSwgbnVsbCk7CiAgICAgICAgSUxpY2Vuc2Ugc3RhbmRhcmRMaWNlbnNlMjAxMCA9IG5ldyBMaWNlbnNlKG51bGwsIGJvZHkyMDEwLCBudWxsKTsKCiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBleHRyYUxpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBnb29kTGljZW5zZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBiYWRMaWNlbnNlID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIGNoZWNrTGljZW5zZXMoc3RhbmRhcmRMaWNlbnNlMjAxMSwgc3RhbmRhcmRMaWNlbnNlMjAxMCwgYWxsRmVhdHVyZXMsIGdvb2RMaWNlbnNlLCBvbGRMaWNlbnNlLCBiYWRMaWNlbnNlLCBub0xpY2Vuc2UsIGV4dHJhTGljZW5zZSk7CgogICAgICAgIHByaW50UmVwb3J0TGljZW5zZShnb29kTGljZW5zZSwgb2xkTGljZW5zZSwgYmFkTGljZW5zZSwgbm9MaWNlbnNlLCBleHRyYUxpY2Vuc2UpOwogICAgICAgIHJlc3VsdCA9ICgoYmFkTGljZW5zZS5zaXplKCkgPiAwKSB8fCAoZXh0cmFMaWNlbnNlLnNpemUoKSA+IDApIHx8IChub0xpY2Vuc2Uuc2l6ZSgpID4gMCkpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNoZWNrTGljZW5zZXMoSUxpY2Vuc2UgcGxhdGZvcm1MaWNlbnNlMjAxMSwgSUxpY2Vuc2UgcGxhdGZvcm1MaWNlbnNlMjAxMCwgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGdvb2RMaWNlbnNlLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkTGljZW5zZSwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZXh0cmFMaWNlbnNlKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgSVVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAiICsgYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKS5zaXplKCkpOwogICAgICAgIGludCBuRmVhdHVyZXMgPSAwOwogICAgICAgIGludCBuTm9uRmVhdHVyZXMgPSAwOwogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgSUQ6ICIgKyBmZWF0dXJlLmdldElkKCkpOwogICAgICAgICAgICAvLyBpZ25vcmUgSVVzIHRoYXQgYXJlIG5vdCBmZWF0dXJlcwogICAgICAgICAgICAvLyBUT0RPOiBidXQsIHdlIGdldCAiZ3JvdXBzIiAuLi4gd2hhdCBraW5kIG9mIGdyb3VwcyBhcmUgbm90IGZlYXR1cmUgZ3JvdXBzPyAKICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2V0SWQoKS5lbmRzV2l0aCgiLmZlYXR1cmUuZ3JvdXAiKSkgewogICAgICAgICAgICAgICAgbkZlYXR1cmVzKys7CiAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPElMaWNlbnNlPiBsaWNlbnNlcyA9IGZlYXR1cmUuZ2V0TGljZW5zZXMobnVsbCk7CiAgICAgICAgICAgICAgICBpZiAobGljZW5zZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgbm9MaWNlbnNlLmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsaWNlbnNlcy5zaXplKCkgIT0gMSkgewogICAgICAgICAgICAgICAgICAgIGV4dHJhTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBJTGljZW5zZSBmZWF0dXJlTGljZW5zZSA9IGxpY2Vuc2VzLml0ZXJhdG9yKCkubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKHBsYXRmb3JtTGljZW5zZTIwMTAuZ2V0VVVJRCgpLmVxdWFscyhmZWF0dXJlTGljZW5zZS5nZXRVVUlEKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgb2xkTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGxhdGZvcm1MaWNlbnNlMjAxMS5nZXRVVUlEKCkuZXF1YWxzKGZlYXR1cmVMaWNlbnNlLmdldFVVSUQoKSkpIHsKICAgICAgICAgICAgICAgICAgICBnb29kTGljZW5zZS5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiYWRMaWNlbnNlLmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5Ob25GZWF0dXJlcysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIGZlYXR1cmVzIGR1cmluZyBsaWNlbnNlIGNoZWNrOiAiICsgbkZlYXR1cmVzKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBub24tZmVhdHVlcyBkdXJpbmcgbGljZW5zZSBjaGVjazogIiArIG5Ob25GZWF0dXJlcyk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50UmVwb3J0TGljZW5zZShMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGdvb2RMaWNlbnNlLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9sZExpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gYmFkTGljZW5zZSwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub0xpY2Vuc2UsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZXh0cmFMaWNlbnNlKSB7CiAgICAgICAgU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CgogICAgICAgIEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CiAgICAgICAgRmlsZSBvdXRmaWxlID0gbnVsbDsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJsaWNlbnNlQ29uc2lzdGVuY3kuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5MaWNlbnNlIENvbnNpc3RlbmN5IFN1bW1hcnk6IiArIFNQQUNFUik7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggY29uZm9ybWluZyAoMjAxMSkgbGljZW5zZTogIiArIGdvb2RMaWNlbnNlLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOiAiICsgb2xkTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIGRpZmZlcmVudCBsaWNlbnNlOiAiICsgYmFkTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIG5vIGxpY2Vuc2U6ICIgKyBub0xpY2Vuc2Uuc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBleHRyYSBsaWNlbnNlczogIiArIGV4dHJhTGljZW5zZS5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI9PT09PT09PT09PT09PT09PT09PT09PSIpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RGV0YWlsczoiICsgU1BBQ0VSKTsKCiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHdpdGggbm8gbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChub0xpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBub0xpY2Vuc2UpIHsKICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgdW5pdC5nZXRJZCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkaWZmZXJlbnQgbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChiYWRMaWNlbnNlLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogYmFkTGljZW5zZSkgewogICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCB1bml0LmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkZlYXR1cmVzIHdpdGggb2xkICgyMDEwKSBsaWNlbnNlOiIgKyBTUEFDRVIpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG9sZExpY2Vuc2UsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBvbGRMaWNlbnNlKSB7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBtYXRjaGluZyAoMjAxMSkgbGljZW5zZToiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChnb29kTGljZW5zZSwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IGdvb2RMaWNlbnNlKSB7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIHVuaXQuZ2V0SWQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZWlyZG5lc3MKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICAgICAgICBpZiAoKGJhZExpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKGV4dHJhTGljZW5zZS5zaXplKCkgPiAwKSB8fCAobm9MaWNlbnNlLnNpemUoKSA+IDApKSB7CiAgICAgICAgLy8gICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbGljZW5zZSBjb25zaXN0ZW5jeS4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgLy8gICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0RGlzcGxheWFibGVEYXRhKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbEdyb3VwSVVzKCk7CiAgICAgICAgcmVzdWx0ID0gY2hlY2tMaWNlbnNlQ29uc2lzdGVuY3koYWxsSVVzKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQgfCBjaGVja0NvcHlyaWdodHMoYWxsSVVzKTsKICAgICAgICByZXN1bHQgPSByZXN1bHQgfCBjaGVja0Rlc2NyaXB0aW9ucyhhbGxJVXMpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ29weXJpZ2h0cyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsRmVhdHVyZXMpIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwoKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG5vT3JCYWRDb3B5cmlnaHQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBva0NvcHlyaWdodCA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CgogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlIDogYWxsRmVhdHVyZXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICBpZiAoZmVhdHVyZS5nZXRJZCgpLmVuZHNXaXRoKCIuZmVhdHVyZS5ncm91cCIpKSB7CiAgICAgICAgICAgICAgICBJQ29weXJpZ2h0IGNvcHlyaWdodCA9IGZlYXR1cmUuZ2V0Q29weXJpZ2h0KG51bGwpOwogICAgICAgICAgICAgICAgaWYgKGNvcHlyaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbm9PckJhZENvcHlyaWdodC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9IGNvcHlyaWdodC5nZXRCb2R5KCk7CiAgICAgICAgICAgICAgICBpZiAoKGJvZHkgPT0gbnVsbCkgfHwgKGJvZHkubGVuZ3RoKCkgPT0gMCkgfHwgYm9keS5zdGFydHNXaXRoKCIlIikgfHwgYm9keS5zdGFydHNXaXRoKCJbIikpIHsKICAgICAgICAgICAgICAgICAgICBub09yQmFkQ29weXJpZ2h0LmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYm9keS5zdGFydHNXaXRoKCJDb3B5cmlnaHQiKSB8fCBib2R5LnN0YXJ0c1dpdGgoIihjKSBDb3B5cmlnaHQiKSkgewogICAgICAgICAgICAgICAgICAgIG9rQ29weXJpZ2h0LmFkZChmZWF0dXJlKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVzZSB0ZXN0cyBjbGF1c2VzIG1hdHRlciwgb2J2b3VzbHkuIChDb21wYXJlIHdpdGggYWJvdmUgJ3N0YXJ0c1dpdGgnLikKICAgICAgICAgICAgICAgIGlmIChib2R5LmNvbnRhaW5zKCJDb3B5cmlnaHQiKSB8fCBib2R5LmNvbnRhaW5zKCJjb3B5cmlnaHQiKSkgewogICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQuYWRkKGZlYXR1cmUpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2ggYXNzdW1lZCAiYmFkIgogICAgICAgICAgICAgICAgbm9PckJhZENvcHlyaWdodC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBwcmludFJlcG9ydENvcHlyaWdodHMob2tDb3B5cmlnaHQsIG5vT3JCYWRDb3B5cmlnaHQsIGluZGV0ZXJtaW5hdGVDb3B5cmlnaHQpOwogICAgICAgIHJlc3VsdCA9ICgobm9PckJhZENvcHlyaWdodC5zaXplKCkgPiAwKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEZXNjcmlwdGlvbnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbEZlYXR1cmVzKSB7CiAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBub25lT3JCYWQgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBvayA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKCiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGZlYXR1cmUgOiBhbGxGZWF0dXJlcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CiAgICAgICAgICAgIGlmIChmZWF0dXJlLmdldElkKCkuZW5kc1dpdGgoIi5mZWF0dXJlLmdyb3VwIikpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGZlYXR1cmUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBudWxsKTsKICAgICAgICAgICAgICAgIGlmICgoZGVzY3JpcHRpb24gPT0gbnVsbCkgfHwgKGRlc2NyaXB0aW9uLmxlbmd0aCgpIDw9IDApIHx8IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIiUiKSkgewogICAgICAgICAgICAgICAgICAgIG5vbmVPckJhZC5hZGQoZmVhdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb2suYWRkKGZlYXR1cmUpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcHJpbnRSZXBvcnREZXNjcmlwdGlvbihvaywgbm9uZU9yQmFkKTsKICAgICAgICByZXN1bHQgPSAoKG5vbmVPckJhZC5zaXplKCkgPiAwKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXBvcnREZXNjcmlwdGlvbihMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG9rLCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IG5vbmVPckJhZCkgewogICAgICAgIFN0cmluZyBTUEFDRVIgPSAiPGJyIC8+PT09PT09PT09PT09PT09PT09PT09PT0iOwoKICAgICAgICBGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIgPSBudWxsOwogICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiZGVzY3JpcHRpb25zLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RGVzY3JpcHRpb24gUmVwb3J0OiIgKyBTUEFDRVIpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGRlc2NyaXB0aW9uczogIiArIG5vbmVPckJhZC5zaXplKCkpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyBwcm9iYWJseSBjb3JyZWN0OiAiICsgb2suc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iKTsKCiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRldGFpbHM6IiArIFNQQUNFUik7CgogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3aXRoIG5vIG9yIGR1YmlvdXMgZGVzY3JpcGl0b246IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobm9uZU9yQmFkLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogbm9uZU9yQmFkKSB7CiAgICAgICAgICAgICAgICBwcmludExpbmVEZXNjcmlwdGlvbihvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+RmVhdHVyZXMgd2l0aCBkZXNjcmlwaXRvbnM6IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQob2ssIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBvaykgewogICAgICAgICAgICAgICAgcHJpbnRMaW5lRGVzY3JpcHRpb24ob3V0ZmlsZVdyaXRlciwgdW5pdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2VpcmRuZXNzCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAgICAgICAgaWYgKChiYWRMaWNlbnNlLnNpemUoKSA+IDApIHx8IChleHRyYUxpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKG5vTGljZW5zZS5zaXplKCkgPiAwKSkgewogICAgICAgIC8vICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIGxpY2Vuc2UgY29uc2lzdGVuY3kuIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgIC8vICAgICAgICB9CiAgICB9CgoKCiAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXBvcnRDb3B5cmlnaHRzKExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gZ29vZCwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBiYWQsIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gbWF5YmUpIHsKICAgICAgICBTdHJpbmcgU1BBQ0VSID0gIjxiciAvPj09PT09PT09PT09PT09PT09PT09PT09IjsKCiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgImNvcHlyaWdodHMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5Db3B5cmlnaHQgUmVwb3J0OiIgKyBTUEFDRVIpOwogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICJGZWF0dXJlcyB3cm9uZyBvciB1bmV4cGxhaW5hYmxlIGNvcHlyaWdodHM6ICIgKyBiYWQuc2l6ZSgpKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgbWF5YmUgd3JvbmcsIG1heWJlIGNvcnJlY3QgY29weXJpZ2h0czogIiArIG1heWJlLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIkZlYXR1cmVzIHByb2JhYmx5IGNvcnJlY3Q6ICIgKyBnb29kLnNpemUoKSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIj09PT09PT09PT09PT09PT09PT09PT09Iik7CgogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5EZXRhaWxzOiIgKyBTUEFDRVIpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiRmVhdHVyZXMgd2l0aCBubyBvciBwcm9iYWJseSBpbmNvcnJlY3QgY29weXJpZ2h0IHN0YXRlbWVudDoiICsgU1BBQ0VSKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChiYWQsIG5ldyBJVUlkQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IHVuaXQgOiBiYWQpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPGJyIC8+PGJyIC8+SW5kZXRlcm1pbmFudDogZmVhdHVyZSdzIGNvcHlyaWdodCB0ZXh0IGNvbnRhaW5zIHRoZSB3b3JkICdjb3B5cmlnaHQnIGJ1dCBub3QgYXQgYmVnaW5uaW5nOiIgKyBTUEFDRVIpOwogICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1heWJlLCBuZXcgSVVJZENvbXBhcmF0b3IoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCB1bml0IDogbWF5YmUpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsICI8YnIgLz48YnIgLz5GZWF0dXJlcyB3aXRoIGNvcHlyaWdodHMgdGhhdCBhcmUgcHJvYmFibHkgb2sgKGkuZS4gc3RhcnQgd2l0aCAnQ29weXJpZ2h0Jyk6IiArIFNQQUNFUik7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZ29vZCwgbmV3IElVSWRDb21wYXJhdG9yKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgdW5pdCA6IGdvb2QpIHsKICAgICAgICAgICAgICAgIHByaW50TGluZUNvcHlyaWdodChvdXRmaWxlV3JpdGVyLCB1bml0KTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZWlyZG5lc3MKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vICAgICAgICBpZiAoKGJhZExpY2Vuc2Uuc2l6ZSgpID4gMCkgfHwgKGV4dHJhTGljZW5zZS5zaXplKCkgPiAwKSB8fCAobm9MaWNlbnNlLnNpemUoKSA+IDApKSB7CiAgICAgICAgLy8gICAgICAgICAgICBmYWlsKCJFcnJvcnMgaW4gbGljZW5zZSBjb25zaXN0ZW5jeS4gRm9yIGxpc3QsIHNlZSAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgLy8gICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRMaW5lQ29weXJpZ2h0KEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCiAgICAgICAgU3RyaW5nIGNvcHlyaWdodCA9IG51bGw7CiAgICAgICAgSUNvcHlyaWdodCBjb3B5cmlnaHRJdSA9IGl1LmdldENvcHlyaWdodChudWxsKTsKICAgICAgICBpZiAoY29weXJpZ2h0SXUgIT0gbnVsbCkgewogICAgICAgICAgICBjb3B5cmlnaHQgPSBjb3B5cmlnaHRJdS5nZXRCb2R5KCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKICAgICAgICBTdHJpbmcgaXVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CiAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBpdUlkICsgTkJTUCArIGl1VmVyc2lvbiArIEJSICsgTkJTUCArIGNvcHlyaWdodCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50TGluZURlc2NyaXB0aW9uKEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciwgSUluc3RhbGxhYmxlVW5pdCBpdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKCgogICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ERVNDUklQVElPTiwgbnVsbCk7CiAgICAgICAgU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwogICAgICAgIFN0cmluZyBpdVZlcnNpb24gPSBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIGl1SWQgKyBOQlNQICsgaXVWZXJzaW9uICsgQlIgKyBOQlNQICsgZGVzY3JpcHRpb24pOwogICAgfQp9ClBLAwQKAAAAAAA7AtI+Qh56b3UbAAB1GwAALQAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9UZXN0UmVwby5jbGFzc8r+ur4AAAAxAS8HAAIBACdvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvVGVzdFJlcG8HAAQBABhqdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UBAAVERUJVRwEAAVoBAA1Db25zdGFudFZhbHVlAwAAAAABAANFT0wBABJMamF2YS9sYW5nL1N0cmluZzsBAAROQlNQCAANAQAIICZuYnNwOyABAAJCUgEAE0pVTklUX1JFUE9SVF9PVVRQVVQIABEBABNqdW5pdC1yZXBvcnQtb3V0cHV0AQANcmVwb1VSTFRvVGVzdAEAD291dHB1dERpcmVjdG9yeQEACDxjbGluaXQ+AQADKClWAQAEQ29kZQgAGAEADmxpbmUuc2VwYXJhdG9yCAAaAQABCgoAHAAeBwAdAQAQamF2YS9sYW5nL1N5c3RlbQwAHwAgAQALZ2V0UHJvcGVydHkBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwkAAQAiDAAJAAoHACQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAJgEABTxici8+CgAjACgMACkAKgEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAIwAsDAAtAC4BAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKACMAMAwAMQAyAQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwkAAQA0DAAOAAoBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUKAAMAOAwAKQAVAQAEdGhpcwEAKUxvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvVGVzdFJlcG87AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsJABwAPgwAPwBAAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07CABCAQAQc3VpdGUgZm9yIGxheW91dAoARABGBwBFAQATamF2YS9pby9QcmludFN0cmVhbQwARwAqAQAHcHJpbnRsbgcASQEAGWp1bml0L2ZyYW1ld29yay9UZXN0U3VpdGUKAEgASwwAKQBMAQAUKExqYXZhL2xhbmcvQ2xhc3M7KVYBACkoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS9sYW5nL1N0cmluZzspVgEACkV4Y2VwdGlvbnMHAFABABNqYXZhL2lvL0lPRXhjZXB0aW9uCABSAQAEPGxpPggAVAEABTwvbGk+CgBWAFgHAFcBABJqYXZhL2lvL0ZpbGVXcml0ZXIMAFkAKgEABXdyaXRlAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAl3aG9sZUxpbmUBAAlpc1NwZWNpYWwBADUoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspWgsAXwBhBwBgAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DABiADIBAAVnZXRJZAgAZAEABWEuanJlCgBmAGgHAGcBABBqYXZhL2xhbmcvU3RyaW5nDABpAGoBAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCABsAQAMY29uZmlnLmEuanJlCABuAQAjb3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlX3Jvb3QIAHABACJvcmcuZWNsaXBzZS5yY3AuY29uZmlndXJhdGlvbl9yb290CAByAQASdG9vbGluZ29yZy5lY2xpcHNlCAB0AQAIdG9vbGluZy4BAAJpdQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQAEaXVJZAEADmlzRmVhdHVyZUdyb3VwCAB6AQANZmVhdHVyZS5ncm91cAoAZgB8DAB9AGoBAAhlbmRzV2l0aAEAEXByaW50TGluZUxpc3RJdGVtAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMamF2YS9sYW5nL1N0cmluZzspVgsAXwAeCwBfAIIMAIMAhAEACmdldFZlcnNpb24BACsoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb247CgCGADAHAIcBACdvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb24KAGYAiQwAigCLAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgABAI0MAEcATQEADW91dGZpbGVXcml0ZXIBAAppdXByb3BlcnR5AQAPaXVwcm9wZXJ0eVZhbHVlAQAJaXVWZXJzaW9uAQAScHJpbnRBbGxQcm9wZXJ0aWVzAQBJKExqYXZhL2lvL0ZpbGVXcml0ZXI7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspVgsAXwCVDACWAJcBAA1nZXRQcm9wZXJ0aWVzAQARKClMamF2YS91dGlsL01hcDsLAJkAmwcAmgEADWphdmEvdXRpbC9NYXAMAJwAnQEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwCfAKEHAKABAA1qYXZhL3V0aWwvU2V0DACiAKMBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAKUApwcApgEAEmphdmEvdXRpbC9JdGVyYXRvcgwAqACpAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7CwCZAKsMAKwArQEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CgAjADgKACMAsAwALQCxAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CACzAQADIDogCwClALUMALYAtwEAB2hhc05leHQBAAMoKVoBAA1vdXRGaWxlV3JpdGVyAQAKcHJvcGVydGllcwEAD0xqYXZhL3V0aWwvTWFwOwEABGtleXMBAA9MamF2YS91dGlsL1NldDsBAANrZXkBABJMamF2YS9sYW5nL09iamVjdDsBAAV2YWx1ZQEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzs+OwEACWdldEFsbElVcwEALSgpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwcAxQEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcAxwEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24BAAlTaWduYXR1cmUBAGEoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47CgABAMsMAMwAMgEAEGdldFJlcG9VUkxUb1Rlc3QHAM4BAAxqYXZhL25ldC9VUkkKAM0AKAoAAQDRDADSANMBABxnZXRNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyAQBJKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwsA1QDXBwDWAQBFb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9yZXBvc2l0b3J5L21ldGFkYXRhL0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyDADYANkBAA5sb2FkUmVwb3NpdG9yeQEAeyhMamF2YS9uZXQvVVJJO0xvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvSVByb2dyZXNzTW9uaXRvcjspTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwgA2wEAF25vIHJlcG9zaXRvcnkgZm91bmQgYXQgCgDNADAKAAEA3gwA3wDgAQANYXNzZXJ0Tm90TnVsbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgoA4gDkBwDjAQAmb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9RdWVyeVV0aWwMAOUA5gEAEGNyZWF0ZUlVQW55UXVlcnkBACcoKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeTsLAOgA6gcA6QEAPm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5DADrAOwBAAVxdWVyeQEAfShMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnk7TG9yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9JUHJvZ3Jlc3NNb25pdG9yOylMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CwDuAPAHAO8BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwA8QC3AQAHaXNFbXB0eQoAAQDzDAD0APUBAAthc3NlcnRGYWxzZQEABChaKVYBAAdyZXBvVVJMAQAMcmVwb0xvY2F0aW9uAQAOTGphdmEvbmV0L1VSSTsBAARyZXBvAQBATG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcmVwb3NpdG9yeS9tZXRhZGF0YS9JTWV0YWRhdGFSZXBvc2l0b3J5OwEABmFsbElVcwEAK0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEADmdldEFsbEdyb3VwSVVzCgDiAQAMAQEA5gEAEmNyZWF0ZUlVR3JvdXBRdWVyeQoAAQEDDAEEAQUBAAhnZXRBZ2VudAEAMigpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9JUHJvdmlzaW9uaW5nQWdlbnQ7CQDVAQcMAQgACgEADFNFUlZJQ0VfTkFNRQsBCgEMBwELAQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL0lQcm92aXNpb25pbmdBZ2VudAwBDQEOAQAKZ2V0U2VydmljZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7CgEQARIHAREB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GQAALAAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9UZXN0UmVwby5qYXZhLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CmltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwoKaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5JUHJvdmlzaW9uaW5nQWdlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeS5JUXVlcnlSZXN1bHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LlF1ZXJ5VXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeS5tZXRhZGF0YS5JTWV0YWRhdGFSZXBvc2l0b3J5OwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5Lm1ldGFkYXRhLklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLlRlc3RBY3RpdmF0b3I7CgovKioKICogVGVzdHMgdGhhdCBsaWNlbnNlcyBpbiB0aGUgcmVwb3NpdG9yeSBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBwbGF0Zm9ybQogKiBmZWF0dXJlIGxpY2Vuc2UuCiAqIAogKiBUaGlzIHdhcyBiYXNlZCBvbiB0ZXN0IGNvZGUgb3JpZ2luYWxseSBhdHRhY2hlZCB0byBidWcgMzA2NjI3CiAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY2MjcKICovCnB1YmxpYyBjbGFzcyBUZXN0UmVwbyBleHRlbmRzIFRlc3RDYXNlIHsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgICAgICAgICAgICAgID0gZmFsc2U7CiAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyAgRU9MICAgICAgICAgICAgICAgICA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nICBOQlNQICAgICAgICAgICAgICAgID0gIiAmbmJzcDsgIjsKICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nICBCUiAgICAgICAgICAgICAgICAgID0gIjxici8+IiArIEVPTDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAgICBKVU5JVF9SRVBPUlRfT1VUUFVUID0gImp1bml0LXJlcG9ydC1vdXRwdXQiOwoKICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1aXRlIGZvciBsYXlvdXQiKTsKICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0UmVwby5jbGFzcyk7CiAgICB9CgoKICAgIHByaXZhdGUgU3RyaW5nIHJlcG9VUkxUb1Rlc3Q7CiAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7CgogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRsbihGaWxlV3JpdGVyIG91dCwgU3RyaW5nIHdob2xlTGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBvdXQud3JpdGUoIjxsaT4iICsgd2hvbGVMaW5lICsgIjwvbGk+IiArIEVPTCk7CgogICAgfQoKICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3BlY2lhbChJSW5zdGFsbGFibGVVbml0IGl1KSB7CgoKICAgICAgICAvLyBUT0RPOiBJIGFzc3VtZSAnZXhlY3V0YWJsZSByb290cycsIGV0Yy4gaGF2ZSBubyByZWFkYWJsZSBuYW1lPyAKICAgICAgICAvKgogICAgICAgICAqIFRPRE86IHdoYXQgYXJlIHRoZXNlIHNwZWNpYWwgdGhpbmdzPyBXaGF0IGV2ZXIgdGhleQogICAgICAgICAqIGFyZSwgdGhleSBoYXZlIG5vIHByb3ZpZGVyIG5hbWUuIGNvbmZpZy5hLmpyZSBpcwogICAgICAgICAqIGlkZW50aWZpZWQgYXMgYSBmcmFnbWVudAogICAgICAgICAqIChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQpLiBhLmpyZSBoYXMgbm8KICAgICAgICAgKiBwcm9wZXJ0aWVzLgogICAgICAgICAqLwogICAgICAgIFN0cmluZyBpdUlkID0gaXUuZ2V0SWQoKTsKICAgICAgICBib29sZWFuIGlzU3BlY2lhbCA9IGl1SWQuc3RhcnRzV2l0aCgiYS5qcmUiKSB8fCBpdUlkLnN0YXJ0c1dpdGgoImNvbmZpZy5hLmpyZSIpIHx8IGl1SWQuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuZXF1aW5veC5leGVjdXRhYmxlX3Jvb3QiKSB8fCBpdUlkLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLnJjcC5jb25maWd1cmF0aW9uX3Jvb3QiKSB8fCBpdUlkLnN0YXJ0c1dpdGgoInRvb2xpbmdvcmcuZWNsaXBzZSIpIHx8IGl1SWQuc3RhcnRzV2l0aCgidG9vbGluZy4iKTsKICAgICAgICByZXR1cm4gaXNTcGVjaWFsOwogICAgfQoKICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmVhdHVyZUdyb3VwKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKCiAgICAgICAgU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwogICAgICAgIGJvb2xlYW4gaXNGZWF0dXJlR3JvdXAgPSBpdUlkLmVuZHNXaXRoKCJmZWF0dXJlLmdyb3VwIik7CiAgICAgICAgcmV0dXJuIGlzRmVhdHVyZUdyb3VwOwogICAgfQoKCgogICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRMaW5lTGlzdEl0ZW0oRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyLCBJSW5zdGFsbGFibGVVbml0IGl1LCBTdHJpbmcgaXVwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgaXVwcm9wZXJ0eVZhbHVlID0gaXUuZ2V0UHJvcGVydHkoaXVwcm9wZXJ0eSwgbnVsbCk7CiAgICAgICAgU3RyaW5nIGl1SWQgPSBpdS5nZXRJZCgpOwogICAgICAgIFN0cmluZyBpdVZlcnNpb24gPSBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIGl1SWQgKyBOQlNQICsgaXVWZXJzaW9uICsgTkJTUCArIEJSICsgaXVwcm9wZXJ0eVZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFVzZSBmb3IgZGVidWdnaW5nIGFuZCBleHBsb3JhdGlvbgogICAgICogCiAgICAgKiBAcGFyYW0gb3V0RmlsZVdyaXRlcgogICAgICogQHBhcmFtIGl1CiAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCB2b2lkIHByaW50QWxsUHJvcGVydGllcyhGaWxlV3JpdGVyIG91dEZpbGVXcml0ZXIsIElJbnN0YWxsYWJsZVVuaXQgaXUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gaXUuZ2V0UHJvcGVydGllcygpOwogICAgICAgIFNldCBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKTsKICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiBrZXlzKSB7CiAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7CiAgICAgICAgICAgIHByaW50bG4ob3V0RmlsZVdyaXRlciwga2V5ICsgIiA6ICIgKyB2YWx1ZSk7CiAgICAgICAgfQoKICAgIH0KCiAgICBwcm90ZWN0ZWQgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGdldEFsbElVcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIHJlcG9VUkwgPSBnZXRSZXBvVVJMVG9UZXN0KCk7CiAgICAgICAgVVJJIHJlcG9Mb2NhdGlvbiA9IG5ldyBVUkkocmVwb1VSTCk7CiAgICAgICAgSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpLmxvYWRSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbiwgbnVsbCk7CiAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm8gcmVwb3NpdG9yeSBmb3VuZCBhdCAiICsgcmVwb0xvY2F0aW9uLnRvU3RyaW5nKCksIHJlcG8pOwogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSByZXBvLnF1ZXJ5KFF1ZXJ5VXRpbC5jcmVhdGVJVUFueVF1ZXJ5KCksIG51bGwpOwogICAgICAgIGFzc2VydEZhbHNlKGFsbElVcy5pc0VtcHR5KCkpOwogICAgICAgIHJldHVybiBhbGxJVXM7CiAgICB9CgogICAgcHJvdGVjdGVkIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBnZXRBbGxHcm91cElVcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIHJlcG9VUkwgPSBnZXRSZXBvVVJMVG9UZXN0KCk7CiAgICAgICAgVVJJIHJlcG9Mb2NhdGlvbiA9IG5ldyBVUkkocmVwb1VSTCk7CiAgICAgICAgSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpLmxvYWRSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbiwgbnVsbCk7CiAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm8gcmVwb3NpdG9yeSBmb3VuZCBhdCAiICsgcmVwb0xvY2F0aW9uLnRvU3RyaW5nKCksIHJlcG8pOwogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSByZXBvLnF1ZXJ5KFF1ZXJ5VXRpbC5jcmVhdGVJVUdyb3VwUXVlcnkoKSwgbnVsbCk7CiAgICAgICAgYXNzZXJ0RmFsc2UoYWxsSVVzLmlzRW1wdHkoKSk7CiAgICAgICAgcmV0dXJuIGFsbElVczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKSB7CiAgICAgICAgcmV0dXJuIChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgZ2V0QWdlbnQoKS5nZXRTZXJ2aWNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlNFUlZJQ0VfTkFNRSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyBJUHJvdmlzaW9uaW5nQWdlbnQgZ2V0QWdlbnQoKSB7CiAgICAgICAgLy8gZ2V0IHRoZSBnbG9iYWwgYWdlbnQgZm9yIHRoZSBjdXJyZW50bHkgcnVubmluZyBzeXN0ZW0KICAgICAgICByZXR1cm4gKElQcm92aXNpb25pbmdBZ2VudCkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nQWdlbnQuU0VSVklDRV9OQU1FKTsKICAgIH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9VUkxUb1Rlc3QoKSB7CiAgICAgICAgaWYgKHJlcG9VUkxUb1Rlc3QgPT0gbnVsbCkgewogICAgICAgICAgICByZXBvVVJMVG9UZXN0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJyZXBvVVJMVG9UZXN0Iik7CgogICAgICAgICAgICBpZiAocmVwb1VSTFRvVGVzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSAncmVwb1VSTFRvVGVzdCcgcHJvcGVydHkgd2FzIG5vdCBzZXQiKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXBvVVJMVG9UZXN0OiAiICsgcmVwb1VSTFRvVGVzdCk7CiAgICAgICAgcmV0dXJuIHJlcG9VUkxUb1Rlc3Q7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0UmVwb1VSTFRvVGVzdChTdHJpbmcgcmVwb1VSTFRvVGVzdCkgewogICAgICAgIHRoaXMucmVwb1VSTFRvVGVzdCA9IHJlcG9VUkxUb1Rlc3Q7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSA9PSBudWxsKSB7CiAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShKVU5JVF9SRVBPUlRfT1VUUFVUKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQp9ClBLAwQKAAAAAAA7AtI+HaRFrCokAAAqJAAANAAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcuY2xhc3PK/rq+AAAAMQFwBwACAQAub3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZwcABAEAJ29yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9UZXN0UmVwbwEABkVRVUFMUwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAkBAAZlcXVhbHMBAAtTVEFSVFNfV0lUSAgADAEACnN0YXJ0c1dpdGgBABZTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIAQABSQMAAAAFAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAUDAAQABEBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAwTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmc7AQAFc3VpdGUBABgoKUxqdW5pdC9mcmFtZXdvcmsvVGVzdDsJABwAHgcAHQEAEGphdmEvbGFuZy9TeXN0ZW0MAB8AIAEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwgAIgEAFXRlc3QgdmVyc2lvbiBjaGVja2luZwoAJAAmBwAlAQATamF2YS9pby9QcmludFN0cmVhbQwAJwAoAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAAQAUCAArAQATdGVzdFZlcnNpb25VbmlxbmVzcwoAAQAtDAAuACgBAAdzZXROYW1lCAAwAQAsZmlsZTovLy9ob21lL3NoYXJlZC93ZWJ0b29scy90ZXN0U3RhZ2luZ1JlcG8KAAEAMgwAMwAoAQAQc2V0UmVwb1VSTFRvVGVzdAgANQEAES9ob21lL2Rhdmlkdy90ZW1wCgABADcMADgAKAEAEnNldE91dHB1dERpcmVjdG9yeQEABHRlc3QBAAMoKVoBAApFeGNlcHRpb25zBwA9AQAbamF2YS9uZXQvVVJJU3ludGF4RXhjZXB0aW9uBwA/AQAub3JnL2VjbGlwc2UvZXF1aW5veC9wMi9jb3JlL1Byb3Zpc2lvbkV4Y2VwdGlvbgcAQQEAM29yZy9lY2xpcHNlL2NvcmUvcnVudGltZS9PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgcAQwEAE2phdmEvaW8vSU9FeGNlcHRpb24KAAEARQwARgBHAQAJZ2V0QWxsSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABAEkMAEoASwEAFmFuYWx5emVWZXJzaW9uUGF0dGVybnMBAC4oTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OylWCgABAE0MAE4ATwEAGGFuYWx5emVOb25VbmlxdWVWZXJzaW9ucwEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAAZhbGxJVXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVYKAAEAVwwAWABZAQASZ2V0T3V0cHV0RGlyZWN0b3J5AQAUKClMamF2YS9sYW5nL1N0cmluZzsHAFsBAAxqYXZhL2lvL0ZpbGUIAF0BABN2ZXJzaW9uUGF0dGVybnMudHh0CgBaAF8MABAAYAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgcAYgEAEmphdmEvaW8vRmlsZVdyaXRlcgoAYQBkDAAQAGUBABEoTGphdmEvaW8vRmlsZTspVgcAZwEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyCABpAQAIb3V0cHV0OiAKAGYAawwAEAAoCgBaAG0MAG4AWQEAD2dldEFic29sdXRlUGF0aAoAZgBwDABxAHIBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsKAGYAdAwAdQBZAQAIdG9TdHJpbmcIAHcBACxWZXJzaW9uIHF1YWxpZmVyIHBhdHRlcm5zIHVzZWQgaW4gcmVwb3NpdG9yeQkAAQB5DAB6AAYBAANFT0wKAGEAfAwAfQAoAQAFd3JpdGUIAH8BAB5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAKAAEAgQwAggBZAQAQZ2V0UmVwb1VSTFRvVGVzdAgAhAEATyhFeHBsb3JhdG9yeSByZXBvcnQgLi4uIG1heWJlIGV2ZW50dWFsbHkgdXNlZCB0byBmaW5kIHR5cG9zLCBzdWNoIGFzICdxdWFsZmVyJykKAAEAhgwAhwCIAQARY29sbGVjdFF1YWxpZmllcnMBAFEoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0O0xqYXZhL2lvL0ZpbGVXcml0ZXI7KUxqYXZhL3V0aWwvTGlzdDsKAAEAigwAiwCMAQAYY29sbGFwc2VTb3J0ZWRRdWFsaWZpZXJzAQAnKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0OylWCgBhAI4MAI8AEQEABWNsb3NlCgBCAJEMAJIAEQEAD3ByaW50U3RhY2tUcmFjZQEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAC3Rlc3REaXJOYW1lAQANYWxsUXVhbGlmaWVycwEAEExqYXZhL3V0aWwvTGlzdDsBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47BwCeAQAPamF2YS9sYW5nL0Vycm9yAQA7KExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvU3RyaW5nOz47KVYKAKEAowcAogEAFWphdmEvdXRpbC9Db2xsZWN0aW9ucwwApAClAQAEc29ydAEAEyhMamF2YS91dGlsL0xpc3Q7KVYKAKcAqQcAqAEAEGphdmEvbGFuZy9TdHJpbmcMAKoAqwEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwgArQEAKkNvdW50IG9mIChzb3J0ZWQpIHBhdHRlcm5zIG1hdGNoaW5nIHVwIHRvIAoAZgCvDABxALABABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CACyAQAMIGNoYXJhY3RlcnMuCwC0ALYHALUBAA5qYXZhL3V0aWwvTGlzdAwAtwC4AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwC6ALwHALsBABJqYXZhL3V0aWwvSXRlcmF0b3IMAL0AvgEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwoApwDADAAJAMEBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoKAKcAwwwAxADFAQAGbGVuZ3RoAQADKClJCADHAQAOW2VtcHR5IHN0cmluZ10KAKcAyQwAqgDKAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7CADMAQABCQgAzgEAAwkJCQoAAQDQDADRANIBAA1zdGFydHNTaW1pbGFyAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaCADUAQACCQkKAAEA1gwA1wDYAQAKc3Vic2VjdGlvbgEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CgCdABQLALoA2wwA3AA6AQAHaGFzTmV4dAEACXJlZmVyZW5jZQEACHJlZkNvdW50AQAEdHlwZQEAAXEBAJkoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjtMamF2YS9pby9GaWxlV3JpdGVyOylMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9TdHJpbmc7PjsHAOMBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgDiABQLAOYA6AcA5wEAKW9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0DADpAOoBABF0b1VubW9kaWZpYWJsZVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwDsALYHAO0BAA1qYXZhL3V0aWwvU2V0BwDvAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0CADxAQAEdHJ1ZQgA8wEAJG9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeQsA7gD1DAD2ANgBAAtnZXRQcm9wZXJ0eQoAAQD4DAD5APoBAAlpc1NwZWNpYWwBADUoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspWgsA7gD8DAD9AP4BAApnZXRWZXJzaW9uAQArKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uOwoBAAECBwEBAQAnb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9WZXJzaW9uDAEDADoBABBpc09TR2lDb21wYXRpYmxlCgEAAQUMAQYAxQEAD2dldFNlZ21lbnRDb3VudAoBAAEIDAEJAQoBAApnZXRTZWdtZW50AQAZKEkpTGphdmEvbGFuZy9Db21wYXJhYmxlOwgBDAEAGXplcm8gbGVuZ3RoIDR0aCBzZWdtZW50OiALAO4BDgwBDwBZAQAFZ2V0SWQLALQBEQwBEgDBAQADYWRkCAEUAQANUHJvZ3JhbSBFcnJvcgoAnQBrCAEXAQAnTnVtYmVyIG9mIG5vbk9TR2kgY29tcGF0aWJsZSB2ZXJzaW9uczogCAEZAQAiTnVtYmVyIHdpdGggbW9yZSB0aGFuIDQgc2VnbWVudHM6IAgBGwEAIk51bWJlciB3dGloIGxlc3MgdGhhbiA0IHNlZ21lbnRzOiABABFub25PU0dpQ29tcGF0aWJsZQEADW5MZXNzVGhhbkZvdXIBAA1uTW9yZVRoYW5Gb3VyAQACaXUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEACmlzQ2F0ZWdvcnkBAAFaAQANYnVuZGxlVmVyc2lvbgEAKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL1ZlcnNpb247AQAJcXVhbGlmaWVyAQAWTGphdmEvbGFuZy9Db21wYXJhYmxlOwEAB3FTdHJpbmcKAKcBKQwADAEqAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgCnASwMAS0BLgEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBAAZyZXN1bHQBAGIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspWgoAAQEyDAEzATQBABR0YWJ1bGF0ZU5vblVuaXF1ZUlEcwEAPChMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KUxqYXZhL3V0aWwvTWFwOwgBNgEAFW5vblVuaXF1ZVZlcnNpb25zLnR4dAgBOAEAJk5vbiBVbmlxdWUgVmVyc2lvbnMgdXNlZCBpbiByZXBvc2l0b3J5CwE6ATwHATsBAA1qYXZhL3V0aWwvTWFwDAE9AOoBAAZrZXlTZXQLAToBPwwBQAFBAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsLAOwBQwwBRADFAQAEc2l6ZQoAAQFGDAFHAUgBAAdwcmludElkAQApKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvbGFuZy9PYmplY3Q7KVYKAAEBSgwBSwFIAQAMcHJpbnRWZXJzaW9uCAFNAQAdTnVtYmVyIG9mIHVuaXF1ZSBpZC12ZXJzaW9ucyABAAdidW5kbGVzAQAPTGphdmEvdXRpbC9NYXA7AQAHblVuaXF1ZQEACGJ1bmRsZUlkAQASTGphdmEvbGFuZy9PYmplY3Q7AQAKdmVyc2lvblNldAEAD0xqYXZhL3V0aWwvU2V0OwEAB3ZlcnNpb24BAHAoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspTGphdmEvdXRpbC9NYXA7BwFYAQARamF2YS91dGlsL0hhc2hNYXAKAVcAFAsBOgFbDAFcAMEBAAtjb250YWluc0tleQsA7AERBwFfAQARamF2YS91dGlsL0hhc2hTZXQKAV4AFAsBOgFiDAFjAWQBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoBZgCRBwFnAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24BABxMamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb247CgBmABQKAGYBawwAcQFsAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACaWQBAApTb3VyY2VGaWxlAQAUVmVyc2lvbkNoZWNraW5nLmphdmEAIQABAAMAAAADABoABQAGAAEABwAAAAIACAAaAAoABgABAAcAAAACAAsAGgANAA4AAQAHAAAAAgAPAAwAAQAQABEAAQASAAAALwABAAEAAAAFKrcAE7EAAAACABUAAAAGAAEAAAAXABYAAAAMAAEAAAAFABcAGAAAAAkAGQAaAAEAEgAAAGIAAgABAAAAJLIAGxIhtgAjuwABWbcAKUsqEiq2ACwqEi+2ADEqEjS2ADYqsAAAAAIAFQAAABoABgAAACYACAAnABAAKAAWACkAHAAqACIAKwAWAAAADAABABAAFAA5ABgAAAABACsAOgACADsAAAAKAAQAPAA+AEAAQgASAAAA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RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLlZlcnNpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKCnB1YmxpYyBjbGFzcyBWZXJzaW9uQ2hlY2tpbmcgZXh0ZW5kcyBUZXN0UmVwbyB7CgoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTFMgICAgICAgICAgICAgICAgID0gImVxdWFscyI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRTX1dJVEggICAgICAgICAgICA9ICJzdGFydHNXaXRoIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIID0gNTsKCiAgICAvKioKICAgICAqIFRoZSB0ZXN0IHNldHVwIGluIHRoaXMgc3VpdGUgbWV0aG9kIGlzIGF0eXBpY2FsLCBidXQgaGFuZHkgZG8gdG8gbG9jYWwKICAgICAqIHRlc3RpbmcgZnJvbSB3b3JrYmVuY2guIEZvciBwcm9kdWN0aW9uIHdvcmssIGN1cnJlbnRseSwgdGhlIHZhbHVlcyBhcmUKICAgICAqIHNldCBpbiBhbnQgZXhlY3V0ZSBtZXRob2QuIElmL3doZW4gY29udmVydGVkIHRvIHRydWUgSlVuaXQgdGVzdHMsIHRoaXMKICAgICAqIHN1aXRlIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2hhYW5nZWQgdG8gYSBtb3JlIHR5cGljYWwgZm9ybSwgYW5kIG5vCiAgICAgKiB2YWx1ZSBoYXJkIGNvZGVkLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0IHZlcnNpb24gY2hlY2tpbmciKTsKICAgICAgICBWZXJzaW9uQ2hlY2tpbmcgdGVzdCA9IG5ldyBWZXJzaW9uQ2hlY2tpbmcoKTsKICAgICAgICB0ZXN0LnNldE5hbWUoInRlc3RWZXJzaW9uVW5pcW5lc3MiKTsKICAgICAgICB0ZXN0LnNldFJlcG9VUkxUb1Rlc3QoImZpbGU6Ly8vaG9tZS9zaGFyZWQvd2VidG9vbHMvdGVzdFN0YWdpbmdSZXBvIik7CiAgICAgICAgdGVzdC5zZXRPdXRwdXREaXJlY3RvcnkoIi9ob21lL2Rhdmlkdy90ZW1wIik7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdFZlcnNpb25VbmlxbmVzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICBJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzID0gZ2V0QWxsSVVzKCk7CiAgICAgICAgYW5hbHl6ZVZlcnNpb25QYXR0ZXJucyhhbGxJVXMpOwogICAgICAgIHJldHVybiBhbmFseXplTm9uVW5pcXVlVmVyc2lvbnMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgYW5hbHl6ZVZlcnNpb25QYXR0ZXJucyhJUXVlcnlSZXN1bHQ8SUluc3RhbGxhYmxlVW5pdD4gYWxsSVVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewoKCgogICAgICAgIEZpbGVXcml0ZXIgb3V0ZmlsZVdyaXRlciA9IG51bGw7CiAgICAgICAgRmlsZSBvdXRmaWxlID0gbnVsbDsKICAgICAgICBTdHJpbmcgdGVzdERpck5hbWUgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBvdXRmaWxlID0gbmV3IEZpbGUodGVzdERpck5hbWUsICJ2ZXJzaW9uUGF0dGVybnMudHh0Iik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKCgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJWZXJzaW9uIHF1YWxpZmVyIHBhdHRlcm5zIHVzZWQgaW4gcmVwb3NpdG9yeSIgKyBFT0wgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCJSZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgRU9MICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiKEV4cGxvcmF0b3J5IHJlcG9ydCAuLi4gbWF5YmUgZXZlbnR1YWxseSB1c2VkIHRvIGZpbmQgdHlwb3MsIHN1Y2ggYXMgJ3F1YWxmZXInKSIgKyBFT0wgKyBFT0wpOwoKICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFF1YWxpZmllcnMgPSBjb2xsZWN0UXVhbGlmaWVycyhhbGxJVXMsIG91dGZpbGVXcml0ZXIpOwoKCgogICAgICAgICAgICBjb2xsYXBzZVNvcnRlZFF1YWxpZmllcnMob3V0ZmlsZVdyaXRlciwgYWxsUXVhbGlmaWVycyk7CgoKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGNvbGxhcHNlU29ydGVkUXVhbGlmaWVycyhGaWxlV3JpdGVyIG91dGZpbGVXcml0ZXIsIExpc3Q8U3RyaW5nPiBhbGxRdWFsaWZpZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEVycm9yIHsKICAgICAgICBTdHJpbmcgcmVmZXJlbmNlID0gbnVsbDsKICAgICAgICBpbnQgcmVmQ291bnQgPSAwOwogICAgICAgIFN0cmluZyB0eXBlID0gRVFVQUxTOwogICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsUXVhbGlmaWVycyk7CgogICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIkNvdW50IG9mIChzb3J0ZWQpIHBhdHRlcm5zIG1hdGNoaW5nIHVwIHRvICIgKyBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIICsgIiBjaGFyYWN0ZXJzLiIgKyBFT0wgKyBFT0wpOwoKICAgICAgICBmb3IgKFN0cmluZyBxIDogYWxsUXVhbGlmaWVycykgewogICAgICAgICAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHE7CiAgICAgICAgICAgICAgICByZWZDb3VudCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlLmVxdWFscyhxKSkgewogICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVRVUFMUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSAiW2VtcHR5IHN0cmluZ10iOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKHJlZkNvdW50ICsgIlx0IiArIHR5cGUgKyAiXHRcdFx0IiArIHJlZmVyZW5jZSArIEVPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVRVUFMUzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRzU2ltaWxhcihyZWZlcmVuY2UsIHEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTVEFSVFNfV0lUSDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTVEFSVFNfV0lUSC5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUocmVmQ291bnQgKyAiXHQiICsgdHlwZSArICJcdFx0IiArIHN1YnNlY3Rpb24ocmVmZXJlbmNlKSArIEVPTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRVFVQUxTLmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShyZWZDb3VudCArICJcdCIgKyB0eXBlICsgIlx0XHRcdCIgKyByZWZlcmVuY2UgKyBFT0wpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRVFVQUxTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29sbGVjdFF1YWxpZmllcnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcywgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEVycm9yIHsKICAgICAgICBMaXN0PFN0cmluZz4gYWxsUXVhbGlmaWVycyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICBpbnQgbm9uT1NHaUNvbXBhdGlibGUgPSAwOwogICAgICAgIGludCBuTGVzc1RoYW5Gb3VyID0gMDsKICAgICAgICBpbnQgbk1vcmVUaGFuRm91ciA9IDA7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKCiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY2F0ZWdvcmllcywgc2luY2UgdGhleSBhcmUgKG9mdGVuKSBpbnRlbmRlZCB0byB3b3JrIHdpdGggc2FtZSBJRCwgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwoKICAgICAgICAgICAgLy8gd2UgZXhjbHVkZSB0aGVzZSB0aGluZ3MgaW4gc29tZSBvdGhlciByZXBvIHJlcG9ydHMgLi4uIHRvIGltcHJvdmUgZm9jdXMgLi4uIGJ1dCBzdXNwZWN0IG5vdCBuZWVkZWQgaGVyZS4KICAgICAgICAgICAgLy8gYm9vbGVhbiBpc0ZyYWdtZW50ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IikpOwogICAgICAgICAgICAvLyAhaXNGcmFnbWVudCAmJiAhaXNGZWF0dXJlR3JvdXAoaXUpCiAgICAgICAgICAgIGlmICghaXNDYXRlZ29yeSAmJiAhaXNTcGVjaWFsKGl1KSkgewogICAgICAgICAgICAgICAgLy9TdHJpbmcgYnVuZGxlSWQgPSBpdS5nZXRJZCgpOwogICAgICAgICAgICAgICAgVmVyc2lvbiBidW5kbGVWZXJzaW9uID0gaXUuZ2V0VmVyc2lvbigpOwogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVZlcnNpb24uaXNPU0dpQ29tcGF0aWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVZlcnNpb24uZ2V0U2VnbWVudENvdW50KCkgPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhYmxlIHF1YWxpZmllciA9IGJ1bmRsZVZlcnNpb24uZ2V0U2VnbWVudCgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFTdHJpbmcgPSAoU3RyaW5nKSBxdWFsaWZpZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiemVybyBsZW5ndGggNHRoIHNlZ21lbnQ6ICIgKyBpdS5nZXRJZCgpICsgRU9MKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFF1YWxpZmllcnMuYWRkKHFTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVuZGxlVmVyc2lvbi5nZXRTZWdtZW50Q291bnQoKSA8IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbkxlc3NUaGFuRm91cisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidW5kbGVWZXJzaW9uLmdldFNlZ21lbnRDb3VudCgpID4gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBuTW9yZVRoYW5Gb3VyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbm9uT1NHaUNvbXBhdGlibGUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCiAgICAgICAgfQoKICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKEVPTCArICJOdW1iZXIgb2Ygbm9uT1NHaSBjb21wYXRpYmxlIHZlcnNpb25zOiAiICsgbm9uT1NHaUNvbXBhdGlibGUgKyBFT0wpOwogICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIk51bWJlciB3aXRoIG1vcmUgdGhhbiA0IHNlZ21lbnRzOiAiICsgbk1vcmVUaGFuRm91ciArIEVPTCk7CiAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZShFT0wgKyAiTnVtYmVyIHd0aWggbGVzcyB0aGFuIDQgc2VnbWVudHM6ICIgKyBuTGVzc1RoYW5Gb3VyICsgRU9MICsgRU9MKTsKICAgICAgICByZXR1cm4gYWxsUXVhbGlmaWVyczsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRzU2ltaWxhcihTdHJpbmcgcmVmZXJlbmNlLCBTdHJpbmcgcSkgewogICAgICAgIHJldHVybiAocS5zdGFydHNXaXRoKHN1YnNlY3Rpb24ocmVmZXJlbmNlKSkpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIHN1YnNlY3Rpb24oU3RyaW5nIHJlZmVyZW5jZSkgewogICAgICAgIC8vIGxlbmd0aCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OwoKICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVmZXJlbmNlOwogICAgICAgIGlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPj0gU1RBUlRXSVRIX01BVENIX0xFTkdUSCkgewogICAgICAgICAgICByZXN1bHQgPSAocmVmZXJlbmNlLnN1YnN0cmluZygwLCBTVEFSVFdJVEhfTUFUQ0hfTEVOR1RIKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CgogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplTm9uVW5pcXVlVmVyc2lvbnMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBNYXAgYnVuZGxlcyA9IHRhYnVsYXRlTm9uVW5pcXVlSURzKGFsbElVcyk7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgIm5vblVuaXF1ZVZlcnNpb25zLnR4dCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgoKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiTm9uIFVuaXF1ZSBWZXJzaW9ucyB1c2VkIGluIHJlcG9zaXRvcnkiICsgRU9MICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiUmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIiArIGdldFJlcG9VUkxUb1Rlc3QoKSArIEVPTCArIEVPTCk7CgogICAgICAgICAgICBpbnQgblVuaXF1ZSA9IDA7CiAgICAgICAgICAgIGZvciAoT2JqZWN0IGJ1bmRsZUlkIDogYnVuZGxlcy5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgU2V0IHZlcnNpb25TZXQgPSAoU2V0KSBidW5kbGVzLmdldChidW5kbGVJZCk7CiAgICAgICAgICAgICAgICBpZiAodmVyc2lvblNldC5zaXplKCkgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5VbmlxdWUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50SWQob3V0ZmlsZVdyaXRlciwgYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZlcnNpb24gOiB2ZXJzaW9uU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbihvdXRmaWxlV3JpdGVyLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoRU9MICsgIk51bWJlciBvZiB1bmlxdWUgaWQtdmVyc2lvbnMgIiArIG5VbmlxdWUgKyBFT0wpOwoKICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiBmYWxzZSAobm8gZXJyb3IpLCBmb3Igbm93IC4uLiBldmVudHVhbGx5IG1heSBiZSBhYmxlIHRvIAogICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHNvbWUgaGV1cmlzdGljIHRvIHJldHVybiAiZXJyb3IiLCBzdWNoIGFzIGlmIG5ldywgbm9uLWV4cGVjdGVkIG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIHByaXZhdGUgTWFwIHRhYnVsYXRlTm9uVW5pcXVlSURzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHsKICAgICAgICBNYXAgYnVuZGxlcyA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY2F0ZWdvcmllcywgc2luY2UgdGhleSBhcmUgKG9mdGVuKSBpbnRlbmRlZCB0byB3b3JrIHdpdGggc2FtZSBJRCwgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXRlZ29yeSA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSIpKTsKCiAgICAgICAgICAgICAgICAvLyB3ZSBleGNsdWRlIHRoZXNlIHRoaW5ncyBpbiBzb21lIG90aGVyIHJlcG8gcmVwb3J0cyAuLi4gdG8gaW1wcm92ZSBmb2N1cyAuLi4gYnV0IHN1c3BlY3Qgbm90IG5lZWRlZCBoZXJlLgogICAgICAgICAgICAgICAgLy9ib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CiAgICAgICAgICAgICAgICAvLyAmJiAhaXNTcGVjaWFsKGl1KSAmJiAhaXNGcmFnbWVudCAmJiAhaXNGZWF0dXJlR3JvdXAoaXUpCiAgICAgICAgICAgICAgICBpZiAoIWlzQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlSWQgPSBpdS5nZXRJZCgpOwogICAgICAgICAgICAgICAgICAgIFZlcnNpb24gYnVuZGxlVmVyc2lvbiA9IGl1LmdldFZlcnNpb24oKTsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBidW5kbGUgSUQgaXMgYWxyZWFkeSBpbiBtYXAsIHdlIG11c3QgaGF2ZSBhbHJlYWR5IGZvdW5kIGF0IGxlYXN0IG9uZQogICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVzLmNvbnRhaW5zS2V5KGJ1bmRsZUlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IChTZXQpIGJ1bmRsZXMuZ2V0KGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblNldC5hZGQoYnVuZGxlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGZvdW5kIG9uZSB5ZXQsIHNvIGFkZCBpdCwgd2l0aCBpbml0aWFsIHNldCBvZiBpdHMgKG9uZSkgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmVyc2lvblNldCA9IG5ldyBIYXNoU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TZXQuYWRkKGJ1bmRsZVZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzLnB1dChidW5kbGVJZCwgdmVyc2lvblNldCk7CiAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1bmRsZXM7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHByaW50SWQoRmlsZVdyaXRlciBvdXQsIE9iamVjdCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBvdXQud3JpdGUoaWQgKyBFT0wpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFZlcnNpb24oRmlsZVdyaXRlciBvdXQsIE9iamVjdCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIG91dC53cml0ZSgiXHQiICsgdmVyc2lvbiArIEVPTCk7CiAgICB9Cgp9ClBLAwQKAAAAAAA7AtI+9hyivF4ZAABeGQAAMgAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmNsYXNzyv66vgAAADEBCAcAAgEALG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyBwAEAQAnb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAJDAAFAAYBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAuTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyOwEAD3Rlc3RCdW5kbGVOYW1lcwEAAygpWgEACkV4Y2VwdGlvbnMHABIBABtqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb24HABQBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uBwAWAQAzb3JnL2VjbGlwc2UvY29yZS9ydW50aW1lL09wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uBwAYAQATamF2YS9pby9JT0V4Y2VwdGlvbgoAAQAaDAAbABwBAAlnZXRBbGxJVXMBAC0oKUxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDsKAAEAHgwAHwAgAQAQY2hlY2tCdW5kbGVOYW1lcwEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVoBAAZhbGxJVXMBACtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAQdGVzdEZlYXR1cmVOYW1lcwoAAQAnDAAoABwBAA5nZXRBbGxHcm91cElVcwoAAQAqDAArACABABFjaGVja0ZlYXR1cmVOYW1lcwEACVNpZ25hdHVyZQEAYihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OylaBwAvAQATamF2YS91dGlsL0FycmF5TGlzdAoALgAJCgABADIMADMANAEAEmdldE91dHB1dERpcmVjdG9yeQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7BwA2AQAMamF2YS9pby9GaWxlCAA4AQARZmVhdHVyZU5hbWVzLmh0bWwKADUAOgwABQA7AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwA9AQASamF2YS9pby9GaWxlV3JpdGVyCgA8AD8MAAUAQAEAEShMamF2YS9pby9GaWxlOylWCQBCAEQHAEMBABBqYXZhL2xhbmcvU3lzdGVtDABFAEYBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsHAEgBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggASgEACG91dHB1dDogCgBHAEwMAAUATQEAFShMamF2YS9sYW5nL1N0cmluZzspVgoANQBPDABQADQBAA9nZXRBYnNvbHV0ZVBhdGgKAEcAUgwAUwBUAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBHAFYMAFcANAEACHRvU3RyaW5nCgBZAFsHAFoBABNqYXZhL2lvL1ByaW50U3RyZWFtDABcAE0BAAdwcmludGxuCwBeAGAHAF8BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwAYQBiAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsAZABmBwBlAQANamF2YS91dGlsL1NldAwAZwBoAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwBqAGwHAGsBABJqYXZhL3V0aWwvSXRlcmF0b3IMAG0AbgEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwcAcAEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAgAcgEABHRydWUIAHQBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkLAG8AdgwAdwB4AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAegB8BwB7AQAQamF2YS9sYW5nL1N0cmluZwwAfQB+AQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaCACAAQAkb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50CgABAIIMAIMAhAEADmlzRmVhdHVyZUdyb3VwAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoKAAEAhgwAhwCEAQAJaXNTcGVjaWFsCACJAQAbb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lCwBvAIsMAHcAjAEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CwCOAJAHAI8BAA5qYXZhL3V0aWwvTGlzdAwAkQB+AQADYWRkCACTAQABJQoAegCVDACWAJcBAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCACZAQAIRmVhdHVyZS0IAJsBAAdCdW5kbGUtCACdAQAHZmVhdHVyZQgAnwEABnBsdWdpbggAoQEAC1BsdWdpbi5uYW1lCACjAQAJZnJhZ21lbnQuCAClAQALRWNsaXBzZS5vcmcIAKcBAAZidW5kbGUKAKkAqwcAqgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDACsAAYBAA9wcmludFN0YWNrVHJhY2ULAGoArgwArwAPAQAHaGFzTmV4dAgAsQEAKTxoMT5GZWF0dXJlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+CQABALMMALQAtQEAA0VPTAEAEkxqYXZhL2xhbmcvU3RyaW5nOwoAPAC3DAC4AE0BAAV3cml0ZQgAugEAITxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6IAoAAQC8DAC9ADQBABBnZXRSZXBvVVJMVG9UZXN0CAC/AQAEPC9wPggAwQEANTxoMj5NYWpvcjogbWlzc2luZyBvciAocHJvYmFibHkpIGluY29ycmVjdCBuYW1lczwvaDI+CgABAMMMAMQAxQEAFHByaW50TGluZXNCdW5kbGVOYW1lAQAnKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0OylWCADHAQAfPGgyPlByb2JhYmx5IGNvcnJlY3QgbmFtZXM8L2gyPgsAjgDJDADKAMsBAARzaXplAQADKClJCgA8AM0MAM4ABgEABWNsb3NlCgAXAKsBAA1vdXRmaWxlV3JpdGVyAQAUTGphdmEvaW8vRmlsZVdyaXRlcjsBAAdvdXRmaWxlAQAOTGphdmEvaW8vRmlsZTsBABNpbmNvcnJlY3RCdW5kbGVOYW1lAQAQTGphdmEvdXRpbC9MaXN0OwEAGXByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUBAAt0ZXN0RGlyTmFtZQEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAppc0NhdGVnb3J5AQABWgEACmlzRnJhZ21lbnQBAApidW5kbGVOYW1lAQABZQEAHExqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbjsBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAERMamF2YS91dGlsL0xpc3Q8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwgA4wEAEGJ1bmRsZU5hbWVzLmh0bWwIAOUBACg8aDE+QnVuZGxlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+CADnAQA7PGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4IAOkBACU8aDI+UHJvYmFibHkgY29ycmVjdCBidW5kbGUgbmFtZTwvaDI+AQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcA7AEALW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvcgoA6wAJCgDvAPEHAPABABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMAPIA8wEABHNvcnQBACkoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjspVggA9QEACjxwPkNvdW50OiAKAEcA9wwAUwD4AQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgA+gEABDxvbD4LAI4AZgoAAQD9DAD+AP8BABFwcmludExpbmVMaXN0SXRlbQEAWyhM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AAgAfAEDAQUAAwABAQYAAAACAQdQSwMECgAAAAAAjpvEPhnkAU18IwAAfCMAADEAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvSVVOYW1lQ2hlY2tlci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMucmVwb3M7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnF1ZXJ5LklRdWVyeVJlc3VsdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlscy5JVUlkQ29tcGFyYXRvcjsKCnB1YmxpYyBjbGFzcyBJVU5hbWVDaGVja2VyIGV4dGVuZHMgVGVzdFJlcG8gewoKCgogICAgcHVibGljIGJvb2xlYW4gdGVzdEJ1bmRsZU5hbWVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSBnZXRBbGxJVXMoKTsKICAgICAgICByZXR1cm4gY2hlY2tCdW5kbGVOYW1lcyhhbGxJVXMpOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIHRlc3RGZWF0dXJlTmFtZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbEdyb3VwSVVzKCk7CiAgICAgICAgcmV0dXJuIGNoZWNrRmVhdHVyZU5hbWVzKGFsbElVcyk7CiAgICB9CgogICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRmVhdHVyZU5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiZmVhdHVyZU5hbWVzLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIiArIG91dGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBhbGxJVXMudG9Vbm1vZGlmaWFibGVTZXQoKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXRlZ29yeSA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSIpKTsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZXhjbHVkZSBmcmFnbWVudHM/CiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0ZyYWdtZW50ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50IikpOwoKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSBkbyBub3QgbmVlZCB0byBleGNsdWRlIGFsbCBvZiB0aGVzZT8gU2luY2Ugd2UgYXJlIHNwZWNpZmljYWxseSBzZWxlY3RpbmcgImdyb3VwcyI/IAogICAgICAgICAgICAgICAgICAgIGlmICgoaXNGZWF0dXJlR3JvdXAoaXUpICYmICFpc0NhdGVnb3J5KSAmJiAhaXNTcGVjaWFsKGl1KSAmJiAhaXNGcmFnbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGl1LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cmUgZmkgY2FuIGV2ZXIgYmUgbnVsbCAuLi4gYnV0LCBqdXN0IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QnVuZGxlTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIiUiKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkZlYXR1cmUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmZWF0dXJlIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJwbHVnaW4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIlBsdWdpbi5uYW1lIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmcmFnbWVudC4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkVjbGlwc2Uub3JnIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJidW5kbGUiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEFsbFByb3BlcnRpZXMob3V0ZmlsZVdyaXRlciwgaXUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDE+RmVhdHVyZSBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IG5hbWVzPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0QnVuZGxlTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5Qcm9iYWJseSBjb3JyZWN0IG5hbWVzPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSk7CgogICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDA7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgd2VpcmQKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0J1bmRsZU5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0QnVuZGxlTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAiYnVuZGxlTmFtZXMuaHRtbCIpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3V0cHV0OiAiICsgb3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGFsbElVcy50b1VubW9kaWZpYWJsZVNldCgpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXRlZ29yaWVzCiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NhdGVnb3J5ID0gInRydWUiLmVxdWFscyhpdS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmNhdGVnb3J5IikpOwogICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBleGNsdWRlIGZyYWdtZW50cz8KICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRnJhZ21lbnQgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiKSk7CgoKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBleGNsdWRlIGZlYXR1cmUgZ3JvdXBzIGhlcmUsIHNvIHRoZXkgY2FuIGJlIGluIHRoZWlyIG93biBsaXN0LCBmb3IgYmV0dGVyIGZvY3VzCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NhdGVnb3J5ICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50ICYmICFpc0ZlYXR1cmVHcm91cChpdSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUgPSBpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXJlIGZpIGNhbiBldmVyIGJlIG51bGwgLi4uIGJ1dCwganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoYnVuZGxlTmFtZS5zdGFydHNXaXRoKCIlIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJwbHVnaW4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIlBsdWdpbi5uYW1lIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJmcmFnbWVudC4iKSB8fCBidW5kbGVOYW1lLnN0YXJ0c1dpdGgoIkVjbGlwc2Uub3JnIikgfHwgYnVuZGxlTmFtZS5zdGFydHNXaXRoKCJidW5kbGUiKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmx5Q29ycmVjdEJ1bmRsZU5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEFsbFByb3BlcnRpZXMob3V0ZmlsZVdyaXRlciwgaXUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDE+QnVuZGxlIG5hbWVzIHVzZWQgaW4gcmVwb3NpdG9yeTwvaDE+IiArIEVPTCk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxwPlJlcG9zaXRvcnkgKCdyZXBvVVJMVG9UZXN0Jyk6ICIgKyBnZXRSZXBvVVJMVG9UZXN0KCkgKyAiPC9wPiIgKyBFT0wpOwogICAgICAgICAgICAvL291dGZpbGVXcml0ZXIud3JpdGUoIjxwPk5vdGUsIHRoZXJlIGFyZSBzZXZlcmFsIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LCBlLmcuIHNlZSA8YSBocmVmPVwiaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTU2NlwiPmJ1ZyAzMDk1NjY8L2E+LiBTbyBwcm92aWRlZCBoZXJlIGFzIEZZSSBmb3Igbm93LjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0QnVuZGxlTmFtZSk7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMj5Qcm9iYWJseSBjb3JyZWN0IGJ1bmRsZSBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc0J1bmRsZU5hbWUob3V0ZmlsZVdyaXRlciwgcHJvYmFibHlDb3JyZWN0QnVuZGxlTmFtZSk7CgogICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RCdW5kbGVOYW1lLnNpemUoKSA+IDA7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBpZiAob3V0ZmlsZVdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG91dGZpbGVXcml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgd2VpcmQKICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludExpbmVzQnVuZGxlTmFtZShGaWxlV3JpdGVyIG91dCwgTGlzdDxJSW5zdGFsbGFibGVVbml0PiBpdUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy9Db21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvckJ1bmRsZU5hbWUgPSBuZXcgSVVOYW1lQW5kSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIElJbnN0YWxsYWJsZVVuaXQ+IGNvbXBhcmF0b3JCdW5kbGVOYW1lID0gbmV3IElVSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChpdUxpc3QsIGNvbXBhcmF0b3JCdW5kbGVOYW1lKTsKICAgICAgICBvdXQud3JpdGUoIjxwPkNvdW50OiAiICsgaXVMaXN0LnNpemUoKSArIEVPTCk7CiAgICAgICAgb3V0LndyaXRlKCI8b2w+IiArIEVPTCk7CgogICAgICAgIGZvciAoSUluc3RhbGxhYmxlVW5pdCBpdSA6IGl1TGlzdCkgewogICAgICAgICAgICBwcmludExpbmVMaXN0SXRlbShvdXQsIGl1LCBJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSk7CiAgICAgICAgfQogICAgICAgIG91dC53cml0ZSgiPC9vbD4iICsgRU9MKTsKICAgIH0KCn0KUEsDBAoAAAAAADsC0j7js4ExThsAAE4bAAA3AAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3Rocy5jbGFzc8r+ur4AAAAxAUEHAAIBADFvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzBwAEAQAnb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvAQAMZGlzdHJpYnV0aW9uAQAPTGphdmEvdXRpbC9NYXA7AQALbWF4Q3JpdGVyaWEBAAFJAQAMbG9uZ2VzdE5hbWVzAQAQTGphdmEvdXRpbC9MaXN0OwEABjxpbml0PgEAAygpVgEABENvZGUKAAMADwwACwAMCQABABEMAAUABgkAAQATDAAHAAgHABUBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgAUAA8JAAEAGAwACQAKAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAM0xvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzOwEADGFzU29ydGVkTGlzdAEAKChMamF2YS91dGlsL0NvbGxlY3Rpb247KUxqYXZhL3V0aWwvTGlzdDsBAAlTaWduYXR1cmUBAFM8VDo6TGphdmEvbGFuZy9Db21wYXJhYmxlPC1UVDs+Oz4oTGphdmEvdXRpbC9Db2xsZWN0aW9uPFRUOz47KUxqYXZhL3V0aWwvTGlzdDxUVDs+OwoAFAAiDAALACMBABkoTGphdmEvdXRpbC9Db2xsZWN0aW9uOylWCgAlACcHACYBABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMACgAKQEABHNvcnQBABMoTGphdmEvdXRpbC9MaXN0OylWAQABYwEAFkxqYXZhL3V0aWwvQ29sbGVjdGlvbjsBAARsaXN0AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAG0xqYXZhL3V0aWwvQ29sbGVjdGlvbjxUVDs+OwEAFUxqYXZhL3V0aWwvTGlzdDxUVDs+OwEABXN1aXRlAQAYKClManVuaXQvZnJhbWV3b3JrL1Rlc3Q7CQAzADUHADQBABBqYXZhL2xhbmcvU3lzdGVtDAA2ADcBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsIADkBAB50ZXN0IGZlYXR1cmUgZGlyZWN0b3J5IGxlbmd0aHMKADsAPQcAPAEAE2phdmEvaW8vUHJpbnRTdHJlYW0MAD4APwEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYKAAEADwgAQgEAGnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoCgABAEQMAEUAPwEAB3NldE5hbWUIAEcBAC9maWxlOi8vL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2luZGlnb1JDMy93dHAtcmVwbwoAAQBJDABKAD8BABBzZXRSZXBvVVJMVG9UZXN0CABMAQARL2hvbWUvZGF2aWR3L3RlbXAKAAEATgwATwA/AQASc2V0T3V0cHV0RGlyZWN0b3J5AQASZmVhdHVyZU5hbWVMZW5ndGhzAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYIAFQBACgvaG9tZS9maWxlcy9idWlsZHppcHMvaW5kaWdvUkMzL3d0cC1yZXBvCABWAQAFL3RlbXAKAAEAWAwAQgBZAQADKClJCgBbAF0HAFwBAC5vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uDABeAAwBAA9wcmludFN0YWNrVHJhY2UKAGAAXQcAYQEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgoAYwBdBwBkAQATamF2YS9pby9JT0V4Y2VwdGlvbgEABGFyZ3MBABNbTGphdmEvbGFuZy9TdHJpbmc7AQABZQEAMExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uOwEAHUxqYXZhL25ldC9VUklTeW50YXhFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAHYW5hbHl6ZQEALihMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7KVYBAGIoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcAbwEAEWphdmEvdXRpbC9IYXNoTWFwCgBuAA8LAHIAdAcAcwEAKW9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0DAB1AHYBABF0b1VubW9kaWZpYWJsZVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwB4AHoHAHkBAA1qYXZhL3V0aWwvU2V0DAB7AHwBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLAH4AgAcAfwEAEmphdmEvdXRpbC9JdGVyYXRvcgwAgQCCAQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7BwCEAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0CwCDAIYMAIcAiAEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsIAIoBAA4uZmVhdHVyZS5ncm91cAoAjACOBwCNAQAQamF2YS9sYW5nL1N0cmluZwwAjwBZAQAGbGVuZ3RoCgCMAJEMAJIAkwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCgCMAJUMAJYAlwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsHAJkBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoAjACbDACcAJ0BAAd2YWx1ZU9mAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAJgAnwwACwA/CAChAQABXwoAmACjDACkAKUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsLAIMApwwAqACpAQAKZ2V0VmVyc2lvbgEAKygpTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvVmVyc2lvbjsKAJgAqwwApACsAQAtKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgCYAK4MAK8AiAEACHRvU3RyaW5nCgABALEMALIAswEACHRhYnVsYXRlAQAEKEkpVgsAtQC3BwC2AQAOamF2YS91dGlsL0xpc3QMALgAuQEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgsAfgC7DAC8AL0BAAdoYXNOZXh0AQADKClaAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEAAml1AQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAAtmZWF0dXJlTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADGZlYXR1cmVHcm91cAEAEmZlYXR1cmVHcm91cExlbmd0aAEABGxpbmUBAF9Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ8TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDs+OwEAC3ByaW50UmVwb3J0AQAKRXhjZXB0aW9ucwgAywEAHTxiciAvPj09PT09PT09PT09PT09PT09PT09PT09CgABAM0MAM4AiAEAEmdldE91dHB1dERpcmVjdG9yeQcA0AEADGphdmEvaW8vRmlsZQgA0gEAHGZlYXR1cmVEaXJlY3RvcnlMZW5ndGhzLmh0bWwKAM8A1AwACwDVAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwDXAQASamF2YS9pby9GaWxlV3JpdGVyCgDWANkMAAsA2gEAEShMamF2YS9pby9GaWxlOylWCADcAQAhPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAN4MAN8AiAEAEGdldFJlcG9VUkxUb1Rlc3QIAOEBAAQ8L3A+CQABAOMMAOQAwwEAA0VPTAoAAQDmDAA+AOcBACkoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS9sYW5nL1N0cmluZzspVggA6QEANjxiciAvPjxiciAvPkRpc3RyaWJ1dGlvbiBvZiBGZWF0dXJlIERpcmVjdG9yeSBMZW5ndGhzOgcA6wEAEWphdmEvbGFuZy9JbnRlZ2VyCgDqAO0MAAsAswsA7wDxBwDwAQANamF2YS91dGlsL01hcAwA8gB2AQAGa2V5U2V0CgABAPQMAB0AHgsAtQB6CwDvAPcMAPgA+QEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7CAD7AQAIICZuYnNwOyAKAOoA/QwA/gBZAQAIaW50VmFsdWUKAOoBAAwAnAEBAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwgBAwEAFz09PT09PT09PT09PT09PT09PT09PT09CAEFAQAoICZuYnNwOyBUb3RhbCBmZWF0dXJlcyBkaXJlY3RvcnkgbmFtZXM6IAsAtQEHDAEIAFkBAARzaXplCAEKAQA0ICZuYnNwOyBGZWF0dXJlcyBkaXJlY3RvcnkgbmFtZXMgd2l0aCBsZW5ndGhzIGFib3ZlIAoAmAEMDACkAQ0BABwoSSlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwEPAQA1b3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1N0cmluZ0xlbmd0aENvbXBhcmF0b3IKAQ4ADwoAJQESDAAoARMBACkoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjspVgsAtQEVDAD4ARYBABUoSSlMamF2YS9sYW5nL09iamVjdDsKAIwBGAwAnAEZAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7CAEbAQBOICZuYnNwOyAgTm8gZmVhdHVyZSBkaXJlY3RvcnkgbmFtZXMgbGVuZ3RocyB3ZXJlIGxvbmdlciB0aGFuIHRoZSBtYXhDcml0ZXJpYSwgCgDWAR0MAR4ADAEABWNsb3NlAQAGU1BBQ0VSAQANb3V0ZmlsZVdyaXRlcgEAFExqYXZhL2lvL0ZpbGVXcml0ZXI7AQAHb3V0ZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQALdGVzdERpck5hbWUBAAV0b3RhbAEAE0xqYXZhL2xhbmcvSW50ZWdlcjsBAARr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AJkAGgAAABYAAgAAABMAGwAcAAAAAAATAL4AvwABAC0AAAAMAAEAAAATAL4AxwABAAEBPwAAAAIBQFBLAwQKAAAAAADVscQ+i1GIIPkWAAD5FgAANgAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9GZWF0dXJlTmFtZUxlbmd0aHMuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnJlcG9zOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnV0aWxzLlN0cmluZ0xlbmd0aENvbXBhcmF0b3I7CgpwdWJsaWMgY2xhc3MgRmVhdHVyZU5hbWVMZW5ndGhzIGV4dGVuZHMgVGVzdFJlcG8gewoKICAgIHByaXZhdGUgTWFwICBkaXN0cmlidXRpb24gPSBudWxsOwogICAgcHJpdmF0ZSBpbnQgIG1heENyaXRlcmlhICA9IDEwMDsKICAgIHByaXZhdGUgTGlzdCBsb25nZXN0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CgogICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBUPj4gTGlzdDxUPiBhc1NvcnRlZExpc3QoQ29sbGVjdGlvbjxUPiBjKSB7CiAgICAgICAgTGlzdDxUPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxUPihjKTsKICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKICAgICAgICByZXR1cm4gbGlzdDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0IGZlYXR1cmUgZGlyZWN0b3J5IGxlbmd0aHMiKTsKICAgICAgICBGZWF0dXJlTmFtZUxlbmd0aHMgZmVhdHVyZU5hbWVMZW5ndGhzID0gbmV3IEZlYXR1cmVOYW1lTGVuZ3RocygpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXROYW1lKCJ0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aCIpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRSZXBvVVJMVG9UZXN0KCJmaWxlOi8vL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2luZGlnb1JDMy93dHAtcmVwbyIpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRPdXRwdXREaXJlY3RvcnkoIi9ob21lL2Rhdmlkdy90ZW1wIik7CiAgICAgICAgcmV0dXJuIGZlYXR1cmVOYW1lTGVuZ3RoczsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgRmVhdHVyZU5hbWVMZW5ndGhzIGZlYXR1cmVOYW1lTGVuZ3RocyA9IG5ldyBGZWF0dXJlTmFtZUxlbmd0aHMoKTsKICAgICAgICBmZWF0dXJlTmFtZUxlbmd0aHMuc2V0UmVwb1VSTFRvVGVzdCgiL2hvbWUvZmlsZXMvYnVpbGR6aXBzL2luZGlnb1JDMy93dHAtcmVwbyIpOwogICAgICAgIGZlYXR1cmVOYW1lTGVuZ3Rocy5zZXRPdXRwdXREaXJlY3RvcnkoIi90ZW1wIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZmVhdHVyZU5hbWVMZW5ndGhzLnRlc3RGZWF0dXJlRGlyZWN0b3J5TGVuZ3RoKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGFuYWx5emUoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgewogICAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgLy8gc2ltdWxhdGUgd2hhdCBkaXJlY3RvcnkgbmFtZSB3b3VsZCBiZSwgd2hlbiBpbnN0YWxsZWQKICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVOYW1lID0gaXUuZ2V0SWQoKTsKICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVHcm91cCA9ICIuZmVhdHVyZS5ncm91cCI7CiAgICAgICAgICAgIGludCBmZWF0dXJlR3JvdXBMZW5ndGggPSBmZWF0dXJlR3JvdXAubGVuZ3RoKCk7CiAgICAgICAgICAgIGlmIChmZWF0dXJlTmFtZS5lbmRzV2l0aChmZWF0dXJlR3JvdXApKSB7CiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lLnN1YnN0cmluZygwLCBmZWF0dXJlTmFtZS5sZW5ndGgoKSAtIGZlYXR1cmVHcm91cExlbmd0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFN0cmluZyBsaW5lID0gZmVhdHVyZU5hbWUgKyAiXyIgKyBpdS5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgIHRhYnVsYXRlKGxpbmUubGVuZ3RoKCkpOwogICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IG1heENyaXRlcmlhKSB7CiAgICAgICAgICAgICAgICBsb25nZXN0TmFtZXMuYWRkKGxpbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgdm9pZCBwcmludFJlcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIFNQQUNFUiA9ICI8YnIgLz49PT09PT09PT09PT09PT09PT09PT09PSI7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIFN0cmluZyB0ZXN0RGlyTmFtZSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG91dGZpbGUgPSBuZXcgRmlsZSh0ZXN0RGlyTmFtZSwgImZlYXR1cmVEaXJlY3RvcnlMZW5ndGhzLmh0bWwiKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dGZpbGUpOwoKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogIiArIGdldFJlcG9VUkxUb1Rlc3QoKSArICI8L3A+IiArIEVPTCk7CiAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgIjxiciAvPjxiciAvPkRpc3RyaWJ1dGlvbiBvZiBGZWF0dXJlIERpcmVjdG9yeSBMZW5ndGhzOiIgKyBTUEFDRVIpOwoKICAgICAgICAgICAgSW50ZWdlciB0b3RhbCA9IG5ldyBJbnRlZ2VyKDApOwogICAgICAgICAgICBTZXQga2V5cyA9IGRpc3RyaWJ1dGlvbi5rZXlTZXQoKTsKICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0ID0gYXNTb3J0ZWRMaXN0KGtleXMpOwogICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CiAgICAgICAgICAgICAgICBJbnRlZ2VyIGNhdGVnb3J5ID0gKEludGVnZXIpIGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgZGlzdHJpYnV0aW9uLmdldChjYXRlZ29yeSk7CiAgICAgICAgICAgICAgICBwcmludGxuKG91dGZpbGVXcml0ZXIsIE5CU1AgKyBjYXRlZ29yeSArIE5CU1AgKyBjb3VudCk7CiAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBOQlNQICsgIlRvdGFsIGZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lczogIiArIHRvdGFsICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCAiPT09PT09PT09PT09PT09PT09PT09PT0iICsgRU9MKTsKICAgICAgICAgICAgaWYgKGxvbmdlc3ROYW1lcy5zaXplKCkgPiAwKSB7CgogICAgICAgICAgICAgICAgcHJpbnRsbihvdXRmaWxlV3JpdGVyLCBOQlNQICsgIkZlYXR1cmVzIGRpcmVjdG9yeSBuYW1lcyB3aXRoIGxlbmd0aHMgYWJvdmUgIiArIG1heENyaXRlcmlhICsgRU9MKTsKICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobG9uZ2VzdE5hbWVzLCBuZXcgU3RyaW5nTGVuZ3RoQ29tcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9uZ2VzdE5hbWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSAoU3RyaW5nKSBsb25nZXN0TmFtZXMuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgbGluZS5sZW5ndGgoKSArIE5CU1AgKyBsaW5lICsgRU9MKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50bG4ob3V0ZmlsZVdyaXRlciwgTkJTUCArICIgTm8gZmVhdHVyZSBkaXJlY3RvcnkgbmFtZXMgbGVuZ3RocyB3ZXJlIGxvbmdlciB0aGFuIHRoZSBtYXhDcml0ZXJpYSwgIiArIG1heENyaXRlcmlhICsgRU9MKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKG91dGZpbGVXcml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvdXRmaWxlV3JpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHdlaXJkCiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHRhYnVsYXRlKGludCBsZW5ndGgpIHsKICAgICAgICBJbnRlZ2VyIGNhdGVnb3J5ID0gbmV3IEludGVnZXIobGVuZ3RoKTsKICAgICAgICBJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIGRpc3RyaWJ1dGlvbi5nZXQoY2F0ZWdvcnkpOwogICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIG91ciBmaXJzdCBvY2N1cmFuY2UKICAgICAgICAgICAgY291bnQgPSBuZXcgSW50ZWdlcigxKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgICAgICBkaXN0cmlidXRpb24ucHV0KGNhdGVnb3J5LCBjb3VudCk7CiAgICB9CgogICAgcHVibGljIGludCB0ZXN0RmVhdHVyZURpcmVjdG9yeUxlbmd0aCgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgIElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMgPSBnZXRBbGxHcm91cElVcygpOwogICAgICAgIHJldHVybiBjaGVja0ZlYXR1cmVEaXJMZW50aHMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBjaGVja0ZlYXR1cmVEaXJMZW50aHMoSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBhbmFseXplKGFsbElVcyk7CiAgICAgICAgcHJpbnRSZXBvcnQoKTsKICAgICAgICByZXR1cm4gbG9uZ2VzdE5hbWVzLnNpemUoKTsKICAgIH0KfQpQSwMECgAAAAAAOwLSPurdsP0MGwAADBsAADgAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvUHJvdmlkZXJOYW1lQ2hlY2tlci5jbGFzc8r+ur4AAAAxAUYHAAIBADJvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvUHJvdmlkZXJOYW1lQ2hlY2tlcgcABAEAJ29yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9UZXN0UmVwbwEAEU9MRF9QUk9WSURFUl9OQU1FAQASTGphdmEvbGFuZy9TdHJpbmc7AQANQ29uc3RhbnRWYWx1ZQgACQEAC0VjbGlwc2Uub3JnAQAXRVhQRUNURURfUFJPVklERVJfTkFNRVMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAQDAAMAA0HABIBABBqYXZhL2xhbmcvU3RyaW5nCAAUAQAXRWNsaXBzZSBFcXVpbm94IFByb2plY3QIABYBAAtFY2xpcHNlIFBUUAgAGAEADUVjbGlwc2UgT3JiaXQIABoBABpFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQgAHAEAC0VjbGlwc2UgQ0RUCAAeAQAfRWNsaXBzZSBBZ2VudCBNb2RlbGluZyBQbGF0Zm9ybQgAIAEAFEVjbGlwc2UgQklSVCBQcm9qZWN0CAAiAQAbRWNsaXBzZSBEYXRhIFRvb2xzIFBsYXRmb3JtCAAkAQAYRWNsaXBzZSBNb2RlbGluZyBQcm9qZWN0CAAmAQANRWNsaXBzZSBNeWx5bggAKAEAF0VjbGlwc2UgTWVtb3J5IEFuYWx5emVyCAAqAQATRWNsaXBzZSBMaW51eCBUb29scwgALAEADkVjbGlwc2UgSnVidWxhCAAuAQAVRWNsaXBzZSBKZXR0eSBQcm9qZWN0CAAwAQANRWNsaXBzZSBHeXJleAgAMgEADEVjbGlwc2UgRUdpdAgANAEADEVjbGlwc2UgSkdpdAgANgEAHkVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUHJvamVjdAgAOAEAGUVjbGlwc2UgUGFja2FnaW5nIFByb2plY3QIADoBABVFY2xpcHNlIFNjb3V0IFByb2plY3QIADwBABBFY2xpcHNlIFNlcXVveWFoCAA+AQASRWNsaXBzZSBUTSBQcm9qZWN0CQABAEAMAAoACwEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADRMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXI7AQASY2hlY2tQcm92aWRlck5hbWVzAQAuKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDspWgEACkV4Y2VwdGlvbnMHAEkBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAJU2lnbmF0dXJlAQBiKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47KVoHAE0BABNqYXZhL3V0aWwvQXJyYXlMaXN0CgBMABAKAAEAUAwAUQBSAQASZ2V0T3V0cHV0RGlyZWN0b3J5AQAUKClMamF2YS9sYW5nL1N0cmluZzsHAFQBAAxqYXZhL2lvL0ZpbGUIAFYBABJwcm92aWRlck5hbWVzLmh0bWwKAFMAWAwADABZAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWBwBbAQASamF2YS9pby9GaWxlV3JpdGVyCgBaAF0MAAwAXgEAEShMamF2YS9pby9GaWxlOylWCQBgAGIHAGEBABBqYXZhL2xhbmcvU3lzdGVtDABjAGQBAANvdXQBABVMamF2YS9pby9QcmludFN0cmVhbTsHAGYBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcggAaAEACG91dHB1dDogCgBlAGoMAAwAawEAFShMamF2YS9sYW5nL1N0cmluZzspVgoAUwBtDABuAFIBAA9nZXRBYnNvbHV0ZVBhdGgKAGUAcAwAcQByAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBlAHQMAHUAUgEACHRvU3RyaW5nCgB3AHkHAHgBABNqYXZhL2lvL1ByaW50U3RyZWFtDAB6AGsBAAdwcmludGxuCwB8AH4HAH0BAClvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdAwAfwCAAQARdG9Vbm1vZGlmaWFibGVTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwsAggCEBwCDAQANamF2YS91dGlsL1NldAwAhQCGAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7CwCIAIoHAIkBABJqYXZhL3V0aWwvSXRlcmF0b3IMAIsAjAEABG5leHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwcAjgEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAgAkAEABHRydWUIAJIBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkLAI0AlAwAlQCWAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwoAEQCYDACZAJoBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoIAJwBACRvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQKAAEAngwAnwCgAQAJaXNTcGVjaWFsAQA1KExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KVoIAKIBAB9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyCwCNAKQMAJUApQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CwCnAKkHAKgBAA5qYXZhL3V0aWwvTGlzdAwAqgCaAQADYWRkCACsAQABJQoAEQCuDACvALABAApzdGFydHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaCACyAQAHRWNsaXBzZQgAtAEAC2VjbGlwc2Uub3JnCAC2AQALVEhBTEVTR1JPVVAIALgBAAVJTlJJQQgAugEAC0VuZ2luZWVyaW5nCAC8AQAPb3JnLmVjbGlwc2Uuand0CgARAL4MAL8AwAEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaCADCAQAPd3d3LmV4YW1wbGUub3JnCADEAQAPd3d3LmVjbGlwc2Uub3JnCADGAQAIUHJvdmlkZXIIAMgBAAhwcm92aWRlcggAygEAB0J1bmRsZS0IAMwBAARidW5kCADOAQAHRWNsaXNwZQgA0AEADkVjbGlwc2Uub3JnIC0gCgABANIMANMAsAEAFGluTGlzdE9mRXhwZWN0ZWROYW1lCgDVANcHANYBABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgwA2AANAQAPcHJpbnRTdGFja1RyYWNlCwCIANoMANsA3AEAB2hhc05leHQBAAMoKVoIAN4BACo8aDE+UHJvdmlkZXIgbmFtZXMgdXNlZCBpbiByZXBvc2l0b3J5PC9oMT4JAAEA4AwA4QAGAQADRU9MCgBaAOMMAOQAawEABXdyaXRlCADmAQAhPHA+UmVwb3NpdG9yeSAoJ3JlcG9VUkxUb1Rlc3QnKTogCgABAOgMAOkAUgEAEGdldFJlcG9VUkxUb1Rlc3QIAOsBAAQ8L3A+CADtAQA9PGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPgoAAQDvDADwAPEBABJwcmludExpbmVzUHJvdmlkZXIBACcoTGphdmEvaW8vRmlsZVdyaXRlcjtMamF2YS91dGlsL0xpc3Q7KVYIAPMBAEQ8aDI+SW5kZXRlcm1pbmF0ZTogbWF5YmUgY29ycmVjdCwgbWF5YmUgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPggA9QEANzxoMj5NaW5vciBwcm9ibGVtIG9mIHVzaW5nIG9sZCBzdHlsZSBwcm92aWRlciBuYW1lPC9oMj4IAPcBAC08aDI+UHJvYmFibHkgdXNpbmcgY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4LAKcA+QwA+gD7AQAEc2l6ZQEAAygpSQoAWgD9DAD+AA0BAAVjbG9zZQoASADXAQAGYWxsSVVzAQArTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvcXVlcnkvSVF1ZXJ5UmVzdWx0OwEADW91dGZpbGVXcml0ZXIBABRMamF2YS9pby9GaWxlV3JpdGVyOwEAB291dGZpbGUBAA5MamF2YS9pby9GaWxlOwEAFWluY29ycmVjdFByb3ZpZGVyTmFtZQEAEExqYXZhL3V0aWwvTGlzdDsBABNjb3JyZWN0UHJvdmlkZXJOYW1lAQAYaW5jb3JyZWN0T2xkUHJvdmlkZXJOYW1lAQATdW5rbm93blByb3ZpZGVyTmFtZQEAC3Rlc3REaXJOYW1lAQACaXUBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEACmlzQ2F0ZWdvcnkBAAFaAQAKaXNGcmFnbWVudAEADHByb3ZpZGVyTmFtZQEAAWUBABxMamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb247AQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEAX0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL3F1ZXJ5L0lRdWVyeVJlc3VsdDxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQBETGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsBABF0ZXN0UHJvdmlkZXJOYW1lcwcBGgEAG2phdmEvbmV0L1VSSVN5bnRheEV4Y2VwdGlvbgcBHAEALm9yZy9lY2xpcHNlL2VxdWlub3gvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24HAR4BADNvcmcvZWNsaXBzZS9jb3JlL3J1bnRpbWUvT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KAAEBIAwBIQEiAQAJZ2V0QWxsSVVzAQAtKClMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9xdWVyeS9JUXVlcnlSZXN1bHQ7CgABASQMAEUARgEABnJlc3VsdAEAAWkBAAFJAQBbKExqYXZhL2lvL0ZpbGVXcml0ZXI7TGphdmEvdXRpbC9MaXN0PExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjspVgcBKgEALW9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvcgoBKQAQCgEtAS8HAS4BABVqYXZhL3V0aWwvQ29sbGVjdGlvbnMMATABMQEABHNvcnQBACkoTGphdmEvdXRpbC9MaXN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjspVggBMwEACjxwPkNvdW50OiAKAGUBNQwAcQE2AQAcKEkpTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwgBOAEABDxvbD4LAKcAhAoAAQE7DAE8AT0BABFwcmludExpbmVMaXN0SXRlbQEAWyhMamF2YS9pby9GaWxlV3JpdGVyO0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7TGphdmEvbGFuZy9TdHJpbmc7KVYIAT8BAAU8L29sPgEABml1TGlzdAEAFmNvbXBhcmF0b3JQcm92aWRlck5hbWUBABZMamF2YS91dGlsL0NvbXBhcmF0b3I7AQBLTGphdmEvdXRpbC9Db21wYXJhdG9yPC1Mb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47AQAKU291cmNlRmlsZQEAGFByb3ZpZGVyTmFtZUNoZWNrZXIuamF2YQAhAAEAAwAAAAIAGgAFAAYAAQAHAAAAAgAIAAIACgALAAAABQABAAwADQABAA4AAAC+AAUAAQAAAIwqtwAPKhAWvQARWQMSE1NZBBIVU1kFEhdTWQYSGVNZBxIbU1kIEh1TWRAGEh9TWRAHEiFTWRAIEiNTWRAJEiVTWRAKEidTWRALEilTWRAMEitTWRANEi1TWRAOEi9TWRAPEjFTWRAQEjNTWRAREjVTWRASEjdTWRATEjlTWRAUEjtTWRAVEj1TtQA/sQAAAAIAQQAAAA4AAwAAABIABAAUAIsAEgBCAAAADAABAAAAjABDAEQAAAACAEUARgADAEcAAAAEAAEASABKAAAAAgBLAA4AAASuAAQAEQAAAsQBTQFOuwBMWbcATjoEuwBMWbcATjoFuwBMWbcATjoGuwBMWbcATjoHKrYATzoIuwBTWRkIElW3AFdOuwBaWS23AFxNsgBfuwBlWRJntwBpLbYAbLYAb7YAc7YAdiu5AHsBALkAgQEAOgqnAWgZCrkAhwEAwACNOgkSjxkJEpG5AJMCALYAlzYLEo8ZCRKbuQCTAgC2AJc2DBULmgE3KhkJtgCdmgEuFQyaASkZCRKhAbkAowMAOg0ZDccAEBkEGQm5AKYCAFenAQsZDRKrtgCtmgCFGQ0SsbYAl5oAexkNErO2AK2aAHEZDRK1tgCtmgBnGQ0St7YArZoAXRkNErm2AK2aAFMZDRK7tgC9mgBJGQ0SwbYAvZoAPxkNEsO2AL2aADUZDRLFtgC9mgArGQ0Sx7YAvZoAIRkNEsm2AK2aABcZDRLLtgCtmgANGQ0SzbYArZkAEBkEGQm5AKYCAFenAHIZDRLPtgCtmQAQGQUZCbkApgIAV6cAWyoZDbcA0ZkAEBkFGQm5AKYCAFenAEUSCBkNtgCXmQAQGQYZCbkApgIAV6cALhkNErG2AK2ZABAZBxkJuQCmAgBXpwAXGQcZCbkApgIAV6cACjoLGQu2ANQZCrkA2QEAmv6ULLsAZVkS3bcAabIA37YAb7YAc7YA4iy7AGVZEuW3AGkqtgDntgBvEuq2AG+yAN+2AG+2AHO2AOIsuwBlWRLstwBpsgDftgBvtgBztgDiKiwZBLcA7iy7AGVZEvK3AGmyAN+2AG+2AHO2AOIqLBkHtwDuLLsAZVkS9LcAabIA37YAb7YAc7YA4iosGQa3AO4suwBlWRL2twBpsgDftgBvtgBztgDiKiwZBbcA7hkEuQD4AQCeAAcEpwAEAzYPLMYAESy2APynAAo6EBkQtgD/FQ+sOg4sxgARLLYA/KcACjoQGRC2AP8ZDr8ABAB4AccBygDVApwCoAKjAEgALgKYAq0AAAKzArcCugBIAAMAQQAAANYANQAAABcAAgAYAAQAGQANABoAFgAbAB8AHAAoAB0ALgAfADoAIABDACEAXAAiAHgAJQCIACcAmAArAKsALAC3AC0AvAAuAMkAMQFVADIBYgA0AWwANQF5ADcBggA4AY8AOgGZADsBpgA/AbAAQAG9AEMBygBOAcwATwHRACIB2wBTAfEAVAITAFUCKQBWAjAAVwJGAFgCTQBZAmMAWgJqAFsCgABcAocAYQKYAGQCnABmAqMAaAKlAGoCqgBhAq0AYwKvAGQCswBmAroAaAK8AGoCwQBtAEIAAACiABAAAALEAEMARAAAAAACxAEAAQEAAQACAsIBAgEDAAIABALAAQQBBQADAA0CtwEGAQcABAAWAq4BCAEHAAUAHwKlAQkBBwAGACgCnAEKAQcABwAuApYBCwAGAAgAeAFZAQwBDQAJAIgBQgEOAQ8ACwCYATIBEAEPAAwAtwEQAREABgANAcwABQESARMACwKlAAUBEgEUABACvAAFARIBFAAQARUAAAA0AAUAAALEAQABFgABAA0CtwEGARcABAAWAq4BCAEXAAUAHwKlAQkBFwAGACgCnAEKARcABwABARgA3AACAEcAAAAKAAQBGQEbAR0ASAAOAAAAVQACAAIAAAALKrYBH0wqK7cBI6wAAAADAEEAAAAKAAIAAABxAAUAcgBCAAAAFgACAAAACwBDAEQAAAAFAAYBAAEBAAEBFQAAAAwAAQAFAAYBAAEWAAEAAgDTALAAAQAOAAAAhwACAAQAAAAnAz0DPqcAGCq0AD8dMiu2AJeZAAgEPacAD4QDAR0qtAA/vqH/5RysAAAAAgBBAAAAHgAHAAAAdgACAHcABwB4ABQAeQAWAHoAGQB3ACUAfQBCAAAAKgAEAAAAJwBDAEQAAAAAACcBEQAGAAEAAgAlASUBDwACAAQAIQEmAScAAwACAPAA8QADAEcAAAAEAAEASABKAAAAAgEoAA4AAAEUAAQABgAAAIa7ASlZtwErTiwtuAEsK7sAZVkTATK3AGksuQD4AQC2ATSyAN+2AG+2AHO2AOIruwBlWRMBN7cAabIA37YAb7YAc7YA4iy5ATkBADoFpwAYGQW5AIcBAMAAjToEKisZBBKhtgE6GQW5ANkBAJr/5Cu7AGVZEwE+twBpsgDftgBvtgBztgDisQAAAAMAQQAAACYACQAAAIMACACEAA0AhQAtAIYARACIAFsAiQBkAIgAbgCLAIUAjABCAAAANAAFAAAAhgBDAEQAAAAAAIYAYwEDAAEAAACGAUABBwACAAgAfgFBAUIAAwBbAAkBDAENAAQBFQAAABYAAgAAAIYBQAEXAAIACAB+AUEBQwADAAEBRAAAAAIBRVBLAwQKAAAAAAD0m8Q+wAE4O5MdAACTHQAANwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9Qcm92aWRlck5hbWVDaGVja2VyLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy5yZXBvczsKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkuSVF1ZXJ5UmVzdWx0OwppbXBvcnQgb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnV0aWxzLklVSWRDb21wYXJhdG9yOwoKcHVibGljIGNsYXNzIFByb3ZpZGVyTmFtZUNoZWNrZXIgZXh0ZW5kcyBUZXN0UmVwbyB7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1BST1ZJREVSX05BTUUgICAgICAgPSAiRWNsaXBzZS5vcmciOwogICAgcHJpdmF0ZSBTdHJpbmdbXSAgICAgICAgICAgIEVYUEVDVEVEX1BST1ZJREVSX05BTUVTID0geyJFY2xpcHNlIEVxdWlub3ggUHJvamVjdCIsICJFY2xpcHNlIFBUUCIsICJFY2xpcHNlIE9yYml0IiwgIkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIiwgIkVjbGlwc2UgQ0RUIiwgIkVjbGlwc2UgQWdlbnQgTW9kZWxpbmcgUGxhdGZvcm0iLCAiRWNsaXBzZSBCSVJUIFByb2plY3QiLCAiRWNsaXBzZSBEYXRhIFRvb2xzIFBsYXRmb3JtIiwgIkVjbGlwc2UgTW9kZWxpbmcgUHJvamVjdCIsICJFY2xpcHNlIE15bHluIiwgIkVjbGlwc2UgTWVtb3J5IEFuYWx5emVyIiwgIkVjbGlwc2UgTGludXggVG9vbHMiLCAiRWNsaXBzZSBKdWJ1bGEiLCAiRWNsaXBzZSBKZXR0eSBQcm9qZWN0IiwgIkVjbGlwc2UgR3lyZXgiLCAiRWNsaXBzZSBFR2l0IiwgIkVjbGlwc2UgSkdpdCIsICJFY2xpcHNlIEFnZW50IE1vZGVsaW5nIFByb2plY3QiLCAiRWNsaXBzZSBQYWNrYWdpbmcgUHJvamVjdCIsICJFY2xpcHNlIFNjb3V0IFByb2plY3QiLCAiRWNsaXBzZSBTZXF1b3lhaCIsICJFY2xpcHNlIFRNIFByb2plY3QifTsKCiAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQcm92aWRlck5hbWVzKElRdWVyeVJlc3VsdDxJSW5zdGFsbGFibGVVbml0PiBhbGxJVXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgRmlsZVdyaXRlciBvdXRmaWxlV3JpdGVyID0gbnVsbDsKICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gaW5jb3JyZWN0UHJvdmlkZXJOYW1lID0gbmV3IEFycmF5TGlzdDxJSW5zdGFsbGFibGVVbml0PigpOwogICAgICAgIExpc3Q8SUluc3RhbGxhYmxlVW5pdD4gY29ycmVjdFByb3ZpZGVyTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGluY29ycmVjdE9sZFByb3ZpZGVyTmFtZSA9IG5ldyBBcnJheUxpc3Q8SUluc3RhbGxhYmxlVW5pdD4oKTsKICAgICAgICBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IHVua25vd25Qcm92aWRlck5hbWUgPSBuZXcgQXJyYXlMaXN0PElJbnN0YWxsYWJsZVVuaXQ+KCk7CiAgICAgICAgU3RyaW5nIHRlc3REaXJOYW1lID0gZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZmlsZSA9IG5ldyBGaWxlKHRlc3REaXJOYW1lLCAicHJvdmlkZXJOYW1lcy5odG1sIik7CiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihvdXRmaWxlKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXQ6ICIgKyBvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgZm9yIChJSW5zdGFsbGFibGVVbml0IGl1IDogYWxsSVVzLnRvVW5tb2RpZmlhYmxlU2V0KCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhdGVnb3JpZXMKICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2F0ZWdvcnkgPSAidHJ1ZSIuZXF1YWxzKGl1LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGV4Y2x1ZGUgZnJhZ21lbnRzPwogICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGcmFnbWVudCA9ICJ0cnVlIi5lcXVhbHMoaXUuZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCIpKTsKCgogICAgICAgICAgICAgICAgICAgIC8vfHwgaXUuZ2V0SWQoKS5lbmRzV2l0aCgiZmVhdHVyZS5ncm91cCIpCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NhdGVnb3J5ICYmICFpc1NwZWNpYWwoaXUpICYmICFpc0ZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm92aWRlck5hbWUgPSBpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPVklERVIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBlcnJvcnMgYW5kIG1pc3NwZWxsaW5ncwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiJSIpIHx8IHByb3ZpZGVyTmFtZS5lcXVhbHMoIkVjbGlwc2UiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiZWNsaXBzZS5vcmciKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiVEhBTEVTR1JPVVAiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiSU5SSUEiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRW5naW5lZXJpbmciKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoIm9yZy5lY2xpcHNlLmp3dCIpIHx8IHByb3ZpZGVyTmFtZS5jb250YWlucygid3d3LmV4YW1wbGUub3JnIikgfHwgcHJvdmlkZXJOYW1lLmNvbnRhaW5zKCJ3d3cuZWNsaXBzZS5vcmciKSB8fCBwcm92aWRlck5hbWUuY29udGFpbnMoIlByb3ZpZGVyIikgfHwgcHJvdmlkZXJOYW1lLmNvbnRhaW5zKCJwcm92aWRlciIpIHx8IHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJCdW5kbGUtIikgfHwgcHJvdmlkZXJOYW1lLnN0YXJ0c1dpdGgoImJ1bmQiKSB8fCBwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRWNsaXNwZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RQcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlck5hbWUuc3RhcnRzV2l0aCgiRWNsaXBzZS5vcmcgLSAiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFByb3ZpZGVyTmFtZS5hZGQoaXUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluTGlzdE9mRXhwZWN0ZWROYW1lKHByb3ZpZGVyTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RQcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChPTERfUFJPVklERVJfTkFNRS5lcXVhbHMocHJvdmlkZXJOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0T2xkUHJvdmlkZXJOYW1lLmFkZChpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50LCBzdGFydHMgd2l0aCBFY2xpcHNlLCBidXQgbm90IG9uZSBvZiB0aGUgYWJvdmUgZS5nLiAiRWNsaXBzZSBPcmJpdCIgb3IgIkVjbGlwc2Uub3JnIj8gCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGV2ZW50dWFsbHkgcHV0IGluIHdpdGggImluY29ycmVjdD8iCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyTmFtZS5zdGFydHNXaXRoKCJFY2xpcHNlIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Qcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25Qcm92aWRlck5hbWUuYWRkKGl1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlcmltZW50IHRvIGZpbmQgY29uZmlncyBhbmQgY2F0ZWdvcmllcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50QWxsUHJvcGVydGllcyhvdXRmaWxlV3JpdGVyLCBpdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG91dGZpbGVXcml0ZXIud3JpdGUoIjxoMT5Qcm92aWRlciBuYW1lcyB1c2VkIGluIHJlcG9zaXRvcnk8L2gxPiIgKyBFT0wpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8cD5SZXBvc2l0b3J5ICgncmVwb1VSTFRvVGVzdCcpOiAiICsgZ2V0UmVwb1VSTFRvVGVzdCgpICsgIjwvcD4iICsgRU9MKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPk1ham9yOiBtaXNzaW5nIG9yIChwcm9iYWJseSkgaW5jb3JyZWN0IHByb3ZpZGVyIG5hbWU8L2gyPiIgKyBFT0wpOwogICAgICAgICAgICBwcmludExpbmVzUHJvdmlkZXIob3V0ZmlsZVdyaXRlciwgaW5jb3JyZWN0UHJvdmlkZXJOYW1lKTsKICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci53cml0ZSgiPGgyPkluZGV0ZXJtaW5hdGU6IG1heWJlIGNvcnJlY3QsIG1heWJlIGluY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc1Byb3ZpZGVyKG91dGZpbGVXcml0ZXIsIHVua25vd25Qcm92aWRlck5hbWUpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+TWlub3IgcHJvYmxlbSBvZiB1c2luZyBvbGQgc3R5bGUgcHJvdmlkZXIgbmFtZTwvaDI+IiArIEVPTCk7CiAgICAgICAgICAgIHByaW50TGluZXNQcm92aWRlcihvdXRmaWxlV3JpdGVyLCBpbmNvcnJlY3RPbGRQcm92aWRlck5hbWUpOwogICAgICAgICAgICBvdXRmaWxlV3JpdGVyLndyaXRlKCI8aDI+UHJvYmFibHkgdXNpbmcgY29ycmVjdCBwcm92aWRlciBuYW1lPC9oMj4iICsgRU9MKTsKICAgICAgICAgICAgcHJpbnRMaW5lc1Byb3ZpZGVyKG91dGZpbGVXcml0ZXIsIGNvcnJlY3RQcm92aWRlck5hbWUpOwoKICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoaW5jb3JyZWN0UHJvdmlkZXJOYW1lLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3JzIGluIG5hbWluZyBvciBsb2NhbGl6YXRpb24uIEZvciBsaXN0LCBzZWUgIiArIG91dGZpbGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgLy8gICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbmNvcnJlY3RQcm92aWRlck5hbWUuc2l6ZSgpID4gMDsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChvdXRmaWxlV3JpdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZVdyaXRlci5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB3ZWlyZAogICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gdGVzdFByb3ZpZGVyTmFtZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSVF1ZXJ5UmVzdWx0PElJbnN0YWxsYWJsZVVuaXQ+IGFsbElVcyA9IGdldEFsbElVcygpOwogICAgICAgIHJldHVybiBjaGVja1Byb3ZpZGVyTmFtZXMoYWxsSVVzKTsKICAgIH0KCiAgICBwcml2YXRlIGJvb2xlYW4gaW5MaXN0T2ZFeHBlY3RlZE5hbWUoU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9QUk9WSURFUl9OQU1FUy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoRVhQRUNURURfUFJPVklERVJfTkFNRVNbaV0uZXF1YWxzKHByb3ZpZGVyTmFtZSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwoKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRMaW5lc1Byb3ZpZGVyKEZpbGVXcml0ZXIgb3V0LCBMaXN0PElJbnN0YWxsYWJsZVVuaXQ+IGl1TGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyBDb21wYXJhdG9yPD8gc3VwZXIgSUluc3RhbGxhYmxlVW5pdD4gY29tcGFyYXRvclByb3ZpZGVyTmFtZSA9IG5ldyBJVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yKCk7CiAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIElJbnN0YWxsYWJsZVVuaXQ+IGNvbXBhcmF0b3JQcm92aWRlck5hbWUgPSBuZXcgSVVJZENvbXBhcmF0b3IoKTsKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGl1TGlzdCwgY29tcGFyYXRvclByb3ZpZGVyTmFtZSk7CiAgICAgICAgb3V0LndyaXRlKCI8cD5Db3VudDogIiArIGl1TGlzdC5zaXplKCkgKyBFT0wpOwogICAgICAgIG91dC53cml0ZSgiPG9sPiIgKyBFT0wpOwoKICAgICAgICBmb3IgKElJbnN0YWxsYWJsZVVuaXQgaXUgOiBpdUxpc3QpIHsKICAgICAgICAgICAgcHJpbnRMaW5lTGlzdEl0ZW0ob3V0LCBpdSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST1ZJREVSKTsKICAgICAgICB9CiAgICAgICAgb3V0LndyaXRlKCI8L29sPiIgKyBFT0wpOwogICAgfQp9ClBLAwQKAAAAAAB6vL0+yGWYuIc/AACHPwAAOgAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9zdGFuZGFyZExpY2Vuc2VzLnByb3BlcnRpZXNsaWNlbnNlMjAxMT1cCkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXApGZWJydWFyeSAxLCAyMDExXG5cClxuXApVc2FnZSBPZiBDb250ZW50XG5cClxuXApUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCk9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXApVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCk5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCkFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cClRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXApcblwKQXBwbGljYWJsZSBMaWNlbnNlc1xuXApcblwKVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXApFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAp0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXApwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCkZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXApcblwKQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCmRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXApyZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCmFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXApcblwKICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAogICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAogICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCiAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCiAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCiAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAogICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCiAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAogICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKXG5cClRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCmNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCmluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAppbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKXG5cCiAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAogICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAogICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCiAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXApcblwKTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXApQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cClVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKeW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAp0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cClN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXApnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKXG5cClRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cClNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKXG5cCiAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCiAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAogICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAogICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKXG5cCklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCmlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCmdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKXG5cClxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXApcblwKVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXApidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAp0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCnRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXApJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cClxuXApZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCllvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXApJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAppbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCm1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCmFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKXG5cCiAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCiAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCiAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCiAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCiAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAogICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAogICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAogICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCiAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCiAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cClxuXApDcnlwdG9ncmFwaHlcblwKXG5cCkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXApjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCmFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCnJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCnJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cClxuXApKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCgpsaWNlbnNlMjAxMD1cCkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXApBcHJpbCAxNCwgMjAxMFxuXApcblwKVXNhZ2UgT2YgQ29udGVudFxuXApcblwKVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXApPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCkFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXApOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXApBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCkFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCk9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXApURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCk9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCkJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKXG5cCkFwcGxpY2FibGUgTGljZW5zZXNcblwKXG5cClVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXApGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKXG5cCkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXApkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAphcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKXG5cCiAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCiAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAogICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCiAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAogICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAogICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAogICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cClxuXApUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCmNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXApjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAppbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCkxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cClxuXAogICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAogICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCiAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKXG5cCk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXApVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCkluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCndpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCnlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXApTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCnRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cClxuXApUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cClRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXApTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cClxuXAogICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCiAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKICAgICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCiAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cClxuXApJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cClRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAppcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXApnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cClxuXApcblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKXG5cClRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCm90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAp0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXApodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXApcblwKWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXApZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAptYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAphZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cClxuXAogICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAogICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCiAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAogICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAogICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAogICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCiAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAogICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAogICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXApcblwKQ3J5cHRvZ3JhcGh5XG5cClxuXApDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAphbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCnVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXApyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXApyZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXApcblwKSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgpQSwMECgAAAAAAOwLSPojtB2bYCQAA2AkAADEAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUmVwb3J0V3JpdGVyLmNsYXNzyv66vgAAADEAbwcAAgEAK29yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQADRU9MAQASTGphdmEvbGFuZy9TdHJpbmc7AQAOb3V0cHV0RmlsZW5hbWUBAA9vdXRwdXREaXJlY3RvcnkBAA1vdXRmaWxld3JpdGVyAQAVTGphdmEvaW8vUHJpbnRXcml0ZXI7AQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCAAPAQAObGluZS5zZXBhcmF0b3IIABEBAAEKCgATABUHABQBABBqYXZhL2xhbmcvU3lzdGVtDAAWABcBAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CQABABkMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgoAAwAfDAAcAAwJAAEAIQwACAAGCQABACMMAAcABgEABHRoaXMBAC1Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlcjsBABFnZXRPdXRwdXRGaWxlbmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQARc2V0T3V0cHV0RmlsZW5hbWUBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABJnZXRPdXRwdXREaXJlY3RvcnkBABJzZXRPdXRwdXREaXJlY3RvcnkBAAlnZXRXcml0ZXIBABcoKUxqYXZhL2lvL1ByaW50V3JpdGVyOwEACkV4Y2VwdGlvbnMHADABAB1qYXZhL2lvL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbgkAAQAyDAAJAAoHADQBAAxqYXZhL2lvL0ZpbGUKAAEANgwAKgAnCgABADgMACYAJwoAMwA6DAAcAB0HADwBABNqYXZhL2lvL1ByaW50V3JpdGVyCgA7AD4MABwAPwEAEShMamF2YS9pby9GaWxlOylWAQAHb3V0ZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAHd3JpdGVsbgcARAEAE2phdmEvaW8vSU9FeGNlcHRpb24KAAEARgwALAAtBwBIAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIKAEoATAcASwEAEGphdmEvbGFuZy9TdHJpbmcMAE0ATgEAB3ZhbHVlT2YBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoARwBQDAAcACkKAEcAUgwAUwBUAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgBHAFYMAFcAJwEACHRvU3RyaW5nCgA7AFkMAFoAKQEABXdyaXRlAQAEdGV4dAEABWNsb3NlCgA7AF4MAFwADAEAFShMamF2YS9sYW5nL09iamVjdDspVgoAAwBWCgABAGIMAEIAKQEABm9iamVjdAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEABnByaW50ZgEAKChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KVYKADsAaAwAZQBpAQA8KExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvaW8vUHJpbnRXcml0ZXI7AQAGZm9ybWF0AQAEYXJncwEAE1tMamF2YS9sYW5nL09iamVjdDsBAApTb3VyY2VGaWxlAQARUmVwb3J0V3JpdGVyLmphdmEAIQABAAMAAAAEABoABQAGAAAAAgAHAAYAAAACAAgABgAAAAIACQAKAAAADAAIAAsADAABAA0AAAAvAAIAAAAAAAsSDhIQuAASswAYsQAAAAIAGgAAAAoAAgAAAA8ACgAIABsAAAACAAAAAQAcAB0AAQANAAAAWQACAAMAAAAPKrcAHiortQAgKiy1ACKxAAAAAgAaAAAAEgAEAAAACgAEAAsACQAMAA4ADQAbAAAAIAADAAAADwAkACUAAAAAAA8ACAAGAAEAAAAPAAcABgACAAEAJgAnAAEADQAAAC8AAQABAAAABSq0ACKwAAAAAgAaAAAABgABAAAAFgAbAAAADAABAAAABQAkACUAAAABACgAKQABAA0AAAA+AAIAAgAAAAYqK7UAIrEAAAACABoAAAAKAAIAAAAaAAUAGwAbAAAAFgACAAAABgAkACUAAAAAAAYABwAGAAEAAQAqACcAAQANAAAALwABAAEAAAAFKrQAILAAAAACABoAAAAGAAEAAAAeABsAAAAMAAEAAAAFACQAJQAAAAEAKwApAAEADQAAAD4AAgACAAAABiortQAgsQAAAAIAGgAAAAoAAgAAACIABQAjABsAAAAWAAIAAAAGACQAJQAAAAAABgAIAAYAAQACACwALQACAC4AAAAEAAEALwANAAAAaAAEAAIAAAAoKrQAMccAH7sAM1kqtgA1KrYAN7cAOUwquwA7WSu3AD21ADEqtAAxsAAAAAIAGgAAABIABAAAACYABwAnABcAKAAjACoAGwAAABYAAgAAACgAJAAlAAAAFwAMAEAAQQABAAEAQgApAAIALgAAAAQAAQBDAA0AAABUAAQAAgAAABwqtwBFuwBHWSu4AEm3AE+yABi2AFG2AFW2AFixAAAAAgAaAAAACgACAAAALgAbAC8AGwAAABYAAgAAABwAJAAlAAAAAAAcAFsABgABAAEAQgAMAAIALgAAAAQAAQBDAA0AAAA5AAIAAQAAAAsqtwBFsgAYtgBYsQAAAAIAGgAAAAoAAgAAADIACgAzABsAAAAMAAEAAAALACQAJQAAAAEAXAAMAAEADQAAAEEAAQABAAAADyq0ADHGAAoqtAAxtgBdsQAAAAIAGgAAAA4AAwAAADYABwA3AA4AOQAbAAAADAABAAAADwAkACUAAAABAEIAXwACAC4AAAAEAAEAQwANAAAAQQACAAIAAAAJKiu2AGC2AGGxAAAAAgAaAAAACgACAAAAPAAIAD0AGwAAABYAAgAAAAkAJAAlAAAAAAAJAGMAZAABAIEAZQBmAAIALgAAAAQAAQBDAA0AAABNAAMAAwAAAAsqtwBFKyy2AGdXsQAAAAIAGgAAAAoAAgAAAEAACgBBABsAAAAgAAMAAAALACQAJQAAAAAACwBqAAYAAQAAAAsAawBsAAIAAQBtAAAAAgBuUEsDBAoAAAAAAPK+wz7v/9GJEAcAABAHAAAwAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKCnB1YmxpYyBjbGFzcyBSZXBvcnRXcml0ZXIgewogICAgcHVibGljIFJlcG9ydFdyaXRlcihTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LCBTdHJpbmcgb3V0cHV0RmlsZW5hbWUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgICAgIHRoaXMub3V0cHV0RmlsZW5hbWUgPSBvdXRwdXRGaWxlbmFtZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeTsKCiAgICBwcml2YXRlIFByaW50V3JpdGVyICAgICAgICAgb3V0ZmlsZXdyaXRlcjsKCiAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVuYW1lKCkgewogICAgICAgIHJldHVybiBvdXRwdXRGaWxlbmFtZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlbmFtZShTdHJpbmcgb3V0cHV0RmlsZW5hbWUpIHsKICAgICAgICB0aGlzLm91dHB1dEZpbGVuYW1lID0gb3V0cHV0RmlsZW5hbWU7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewogICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwogICAgfQoKICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgaWYgKG91dGZpbGV3cml0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBGaWxlIG91dGZpbGUgPSBuZXcgRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoKSwgZ2V0T3V0cHV0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgIG91dGZpbGV3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0ZmlsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXRmaWxld3JpdGVyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHdyaXRlbG4oU3RyaW5nIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgZ2V0V3JpdGVyKCkud3JpdGUodGV4dCArIEVPTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgd3JpdGVsbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgZ2V0V3JpdGVyKCkud3JpdGUoRU9MKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICBpZiAob3V0ZmlsZXdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgIG91dGZpbGV3cml0ZXIuY2xvc2UoKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgd3JpdGVsbihPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIHdyaXRlbG4ob2JqZWN0LnRvU3RyaW5nKCkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHByaW50ZihTdHJpbmcgZm9ybWF0LCBPYmplY3QuLi4gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBnZXRXcml0ZXIoKS5wcmludGYoZm9ybWF0LCBhcmdzKTsKICAgIH0KfQpQSwMECgAAAAAAOwLSPvtARVT+BwAA/gcAADYAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuY2xhc3PK/rq+AAAAMQB2BwACAQAwb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0Z1bGxKYXJOYW1lUGFyc2VyBwAEAQAQamF2YS9sYW5nL09iamVjdAEABURFQlVHAQABWgEADUNvbnN0YW50VmFsdWUDAAAAAAEAC1NUQVJUX0dST1VQAQASTGphdmEvbGFuZy9TdHJpbmc7AQAJRU5EX0dST1VQAQAKVU5ERVJTQ09SRQEACUJBQ0tTTEFTSAEADkxJVEVSQUxfUEVSSU9EAQAJQU5ZRElHSVRTAQADQU5ZAQAHcGF0dGVybgEAGUxqYXZhL3V0aWwvcmVnZXgvUGF0dGVybjsBAA1wcm9qZWN0U3RyaW5nAQANdmVyc2lvblN0cmluZwEABjxpbml0PgEAAygpVgEABENvZGUKAAMAGQwAFQAWCAAbAQABKAkAAQAdDAAJAAoIAB8BAAEpCQABACEMAAsACggAIwEAAV8JAAEAJQwADAAKCAAnAQABXAkAAQApDAANAAoHACsBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoALQAvBwAuAQAQamF2YS9sYW5nL1N0cmluZwwAMAAxAQAHdmFsdWVPZgEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmc7CgAqADMMABUANAEAFShMamF2YS9sYW5nL1N0cmluZzspVggANgEAAS4KACoAOAwAOQA6AQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgAqADwMAD0APgEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsJAAEAQAwADgAKCABCAQABZAgARAEAASoJAAEARgwA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bC9lcGwtdjEwLmh0bWwKICogCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCnB1YmxpYyBjbGFzcyBGdWxsSmFyTmFtZVBhcnNlciB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgICAgICAgICA9IGZhbHNlOwogICAgLy8gc2ltcGxpZmllZCBwYXR0ZXJuOiAoSUQpICdfJyAoTiAnLicgTSAnLicgTyAnLicgUykgJy5qYXInCiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIFNUQVJUX0dST1VQICAgID0gIigiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBFTkRfR1JPVVAgICAgICA9ICIpIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgVU5ERVJTQ09SRSAgICAgPSAiXyI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIEJBQ0tTTEFTSCAgICAgID0gIlxcIjsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgTElURVJBTF9QRVJJT0QgPSBCQUNLU0xBU0ggKyAiLiI7CiAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIEFOWURJR0lUUyAgICAgID0gQkFDS1NMQVNIICsgImQiICsgIioiOwogICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBBTlkgICAgICAgICAgICA9ICIuKiI7CiAgICBwcml2YXRlIFBhdHRlcm4gICAgICAgICAgICAgIHBhdHRlcm4gICAgICAgID0gUGF0dGVybi5jb21waWxlKFNUQVJUX0dST1VQICsgQU5ZICsgRU5EX0dST1VQICsgVU5ERVJTQ09SRSArIFNUQVJUX0dST1VQICsgU1RBUlRfR1JPVVAgKyBBTllESUdJVFMgKyBFTkRfR1JPVVAgKyBMSVRFUkFMX1BFUklPRCArIFNUQVJUX0dST1VQICsgQU5ZRElHSVRTICsgRU5EX0dST1VQICsgTElURVJBTF9QRVJJT0QgKyBTVEFSVF9HUk9VUCArIEFOWURJR0lUUyArIEVORF9HUk9VUCArIFNUQVJUX0dST1VQICsgTElURVJBTF9QRVJJT0QgKyBBTlkgKyBFTkRfR1JPVVAgKyAiPyIgKyBFTkRfR1JPVVApOwoKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgcHJvamVjdFN0cmluZzsKICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgdmVyc2lvblN0cmluZzsKCgogICAgcHVibGljIGJvb2xlYW4gcGFyc2UoU3RyaW5nIGxpbmUpIHsKICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgIHByb2plY3RTdHJpbmcgPSAiIjsKICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIiI7CiAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGxpbmUpOwoKICAgICAgICBpZiAoIW1hdGNoZXIubWF0Y2hlcygpKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdHRoZSBsaW5lIGRpZCBub3QgbWF0Y2ggcGFyc2UgcnVsZTogIik7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIGxpbmUpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByb2plY3RTdHJpbmcgPSBtYXRjaGVyLmdyb3VwKDEpOwogICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gbWF0Y2hlci5ncm91cCgyKTsKICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJvamVjdFN0cmluZyk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odmVyc2lvblN0cmluZyk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKCiAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3RTdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHByb2plY3RTdHJpbmc7CiAgICB9CgoKCiAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7CiAgICB9Cn1QSwMECgAAAAAAOwLSPli9h61WBQAAVgUAADoAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmNsYXNzyv66vgAAADEANQcAAgEANG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVU5hbWVBbmRJZENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADZMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVTmFtZUFuZElkQ29tcGFyYXRvcjsBAAdjb21wYXJlAQBnKExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7TG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDspSQgAEwEAG29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZQsAFQAXBwAWAQAwb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0DAAYABkBAAtnZXRQcm9wZXJ0eQEAOChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7CAAbAQAEbnVsbAoAHQAfBwAeAQAQamF2YS9sYW5nL1N0cmluZwwAIAAhAQAJY29tcGFyZVRvAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJCwAVACMMACQAJQEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAANpdTEBADJMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OwEAA2l1MgEAAnAxAQASTGphdmEvbGFuZy9TdHJpbmc7AQACcDIBAAZyZXN1bHQBAAFJAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABADAMABAAEQEAClNvdXJjZUZpbGUBABpJVU5hbWVBbmRJZENvbXBhcmF0b3IuamF2YQEACVNpZ25hdHVyZQEAXExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvQ29tcGFyYXRvcjxMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0Oz47ACEAAQADAAEABQAAAAMAAQAHAAgAAQAJAAAALwABAAEAAAAFKrcACrEAAAACAAwAAAAGAAEAAAAHAA0AAAAMAAEAAAAFAA4ADwAAAAEAEAARAAEACQAAAOoAAwAGAAAAWivHAAksxwAFA6wrxgAHLMcABQSsKxISAbkAFAMATiwSEgG5ABQDADoELccABhIaThkExwAHEho6BC0ZBLYAHDYFFQWaABQruQAiAQAsuQAiAQC2ABw2BRUFrAAAAAIADAAAADoADgAAAAwACAANAAoADwASABAAFAATAB4AFAApABUALQAWADAAGAA1ABkAOQAbAEEA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bXBhcmUoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSB7CiAgICAgICAgaWYgKChzdHJpbmcxID09IG51bGwpICYmIChzdHJpbmcyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoc3RyaW5nMSA9PSBudWxsKSB8fCAoc3RyaW5nMiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEludGVnZXIgbGVuZ3RoMSA9IG5ldyBJbnRlZ2VyKHN0cmluZzEubGVuZ3RoKCkpOwogICAgICAgICAgICBJbnRlZ2VyIGxlbmd0aDIgPSBuZXcgSW50ZWdlcihzdHJpbmcyLmxlbmd0aCgpKTsKICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDEuY29tcGFyZVRvKGxlbmd0aDIpOwogICAgICAgIH0KICAgIH0KfVBLAwQKAAAAAAA7AtI+kh07gB8EAAAfBAAAMwAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvci5jbGFzc8r+ur4AAAAxACgHAAIBAC1vcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC9Mb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yOwEAB2NvbXBhcmUBAGcoTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDtMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0OylJCwATABUHABQBADBvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQMABYAFwEABWdldElkAQAUKClMamF2YS9sYW5nL1N0cmluZzsKABkAGwcAGgEAEGphdmEvbGFuZy9TdHJpbmcMABwAHQEACWNvbXBhcmVUbwEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAA2l1MQEAMkxvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7AQADaXUyAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylJCgABACMMABAAEQEAClNvdXJjZUZpbGUBABNJVUlkQ29tcGFyYXRvci5qYXZhAQAJU2lnbmF0dXJlAQBcTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsAIQABAAMAAQAFAAAAAwABAAcACAABAAkAAAAvAAEAAQAAAAUqtwAKsQAAAAIADAAAAAYAAQAAAAcADQAAAAwAAQAAAAUADgAPAAAAAQAQABEAAQAJAAAAcgACAAMAAAAkK8cACSzHAAUDrCvGAAcsxwAFBKwruQASAQAsuQASAQC2ABisAAAAAgAMAAAAFgAFAAAADAAIAA0ACgAPABIAEAAUABMADQAAACAAAwAAACQADgAPAAAAAAAkAB4AHwABAAAAJAAgAB8AAhBBABAAIQABAAkAAAAtAAMAAwAAAA0qK8AAEyzAABO2ACKsAAAAAgAMAAAABgABAAAAAQANAAAAAgAAAAIAJAAAAAIAJQAmAAAAAgAnUEsDBAoAAAAAAEOHxD7LivEmTAIAAEwCAAAyAAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVSWRDb21wYXJhdG9yLmphdmFwYWNrYWdlIG9yZy5lY2xpcHNlLmluZGlnby50ZXN0cy51dGlsczsKCmltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7CgpwdWJsaWMgY2xhc3MgSVVJZENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElJbnN0YWxsYWJsZVVuaXQ+IHsKCgogICAgcHVibGljIGludCBjb21wYXJlKElJbnN0YWxsYWJsZVVuaXQgaXUxLCBJSW5zdGFsbGFibGVVbml0IGl1MikgewogICAgICAgIC8vIG5laXRoZXIgaXUgc2hvdWxkIGJlIG51bGwgLi4uIGJ1dCwganVzdCB0byBjb3ZlciBhbGwgY2FzZXMKICAgICAgICBpZiAoKGl1MSA9PSBudWxsKSAmJiAoaXUyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoaXUxID09IG51bGwpIHx8IChpdTIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gaXUxLmdldElkKCkuY29tcGFyZVRvKGl1Mi5nZXRJZCgpKTsKICAgICAgICB9CiAgICB9Cn1QSwMECgAAAAAAOwLSPkHDb426AgAAugIAADkAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuY2xhc3PK/rq+AAAAMQAiBwACAQAzb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyBwAEAQAQamF2YS9sYW5nL09iamVjdAcABgEAFmphdmEvaW8vRmlsZW5hbWVGaWx0ZXIBABRFWFRFTlNJT05fUEFDRUtEX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAsBAAwuamFyLnBhY2suZ3oBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADABAMAAwADQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADVMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyOwEABmFjY2VwdAEAIyhMamF2YS9pby9GaWxlO0xqYXZhL2xhbmcvU3RyaW5nOylaCgAYABoHABkBABBqYXZhL2xhbmcvU3RyaW5nDAAbABwBAAhlbmRzV2l0aAEAFShMamF2YS9sYW5nL1N0cmluZzspWgEAA2RpcgEADkxqYXZhL2lvL0ZpbGU7AQAEbmFtZQEAClNvdXJjZUZpbGUBABlQYWNrR3pGaWxlTmFtZUZpbHRlci5qYXZhACEAAQADAAEABQABABoABwAIAAEACQAAAAIACgACAAEADAANAAEADgAAAC8AAQABAAAABSq3AA+xAAAAAgARAAAABgABAAAABgASAAAADAABAAAABQATABQAAAABABUAFgABAA4AAABFAAIAAwAAAAcsEgq2ABesAAAAAgARAAAABgABAAAACgASAAAAIAADAAAABwATABQAAAAAAAcAHQAeAAEAAAAHAB8ACAACAAEAIAAAAAIAIVBLAwQKAAAAAACQAcQ+S+ENklMBAABTAQAAOAAAAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9QYWNrR3pGaWxlTmFtZUZpbHRlci5qYXZhcGFja2FnZSBvcmcuZWNsaXBzZS5pbmRpZ28udGVzdHMudXRpbHM7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKCnB1YmxpYyBjbGFzcyBQYWNrR3pGaWxlTmFtZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUEFDRUtEX0pBUiA9ICIuamFyLnBhY2suZ3oiOwoKICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aChFWFRFTlNJT05fUEFDRUtEX0pBUik7CiAgICB9Cn0KUEsDBAoAAAAAADsC0j5DehbxYgUAAGIFAAA+AAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuY2xhc3PK/rq+AAAAMQA1BwACAQA4b3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IHAAQBABBqYXZhL2xhbmcvT2JqZWN0BwAGAQAUamF2YS91dGlsL0NvbXBhcmF0b3IBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAsMAAcACAEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBADpMb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3I7AQAHY29tcGFyZQEAZyhMb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0O0xvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7KUkIABMBABtvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWULABUAFwcAFgEAMG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdAwAGAAZAQALZ2V0UHJvcGVydHkBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgAGwEABG51bGwKAB0AHwcAHgEAEGphdmEvbGFuZy9TdHJpbmcMACAAIQEACWNvbXBhcmVUbwEAFShMamF2YS9sYW5nL1N0cmluZzspSQsAFQAjDAAkACUBAAVnZXRJZAEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQADaXUxAQAyTG9yZy9lY2xpcHNlL2VxdWlub3gvcDIvbWV0YWRhdGEvSUluc3RhbGxhYmxlVW5pdDsBAANpdTIBAAJwMQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAAnAyAQAGcmVzdWx0AQABSQEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspSQoAAQAwDAAQABEBAApTb3VyY2VGaWxlAQAeSVVQcm92aWRlckFuZElkQ29tcGFyYXRvci5qYXZhAQAJU2lnbmF0dXJlAQBcTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9Db21wYXJhdG9yPExvcmcvZWNsaXBzZS9lcXVpbm94L3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQ7PjsAIQABAAMAAQAFAAAAAwABAAcACAABAAkAAAAvAAEAAQAAAAUqtwAKsQAAAAIADAAAAAYAAQAAAAcADQAAAAwAAQAAAAUADgAPAAAAAQAQABEAAQAJAAAA6gADAAYAAABaK8cACSzHAAUDrCvGAAcsxwAFBKwrEhIBuQAUAwBOLBISAbkAFAMAOgQtxwAGEhpOGQTHAAcSGjoELRkEtgAcNgUVBZoAFCu5ACIBACy5ACIBALYAHDYFFQWsAAAAAgAMAAAAOgAOAAAADAAIAA0ACgAPABIAEAAUABMAHgAUACkAFQAtABYAMAAYADUAGQA5ABsAQQAcAEYAHwBXACEADQAAAD4ABgAAAFoADgAPAAAAAABaACYAJwABAAAAWgAoACcAAgAeADwAKQAqAAMAKQAxACsAKgAEAEEAGQAsAC0ABRBBABAALgABAAkAAAAtAAMAAwAAAA0qK8AAFSzAABW2AC+sAAAAAgAMAAAABgABAAAAAQANAAAAAgAAAAIAMQAAAAIAMgAzAAAAAgA0UEsDBAoAAAAAACKGxD53OsvhWAQAAFgEAAA9AAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKCnB1YmxpYyBjbGFzcyBJVVByb3ZpZGVyQW5kSWRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJSW5zdGFsbGFibGVVbml0PiB7CgoKICAgIHB1YmxpYyBpbnQgY29tcGFyZShJSW5zdGFsbGFibGVVbml0IGl1MSwgSUluc3RhbGxhYmxlVW5pdCBpdTIpIHsKICAgICAgICAvLyBuZWl0aGVyIGl1IHNob3VsZCBiZSBudWxsIC4uLiBidXQsIGp1c3QgdG8gY292ZXIgYWxsIGNhc2VzCiAgICAgICAgaWYgKChpdTEgPT0gbnVsbCkgJiYgKGl1MiA9PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGl1MSA9PSBudWxsKSB8fCAoaXUyID09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgU3RyaW5nIHAxID0gaXUxLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgU3RyaW5nIHAyID0gaXUyLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBudWxsKTsKICAgICAgICAgICAgaWYgKHAxID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHAxID0gIm51bGwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwMiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwMiA9ICJudWxsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gcDEuY29tcGFyZVRvKHAyKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBwcm92aWRlciBuYW1lcyBhcmUgZXF1YWwsIHVzZSBpZCBhcyBzZWNvbmRhcnkKICAgICAgICAgICAgICAgIC8vIHNvcnQga2V5CiAgICAgICAgICAgICAgICByZXN1bHQgPSBpdTEuZ2V0SWQoKS5jb21wYXJlVG8oaXUyLmdldElkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgfQp9UEsDBAoAAAAAADsC0j4s8wuTogIAAKICAAA2AAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyLmNsYXNzyv66vgAAADEAIgcAAgEAMG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcgcABAEAEGphdmEvbGFuZy9PYmplY3QHAAYBABZqYXZhL2lvL0ZpbGVuYW1lRmlsdGVyAQANRVhURU5TSU9OX0pBUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAAsBAAQuamFyAQAGPGluaXQ+AQADKClWAQAEQ29kZQoAAwAQDAAMAA0BAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAyTG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9KQVJGaWxlTmFtZUZpbHRlcjsBAAZhY2NlcHQBACMoTGphdmEvaW8vRmlsZTtMamF2YS9sYW5nL1N0cmluZzspWgoAGAAaBwAZAQAQamF2YS9sYW5nL1N0cmluZwwAGwAcAQAIZW5kc1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAANkaXIBAA5MamF2YS9pby9GaWxlOwEABG5hbWUBAApTb3VyY2VGaWxlAQAWSkFSRmlsZU5hbWVGaWx0ZXIuamF2YQAhAAEAAwABAAUAAQAaAAcACAABAAkAAAACAAoAAgABAAwADQABAA4AAAAvAAEAAQAAAAUqtwAPsQAAAAIAEQAAAAYAAQAAAAYAEgAAAAwAAQAAAAUAEwAUAAAAAQAVABYAAQAOAAAARQACAAMAAAAHLBIKtgAXrAAAAAIAEQAAAAYAAQAAAAoAEgAAACAAAwAAAAcAEwAUAAAAAAAHAB0AHgABAAAABwAfAAgAAgABACAAAAACACFQSwMECgAAAAAAiwHEPqR6X4o6AQAAOgEAADUAAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIuamF2YXBhY2thZ2Ugb3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLnV0aWxzOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CgpwdWJsaWMgY2xhc3MgSkFSRmlsZU5hbWVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0pBUiA9ICIuamFyIjsKCiAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoRVhURU5TSU9OX0pBUik7CiAgICB9Cn0KUEsDBAoAAAAAANoUvz6cDam1BgUAAAYFAAAWAAAAcnVuRWNsaXBzZUFudFJ1bm5lci5zaCMhL3Vzci9iaW4vZW52IGJhc2gKCiMgT24gcHJvZHVjdGlvbiBtYWNoaW5lLCBpdCBpcyBub3JtYWwgdG8gIm5vdCBmaW5kIiB0aGlzIGZpbGUgd2hlbiBydW5uaW5nLiAKIyBBbGwgdmFyaWFibGVzIHRoYXQgbWlnaHQgYmUgZGVmaW5lZCBpbiBpdCBoYXZlIGNvcnJlY3QgdmFsdWVzIHNldCBmb3IgdGhlIHByb2R1Y3Rpb24gCiMgbWFjaGluZS4gSXRzIHB1cnBvc2UgaXMgaWYvd2hlbiBydW5uaW5nIG9uIGEgdGVzdCBtYWNoaW5lLCB0aGUgdmFyaWFibGVzIGNhbiBiZSBvdmVyIHJpZGRlbgojIGVhc2lseSBpbiB0aGF0IG9uZSBmaWxlLCBhbmQgbGVhdmUgb3JpZ2luYWwgc2NyaXB0cyBhbG9uZS4gCnNvdXJjZSBhZ2dyX3Byb3BlcnRpZXMuc2hzb3VyY2UKCiMgVGhlc2UgZmlyc3QgZmV3IHZhcmlhYmxlcyBjb21tb25seSBuZWVkIHRvIG92ZXJyaWRkZW4gb24gdGVzdCBtYWNoaW5lcywgdGhleSAKIyBhcmUgdmVyeSBzcGVjaWZpYyBwZXIgbWFjaGluZS4gCiMgdGhlIHRvcCBkaXJlY3Rvcnkgb2YgYnVpbGQtcmVsYXRlZCBkaXJlY3RvcmllcwpleHBvcnQgQlVJTERfSE9NRT0ke0JVSUxEX0hPTUU6LS9zaGFyZWQvaW5kaWdvfQpleHBvcnQgSkFWQV9IT01FPSR7SkFWQV9IT01FOi0vc2hhcmVkL3dlYnRvb2xzL2FwcHMvaWJtLWphdmEtc2RrLTYuMC04LjEtbGludXgtaTM4Nn0KCiMgVGhlc2UgcmVtYWluaW5nIHZhcmlhYmxlIHNob3VsZCBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVudCwgYXMgdGhleSAKIyBhcmUgcmVsYXRpdmVseSBjb25zdGFudCwgb3IgY29tcHV0ZWQgZnJvbSBvdGhlcnMuIApleHBvcnQgUkVMRU5HX1RFU1RTPSR7UkVMRU5HX1RFU1RTOi1vcmcuZWNsaXBzZS5pbmRpZ28udGVzdHN9CmV4cG9ydCBKQVZBX0VYRUNfRElSPSR7SkFWQV9FWEVDX0RJUjotJHtKQVZBX0hPTUV9L2pyZS9iaW59CmV4cG9ydCBCVUlMRF9URVNUU19ESVI9JHtCVUlMRF9URVNUU19ESVI6LSR7QlVJTERfSE9NRX0vJHtSRUxFTkdfVEVTVFN9fQpleHBvcnQgRUNMSVBTRV9IT01FX1RFU1Q9JHtFQ0xJUFNFX0hPTUVfVEVTVDotJHtCVUlMRF9IT01FfS90ZXN0SW5zdGFuY2UvZWNsaXBzZX0KCiIke0VDTElQU0VfSE9NRV9URVNUfSIvZWNsaXBzZSAtY29uc29sZWxvZyAtZGF0YSAuL2VjbGlwc2VXb3Jrc3BhY2UgLW5vc3BsYXNoIC0tbGF1bmNoZXIuc3VwcHJlc3NFcnJvcnMgLXZtICIke0pBVkFfRVhFQ19ESVJ9IiAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIC1mICAke0JVSUxEX1RFU1RTX0RJUn0vcnVuVGVzdHMueG1sICIkQCIKUEsDBAoAAAAAAPQAuj6zeFuJ+wEAAPsBAAATAAAAaW52b2tlQW50UnVubmVyLnhtbDxwcm9qZWN0IG5hbWU9ImluZGlnb0FudFJ1bm5lciIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaW52b2tlQW50Ij4KCSAgICA8cHJvcGVydHkKCSAgICAgICAgZW52aXJvbm1lbnQ9ImVudiIgLz4KCSAgICAgICAgCQoJPHRhcmdldCBuYW1lPSJpbnZva2VBbnQiPgoKCQk8ZWNobyBtZXNzYWdlPSJpbnZva2UgYW50IHJ1bm5lciwgZnJvbSBhbnQiIC8+CgkJPGV4ZWMgZXhlY3V0YWJsZT0iJHtlbnYuRUNMSVBTRV9IT01FfS9lY2xpcHNlIiAKCQkJZmFpbG9uZXJyb3I9ImZhbHNlIiAKCQkJYXBwZW5kPSJ0cnVlIj4KCQkJPGFyZyBsaW5lPSItY29uc29sZWxvZyAtZGF0YSAuL3J1bkVjbGlwc2VXb3Jrc3BhY2UgLWRlYnVnIC1ub3NwbGFzaCAtLWxhdW5jaGVyLnN1cHByZXNzRXJyb3JzIC12bSAke2Vudi5KQVZBX0VYRUNfRElSfSAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIC1mIHJ1blRlc3RzLnhtbCIgLz4KCQk8L2V4ZWM+Cgk8L3RhcmdldD4KPC9wcm9qZWN0PlBLAwQKAAAAAADJago7jc/pUZYFAACWBQAACgAAAGFib3V0Lmh0bWw8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgogICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cjx0aXRsZT5BYm91dDwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgbGFuZz0iRU4tVVMiPgo8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KIAo8UD5KdW5lLCAyMDA4PC9QPgkKPGgzPkxpY2Vuc2U8L2gzPgoKPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCmluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KCjxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCmJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIApwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KCjwvYm9keT4KPC9odG1sPlBLAwQKAAAAAACndb0+YWEboE4BAABOAQAACgAAAHBsdWdpbi54bWw8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8P2VjbGlwc2UgdmVyc2lvbj0iMy41Ij8+CjxwbHVnaW4+CiAgIDxleHRlbnNpb24KICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4KICAgICAgICAgPGFudFRhc2sKICAgICAgICAgbGlicmFyeT0iY2hlY2tMYXlvdXQuamFyIgogICAgICAgICBuYW1lPSJnZW5lcmF0ZVJlcG9zaXRvcnlSZXBvcnRzIgogICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaW5kaWdvLnRlc3RzLlJ1bkFsbFJlcG9ydHNBbnRUYXNrIiAvPgogICAgICAgICAKICAgPC9leHRlbnNpb24+Cgo8L3BsdWdpbj4KUEsDBAoAAAAAADdyvD72E0FdYwAAAGMAAAAGAAAAYW50LnNoIyEvYmluL3NoCgpzb3VyY2UgYWdncl9wcm9wZXJ0aWVzLnNoc291cmNlCgpBTlRfQ01EPSIke0FOVF9IT01FfS9iaW4vYW50Igoke0FOVF9IT01FfS9iaW4vYW50ICIkQCIKUEsBAhQAFAAIAAgAuQLSPmSkRXWIAQAAwgMAABQABAAAAAAAAAAAAAAAAAAAAE1FVEEtSU5GL01BTklGRVNULk1G/soAAFBLAQIKAAoAAAAAAPYC0j5CyP2JXA0AAFwNAAARAAAAAAAAAAAAAAAAAM4BAABnZXRSZWxlbmdUZXN0cy5zaFBLAQIKAAoAAAAAAER4uT7Ao6CZegAAAHoAAAAfAAAAAAAAAAAAAAAAAFkPAABPU0dJLUlORi9sMTBuL2J1bmRsZS5wcm9wZXJ0aWVzUEsBAgoACgAAAAAAXLa9PnRMFZpzDwAAcw8AAAkAAAAAAAAAAAAAAAAAEBAAAHZlcmlmeS5zaFBLAQIKAAoAAAAAADdyvD50D6eYVwUAAFcFAAAWAAAAAAAAAAAAAAAAAKofAABjbGVhbnVwQnVpbGRSZXN1bHRzLnNoUEsBAgoACgAAAAAARQnLPltDgXxiBgAAYgYAAAwAAAAAAAAAAAAAAAAANSUAAHZlcmlmeWRpci5zaFBLAQIKAAoAAAAAAJcJyz76XTgYtgwAALYMAAAMAAAAAAAAAAAAAAAAAMErAABydW5UZXN0cy54bWxQSwECCgAKAAAAAAA7AtI+fexsuDYLAAA2CwAALAAAAAAAAAAAAAAAAAChOAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuY2xhc3NQSwECCgAKAAAAAACKcb0+S7p5GPILAADyCwAAKwAAAAAAAAAAAAAAAAAhRAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL1Rlc3RBY3RpdmF0b3IuamF2YVBLAQIKAAoAAAAAADsC0j6vXiUorBMAAKwTAAAzAAAAAAAAAAAAAAAAAFxQAABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvUnVuQWxsUmVwb3J0c0FudFRhc2suY2xhc3NQSwECCgAKAAAAAABRWcw+6RtDeCQZAAAkGQAAMgAAAAAAAAAAAAAAAABZZAAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL1J1bkFsbFJlcG9ydHNBbnRUYXNrLmphdmFQSwECCgAKAAAAAAA7AtI+eiyrmhRJAAAUSQAAMgAAAAAAAAAAAAAAAADNfQAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QuY2xhc3NQSwECCgAKAAAAAADoAMQ+wac8hLJmAACyZgAAMQAAAAAAAAAAAAAAAAAxxwAAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdExheW91dFRlc3QuamF2YVBLAQIKAAoAAAAAADsC0j4YNrtLmB4AAJgeAAAvAAAAAAAAAAAAAAAAADIuAQBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9QYWNrMjAwVGVzdC5jbGFzc1BLAQIKAAoAAAAAALwBxD6H77OhqiYAAKomAAAuAAAAAAAAAAAAAAAAABdNAQBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9QYWNrMjAwVGVzdC5qYXZhUEsBAgoACgAAAAAAOwLSPihuZ4lmGAAAZhgAAC8AAAAAAAAAAAAAAAAADXQBAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1ZlcnNpb25UZXN0LmNsYXNzUEsBAgoACgAAAAAArwHEPrEO1ykDHgAAAx4AAC4AAAAAAAAAAAAAAAAAwIwBAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL1ZlcnNpb25UZXN0LmphdmFQSwECCgAKAAAAAAA7AtI+LXGOu78EAAC/BAAALAAAAAAAAAAAAAAAAAAPqwEAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdEphcnMuY2xhc3NQSwECCgAKAAAAAABFA8Q+Sy5IuKgDAACoAwAAKwAAAAAAAAAAAAAAAAAYsAEAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvVGVzdEphcnMuamF2YVBLAQIKAAoAAAAAALYC0j7rKKweZwMAAGcDAAA5AAAAAAAAAAAAAAAAAAm0AQBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9CUkVFVGVzdCRCUkVFRmlsZURhdGEuY2xhc3NQSwECCgAKAAAAAAC2AtI+VgUo4cQsAADELAAALAAAAAAAAAAAAAAAAADHtwEAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvQlJFRVRlc3QuY2xhc3NQSwECCgAKAAAAAAC2AtI+iPxlFQo8AAAKPAAAKwAAAAAAAAAAAAAAAADV5AEAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvQlJFRVRlc3QuamF2YVBLAQIKAAoAAAAAADsC0j4DufawnCMAAJwjAAAqAAAAAAAAAAAAAAAAACghAgBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvamFycy9FU1Rlc3QuY2xhc3NQSwECCgAKAAAAAABrA8Q+ZG8MrZwoAACcKAAAKQAAAAAAAAAAAAAAAAAMRQIAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvRVNUZXN0LmphdmFQSwECCgAKAAAAAAAAIck+xy/ubv8DAAD/AwAALwAAAAAAAAAAAAAAAADvbQIAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvY29uZmlnLnByb3BlcnRpZXNQSwECCgAKAAAAAADKago7ToF6UXQHAAB0BwAAMwAAAAAAAAAAAAAAAAA7cgIAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL2phcnMvY29uZmlnSE9MRC5wcm9wZXJ0aWVzUEsBAgoACgAAAAAAymoKO+23nfTYAwAA2AMAADMAAAAAAAAAAAAAAAAAAHoCAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9qYXJzL2V4Y2VwdGlvbnMucHJvcGVydGllc1BLAQIKAAoAAAAAADsC0j5cI9aFmzYAAJs2AABCAAAAAAAAAAAAAAAAACl+AgBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZURpc3BsYXlhYmxlRGF0YUNoZWNrZXIuY2xhc3NQSwECCgAKAAAAAABBl8Q+kdyzZKI+AACiPgAAQQAAAAAAAAAAAAAAAAAktQIAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVEaXNwbGF5YWJsZURhdGFDaGVja2VyLmphdmFQSwECCgAKAAAAAAA7AtI+Qh56b3UbAAB1GwAALQAAAAAAAAAAAAAAAAAl9AIAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Rlc3RSZXBvLmNsYXNzUEsBAgoACgAAAAAAV7rMPiWrSSi6GQAAuhkAACwAAAAAAAAAAAAAAAAA5Q8DAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9UZXN0UmVwby5qYXZhUEsBAgoACgAAAAAAOwLSPh2kRawqJAAAKiQAADQAAAAAAAAAAAAAAAAA6SkDAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9WZXJzaW9uQ2hlY2tpbmcuY2xhc3NQSwECCgAKAAAAAABgEM0+4p0ISkQtAABELQAAMwAAAAAAAAAAAAAAAABlTgMAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1ZlcnNpb25DaGVja2luZy5qYXZhUEsBAgoACgAAAAAAOwLSPvYcorxeGQAAXhkAADIAAAAAAAAAAAAAAAAA+nsDAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmNsYXNzUEsBAgoACgAAAAAAjpvEPhnkAU18IwAAfCMAADEAAAAAAAAAAAAAAAAAqJUDAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy9yZXBvcy9JVU5hbWVDaGVja2VyLmphdmFQSwECCgAKAAAAAAA7AtI+47OBMU4bAABOGwAANwAAAAAAAAAAAAAAAABzuQMAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL0ZlYXR1cmVOYW1lTGVuZ3Rocy5jbGFzc1BLAQIKAAoAAAAAANWxxD6LUYgg+RYAAPkWAAA2AAAAAAAAAAAAAAAAABbVAwBvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3MvRmVhdHVyZU5hbWVMZW5ndGhzLmphdmFQSwECCgAKAAAAAAA7AtI+6t2w/QwbAAAMGwAAOAAAAAAAAAAAAAAAAABj7AMAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIuY2xhc3NQSwECCgAKAAAAAAD0m8Q+wAE4O5MdAACTHQAANwAAAAAAAAAAAAAAAADFBwQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3JlcG9zL1Byb3ZpZGVyTmFtZUNoZWNrZXIuamF2YVBLAQIKAAoAAAAAAHq8vT7IZZi4hz8AAIc/AAA6AAAAAAAAAAAAAAAAAK0lBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvcmVwb3Mvc3RhbmRhcmRMaWNlbnNlcy5wcm9wZXJ0aWVzUEsBAgoACgAAAAAAOwLSPojtB2bYCQAA2AkAADEAAAAAAAAAAAAAAAAAjGUEAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9SZXBvcnRXcml0ZXIuY2xhc3NQSwECCgAKAAAAAADyvsM+7//RiRAHAAAQBwAAMAAAAAAAAAAAAAAAAACzbwQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1JlcG9ydFdyaXRlci5qYXZhUEsBAgoACgAAAAAAOwLSPvtARVT+BwAA/gcAADYAAAAAAAAAAAAAAAAAEXcEAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9GdWxsSmFyTmFtZVBhcnNlci5jbGFzc1BLAQIKAAoAAAAAAHEBxD6GHdaJZgoAAGYKAAA1AAAAAAAAAAAAAAAAAGN/BABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvRnVsbEphck5hbWVQYXJzZXIuamF2YVBLAQIKAAoAAAAAADsC0j5YvYetVgUAAFYFAAA6AAAAAAAAAAAAAAAAAByKBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSVVOYW1lQW5kSWRDb21wYXJhdG9yLmNsYXNzUEsBAgoACgAAAAAAE4bEPvvknvpUBAAAVAQAADkAAAAAAAAAAAAAAAAAyo8EAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVU5hbWVBbmRJZENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAAAADsC0j6vNPpL+AMAAPgDAAA7AAAAAAAAAAAAAAAAAHWUBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5jbGFzc1BLAQIKAAoAAAAAAPurxD67Ff2JQAIAAEACAAA6AAAAAAAAAAAAAAAAAMaYBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5qYXZhUEsBAgoACgAAAAAAOwLSPpIdO4AfBAAAHwQAADMAAAAAAAAAAAAAAAAAXpsEAG9yZy9lY2xpcHNlL2luZGlnby90ZXN0cy91dGlscy9JVUlkQ29tcGFyYXRvci5jbGFzc1BLAQIKAAoAAAAAAEOHxD7LivEmTAIAAEwCAAAyAAAAAAAAAAAAAAAAAM6fBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSVVJZENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAAAADsC0j5Bw2+NugIAALoCAAA5AAAAAAAAAAAAAAAAAGqiBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvUGFja0d6RmlsZU5hbWVGaWx0ZXIuY2xhc3NQSwECCgAKAAAAAACQAcQ+S+ENklMBAABTAQAAOAAAAAAAAAAAAAAAAAB7pQQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL1BhY2tHekZpbGVOYW1lRmlsdGVyLmphdmFQSwECCgAKAAAAAAA7AtI+Q3oW8WIFAABiBQAAPgAAAAAAAAAAAAAAAAAkpwQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuY2xhc3NQSwECCgAKAAAAAAAihsQ+dzrL4VgEAABYBAAAPQAAAAAAAAAAAAAAAADirAQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0lVUHJvdmlkZXJBbmRJZENvbXBhcmF0b3IuamF2YVBLAQIKAAoAAAAAADsC0j4s8wuTogIAAKICAAA2AAAAAAAAAAAAAAAAAJWxBABvcmcvZWNsaXBzZS9pbmRpZ28vdGVzdHMvdXRpbHMvSkFSRmlsZU5hbWVGaWx0ZXIuY2xhc3NQSwECCgAKAAAAAACLAcQ+pHpfijoBAAA6AQAANQAAAAAAAAAAAAAAAACLtAQAb3JnL2VjbGlwc2UvaW5kaWdvL3Rlc3RzL3V0aWxzL0pBUkZpbGVOYW1lRmlsdGVyLmphdmFQSwECCgAKAAAAAADaFL8+nA2ptQYFAAAGBQAAFgAAAAAAAAAAAAAAAAAYtgQAcnVuRWNsaXBzZUFudFJ1bm5lci5zaFBLAQIKAAoAAAAAAPQAuj6zeFuJ+wEAAPsBAAATAAAAAAAAAAAAAAAAAFK7BABpbnZva2VBbnRSdW5uZXIueG1sUEsBAgoACgAAAAAAyWoKO43P6VGWBQAAlgUAAAoAAAAAAAAAAAAAAAAAfr0EAGFib3V0Lmh0bWxQSwECCgAKAAAAAACndb0+YWEboE4BAABOAQAACgAAAAAAAAAAAAAAAAA8wwQAcGx1Z2luLnhtbFBLAQIKAAoAAAAAADdyvD72E0FdYwAAAGMAAAAGAAAAAAAAAAAAAAAAALLEBABhbnQuc2hQSwUGAAAAAD0APQCMFQAAOcUEAAAA